@cossistant/types 0.0.29 → 0.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -38,7 +38,13 @@ const realtimeSchema = {
38
38
  conversationSeen: baseRealtimeEvent.extend({
39
39
  conversationId: z.string(),
40
40
  aiAgentId: z.string().nullable(),
41
- lastSeenAt: z.string()
41
+ lastSeenAt: z.string(),
42
+ actorType: z.enum([
43
+ "visitor",
44
+ "user",
45
+ "ai_agent"
46
+ ]),
47
+ actorId: z.string()
42
48
  }),
43
49
  conversationTyping: baseRealtimeEvent.extend({
44
50
  conversationId: z.string(),
@@ -126,6 +132,86 @@ const realtimeSchema = {
126
132
  }),
127
133
  aiAgentId: z.string().nullable()
128
134
  }),
135
+ aiAgentProcessingStarted: baseRealtimeEvent.extend({
136
+ conversationId: z.string(),
137
+ aiAgentId: z.string(),
138
+ workflowRunId: z.string(),
139
+ triggerMessageId: z.string(),
140
+ phase: z.string().optional(),
141
+ audience: z.enum(["all", "dashboard"]).default("dashboard")
142
+ }),
143
+ aiAgentDecisionMade: baseRealtimeEvent.extend({
144
+ conversationId: z.string(),
145
+ aiAgentId: z.string(),
146
+ workflowRunId: z.string(),
147
+ shouldAct: z.boolean(),
148
+ reason: z.string(),
149
+ mode: z.enum([
150
+ "respond_to_visitor",
151
+ "respond_to_command",
152
+ "background_only"
153
+ ]),
154
+ audience: z.enum(["all", "dashboard"])
155
+ }),
156
+ aiAgentProcessingProgress: baseRealtimeEvent.extend({
157
+ conversationId: z.string(),
158
+ aiAgentId: z.string(),
159
+ workflowRunId: z.string(),
160
+ phase: z.string(),
161
+ message: z.string().nullable(),
162
+ tool: z.object({
163
+ toolCallId: z.string(),
164
+ toolName: z.string(),
165
+ state: z.enum([
166
+ "partial",
167
+ "result",
168
+ "error"
169
+ ])
170
+ }).optional(),
171
+ audience: z.enum(["all", "dashboard"]).default("all")
172
+ }),
173
+ aiAgentProcessingCompleted: baseRealtimeEvent.extend({
174
+ conversationId: z.string(),
175
+ aiAgentId: z.string(),
176
+ workflowRunId: z.string(),
177
+ status: z.enum([
178
+ "success",
179
+ "skipped",
180
+ "cancelled",
181
+ "error"
182
+ ]),
183
+ action: z.string().nullable().optional(),
184
+ reason: z.string().nullable().optional(),
185
+ audience: z.enum(["all", "dashboard"]).default("all")
186
+ }),
187
+ timelineItemUpdated: baseRealtimeEvent.extend({
188
+ conversationId: z.string(),
189
+ item: z.object({
190
+ id: z.string(),
191
+ conversationId: z.string(),
192
+ organizationId: z.string(),
193
+ visibility: z.enum([TimelineItemVisibility.PUBLIC, TimelineItemVisibility.PRIVATE]),
194
+ type: z.enum([
195
+ ConversationTimelineType.MESSAGE,
196
+ ConversationTimelineType.EVENT,
197
+ ConversationTimelineType.IDENTIFICATION
198
+ ]),
199
+ text: z.string().nullable(),
200
+ parts: z.array(z.unknown()),
201
+ userId: z.string().nullable(),
202
+ visitorId: z.string().nullable(),
203
+ aiAgentId: z.string().nullable(),
204
+ createdAt: z.string(),
205
+ deletedAt: z.string().nullable(),
206
+ tool: z.string().nullable().optional()
207
+ })
208
+ }),
209
+ timelineItemPartUpdated: baseRealtimeEvent.extend({
210
+ conversationId: z.string(),
211
+ timelineItemId: z.string(),
212
+ partIndex: z.number(),
213
+ part: z.unknown()
214
+ }),
129
215
  crawlStarted: baseRealtimeEvent.extend({
130
216
  linkSourceId: z.string(),
131
217
  url: z.string(),
@@ -196,6 +282,35 @@ const realtimeSchema = {
196
282
  sizeBytes: z.number(),
197
283
  knowledgeId: z.string()
198
284
  })
285
+ }),
286
+ trainingStarted: baseRealtimeEvent.extend({
287
+ aiAgentId: z.string(),
288
+ totalItems: z.number()
289
+ }),
290
+ trainingProgress: baseRealtimeEvent.extend({
291
+ aiAgentId: z.string(),
292
+ processedItems: z.number(),
293
+ totalItems: z.number(),
294
+ currentItem: z.object({
295
+ id: z.string(),
296
+ title: z.string().nullable(),
297
+ type: z.enum([
298
+ "url",
299
+ "faq",
300
+ "article"
301
+ ])
302
+ }).optional(),
303
+ percentage: z.number()
304
+ }),
305
+ trainingCompleted: baseRealtimeEvent.extend({
306
+ aiAgentId: z.string(),
307
+ totalItems: z.number(),
308
+ totalChunks: z.number(),
309
+ duration: z.number()
310
+ }),
311
+ trainingFailed: baseRealtimeEvent.extend({
312
+ aiAgentId: z.string(),
313
+ error: z.string()
199
314
  })
200
315
  };
