@cossistant/types 0.1.1 → 0.1.2

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.
Files changed (73) hide show
  1. package/api/ai-agent-capabilities.d.ts +16 -19
  2. package/api/ai-agent-capabilities.d.ts.map +1 -1
  3. package/api/ai-agent-capabilities.js +215 -286
  4. package/api/ai-agent-capabilities.js.map +1 -1
  5. package/api/ai-agent-defaults.d.ts +6 -0
  6. package/api/ai-agent-defaults.d.ts.map +1 -0
  7. package/api/ai-agent-defaults.js +33 -0
  8. package/api/ai-agent-defaults.js.map +1 -0
  9. package/api/ai-agent.d.ts +311 -204
  10. package/api/ai-agent.d.ts.map +1 -1
  11. package/api/ai-agent.js +175 -111
  12. package/api/ai-agent.js.map +1 -1
  13. package/api/conversation.d.ts +29 -6
  14. package/api/conversation.d.ts.map +1 -1
  15. package/api/conversation.js +7 -2
  16. package/api/conversation.js.map +1 -1
  17. package/api/feedback.d.ts +5 -0
  18. package/api/feedback.d.ts.map +1 -1
  19. package/api/feedback.js +2 -0
  20. package/api/feedback.js.map +1 -1
  21. package/api/index.d.ts +7 -6
  22. package/api/index.js +7 -6
  23. package/api/knowledge.d.ts.map +1 -1
  24. package/api/link-source.d.ts +4 -4
  25. package/api/link-source.d.ts.map +1 -1
  26. package/api/link-source.js +1 -1
  27. package/api/link-source.js.map +1 -1
  28. package/api/timeline-item.d.ts +18 -6
  29. package/api/timeline-item.d.ts.map +1 -1
  30. package/api/timeline-item.js +3 -1
  31. package/api/timeline-item.js.map +1 -1
  32. package/api/user.d.ts +1 -1
  33. package/api/user.d.ts.map +1 -1
  34. package/api/user.js +2 -2
  35. package/api/user.js.map +1 -1
  36. package/api/visitor.d.ts +225 -1
  37. package/api/visitor.d.ts.map +1 -1
  38. package/api/visitor.js +142 -1
  39. package/api/visitor.js.map +1 -1
  40. package/api/website.d.ts +12 -3
  41. package/api/website.d.ts.map +1 -1
  42. package/api/website.js +16 -2
  43. package/api/website.js.map +1 -1
  44. package/enums.d.ts +2 -0
  45. package/enums.d.ts.map +1 -1
  46. package/enums.js +3 -1
  47. package/enums.js.map +1 -1
  48. package/index.d.ts +9 -8
  49. package/index.d.ts.map +1 -1
  50. package/index.js +9 -8
  51. package/package.json +1 -1
  52. package/realtime-events.d.ts +74 -4
  53. package/realtime-events.d.ts.map +1 -1
  54. package/realtime-events.js +6 -2
  55. package/realtime-events.js.map +1 -1
  56. package/schemas.d.ts +3 -1
  57. package/schemas.d.ts.map +1 -1
  58. package/tool-timeline-policy.d.ts +19 -2
  59. package/tool-timeline-policy.d.ts.map +1 -1
  60. package/tool-timeline-policy.js +29 -6
  61. package/tool-timeline-policy.js.map +1 -1
  62. package/trpc/conversation-hard-limit.d.ts +30 -0
  63. package/trpc/conversation-hard-limit.d.ts.map +1 -0
  64. package/trpc/conversation-hard-limit.js +43 -0
  65. package/trpc/conversation-hard-limit.js.map +1 -0
  66. package/trpc/conversation.d.ts +44 -4
  67. package/trpc/conversation.d.ts.map +1 -1
  68. package/trpc/conversation.js +6 -0
  69. package/trpc/conversation.js.map +1 -1
  70. package/trpc/visitor.d.ts +73 -15
  71. package/trpc/visitor.d.ts.map +1 -1
  72. package/trpc/visitor.js +15 -8
  73. package/trpc/visitor.js.map +1 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cossistant/types",
3
3
  "type": "module",
4
- "version": "0.1.1",
4
+ "version": "0.1.2",
5
5
  "private": false,
6
6
  "author": "Cossistant Team",
7
7
  "description": "Shared TypeScript types for Cossistant packages",
@@ -330,6 +330,8 @@ declare const realtimeSchema: {
330
330
  visitor_blocked: "visitor_blocked";
331
331
  visitor_unblocked: "visitor_unblocked";
332
332
  visitor_identified: "visitor_identified";
333
+ ai_paused: "ai_paused";
334
+ ai_resumed: "ai_resumed";
333
335
  }>;
334
336
  actorUserId: z.ZodNullable<z.ZodString>;
335
337
  actorAiAgentId: z.ZodNullable<z.ZodString>;
@@ -339,8 +341,8 @@ declare const realtimeSchema: {
339
341
  }, z.core.$strip>, z.ZodObject<{
340
342
  type: z.ZodLiteral<"metadata">;
341
343
  source: z.ZodEnum<{
342
- widget: "widget";
343
344
  email: "email";
345
+ widget: "widget";
344
346
  api: "api";
345
347
  }>;
346
348
  }, z.core.$strip>]>>;
@@ -383,6 +385,16 @@ declare const realtimeSchema: {
383
385
  websiteId: z.ZodString;
384
386
  channel: z.ZodString;
385
387
  title: z.ZodNullable<z.ZodString>;
388
+ titleSource: z.ZodNullable<z.ZodEnum<{
389
+ ai: "ai";
390
+ user: "user";
391
+ }>>;
392
+ sentiment: z.ZodNullable<z.ZodEnum<{
393
+ positive: "positive";
394
+ negative: "negative";
395
+ neutral: "neutral";
396
+ }>>;
397
+ sentimentConfidence: z.ZodNullable<z.ZodNumber>;
386
398
  resolutionTime: z.ZodNullable<z.ZodNumber>;
387
399
  visitorRating: z.ZodNullable<z.ZodNumber>;
388
400
  visitorRatingAt: z.ZodNullable<z.ZodString>;
@@ -603,6 +615,8 @@ declare const realtimeSchema: {
603
615
  visitor_blocked: "visitor_blocked";
604
616
  visitor_unblocked: "visitor_unblocked";
605
617
  visitor_identified: "visitor_identified";
618
+ ai_paused: "ai_paused";
619
+ ai_resumed: "ai_resumed";
606
620
  }>;
607
621
  actorUserId: z.ZodNullable<z.ZodString>;
608
622
  actorAiAgentId: z.ZodNullable<z.ZodString>;
@@ -612,8 +626,8 @@ declare const realtimeSchema: {
612
626
  }, z.core.$strip>, z.ZodObject<{
613
627
  type: z.ZodLiteral<"metadata">;
614
628
  source: z.ZodEnum<{
615
- widget: "widget";
616
629
  email: "email";
630
+ widget: "widget";
617
631
  api: "api";
618
632
  }>;
619
633
  }, z.core.$strip>]>>;
@@ -824,6 +838,8 @@ declare const realtimeSchema: {
824
838
  visitor_blocked: "visitor_blocked";
825
839
  visitor_unblocked: "visitor_unblocked";
826
840
  visitor_identified: "visitor_identified";
841
+ ai_paused: "ai_paused";
842
+ ai_resumed: "ai_resumed";
827
843
  }>;
828
844
  actorUserId: z.ZodNullable<z.ZodString>;
829
845
  actorAiAgentId: z.ZodNullable<z.ZodString>;
@@ -833,8 +849,8 @@ declare const realtimeSchema: {
833
849
  }, z.core.$strip>, z.ZodObject<{
834
850
  type: z.ZodLiteral<"metadata">;
835
851
  source: z.ZodEnum<{
836
- widget: "widget";
837
852
  email: "email";
853
+ widget: "widget";
838
854
  api: "api";
839
855
  }>;
840
856
  }, z.core.$strip>]>>;
@@ -844,6 +860,8 @@ declare const realtimeSchema: {
844
860
  createdAt: z.ZodString;
845
861
  deletedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
846
862
  }, z.core.$strip>>;
863
+ dashboardLocked: z.ZodOptional<z.ZodBoolean>;
864
+ dashboardLockReason: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"conversation_limit">, z.ZodNull]>>;
847
865
  viewIds: z.ZodArray<z.ZodString>;