201
316
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"realtime-events.js","names":[],"sources":["../src/realtime-events.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { visitorResponseSchema } from \"./api/visitor\";\nimport {\n\tConversationEventType,\n\tConversationTimelineType,\n\tTimelineItemVisibility,\n} from \"./enums\";\nimport { conversationSchema } from \"./schemas\";\nimport { conversationHeaderSchema } from \"./trpc/conversation\";\n\nexport const baseRealtimeEvent = z.object({\n\twebsiteId: z.string(),\n\torganizationId: z.string(),\n\tvisitorId: z.string().nullable(),\n\tuserId: z.string().nullable(),\n});\n\n/**\n * Central event system for real-time communication\n * All WebSocket and Redis Pub/Sub events are defined here\n */\nexport const realtimeSchema = {\n\tuserConnected: baseRealtimeEvent.extend({\n\t\tconnectionId: z.string(),\n\t}),\n\tuserDisconnected: baseRealtimeEvent.extend({\n\t\tconnectionId: z.string(),\n\t}),\n\tvisitorConnected: baseRealtimeEvent.extend({\n\t\tvisitorId: z.string(),\n\t\tconnectionId: z.string(),\n\t}),\n\tvisitorDisconnected: baseRealtimeEvent.extend({\n\t\tvisitorId: z.string(),\n\t\tconnectionId: z.string(),\n\t}),\n\tuserPresenceUpdate: baseRealtimeEvent.extend({\n\t\tuserId: z.string(),\n\t\tstatus: z.enum([\"online\", \"away\", \"offline\"]),\n\t\tlastSeen: z.string(),\n\t}),\n\tconversationSeen: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\taiAgentId: z.string().nullable(),\n\t\tlastSeenAt: z.string(),\n\t}),\n\tconversationTyping: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\taiAgentId: z.string().nullable(),\n\t\tisTyping: z.boolean(),\n\t\tvisitorPreview: z.string().max(2000).nullable().optional(),\n\t}),\n\ttimelineItemCreated: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\titem: z.object({\n\t\t\tid: z.string(),\n\t\t\tconversationId: z.string(),\n\t\t\torganizationId: z.string(),\n\t\t\tvisibility: z.enum([\n\t\t\t\tTimelineItemVisibility.PUBLIC,\n\t\t\t\tTimelineItemVisibility.PRIVATE,\n\t\t\t]),\n\t\t\ttype: z.enum([\n\t\t\t\tConversationTimelineType.MESSAGE,\n\t\t\t\tConversationTimelineType.EVENT,\n\t\t\t\tConversationTimelineType.IDENTIFICATION,\n\t\t\t]),\n\t\t\ttext: z.string().nullable(),\n\t\t\tparts: z.array(z.unknown()),\n\t\t\tuserId: z.string().nullable(),\n\t\t\tvisitorId: z.string().nullable(),\n\t\t\taiAgentId: z.string().nullable(),\n\t\t\tcreatedAt: z.string(),\n\t\t\tdeletedAt: z.string().nullable(),\n\t\t\ttool: z.string().nullable().optional(),\n\t\t}),\n\t}),\n\tconversationCreated: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\tconversation: conversationSchema,\n\t\theader: conversationHeaderSchema,\n\t}),\n\tvisitorIdentified: baseRealtimeEvent.extend({\n\t\tvisitorId: z.string(),\n\t\tvisitor: visitorResponseSchema,\n\t}),\n\tconversationEventCreated: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\taiAgentId: z.string().nullable(),\n\t\tevent: z.object({\n\t\t\tid: z.string(),\n\t\t\tconversationId: z.string(),\n\t\t\torganizationId: z.string(),\n\t\t\ttype: z.enum([\n\t\t\t\tConversationEventType.ASSIGNED,\n\t\t\t\tConversationEventType.UNASSIGNED,\n\t\t\t\tConversationEventType.PARTICIPANT_REQUESTED,\n\t\t\t\tConversationEventType.PARTICIPANT_JOINED,\n\t\t\t\tConversationEventType.PARTICIPANT_LEFT,\n\t\t\t\tConversationEventType.STATUS_CHANGED,\n\t\t\t\tConversationEventType.PRIORITY_CHANGED,\n\t\t\t\tConversationEventType.TAG_ADDED,\n\t\t\t\tConversationEventType.TAG_REMOVED,\n\t\t\t\tConversationEventType.RESOLVED,\n\t\t\t\tConversationEventType.REOPENED,\n\t\t\t\tConversationEventType.VISITOR_BLOCKED,\n\t\t\t\tConversationEventType.VISITOR_UNBLOCKED,\n\t\t\t\tConversationEventType.VISITOR_IDENTIFIED,\n\t\t\t]),\n\t\t\tactorUserId: z.string().nullable(),\n\t\t\tactorAiAgentId: z.string().nullable(),\n\t\t\ttargetUserId: z.string().nullable(),\n\t\t\ttargetAiAgentId: z.string().nullable(),\n\t\t\tmessage: z.string().nullable(),\n\t\t\tmetadata: z.record(z.string(), z.unknown()).nullable(),\n\t\t\tcreatedAt: z.string(),\n\t\t\tupdatedAt: z.string(),\n\t\t\tdeletedAt: z.string().nullable(),\n\t\t}),\n\t}),\n\t// Conversation updated (title, sentiment, escalation status changes)\n\tconversationUpdated: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\tupdates: z.object({\n\t\t\ttitle: z.string().nullable().optional(),\n\t\t\tsentiment: z\n\t\t\t\t.enum([\"positive\", \"negative\", \"neutral\"])\n\t\t\t\t.nullable()\n\t\t\t\t.optional(),\n\t\t\tsentimentConfidence: z.number().nullable().optional(),\n\t\t\tescalatedAt: z.string().nullable().optional(),\n\t\t\tescalationReason: z.string().nullable().optional(),\n\t\t}),\n\t\taiAgentId: z.string().nullable(),\n\t}),\n\t// Web crawling events\n\tcrawlStarted: baseRealtimeEvent.extend({\n\t\tlinkSourceId: z.string(),\n\t\turl: z.string(),\n\t\tdiscoveredPages: z.array(\n\t\t\tz.object({\n\t\t\t\turl: z.string(),\n\t\t\t\ttitle: z.string().nullable(),\n\t\t\t\tdepth: z.number(),\n\t\t\t})\n\t\t),\n\t\ttotalPagesCount: z.number(),\n\t}),\n\tcrawlProgress: baseRealtimeEvent.extend({\n\t\tlinkSourceId: z.string(),\n\t\turl: z.string(),\n\t\tpage: z.object({\n\t\t\turl: z.string(),\n\t\t\ttitle: z.string().nullable(),\n\t\t\tstatus: z.enum([\"pending\", \"crawling\", \"completed\", \"failed\"]),\n\t\t\tsizeBytes: z.number().optional(),\n\t\t\terror: z.string().nullable().optional(),\n\t\t}),\n\t\tcompletedCount: z.number(),\n\t\ttotalCount: z.number(),\n\t}),\n\tcrawlCompleted: baseRealtimeEvent.extend({\n\t\tlinkSourceId: z.string(),\n\t\turl: z.string(),\n\t\tcrawledPagesCount: z.number(),\n\t\ttotalSizeBytes: z.number(),\n\t\tfailedPagesCount: z.number(),\n\t}),\n\tcrawlFailed: baseRealtimeEvent.extend({\n\t\tlinkSourceId: z.string(),\n\t\turl: z.string(),\n\t\terror: z.string(),\n\t}),\n\t// Link source updated (for status changes, etc.)\n\tlinkSourceUpdated: baseRealtimeEvent.extend({\n\t\tlinkSourceId: z.string(),\n\t\tstatus: z.enum([\"pending\", \"mapping\", \"crawling\", \"completed\", \"failed\"]),\n\t\tdiscoveredPagesCount: z.number().optional(),\n\t\tcrawledPagesCount: z.number().optional(),\n\t\ttotalSizeBytes: z.number().optional(),\n\t\terrorMessage: z.string().nullable().optional(),\n\t}),\n\t// Emitted after map phase with all discovered URLs (for real-time tree display)\n\tcrawlPagesDiscovered: baseRealtimeEvent.extend({\n\t\tlinkSourceId: z.string(),\n\t\tpages: z.array(\n\t\t\tz.object({\n\t\t\t\turl: z.string(),\n\t\t\t\tpath: z.string(),\n\t\t\t\tdepth: z.number(),\n\t\t\t})\n\t\t),\n\t}),\n\t// Emitted when each page completes scraping (for real-time updates)\n\tcrawlPageCompleted: baseRealtimeEvent.extend({\n\t\tlinkSourceId: z.string(),\n\t\tpage: z.object({\n\t\t\turl: z.string(),\n\t\t\ttitle: z.string().nullable(),\n\t\t\tsizeBytes: z.number(),\n\t\t\tknowledgeId: z.string(),\n\t\t}),\n\t}),\n} as const;\n\nexport type RealtimeEventType = keyof typeof realtimeSchema;\n\nexport type RealtimeEventPayload<T extends RealtimeEventType> = z.infer<\n\t(typeof realtimeSchema)[T]\n>;\n\nexport type RealtimeEvent<T extends RealtimeEventType> = {\n\ttype: T;\n\tpayload: RealtimeEventPayload<T>;\n};\n\nexport type AnyRealtimeEvent = {\n\t[K in RealtimeEventType]: RealtimeEvent<K>;\n}[RealtimeEventType];\n\nexport type RealtimeEventData<T extends RealtimeEventType> =\n\tRealtimeEventPayload<T>;\n\n/**\n * Validates an event against its schema\n */\nexport function validateRealtimeEvent<T extends RealtimeEventType>(\n\ttype: T,\n\tdata: unknown\n): RealtimeEventPayload<T> {\n\tconst schema = realtimeSchema[type];\n\treturn schema.parse(data) as RealtimeEventPayload<T>;\n}\n\n/**\n * Type guard to check if a string is a valid event type\n */\nexport function isValidEventType(type: unknown): type is RealtimeEventType {\n\treturn typeof type === \"string\" && type in realtimeSchema;\n}\n\nexport function getEventPayload<T extends RealtimeEventType>(\n\tevent: RealtimeEvent<T>\n): RealtimeEventPayload<T> {\n\treturn event.payload;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"realtime-events.js","names":[],"sources":["../src/realtime-events.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { visitorResponseSchema } from \"./api/visitor\";\nimport {\n\tConversationEventType,\n\tConversationTimelineType,\n\tTimelineItemVisibility,\n} from \"./enums\";\nimport { conversationSchema } from \"./schemas\";\nimport { conversationHeaderSchema } from \"./trpc/conversation\";\n\nexport const baseRealtimeEvent = z.object({\n\twebsiteId: z.string(),\n\torganizationId: z.string(),\n\tvisitorId: z.string().nullable(),\n\tuserId: z.string().nullable(),\n});\n\n/**\n * Central event system for real-time communication\n * All WebSocket and Redis Pub/Sub events are defined here\n */\nexport const realtimeSchema = {\n\tuserConnected: baseRealtimeEvent.extend({\n\t\tconnectionId: z.string(),\n\t}),\n\tuserDisconnected: baseRealtimeEvent.extend({\n\t\tconnectionId: z.string(),\n\t}),\n\tvisitorConnected: baseRealtimeEvent.extend({\n\t\tvisitorId: z.string(),\n\t\tconnectionId: z.string(),\n\t}),\n\tvisitorDisconnected: baseRealtimeEvent.extend({\n\t\tvisitorId: z.string(),\n\t\tconnectionId: z.string(),\n\t}),\n\tuserPresenceUpdate: baseRealtimeEvent.extend({\n\t\tuserId: z.string(),\n\t\tstatus: z.enum([\"online\", \"away\", \"offline\"]),\n\t\tlastSeen: z.string(),\n\t}),\n\tconversationSeen: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\taiAgentId: z.string().nullable(),\n\t\tlastSeenAt: z.string(),\n\t\t/** The type of actor who marked the conversation as seen */\n\t\tactorType: z.enum([\"visitor\", \"user\", \"ai_agent\"]),\n\t\t/** The actor's ID (matches one of userId, visitorId, or aiAgentId based on actorType) */\n\t\tactorId: z.string(),\n\t}),\n\tconversationTyping: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\taiAgentId: z.string().nullable(),\n\t\tisTyping: z.boolean(),\n\t\tvisitorPreview: z.string().max(2000).nullable().optional(),\n\t}),\n\ttimelineItemCreated: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\titem: z.object({\n\t\t\tid: z.string(),\n\t\t\tconversationId: z.string(),\n\t\t\torganizationId: z.string(),\n\t\t\tvisibility: z.enum([\n\t\t\t\tTimelineItemVisibility.PUBLIC,\n\t\t\t\tTimelineItemVisibility.PRIVATE,\n\t\t\t]),\n\t\t\ttype: z.enum([\n\t\t\t\tConversationTimelineType.MESSAGE,\n\t\t\t\tConversationTimelineType.EVENT,\n\t\t\t\tConversationTimelineType.IDENTIFICATION,\n\t\t\t]),\n\t\t\ttext: z.string().nullable(),\n\t\t\tparts: z.array(z.unknown()),\n\t\t\tuserId: z.string().nullable(),\n\t\t\tvisitorId: z.string().nullable(),\n\t\t\taiAgentId: z.string().nullable(),\n\t\t\tcreatedAt: z.string(),\n\t\t\tdeletedAt: z.string().nullable(),\n\t\t\ttool: z.string().nullable().optional(),\n\t\t}),\n\t}),\n\tconversationCreated: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\tconversation: conversationSchema,\n\t\theader: conversationHeaderSchema,\n\t}),\n\tvisitorIdentified: baseRealtimeEvent.extend({\n\t\tvisitorId: z.string(),\n\t\tvisitor: visitorResponseSchema,\n\t}),\n\tconversationEventCreated: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\taiAgentId: z.string().nullable(),\n\t\tevent: z.object({\n\t\t\tid: z.string(),\n\t\t\tconversationId: z.string(),\n\t\t\torganizationId: z.string(),\n\t\t\ttype: z.enum([\n\t\t\t\tConversationEventType.ASSIGNED,\n\t\t\t\tConversationEventType.UNASSIGNED,\n\t\t\t\tConversationEventType.PARTICIPANT_REQUESTED,\n\t\t\t\tConversationEventType.PARTICIPANT_JOINED,\n\t\t\t\tConversationEventType.PARTICIPANT_LEFT,\n\t\t\t\tConversationEventType.STATUS_CHANGED,\n\t\t\t\tConversationEventType.PRIORITY_CHANGED,\n\t\t\t\tConversationEventType.TAG_ADDED,\n\t\t\t\tConversationEventType.TAG_REMOVED,\n\t\t\t\tConversationEventType.RESOLVED,\n\t\t\t\tConversationEventType.REOPENED,\n\t\t\t\tConversationEventType.VISITOR_BLOCKED,\n\t\t\t\tConversationEventType.VISITOR_UNBLOCKED,\n\t\t\t\tConversationEventType.VISITOR_IDENTIFIED,\n\t\t\t]),\n\t\t\tactorUserId: z.string().nullable(),\n\t\t\tactorAiAgentId: z.string().nullable(),\n\t\t\ttargetUserId: z.string().nullable(),\n\t\t\ttargetAiAgentId: z.string().nullable(),\n\t\t\tmessage: z.string().nullable(),\n\t\t\tmetadata: z.record(z.string(), z.unknown()).nullable(),\n\t\t\tcreatedAt: z.string(),\n\t\t\tupdatedAt: z.string(),\n\t\t\tdeletedAt: z.string().nullable(),\n\t\t}),\n\t}),\n\t// Conversation updated (title, sentiment, escalation status changes)\n\tconversationUpdated: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\tupdates: z.object({\n\t\t\ttitle: z.string().nullable().optional(),\n\t\t\tsentiment: z\n\t\t\t\t.enum([\"positive\", \"negative\", \"neutral\"])\n\t\t\t\t.nullable()\n\t\t\t\t.optional(),\n\t\t\tsentimentConfidence: z.number().nullable().optional(),\n\t\t\tescalatedAt: z.string().nullable().optional(),\n\t\t\tescalationReason: z.string().nullable().optional(),\n\t\t}),\n\t\taiAgentId: z.string().nullable(),\n\t}),\n\n\t// =========================================================================\n\t// AI AGENT PROCESSING EVENTS\n\t// For progressive UI updates during AI agent responses\n\t//\n\t// AUDIENCE FIELD:\n\t// - 'all': Send to both dashboard and widget\n\t// - 'dashboard': Send only to dashboard (human agents)\n\t//\n\t// Widget (visitor) connections only receive events with audience='all'\n\t// =========================================================================\n\n\t// Emitted when AI agent starts processing a message\n\taiAgentProcessingStarted: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\taiAgentId: z.string(),\n\t\tworkflowRunId: z.string(),\n\t\t/** ID of the trigger message that started this workflow */\n\t\ttriggerMessageId: z.string(),\n\t\t/** Initial phase of processing */\n\t\tphase: z.string().optional(),\n\t\t/** Audience: 'all' = everyone, 'dashboard' = team only */\n\t\taudience: z.enum([\"all\", \"dashboard\"]).default(\"dashboard\"),\n\t}),\n\n\t// Emitted when AI agent makes a decision about whether to act\n\taiAgentDecisionMade: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\taiAgentId: z.string(),\n\t\tworkflowRunId: z.string(),\n\t\t/** Whether the AI decided to take action */\n\t\tshouldAct: z.boolean(),\n\t\t/** Human-readable reason for the decision */\n\t\treason: z.string(),\n\t\t/** Response mode: how the AI is responding */\n\t\tmode: z.enum([\n\t\t\t\"respond_to_visitor\",\n\t\t\t\"respond_to_command\",\n\t\t\t\"background_only\",\n\t\t]),\n\t\t/** Audience: 'all' = everyone, 'dashboard' = team only */\n\t\taudience: z.enum([\"all\", \"dashboard\"]),\n\t}),\n\n\t// Emitted for progress updates during AI agent processing\n\taiAgentProcessingProgress: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\taiAgentId: z.string(),\n\t\tworkflowRunId: z.string(),\n\t\t/** Current phase: 'thinking', 'searching', 'tool-executing', 'generating', etc. */\n\t\tphase: z.string(),\n\t\t/** Human-readable message for display (widget sees this) */\n\t\tmessage: z.string().nullable(),\n\t\t/** Tool information when phase is tool-related */\n\t\ttool: z\n\t\t\t.object({\n\t\t\t\ttoolCallId: z.string(),\n\t\t\t\ttoolName: z.string(),\n\t\t\t\t/** Tool state: partial (executing), result (success), error (failed) */\n\t\t\t\tstate: z.enum([\"partial\", \"result\", \"error\"]),\n\t\t\t})\n\t\t\t.optional(),\n\t\t/** Audience: 'all' = everyone, 'dashboard' = team only */\n\t\taudience: z.enum([\"all\", \"dashboard\"]).default(\"all\"),\n\t}),\n\n\t// Emitted when AI agent finishes processing\n\taiAgentProcessingCompleted: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\taiAgentId: z.string(),\n\t\tworkflowRunId: z.string(),\n\t\t/** Whether processing completed successfully, was skipped, cancelled, or errored */\n\t\tstatus: z.enum([\"success\", \"skipped\", \"cancelled\", \"error\"]),\n\t\t/** Action taken (if status is 'success') */\n\t\taction: z.string().nullable().optional(),\n\t\t/** Reason for skip/cancel/error */\n\t\treason: z.string().nullable().optional(),\n\t\t/** Audience: 'all' = everyone, 'dashboard' = team only */\n\t\taudience: z.enum([\"all\", \"dashboard\"]).default(\"all\"),\n\t}),\n\n\t// =========================================================================\n\t// TIMELINE ITEM UPDATE EVENTS\n\t// For updating timeline items with new parts or state changes\n\t// =========================================================================\n\n\t// Emitted when an entire timeline item is updated (e.g., parts added)\n\ttimelineItemUpdated: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\titem: z.object({\n\t\t\tid: z.string(),\n\t\t\tconversationId: z.string(),\n\t\t\torganizationId: z.string(),\n\t\t\tvisibility: z.enum([\n\t\t\t\tTimelineItemVisibility.PUBLIC,\n\t\t\t\tTimelineItemVisibility.PRIVATE,\n\t\t\t]),\n\t\t\ttype: z.enum([\n\t\t\t\tConversationTimelineType.MESSAGE,\n\t\t\t\tConversationTimelineType.EVENT,\n\t\t\t\tConversationTimelineType.IDENTIFICATION,\n\t\t\t]),\n\t\t\ttext: z.string().nullable(),\n\t\t\tparts: z.array(z.unknown()),\n\t\t\tuserId: z.string().nullable(),\n\t\t\tvisitorId: z.string().nullable(),\n\t\t\taiAgentId: z.string().nullable(),\n\t\t\tcreatedAt: z.string(),\n\t\t\tdeletedAt: z.string().nullable(),\n\t\t\ttool: z.string().nullable().optional(),\n\t\t}),\n\t}),\n\n\t// Emitted for granular part updates (e.g., tool state changes)\n\ttimelineItemPartUpdated: baseRealtimeEvent.extend({\n\t\tconversationId: z.string(),\n\t\ttimelineItemId: z.string(),\n\t\t/** Index of the part in the parts array */\n\t\tpartIndex: z.number(),\n\t\t/** The updated part data */\n\t\tpart: z.unknown(),\n\t}),\n\t// Web crawling events\n\tcrawlStarted: baseRealtimeEvent.extend({\n\t\tlinkSourceId: z.string(),\n\t\turl: z.string(),\n\t\tdiscoveredPages: z.array(\n\t\t\tz.object({\n\t\t\t\turl: z.string(),\n\t\t\t\ttitle: z.string().nullable(),\n\t\t\t\tdepth: z.number(),\n\t\t\t})\n\t\t),\n\t\ttotalPagesCount: z.number(),\n\t}),\n\tcrawlProgress: baseRealtimeEvent.extend({\n\t\tlinkSourceId: z.string(),\n\t\turl: z.string(),\n\t\tpage: z.object({\n\t\t\turl: z.string(),\n\t\t\ttitle: z.string().nullable(),\n\t\t\tstatus: z.enum([\"pending\", \"crawling\", \"completed\", \"failed\"]),\n\t\t\tsizeBytes: z.number().optional(),\n\t\t\terror: z.string().nullable().optional(),\n\t\t}),\n\t\tcompletedCount: z.number(),\n\t\ttotalCount: z.number(),\n\t}),\n\tcrawlCompleted: baseRealtimeEvent.extend({\n\t\tlinkSourceId: z.string(),\n\t\turl: z.string(),\n\t\tcrawledPagesCount: z.number(),\n\t\ttotalSizeBytes: z.number(),\n\t\tfailedPagesCount: z.number(),\n\t}),\n\tcrawlFailed: baseRealtimeEvent.extend({\n\t\tlinkSourceId: z.string(),\n\t\turl: z.string(),\n\t\terror: z.string(),\n\t}),\n\t// Link source updated (for status changes, etc.)\n\tlinkSourceUpdated: baseRealtimeEvent.extend({\n\t\tlinkSourceId: z.string(),\n\t\tstatus: z.enum([\"pending\", \"mapping\", \"crawling\", \"completed\", \"failed\"]),\n\t\tdiscoveredPagesCount: z.number().optional(),\n\t\tcrawledPagesCount: z.number().optional(),\n\t\ttotalSizeBytes: z.number().optional(),\n\t\terrorMessage: z.string().nullable().optional(),\n\t}),\n\t// Emitted after map phase with all discovered URLs (for real-time tree display)\n\tcrawlPagesDiscovered: baseRealtimeEvent.extend({\n\t\tlinkSourceId: z.string(),\n\t\tpages: z.array(\n\t\t\tz.object({\n\t\t\t\turl: z.string(),\n\t\t\t\tpath: z.string(),\n\t\t\t\tdepth: z.number(),\n\t\t\t})\n\t\t),\n\t}),\n\t// Emitted when each page completes scraping (for real-time updates)\n\tcrawlPageCompleted: baseRealtimeEvent.extend({\n\t\tlinkSourceId: z.string(),\n\t\tpage: z.object({\n\t\t\turl: z.string(),\n\t\t\ttitle: z.string().nullable(),\n\t\t\tsizeBytes: z.number(),\n\t\t\tknowledgeId: z.string(),\n\t\t}),\n\t}),\n\n\t// =========================================================================\n\t// AI TRAINING EVENTS\n\t// For knowledge base embedding generation and progress tracking\n\t// =========================================================================\n\n\t// Emitted when AI training starts\n\ttrainingStarted: baseRealtimeEvent.extend({\n\t\taiAgentId: z.string(),\n\t\ttotalItems: z.number(),\n\t}),\n\n\t// Emitted for progress updates during AI training\n\ttrainingProgress: baseRealtimeEvent.extend({\n\t\taiAgentId: z.string(),\n\t\tprocessedItems: z.number(),\n\t\ttotalItems: z.number(),\n\t\tcurrentItem: z\n\t\t\t.object({\n\t\t\t\tid: z.string(),\n\t\t\t\ttitle: z.string().nullable(),\n\t\t\t\ttype: z.enum([\"url\", \"faq\", \"article\"]),\n\t\t\t})\n\t\t\t.optional(),\n\t\tpercentage: z.number(),\n\t}),\n\n\t// Emitted when AI training completes successfully\n\ttrainingCompleted: baseRealtimeEvent.extend({\n\t\taiAgentId: z.string(),\n\t\ttotalItems: z.number(),\n\t\ttotalChunks: z.number(),\n\t\tduration: z.number(), // milliseconds\n\t}),\n\n\t// Emitted when AI training fails\n\ttrainingFailed: baseRealtimeEvent.extend({\n\t\taiAgentId: z.string(),\n\t\terror: z.string(),\n\t}),\n} as const;\n\nexport type RealtimeEventType = keyof typeof realtimeSchema;\n\nexport type RealtimeEventPayload<T extends RealtimeEventType> = z.infer<\n\t(typeof realtimeSchema)[T]\n>;\n\nexport type RealtimeEvent<T extends RealtimeEventType> = {\n\ttype: T;\n\tpayload: RealtimeEventPayload<T>;\n};\n\nexport type AnyRealtimeEvent = {\n\t[K in RealtimeEventType]: RealtimeEvent<K>;\n}[RealtimeEventType];\n\nexport type RealtimeEventData<T extends RealtimeEventType> =\n\tRealtimeEventPayload<T>;\n\n/**\n * Validates an event against its schema\n */\nexport function validateRealtimeEvent<T extends RealtimeEventType>(\n\ttype: T,\n\tdata: unknown\n): RealtimeEventPayload<T> {\n\tconst schema = realtimeSchema[type];\n\treturn schema.parse(data) as RealtimeEventPayload<T>;\n}\n\n/**\n * Type guard to check if a string is a valid event type\n */\nexport function isValidEventType(type: unknown): type is RealtimeEventType {\n\treturn typeof type === \"string\" && type in realtimeSchema;\n}\n\nexport function getEventPayload<T extends RealtimeEventType>(\n\tevent: RealtimeEvent<T>\n): RealtimeEventPayload<T> {\n\treturn event.payload;\n}\n"],"mappings":"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"}
package/schemas.d.ts CHANGED
@@ -25,6 +25,8 @@ declare const conversationSchema: z.ZodObject<{
25
25
  resolved: "resolved";
26
26
  spam: "spam";
27
27
  }>>;