848
866
  seenData: z.ZodArray<z.ZodObject<{
849
867
  id: z.ZodString;
@@ -890,6 +908,54 @@ declare const realtimeSchema: {
890
908
  blockedAt: z.ZodNullable<z.ZodString>;
891
909
  blockedByUserId: z.ZodNullable<z.ZodString>;
892
910
  isBlocked: z.ZodBoolean;
911
+ attribution: z.ZodNullable<z.ZodObject<{
912
+ version: z.ZodLiteral<1>;
913
+ firstTouch: z.ZodObject<{
914
+ channel: z.ZodEnum<{
915
+ email: "email";
916
+ direct: "direct";
917
+ paid: "paid";
918
+ organic_search: "organic_search";
919
+ social: "social";
920
+ referral: "referral";
921
+ }>;
922
+ isDirect: z.ZodBoolean;
923
+ referrer: z.ZodObject<{
924
+ url: z.ZodNullable<z.ZodString>;
925
+ domain: z.ZodNullable<z.ZodString>;
926
+ }, z.core.$strip>;
927
+ landing: z.ZodObject<{
928
+ url: z.ZodNullable<z.ZodString>;
929
+ path: z.ZodNullable<z.ZodString>;
930
+ title: z.ZodNullable<z.ZodString>;
931
+ }, z.core.$strip>;
932
+ utm: z.ZodObject<{
933
+ source: z.ZodNullable<z.ZodString>;
934
+ medium: z.ZodNullable<z.ZodString>;
935
+ campaign: z.ZodNullable<z.ZodString>;
936
+ content: z.ZodNullable<z.ZodString>;
937
+ term: z.ZodNullable<z.ZodString>;
938
+ }, z.core.$strip>;
939
+ clickIds: z.ZodObject<{
940
+ gclid: z.ZodNullable<z.ZodString>;
941
+ gbraid: z.ZodNullable<z.ZodString>;
942
+ wbraid: z.ZodNullable<z.ZodString>;
943
+ fbclid: z.ZodNullable<z.ZodString>;
944
+ msclkid: z.ZodNullable<z.ZodString>;
945
+ ttclid: z.ZodNullable<z.ZodString>;
946
+ li_fat_id: z.ZodNullable<z.ZodString>;
947
+ twclid: z.ZodNullable<z.ZodString>;
948
+ }, z.core.$strip>;
949
+ capturedAt: z.ZodString;
950
+ }, z.core.$strip>;
951
+ }, z.core.$strip>>;
952
+ currentPage: z.ZodNullable<z.ZodObject<{
953
+ url: z.ZodNullable<z.ZodString>;
954
+ path: z.ZodNullable<z.ZodString>;
955
+ title: z.ZodNullable<z.ZodString>;
956
+ referrerUrl: z.ZodNullable<z.ZodString>;
957
+ updatedAt: z.ZodString;
958
+ }, z.core.$strip>>;
893
959
  contact: z.ZodNullable<z.ZodObject<{
894
960
  id: z.ZodULID;
895
961
  externalId: z.ZodNullable<z.ZodString>;
@@ -932,6 +998,8 @@ declare const realtimeSchema: {
932
998
  visitor_blocked: "visitor_blocked";
933
999
  visitor_unblocked: "visitor_unblocked";
934
1000
  visitor_identified: "visitor_identified";
1001
+ ai_paused: "ai_paused";
1002
+ ai_resumed: "ai_resumed";
935
1003
  }>;
936
1004
  actorUserId: z.ZodNullable<z.ZodString>;
937
1005
  actorAiAgentId: z.ZodNullable<z.ZodString>;
@@ -976,6 +1044,8 @@ declare const realtimeSchema: {
976
1044
  resolvedByAiAgentId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
977
1045
  resolutionTime: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
978
1046
  deletedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1047
+ aiPausedUntil: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1048
+ viewIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
979
1049
  }, z.core.$strip>;
980
1050
  aiAgentId: z.ZodNullable<z.ZodString>;
981
1051
  }, z.core.$strip>;
@@ -1163,10 +1233,10 @@ declare const realtimeSchema: {
1163
1233
  linkSourceId: z.ZodString;
1164
1234
  status: z.ZodEnum<{
1165
1235
  pending: "pending";
1166
- mapping: "mapping";
1167
1236
  crawling: "crawling";
1168
1237
  completed: "completed";
1169
1238
  failed: "failed";
1239
+ mapping: "mapping";
1170
1240
  }>;
1171
1241
  discoveredPagesCount: z.ZodOptional<z.ZodNumber>;
1172
1242
  crawledPagesCount: z.ZodOptional<z.ZodNumber>;
@@ -1 +1 @@
1
- {"version":3,"file":"realtime-events.d.ts","names":[],"sources":["../src/realtime-events.ts"],"sourcesContent":[],"mappings":";;;cAWa,mBAAiB,CAAA,CAAA;;EAAjB,cAAA,aAKX;;;;;;;;AAL4B,cAWjB,cAXiB,EAAA;EAAA,SAAA,aAAA,aAAA,CAAA;IAWjB,SAAA,aA2WH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAEE,iBAAA,gBAAiC;KAEjC,+BAA+B,qBAAqB,CAAA,CAAE,cACzD,gBAAgB;KAGb,wBAAwB;QAC7B;WACG,qBAAqB;;KAGnB,gBAAA,WACL,oBAAoB,cAAc,KACvC;KAEU,4BAA4B,qBACvC,qBAAqB;;;;iBAKN,gCAAgC,yBACzC,mBAEJ,qBAAqB;;;;iBAQR,gBAAA,yBAAyC;iBAIzC,0BAA0B,0BAClC,cAAc,KACnB,qBAAqB"}
1
+ {"version":3,"file":"realtime-events.d.ts","names":[],"sources":["../src/realtime-events.ts"],"sourcesContent":[],"mappings":";;;cAWa,mBAAiB,CAAA,CAAA;;EAAjB,cAAA,aAKX;;;;;;;;AAL4B,cAWjB,cAXiB,EAAA;EAAA,SAAA,aAAA,aAAA,CAAA;IAWjB,SAAA,aA+WH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAEE,iBAAA,gBAAiC;KAEjC,+BAA+B,qBAAqB,CAAA,CAAE,cACzD,gBAAgB;KAGb,wBAAwB;QAC7B;WACG,qBAAqB;;KAGnB,gBAAA,WACL,oBAAoB,cAAc,KACvC;KAEU,4BAA4B,qBACvC,qBAAqB;;;;iBAKN,gCAAgC,yBACzC,mBAEJ,qBAAqB;;;;iBAQR,gBAAA,yBAAyC;iBAIzC,0BAA0B,0BAClC,cAAc,KACnB,qBAAqB"}
@@ -105,7 +105,9 @@ const realtimeSchema = {
105
105
  ConversationEventType.REOPENED,
106
106
  ConversationEventType.VISITOR_BLOCKED,
107
107
  ConversationEventType.VISITOR_UNBLOCKED,
108
- ConversationEventType.VISITOR_IDENTIFIED
108
+ ConversationEventType.VISITOR_IDENTIFIED,
109
+ ConversationEventType.AI_PAUSED,
110
+ ConversationEventType.AI_RESUMED
109
111
  ]),
110
112
  actorUserId: z.string().nullable(),
111
113
  actorAiAgentId: z.string().nullable(),
@@ -145,7 +147,9 @@ const realtimeSchema = {
145
147
  resolvedByUserId: z.string().nullable().optional(),
146
148
  resolvedByAiAgentId: z.string().nullable().optional(),
147
149
  resolutionTime: z.number().nullable().optional(),
148
- deletedAt: z.string().nullable().optional()
150
+ deletedAt: z.string().nullable().optional(),
151
+ aiPausedUntil: z.string().nullable().optional(),
152
+ viewIds: z.array(z.string()).optional()
149
153
  }),
150
154
  aiAgentId: z.string().nullable()
151
155
  }),