28
+ visitorRating: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
29
+ visitorRatingAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
28
30
  deletedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
29
31
  visitorLastSeenAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
32
  lastTimelineItem: z.ZodOptional<z.ZodObject<{
@@ -45,6 +47,96 @@ declare const conversationSchema: z.ZodObject<{
45
47
  parts: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
46
48
  type: z.ZodLiteral<"text">;
47
49
  text: z.ZodString;
50
+ state: z.ZodOptional<z.ZodEnum<{
51
+ streaming: "streaming";
52
+ done: "done";
53
+ }>>;
54
+ }, z.core.$strip>, z.ZodObject<{
55
+ type: z.ZodLiteral<"reasoning">;
56
+ text: z.ZodString;
57
+ state: z.ZodOptional<z.ZodEnum<{
58
+ streaming: "streaming";
59
+ done: "done";
60
+ }>>;
61
+ providerMetadata: z.ZodOptional<z.ZodObject<{
62
+ cossistant: z.ZodOptional<z.ZodObject<{
63
+ visibility: z.ZodOptional<z.ZodEnum<{
64
+ public: "public";
65
+ private: "private";
66
+ }>>;
67
+ progressMessage: z.ZodOptional<z.ZodString>;
68
+ knowledgeId: z.ZodOptional<z.ZodString>;
69
+ }, z.core.$strip>>;
70
+ }, z.core.$loose>>;
71
+ }, z.core.$strip>, z.ZodObject<{
72
+ type: z.ZodString;
73
+ toolCallId: z.ZodString;
74
+ toolName: z.ZodString;
75
+ input: z.ZodRecord<z.ZodString, z.ZodUnknown>;
76
+ output: z.ZodOptional<z.ZodUnknown>;
77
+ state: z.ZodEnum<{
78
+ error: "error";
79
+ partial: "partial";
80
+ result: "result";
81
+ }>;
82
+ errorText: z.ZodOptional<z.ZodString>;
83
+ providerMetadata: z.ZodOptional<z.ZodObject<{
84
+ cossistant: z.ZodOptional<z.ZodObject<{
85
+ visibility: z.ZodOptional<z.ZodEnum<{
86
+ public: "public";
87
+ private: "private";
88
+ }>>;
89
+ progressMessage: z.ZodOptional<z.ZodString>;
90
+ knowledgeId: z.ZodOptional<z.ZodString>;
91
+ }, z.core.$strip>>;
92
+ }, z.core.$loose>>;
93
+ }, z.core.$strip>, z.ZodObject<{
94
+ type: z.ZodLiteral<"source-url">;
95
+ sourceId: z.ZodString;
96
+ url: z.ZodString;
97
+ title: z.ZodOptional<z.ZodString>;
98
+ providerMetadata: z.ZodOptional<z.ZodObject<{
99
+ cossistant: z.ZodOptional<z.ZodObject<{
100
+ visibility: z.ZodOptional<z.ZodEnum<{
101
+ public: "public";
102
+ private: "private";
103
+ }>>;
104
+ progressMessage: z.ZodOptional<z.ZodString>;
105
+ knowledgeId: z.ZodOptional<z.ZodString>;
106
+ }, z.core.$strip>>;
107
+ }, z.core.$loose>>;
108
+ }, z.core.$strip>, z.ZodObject<{
109
+ type: z.ZodLiteral<"source-document">;
110
+ sourceId: z.ZodString;
111
+ mediaType: z.ZodString;
112
+ title: z.ZodString;
113
+ filename: z.ZodOptional<z.ZodString>;
114
+ providerMetadata: z.ZodOptional<z.ZodObject<{
115
+ cossistant: z.ZodOptional<z.ZodObject<{
116
+ visibility: z.ZodOptional<z.ZodEnum<{
117
+ public: "public";
118
+ private: "private";
119
+ }>>;
120
+ progressMessage: z.ZodOptional<z.ZodString>;
121
+ knowledgeId: z.ZodOptional<z.ZodString>;
122
+ }, z.core.$strip>>;
123
+ }, z.core.$loose>>;
124
+ }, z.core.$strip>, z.ZodObject<{
125
+ type: z.ZodLiteral<"step-start">;
126
+ }, z.core.$strip>, z.ZodObject<{
127
+ type: z.ZodLiteral<"file">;
128
+ url: z.ZodString;
129
+ mediaType: z.ZodString;
130
+ filename: z.ZodOptional<z.ZodString>;
131
+ size: z.ZodOptional<z.ZodNumber>;
132
+ }, z.core.$strip>, z.ZodObject<{
133
+ type: z.ZodLiteral<"image">;
134
+ url: z.ZodString;
135
+ mediaType: z.ZodString;
136
+ filename: z.ZodOptional<z.ZodString>;
137
+ size: z.ZodOptional<z.ZodNumber>;
138
+ width: z.ZodOptional<z.ZodNumber>;
139
+ height: z.ZodOptional<z.ZodNumber>;
48
140
  }, z.core.$strip>, z.ZodObject<{
49
141
  type: z.ZodLiteral<"event">;
50
142
  eventType: z.ZodEnum<{
@@ -68,20 +160,6 @@ declare const conversationSchema: z.ZodObject<{
68
160
  targetUserId: z.ZodNullable<z.ZodString>;
69
161
  targetAiAgentId: z.ZodNullable<z.ZodString>;
70
162
  message: z.ZodOptional<z.ZodNullable<z.ZodString>>;
71
- }, z.core.$strip>, z.ZodObject<{
72
- type: z.ZodLiteral<"image">;
73
- url: z.ZodString;
74
- mediaType: z.ZodString;
75
- fileName: z.ZodOptional<z.ZodString>;
76
- size: z.ZodOptional<z.ZodNumber>;
77
- width: z.ZodOptional<z.ZodNumber>;
78
- height: z.ZodOptional<z.ZodNumber>;
79
- }, z.core.$strip>, z.ZodObject<{
80
- type: z.ZodLiteral<"file">;
81
- url: z.ZodString;
82
- mediaType: z.ZodString;
83
- fileName: z.ZodOptional<z.ZodString>;
84
- size: z.ZodOptional<z.ZodNumber>;
85
163
  }, z.core.$strip>, z.ZodObject<{
86
164
  type: z.ZodLiteral<"metadata">;
87
165
  source: z.ZodEnum<{
package/schemas.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","names":[],"sources":["../src/schemas.ts"],"sourcesContent":[],"mappings":";;;cAIa,YAAU,CAAA,CAAA;;EAAV,IAAA,aAUX;;;;;;;;;KAEU,SAAA,GAAY,CAAA,CAAE,aAAa;cAE1B,oBAAkB,CAAA,CAAA;;;;EAdR,SAAA,aAAA;EAAA,SAAA,aAAA;EAYX,SAAA,aAAS;EAER,MAAA,cAAA,UAiBX,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAEU,YAAA,GAAe,CAAA,CAAE,aAAa;cAE7B,wBAAsB,CAAA,CAAA;;;;;;;;;;CArBJ,eAAA,CAAA;AAAA,KAiCnB,gBAAA,GAAmB,CAAA,CAAE,KAjCF,CAAA,OAiCe,sBAjCf,CAAA"}
1
+ {"version":3,"file":"schemas.d.ts","names":[],"sources":["../src/schemas.ts"],"sourcesContent":[],"mappings":";;;cAIa,YAAU,CAAA,CAAA;;EAAV,IAAA,aAUX;;;;;;;;;KAEU,SAAA,GAAY,CAAA,CAAE,aAAa;cAE1B,oBAAkB,CAAA,CAAA;;;;EAdR,SAAA,aAAA;EAAA,SAAA,aAAA;EAYX,SAAA,aAAS;EAER,MAAA,cAAA,UAmBX,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAEU,YAAA,GAAe,CAAA,CAAE,aAAa;cAE7B,wBAAsB,CAAA,CAAA;;;;;;;;;;;KAYvB,gBAAA,GAAmB,CAAA,CAAE,aAAa"}
package/schemas.js CHANGED
@@ -26,6 +26,8 @@ const conversationSchema = z.object({
26
26
  ConversationStatus.RESOLVED,
27
27
  ConversationStatus.SPAM
28
28
  ]).default(ConversationStatus.OPEN),
29
+ visitorRating: z.number().int().min(1).max(5).nullable().optional(),
30
+ visitorRatingAt: z.string().nullable().optional(),
29
31
  deletedAt: z.string().nullable().default(null),
30
32
  visitorLastSeenAt: z.string().nullable().optional(),
31
33
  lastTimelineItem: timelineItemSchema.optional()
package/schemas.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","names":[],"sources":["../src/schemas.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { timelineItemSchema } from \"./api/timeline-item\";\nimport { ConversationEventType, ConversationStatus } from \"./enums\";\n\nexport const viewSchema = z.object({\n\tid: z.string(),\n\tname: z.string(),\n\tdescription: z.string().nullable(),\n\tprompt: z.string().nullable(),\n\torganizationId: z.string(),\n\twebsiteId: z.string(),\n\tcreatedAt: z.string(),\n\tupdatedAt: z.string(),\n\tdeletedAt: z.string().nullable(),\n});\n\nexport type InboxView = z.infer<typeof viewSchema>;\n\nexport const conversationSchema = z.object({\n\tid: z.string(),\n\ttitle: z.string().optional(),\n\tcreatedAt: z.string(),\n\tupdatedAt: z.string(),\n\tvisitorId: z.string(),\n\twebsiteId: z.string(),\n\tstatus: z\n\t\t.enum([\n\t\t\tConversationStatus.OPEN,\n\t\t\tConversationStatus.RESOLVED,\n\t\t\tConversationStatus.SPAM,\n\t\t])\n\t\t.default(ConversationStatus.OPEN),\n\tdeletedAt: z.string().nullable().default(null),\n\tvisitorLastSeenAt: z.string().nullable().optional(),\n\tlastTimelineItem: timelineItemSchema.optional(),\n});\n\nexport type Conversation = z.infer<typeof conversationSchema>;\n\nexport const conversationSeenSchema = z.object({\n\tid: z.string(),\n\tconversationId: z.string(),\n\tuserId: z.string().nullable(),\n\tvisitorId: z.string().nullable(),\n\taiAgentId: z.string().nullable(),\n\tlastSeenAt: z.string(),\n\tcreatedAt: z.string(),\n\tupdatedAt: z.string(),\n\tdeletedAt: z.string().nullable(),\n});\n\nexport type ConversationSeen = z.infer<typeof conversationSeenSchema>;\n"],"mappings":";;;;;AAIA,MAAa,aAAa,EAAE,OAAO;CAClC,IAAI,EAAE,QAAQ;CACd,MAAM,EAAE,QAAQ;CAChB,aAAa,EAAE,QAAQ,CAAC,UAAU;CAClC,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,gBAAgB,EAAE,QAAQ;CAC1B,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,CAAC;AAIF,MAAa,qBAAqB,EAAE,OAAO;CAC1C,IAAI,EAAE,QAAQ;CACd,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,QAAQ,EACN,KAAK;EACL,mBAAmB;EACnB,mBAAmB;EACnB,mBAAmB;EACnB,CAAC,CACD,QAAQ,mBAAmB,KAAK;CAClC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,QAAQ,KAAK;CAC9C,mBAAmB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CACnD,kBAAkB,mBAAmB,UAAU;CAC/C,CAAC;AAIF,MAAa,yBAAyB,EAAE,OAAO;CAC9C,IAAI,EAAE,QAAQ;CACd,gBAAgB,EAAE,QAAQ;CAC1B,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,YAAY,EAAE,QAAQ;CACtB,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,CAAC"}
1
+ {"version":3,"file":"schemas.js","names":[],"sources":["../src/schemas.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { timelineItemSchema } from \"./api/timeline-item\";\nimport { ConversationEventType, ConversationStatus } from \"./enums\";\n\nexport const viewSchema = z.object({\n\tid: z.string(),\n\tname: z.string(),\n\tdescription: z.string().nullable(),\n\tprompt: z.string().nullable(),\n\torganizationId: z.string(),\n\twebsiteId: z.string(),\n\tcreatedAt: z.string(),\n\tupdatedAt: z.string(),\n\tdeletedAt: z.string().nullable(),\n});\n\nexport type InboxView = z.infer<typeof viewSchema>;\n\nexport const conversationSchema = z.object({\n\tid: z.string(),\n\ttitle: z.string().optional(),\n\tcreatedAt: z.string(),\n\tupdatedAt: z.string(),\n\tvisitorId: z.string(),\n\twebsiteId: z.string(),\n\tstatus: z\n\t\t.enum([\n\t\t\tConversationStatus.OPEN,\n\t\t\tConversationStatus.RESOLVED,\n\t\t\tConversationStatus.SPAM,\n\t\t])\n\t\t.default(ConversationStatus.OPEN),\n\tvisitorRating: z.number().int().min(1).max(5).nullable().optional(),\n\tvisitorRatingAt: z.string().nullable().optional(),\n\tdeletedAt: z.string().nullable().default(null),\n\tvisitorLastSeenAt: z.string().nullable().optional(),\n\tlastTimelineItem: timelineItemSchema.optional(),\n});\n\nexport type Conversation = z.infer<typeof conversationSchema>;\n\nexport const conversationSeenSchema = z.object({\n\tid: z.string(),\n\tconversationId: z.string(),\n\tuserId: z.string().nullable(),\n\tvisitorId: z.string().nullable(),\n\taiAgentId: z.string().nullable(),\n\tlastSeenAt: z.string(),\n\tcreatedAt: z.string(),\n\tupdatedAt: z.string(),\n\tdeletedAt: z.string().nullable(),\n});\n\nexport type ConversationSeen = z.infer<typeof conversationSeenSchema>;\n"],"mappings":";;;;;AAIA,MAAa,aAAa,EAAE,OAAO;CAClC,IAAI,EAAE,QAAQ;CACd,MAAM,EAAE,QAAQ;CAChB,aAAa,EAAE,QAAQ,CAAC,UAAU;CAClC,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,gBAAgB,EAAE,QAAQ;CAC1B,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,CAAC;AAIF,MAAa,qBAAqB,EAAE,OAAO;CAC1C,IAAI,EAAE,QAAQ;CACd,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,QAAQ,EACN,KAAK;EACL,mBAAmB;EACnB,mBAAmB;EACnB,mBAAmB;EACnB,CAAC,CACD,QAAQ,mBAAmB,KAAK;CAClC,eAAe,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU;CACnE,iBAAiB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CACjD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,QAAQ,KAAK;CAC9C,mBAAmB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CACnD,kBAAkB,mBAAmB,UAAU;CAC/C,CAAC;AAIF,MAAa,yBAAyB,EAAE,OAAO;CAC9C,IAAI,EAAE,QAAQ;CACd,gBAAgB,EAAE,QAAQ;CAC1B,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,YAAY,EAAE,QAAQ;CACtB,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,CAAC"}