@@ -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\tConversationStatus,\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\tConversationTimelineType.TOOL,\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, 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\tstatus: z\n\t\t\t\t.enum([\n\t\t\t\t\tConversationStatus.OPEN,\n\t\t\t\t\tConversationStatus.RESOLVED,\n\t\t\t\t\tConversationStatus.SPAM,\n\t\t\t\t])\n\t\t\t\t.optional(),\n\t\t\tpriority: z.enum([\"low\", \"normal\", \"high\", \"urgent\"]).optional(),\n\t\t\tresolvedAt: z.string().nullable().optional(),\n\t\t\tresolvedByUserId: z.string().nullable().optional(),\n\t\t\tresolvedByAiAgentId: z.string().nullable().optional(),\n\t\t\tresolutionTime: z.number().nullable().optional(),\n\t\t\tdeletedAt: 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\tConversationTimelineType.TOOL,\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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"}
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\tConversationStatus,\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\tConversationTimelineType.TOOL,\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\tConversationEventType.AI_PAUSED,\n\t\t\t\tConversationEventType.AI_RESUMED,\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, 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\tstatus: z\n\t\t\t\t.enum([\n\t\t\t\t\tConversationStatus.OPEN,\n\t\t\t\t\tConversationStatus.RESOLVED,\n\t\t\t\t\tConversationStatus.SPAM,\n\t\t\t\t])\n\t\t\t\t.optional(),\n\t\t\tpriority: z.enum([\"low\", \"normal\", \"high\", \"urgent\"]).optional(),\n\t\t\tresolvedAt: z.string().nullable().optional(),\n\t\t\tresolvedByUserId: z.string().nullable().optional(),\n\t\t\tresolvedByAiAgentId: z.string().nullable().optional(),\n\t\t\tresolutionTime: z.number().nullable().optional(),\n\t\t\tdeletedAt: z.string().nullable().optional(),\n\t\t\taiPausedUntil: z.string().nullable().optional(),\n\t\t\tviewIds: z.array(z.string()).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\tConversationTimelineType.TOOL,\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
@@ -230,6 +230,8 @@ declare const conversationSchema: z.ZodObject<{
230
230
  visitor_blocked: "visitor_blocked";
231
231
  visitor_unblocked: "visitor_unblocked";
232
232
  visitor_identified: "visitor_identified";
233
+ ai_paused: "ai_paused";
234
+ ai_resumed: "ai_resumed";
233
235
  }>;
234
236
  actorUserId: z.ZodNullable<z.ZodString>;
235
237
  actorAiAgentId: z.ZodNullable<z.ZodString>;
@@ -239,8 +241,8 @@ declare const conversationSchema: z.ZodObject<{
239
241
  }, z.core.$strip>, z.ZodObject<{
240
242
  type: z.ZodLiteral<"metadata">;
241
243
  source: z.ZodEnum<{
242
- widget: "widget";
243
244
  email: "email";
245
+ widget: "widget";
244
246
  api: "api";
245
247
  }>;
246
248
  }, z.core.$strip>]>>;
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,UAmBX,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAEU,YAAA,GAAe,CAAA,CAAE,aAAa;cAE7B,wBAAsB,CAAA,CAAA;EAvBJ,EAAA,aAAA;EAAA,cAAA,aAAA;EAqBnB,MAAA,eAAY,YAAkB,CAAA;EAE7B,SAAA,eAAA,YAUX,CAAA;;;;;;;KAEU,gBAAA,GAAmB,CAAA,CAAE,aAAa"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAnB6B,KAqBnB,YAAA,GAAe,CAAA,CAAE,KArBE,CAAA,OAqBW,kBArBX,CAAA;AAAA,cAuBlB,sBAvBkB,EAuBI,CAAA,CAAA,SAvBJ,CAAA;EAqBnB,EAAA,aAAY;EAEX,cAAA,aAUX;;;;;;;;;KAEU,gBAAA,GAAmB,CAAA,CAAE,aAAa"}
@@ -5,9 +5,26 @@ declare const TOOL_TIMELINE_LOG_TYPE: {
5
5
  readonly DECISION: "decision";
6
6
  };
7
7
  type ToolTimelineLogType = (typeof TOOL_TIMELINE_LOG_TYPE)[keyof typeof TOOL_TIMELINE_LOG_TYPE];
8
- declare const TOOL_TIMELINE_CONVERSATION_ALLOWLIST: readonly ["searchKnowledgeBase", "updateConversationTitle", "updateSentiment"];
8
+ type WidgetToolActivityPolicy = {
9
+ timeline: boolean;
10
+ liveStatus: boolean;
11
+ defaultProgressMessage?: string | null;
12
+ };
13
+ declare const TOOL_WIDGET_ACTIVITY_REGISTRY: {
14
+ readonly searchKnowledgeBase: {
15
+ readonly timeline: true;
16
+ readonly liveStatus: true;
17
+ readonly defaultProgressMessage: "Searching knowledge base...";
18
+ };
19
+ };
20
+ declare const TOOL_TIMELINE_CONVERSATION_ALLOWLIST: readonly string[];
21
+ declare function getWidgetToolActivityPolicy(toolName: string): WidgetToolActivityPolicy | null;
22
+ declare function isWidgetVisibleTool(toolName: string): boolean;
23
+ declare function isWidgetTimelineTool(toolName: string): boolean;
24
+ declare function isWidgetLiveStatusTool(toolName: string): boolean;
25
+ declare function getWidgetToolDefaultProgressMessage(toolName: string): string | null;
9
26
  declare function isConversationVisibleTool(toolName: string): boolean;
10
27
  declare function getToolLogType(toolName: string): ToolTimelineLogType;
11
28
  //#endregion
12
- export { TOOL_TIMELINE_CONVERSATION_ALLOWLIST, TOOL_TIMELINE_LOG_TYPE, ToolTimelineLogType, getToolLogType, isConversationVisibleTool };
29
+ export { TOOL_TIMELINE_CONVERSATION_ALLOWLIST, TOOL_TIMELINE_LOG_TYPE, TOOL_WIDGET_ACTIVITY_REGISTRY, ToolTimelineLogType, WidgetToolActivityPolicy, getToolLogType, getWidgetToolActivityPolicy, getWidgetToolDefaultProgressMessage, isConversationVisibleTool, isWidgetLiveStatusTool, isWidgetTimelineTool, isWidgetVisibleTool };
13
30
  //# sourceMappingURL=tool-timeline-policy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-timeline-policy.d.ts","names":[],"sources":["../src/tool-timeline-policy.ts"],"sourcesContent":[],"mappings":";cAAa;EAAA,SAAA,eAAA,EAIH,iBAAA;EAEE,SAAA,GAAA,EAAA,KAAA;EAGC,SAAA,QAAA,EAAA,UAAA;AAUb,CAAA;AAIgB,KAjBJ,mBAAA,GAiBsC,CAAA,OAhBzC,sBAgB4D,CAAA,CAAA,MAAA,OAhBvB,sBAgBuB,CAAA;cAdxD;iBAUG,yBAAA;iBAIA,cAAA,oBAAkC"}
1
+ {"version":3,"file":"tool-timeline-policy.d.ts","names":[],"sources":["../src/tool-timeline-policy.ts"],"sourcesContent":[],"mappings":";cAAa;EAAA,SAAA,eAAA,EAIH,iBAAA;EAEE,SAAA,GAAA,EAAA,KAAA;EAGA,SAAA,QAAA,EAAA,UAAwB;AAMpC,CAAA;AAmBa,KA5BD,mBAAA,GA4BC,CAAA,OA3BJ,sBA6Ba,CAAA,CAAA,MAAA,OA7BwB,sBA6BxB,CAAA;AAEN,KA7BJ,wBAAA,GA6B+B;EAM3B,QAAA,EAAA,OAAA;EAIA,UAAA,EAAA,OAAA;EAIA,sBAAA,CAAA,EAAsB,MAAA,GAAA,IAAA;AAItC,CAAA;AAMgB,cA/CH,6BA+C4B,EAAA;EAIzB,SAAA,mBAAc,EAAoB;;;;;;cAhCrC;iBAIG,2BAAA,oBAEb;iBAIa,mBAAA;iBAIA,oBAAA;iBAIA,sBAAA;iBAIA,mCAAA;iBAMA,yBAAA;iBAIA,cAAA,oBAAkC"}
@@ -4,14 +4,37 @@ const TOOL_TIMELINE_LOG_TYPE = {
4
4
  LOG: "log",
5
5
  DECISION: "decision"
6
6
  };
7
- const TOOL_TIMELINE_CONVERSATION_ALLOWLIST = [
7
+ const TOOL_WIDGET_ACTIVITY_REGISTRY = { searchKnowledgeBase: {
8
+ timeline: true,
9
+ liveStatus: true,
10
+ defaultProgressMessage: "Searching knowledge base..."
11
+ } };
12
+ const DASHBOARD_CONVERSATION_VISIBLE_TOOL_NAMES = new Set([
8
13
  "searchKnowledgeBase",
9
14
  "updateConversationTitle",
10
- "updateSentiment"
11
- ];
12
- const CONVERSATION_VISIBLE_TOOLS = new Set(TOOL_TIMELINE_CONVERSATION_ALLOWLIST);
15
+ "setConversationTitle",
16
+ "updateSentiment",
17
+ "setPriority"
18
+ ]);
19
+ const WIDGET_TOOL_ACTIVITY_POLICIES = TOOL_WIDGET_ACTIVITY_REGISTRY;
20
+ const TOOL_TIMELINE_CONVERSATION_ALLOWLIST = Object.freeze(Object.keys(WIDGET_TOOL_ACTIVITY_POLICIES));
21
+ function getWidgetToolActivityPolicy(toolName) {
22
+ return WIDGET_TOOL_ACTIVITY_POLICIES[toolName] ?? null;
23
+ }
24
+ function isWidgetVisibleTool(toolName) {
25
+ return Boolean(getWidgetToolActivityPolicy(toolName));
26
+ }
27
+ function isWidgetTimelineTool(toolName) {
28
+ return getWidgetToolActivityPolicy(toolName)?.timeline === true;
29
+ }
30
+ function isWidgetLiveStatusTool(toolName) {
31
+ return getWidgetToolActivityPolicy(toolName)?.liveStatus === true;
32
+ }
33
+ function getWidgetToolDefaultProgressMessage(toolName) {
34
+ return getWidgetToolActivityPolicy(toolName)?.defaultProgressMessage ?? null;
35
+ }
13
36
  function isConversationVisibleTool(toolName) {
14
- return CONVERSATION_VISIBLE_TOOLS.has(toolName);
37
+ return DASHBOARD_CONVERSATION_VISIBLE_TOOL_NAMES.has(toolName);
15
38
  }
16
39
  function getToolLogType(toolName) {
17
40
  if (toolName === "aiDecision") return TOOL_TIMELINE_LOG_TYPE.DECISION;
@@ -20,5 +43,5 @@ function getToolLogType(toolName) {
20
43
  }
21
44
 
22
45
  //#endregion
23
- export { TOOL_TIMELINE_CONVERSATION_ALLOWLIST, TOOL_TIMELINE_LOG_TYPE, getToolLogType, isConversationVisibleTool };
46
+ export { TOOL_TIMELINE_CONVERSATION_ALLOWLIST, TOOL_TIMELINE_LOG_TYPE, TOOL_WIDGET_ACTIVITY_REGISTRY, getToolLogType, getWidgetToolActivityPolicy, getWidgetToolDefaultProgressMessage, isConversationVisibleTool, isWidgetLiveStatusTool, isWidgetTimelineTool, isWidgetVisibleTool };
24
47
  //# sourceMappingURL=tool-timeline-policy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-timeline-policy.js","names":[],"sources":["../src/tool-timeline-policy.ts"],"sourcesContent":["export const TOOL_TIMELINE_LOG_TYPE = {\n\tCUSTOMER_FACING: \"customer_facing\",\n\tLOG: \"log\",\n\tDECISION: \"decision\",\n} as const;\n\nexport type ToolTimelineLogType =\n\t(typeof TOOL_TIMELINE_LOG_TYPE)[keyof typeof TOOL_TIMELINE_LOG_TYPE];\n\nexport const TOOL_TIMELINE_CONVERSATION_ALLOWLIST = [\n\t\"searchKnowledgeBase\",\n\t\"updateConversationTitle\",\n\t\"updateSentiment\",\n] as const;\n\nconst CONVERSATION_VISIBLE_TOOLS = new Set<string>(\n\tTOOL_TIMELINE_CONVERSATION_ALLOWLIST\n);\n\nexport function isConversationVisibleTool(toolName: string): boolean {\n\treturn CONVERSATION_VISIBLE_TOOLS.has(toolName);\n}\n\nexport function getToolLogType(toolName: string): ToolTimelineLogType {\n\tif (toolName === \"aiDecision\") {\n\t\treturn TOOL_TIMELINE_LOG_TYPE.DECISION;\n\t}\n\n\tif (isConversationVisibleTool(toolName)) {\n\t\treturn TOOL_TIMELINE_LOG_TYPE.CUSTOMER_FACING;\n\t}\n\n\treturn TOOL_TIMELINE_LOG_TYPE.LOG;\n}\n"],"mappings":";AAAA,MAAa,yBAAyB;CACrC,iBAAiB;CACjB,KAAK;CACL,UAAU;CACV;AAKD,MAAa,uCAAuC;CACnD;CACA;CACA;CACA;AAED,MAAM,6BAA6B,IAAI,IACtC,qCACA;AAED,SAAgB,0BAA0B,UAA2B;AACpE,QAAO,2BAA2B,IAAI,SAAS;;AAGhD,SAAgB,eAAe,UAAuC;AACrE,KAAI,aAAa,aAChB,QAAO,uBAAuB;AAG/B,KAAI,0BAA0B,SAAS,CACtC,QAAO,uBAAuB;AAG/B,QAAO,uBAAuB"}
1
+ {"version":3,"file":"tool-timeline-policy.js","names":["WIDGET_TOOL_ACTIVITY_POLICIES: Record<string, WidgetToolActivityPolicy>"],"sources":["../src/tool-timeline-policy.ts"],"sourcesContent":["export const TOOL_TIMELINE_LOG_TYPE = {\n\tCUSTOMER_FACING: \"customer_facing\",\n\tLOG: \"log\",\n\tDECISION: \"decision\",\n} as const;\n\nexport type ToolTimelineLogType =\n\t(typeof TOOL_TIMELINE_LOG_TYPE)[keyof typeof TOOL_TIMELINE_LOG_TYPE];\n\nexport type WidgetToolActivityPolicy = {\n\ttimeline: boolean;\n\tliveStatus: boolean;\n\tdefaultProgressMessage?: string | null;\n};\n\nexport const TOOL_WIDGET_ACTIVITY_REGISTRY = {\n\tsearchKnowledgeBase: {\n\t\ttimeline: true,\n\t\tliveStatus: true,\n\t\tdefaultProgressMessage: \"Searching knowledge base...\",\n\t},\n} as const satisfies Record<string, WidgetToolActivityPolicy>;\n\nconst DASHBOARD_CONVERSATION_VISIBLE_TOOL_NAMES = new Set([\n\t\"searchKnowledgeBase\",\n\t\"updateConversationTitle\",\n\t\"setConversationTitle\",\n\t\"updateSentiment\",\n\t\"setPriority\",\n]);\n\nconst WIDGET_TOOL_ACTIVITY_POLICIES: Record<string, WidgetToolActivityPolicy> =\n\tTOOL_WIDGET_ACTIVITY_REGISTRY;\n\nexport const TOOL_TIMELINE_CONVERSATION_ALLOWLIST = Object.freeze(\n\tObject.keys(WIDGET_TOOL_ACTIVITY_POLICIES)\n) as readonly string[];\n\nexport function getWidgetToolActivityPolicy(\n\ttoolName: string\n): WidgetToolActivityPolicy | null {\n\treturn WIDGET_TOOL_ACTIVITY_POLICIES[toolName] ?? null;\n}\n\nexport function isWidgetVisibleTool(toolName: string): boolean {\n\treturn Boolean(getWidgetToolActivityPolicy(toolName));\n}\n\nexport function isWidgetTimelineTool(toolName: string): boolean {\n\treturn getWidgetToolActivityPolicy(toolName)?.timeline === true;\n}\n\nexport function isWidgetLiveStatusTool(toolName: string): boolean {\n\treturn getWidgetToolActivityPolicy(toolName)?.liveStatus === true;\n}\n\nexport function getWidgetToolDefaultProgressMessage(\n\ttoolName: string\n): string | null {\n\treturn getWidgetToolActivityPolicy(toolName)?.defaultProgressMessage ?? null;\n}\n\nexport function isConversationVisibleTool(toolName: string): boolean {\n\treturn DASHBOARD_CONVERSATION_VISIBLE_TOOL_NAMES.has(toolName);\n}\n\nexport function getToolLogType(toolName: string): ToolTimelineLogType {\n\tif (toolName === \"aiDecision\") {\n\t\treturn TOOL_TIMELINE_LOG_TYPE.DECISION;\n\t}\n\n\tif (isConversationVisibleTool(toolName)) {\n\t\treturn TOOL_TIMELINE_LOG_TYPE.CUSTOMER_FACING;\n\t}\n\n\treturn TOOL_TIMELINE_LOG_TYPE.LOG;\n}\n"],"mappings":";AAAA,MAAa,yBAAyB;CACrC,iBAAiB;CACjB,KAAK;CACL,UAAU;CACV;AAWD,MAAa,gCAAgC,EAC5C,qBAAqB;CACpB,UAAU;CACV,YAAY;CACZ,wBAAwB;CACxB,EACD;AAED,MAAM,4CAA4C,IAAI,IAAI;CACzD;CACA;CACA;CACA;CACA;CACA,CAAC;AAEF,MAAMA,gCACL;AAED,MAAa,uCAAuC,OAAO,OAC1D,OAAO,KAAK,8BAA8B,CAC1C;AAED,SAAgB,4BACf,UACkC;AAClC,QAAO,8BAA8B,aAAa;;AAGnD,SAAgB,oBAAoB,UAA2B;AAC9D,QAAO,QAAQ,4BAA4B,SAAS,CAAC;;AAGtD,SAAgB,qBAAqB,UAA2B;AAC/D,QAAO,4BAA4B,SAAS,EAAE,aAAa;;AAG5D,SAAgB,uBAAuB,UAA2B;AACjE,QAAO,4BAA4B,SAAS,EAAE,eAAe;;AAG9D,SAAgB,oCACf,UACgB;AAChB,QAAO,4BAA4B,SAAS,EAAE,0BAA0B;;AAGzE,SAAgB,0BAA0B,UAA2B;AACpE,QAAO,0CAA0C,IAAI,SAAS;;AAG/D,SAAgB,eAAe,UAAuC;AACrE,KAAI,aAAa,aAChB,QAAO,uBAAuB;AAG/B,KAAI,0BAA0B,SAAS,CACtC,QAAO,uBAAuB;AAG/B,QAAO,uBAAuB"}
@@ -0,0 +1,30 @@
1
+ //#region src/trpc/conversation-hard-limit.d.ts
2
+ declare const DASHBOARD_CONVERSATION_LOCK_REASON: "conversation_limit";
3
+ type DashboardConversationLockReason = typeof DASHBOARD_CONVERSATION_LOCK_REASON;
4
+ type ConversationHardLimitCutoff = {
5
+ id: string;
6
+ createdAt: string;
7
+ };
8
+ type DashboardLockableConversation = {
9
+ id: string;
10
+ createdAt: string;
11
+ title: string | null;
12
+ lastTimelineItem: unknown | null;
13
+ lastMessageTimelineItem: unknown | null;
14
+ lastMessageAt: string | null;
15
+ dashboardLocked?: boolean;
16
+ dashboardLockReason?: DashboardConversationLockReason | null;
17
+ };
18
+ type DashboardLockMetadata = {
19
+ dashboardLocked: boolean;
20
+ dashboardLockReason: DashboardConversationLockReason | null;
21
+ };
22
+ declare function isConversationAfterHardLimitCutoff(value: Pick<DashboardLockableConversation, "createdAt" | "id">, cutoff: ConversationHardLimitCutoff | null): boolean;
23
+ declare function applyDashboardConversationHardLimitLock<T extends DashboardLockableConversation>(params: {
24
+ conversation: T;
25
+ cutoff: ConversationHardLimitCutoff | null;
26
+ }): T & DashboardLockMetadata;
27
+ declare function ensureDashboardConversationLockRedaction<T extends DashboardLockableConversation>(conversation: T): T & DashboardLockMetadata;
28
+ //#endregion
29
+ export { ConversationHardLimitCutoff, DASHBOARD_CONVERSATION_LOCK_REASON, DashboardConversationLockReason, DashboardLockableConversation, applyDashboardConversationHardLimitLock, ensureDashboardConversationLockRedaction, isConversationAfterHardLimitCutoff };
30
+ //# sourceMappingURL=conversation-hard-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-hard-limit.d.ts","names":[],"sources":["../../src/trpc/conversation-hard-limit.ts"],"sourcesContent":[],"mappings":";cAAa;AAAA,KAED,+BAAA,GAFmE,OAGvE,kCAHuE;AAEnE,KAGA,2BAAA,GAH+B;EAG/B,EAAA,EAAA,MAAA;EAKA,SAAA,EAAA,MAAA;AASV,CAAA;AAOc,KAhBJ,6BAAA,GAgBsC;EACrC,EAAA,EAAA,MAAA;EAAL,SAAA,EAAA,MAAA;EACC,KAAA,EAAA,MAAA,GAAA,IAAA;EAA2B,gBAAA,EAAA,OAAA,GAAA,IAAA;EAiBpB,uBAAA,EAAA,OAAA,GAAA,IAAA;EACL,aAAA,EAAA,MAAA,GAAA,IAAA;EAEI,eAAA,CAAA,EAAA,OAAA;EACN,mBAAA,CAAA,EA/Bc,+BA+Bd,GAAA,IAAA;CACL;KA7BC,qBAAA,GA6BG;EAAqB,eAAA,EAAA,OAAA;EAsBb,mBAAA,EAjDM,+BAiDkC,GAAA,IAAA;CAC7C;AACK,iBAhDA,kCAAA,CAgDA,KAAA,EA/CR,IA+CQ,CA/CH,6BA+CG,EAAA,WAAA,GAAA,IAAA,CAAA,EAAA,MAAA,EA9CP,2BA8CO,GAAA,IAAA,CAAA,EAAA,OAAA;AAAI,iBA7BJ,uCA6BI,CAAA,UA5BT,6BA4BS,CAAA,CAAA,MAAA,EAAA;EAAI,YAAA,EA1BT,CA0BS;EAAqB,MAAA,EAzBpC,2BAyBoC,GAAA,IAAA;IAxBzC,IAAI;iBAsBQ,mDACL,6CACK,IAAI,IAAI"}
@@ -0,0 +1,43 @@
1
+ //#region src/trpc/conversation-hard-limit.ts
2
+ const DASHBOARD_CONVERSATION_LOCK_REASON = "conversation_limit";
3
+ function isConversationAfterHardLimitCutoff(value, cutoff) {
4
+ if (!cutoff) return false;
5
+ if (value.createdAt > cutoff.createdAt) return true;
6
+ if (value.createdAt < cutoff.createdAt) return false;
7
+ return value.id > cutoff.id;
8
+ }
9
+ function applyDashboardConversationHardLimitLock(params) {
10
+ const { conversation, cutoff } = params;
11
+ if (!isConversationAfterHardLimitCutoff(conversation, cutoff)) return {
12
+ ...conversation,
13
+ dashboardLocked: false,
14
+ dashboardLockReason: null
15
+ };
16
+ return {
17
+ ...conversation,
18
+ lastTimelineItem: null,
19
+ lastMessageTimelineItem: null,
20
+ lastMessageAt: null,
21
+ dashboardLocked: true,
22
+ dashboardLockReason: DASHBOARD_CONVERSATION_LOCK_REASON
23
+ };
24
+ }
25
+ function ensureDashboardConversationLockRedaction(conversation) {
26
+ if (!conversation.dashboardLocked) return {
27
+ ...conversation,
28
+ dashboardLocked: false,
29
+ dashboardLockReason: null
30
+ };
31
+ return {
32
+ ...conversation,
33
+ lastTimelineItem: null,
34
+ lastMessageTimelineItem: null,
35
+ lastMessageAt: null,
36
+ dashboardLocked: true,
37
+ dashboardLockReason: conversation.dashboardLockReason ?? DASHBOARD_CONVERSATION_LOCK_REASON
38
+ };
39
+ }
40
+
41
+ //#endregion
42
+ export { DASHBOARD_CONVERSATION_LOCK_REASON, applyDashboardConversationHardLimitLock, ensureDashboardConversationLockRedaction, isConversationAfterHardLimitCutoff };
43
+ //# sourceMappingURL=conversation-hard-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-hard-limit.js","names":[],"sources":["../../src/trpc/conversation-hard-limit.ts"],"sourcesContent":["export const DASHBOARD_CONVERSATION_LOCK_REASON = \"conversation_limit\" as const;\n\nexport type DashboardConversationLockReason =\n\ttypeof DASHBOARD_CONVERSATION_LOCK_REASON;\n\nexport type ConversationHardLimitCutoff = {\n\tid: string;\n\tcreatedAt: string;\n};\n\nexport type DashboardLockableConversation = {\n\tid: string;\n\tcreatedAt: string;\n\ttitle: string | null;\n\tlastTimelineItem: unknown | null;\n\tlastMessageTimelineItem: unknown | null;\n\tlastMessageAt: string | null;\n\tdashboardLocked?: boolean;\n\tdashboardLockReason?: DashboardConversationLockReason | null;\n};\n\ntype DashboardLockMetadata = {\n\tdashboardLocked: boolean;\n\tdashboardLockReason: DashboardConversationLockReason | null;\n};\n\nexport function isConversationAfterHardLimitCutoff(\n\tvalue: Pick<DashboardLockableConversation, \"createdAt\" | \"id\">,\n\tcutoff: ConversationHardLimitCutoff | null\n): boolean {\n\tif (!cutoff) {\n\t\treturn false;\n\t}\n\n\tif (value.createdAt > cutoff.createdAt) {\n\t\treturn true;\n\t}\n\n\tif (value.createdAt < cutoff.createdAt) {\n\t\treturn false;\n\t}\n\n\treturn value.id > cutoff.id;\n}\n\nexport function applyDashboardConversationHardLimitLock<\n\tT extends DashboardLockableConversation,\n>(params: {\n\tconversation: T;\n\tcutoff: ConversationHardLimitCutoff | null;\n}): T & DashboardLockMetadata {\n\tconst { conversation, cutoff } = params;\n\tconst isLocked = isConversationAfterHardLimitCutoff(conversation, cutoff);\n\n\tif (!isLocked) {\n\t\treturn {\n\t\t\t...conversation,\n\t\t\tdashboardLocked: false,\n\t\t\tdashboardLockReason: null,\n\t\t};\n\t}\n\n\treturn {\n\t\t...conversation,\n\t\tlastTimelineItem: null,\n\t\tlastMessageTimelineItem: null,\n\t\tlastMessageAt: null,\n\t\tdashboardLocked: true,\n\t\tdashboardLockReason: DASHBOARD_CONVERSATION_LOCK_REASON,\n\t};\n}\n\nexport function ensureDashboardConversationLockRedaction<\n\tT extends DashboardLockableConversation,\n>(conversation: T): T & DashboardLockMetadata {\n\tif (!conversation.dashboardLocked) {\n\t\treturn {\n\t\t\t...conversation,\n\t\t\tdashboardLocked: false,\n\t\t\tdashboardLockReason: null,\n\t\t};\n\t}\n\n\treturn {\n\t\t...conversation,\n\t\tlastTimelineItem: null,\n\t\tlastMessageTimelineItem: null,\n\t\tlastMessageAt: null,\n\t\tdashboardLocked: true,\n\t\tdashboardLockReason:\n\t\t\tconversation.dashboardLockReason ?? DASHBOARD_CONVERSATION_LOCK_REASON,\n\t};\n}\n"],"mappings":";AAAA,MAAa,qCAAqC;AA0BlD,SAAgB,mCACf,OACA,QACU;AACV,KAAI,CAAC,OACJ,QAAO;AAGR,KAAI,MAAM,YAAY,OAAO,UAC5B,QAAO;AAGR,KAAI,MAAM,YAAY,OAAO,UAC5B,QAAO;AAGR,QAAO,MAAM,KAAK,OAAO;;AAG1B,SAAgB,wCAEd,QAG4B;CAC7B,MAAM,EAAE,cAAc,WAAW;AAGjC,KAAI,CAFa,mCAAmC,cAAc,OAAO,CAGxE,QAAO;EACN,GAAG;EACH,iBAAiB;EACjB,qBAAqB;EACrB;AAGF,QAAO;EACN,GAAG;EACH,kBAAkB;EAClB,yBAAyB;EACzB,eAAe;EACf,iBAAiB;EACjB,qBAAqB;EACrB;;AAGF,SAAgB,yCAEd,cAA4C;AAC7C,KAAI,CAAC,aAAa,gBACjB,QAAO;EACN,GAAG;EACH,iBAAiB;EACjB,qBAAqB;EACrB;AAGF,QAAO;EACN,GAAG;EACH,kBAAkB;EAClB,yBAAyB;EACzB,eAAe;EACf,iBAAiB;EACjB,qBACC,aAAa,uBAAuB;EACrC"}