@deepfrog/pangents-widget 2.1.4 → 2.1.5

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 (88) hide show
  1. package/dist/App.d.ts +2 -0
  2. package/dist/Widget.d.ts +11 -0
  3. package/dist/components/ApiKeyError.d.ts +5 -0
  4. package/dist/components/CallDetailsPage.d.ts +8 -0
  5. package/dist/components/CallLogsPage.d.ts +1 -0
  6. package/dist/components/CallQueueCard.d.ts +8 -0
  7. package/dist/components/CarrierResultCard.d.ts +10 -0
  8. package/dist/components/ChatbotWidget.d.ts +19 -0
  9. package/dist/components/CompactApiKeyError.d.ts +8 -0
  10. package/dist/components/Empty.d.ts +1 -0
  11. package/dist/components/ErrorBoundary.d.ts +17 -0
  12. package/dist/components/HistoryScreen.d.ts +1 -0
  13. package/dist/components/LoginScreen.d.ts +5 -0
  14. package/dist/components/PoweredByFooter.d.ts +2 -0
  15. package/dist/components/SearchCarriersForm.d.ts +8 -0
  16. package/dist/components/SearchResults.d.ts +13 -0
  17. package/dist/components/SettingsScreen.d.ts +1 -0
  18. package/dist/components/WidgetBubble.d.ts +6 -0
  19. package/dist/components/WidgetPopup.d.ts +5 -0
  20. package/dist/components/ui/button.d.ts +12 -0
  21. package/dist/components/ui/card.d.ts +8 -0
  22. package/dist/components/ui/confirmation-modal.d.ts +15 -0
  23. package/dist/components/ui/input.d.ts +3 -0
  24. package/dist/components/ui/tabs.d.ts +7 -0
  25. package/dist/context/CarrierSearchContext.d.ts +20 -0
  26. package/dist/context/ChatContext.d.ts +40 -0
  27. package/dist/data/mockCallDetails.d.ts +5 -0
  28. package/dist/data/mockData.d.ts +8 -0
  29. package/dist/hooks/useInfiniteScroll.d.ts +24 -0
  30. package/dist/hooks/useTheme.d.ts +7 -0
  31. package/dist/index.cjs.js +10 -0
  32. package/dist/index.cjs.js.map +1 -0
  33. package/dist/index.d.ts +6 -0
  34. package/dist/index.es.js +83 -0
  35. package/dist/index.es.js.map +1 -0
  36. package/dist/lib/utils.d.ts +2 -0
  37. package/dist/main.d.ts +1 -0
  38. package/dist/pages/CallDetailsPage.d.ts +1 -0
  39. package/dist/pages/EmailLeads/EmailLeadDetail.d.ts +1 -0
  40. package/dist/pages/EmailLeads/index.d.ts +1 -0
  41. package/dist/pages/Home.d.ts +1 -0
  42. package/dist/pages/SearchCarriersPage.d.ts +1 -0
  43. package/dist/pages/SearchResultsPage.d.ts +1 -0
  44. package/dist/pangents-widget.css +1 -0
  45. package/dist/routes/AppRouter.d.ts +1 -0
  46. package/dist/services/api/apiKeyValidation.d.ts +145 -0
  47. package/dist/services/api/authService.d.ts +39 -0
  48. package/dist/services/api/carrierService.d.ts +13 -0
  49. package/dist/services/api/client.d.ts +22 -0
  50. package/dist/services/api/dashboardService.d.ts +16 -0
  51. package/dist/services/api/emailLeadsService.d.ts +31 -0
  52. package/dist/services/api/interceptors.d.ts +4 -0
  53. package/dist/services/api/workflowService.d.ts +36 -0
  54. package/dist/services/auth/session.d.ts +44 -0
  55. package/dist/services/auth/tokens.d.ts +25 -0
  56. package/dist/services/cache/ApiKeyTracker.d.ts +78 -0
  57. package/dist/services/middleware/__tests__/enhancedErrorHandler.test.d.ts +1 -0
  58. package/dist/services/middleware/enhancedErrorHandler.d.ts +123 -0
  59. package/dist/services/middleware/errorHandler.d.ts +1 -0
  60. package/dist/services/middleware/responseFormatter.d.ts +61 -0
  61. package/dist/services/mock/config.d.ts +14 -0
  62. package/dist/services/mock/index.d.ts +7 -0
  63. package/dist/services/mock/mockApiKeyService.d.ts +49 -0
  64. package/dist/services/mock/mockAuthService.d.ts +12 -0
  65. package/dist/services/mock/mockData.d.ts +87 -0
  66. package/dist/services/queries/hooks.d.ts +64 -0
  67. package/dist/services/queries/mutations.d.ts +33 -0
  68. package/dist/services/queries/queryClient.d.ts +59 -0
  69. package/dist/stores/emailConversationStore.d.ts +16 -0
  70. package/dist/stores/emailLeadsStore.d.ts +55 -0
  71. package/dist/test/setup.d.ts +1 -0
  72. package/dist/types/carrier.d.ts +304 -0
  73. package/dist/types/email.d.ts +208 -0
  74. package/dist/types/index.d.ts +37 -0
  75. package/dist/types/searchHistory.d.ts +59 -0
  76. package/dist/utils/apiKeyValidation.d.ts +9 -0
  77. package/dist/utils/mockData.d.ts +5 -0
  78. package/dist/utils/storage.d.ts +23 -0
  79. package/dist/widget-embed-9DdEqVMP.cjs.js +46 -0
  80. package/dist/widget-embed-9DdEqVMP.cjs.js.map +1 -0
  81. package/dist/widget-embed-LzSoeVtX.es.js +29823 -0
  82. package/dist/widget-embed-LzSoeVtX.es.js.map +1 -0
  83. package/dist/widget-embed.cjs.js +10 -0
  84. package/dist/widget-embed.cjs.js.map +1 -0
  85. package/dist/widget-embed.d.ts +32 -0
  86. package/dist/widget-embed.es.js +15 -0
  87. package/dist/widget-embed.es.js.map +1 -0
  88. package/package.json +2 -2
@@ -0,0 +1,16 @@
1
+ import type { LeadEmail, EmailLead } from '../types/email';
2
+ interface EmailConversationState {
3
+ currentLead: EmailLead | null;
4
+ emails: LeadEmail[];
5
+ isLoading: boolean;
6
+ error: string | null;
7
+ isSending: boolean;
8
+ sendError: string | null;
9
+ setCurrentLead: (lead: EmailLead | null) => void;
10
+ fetchLeadEmails: (leadId: string) => Promise<void>;
11
+ sendReply: (toEmails: string[], conversationId: string, subject: string, bodyHtml: string) => Promise<boolean>;
12
+ clearError: () => void;
13
+ reset: () => void;
14
+ }
15
+ export declare const useEmailConversationStore: import("zustand").UseBoundStore<import("zustand").StoreApi<EmailConversationState>>;
16
+ export default useEmailConversationStore;
@@ -0,0 +1,55 @@
1
+ import type { EmailLead, EmailLeadsQueryParams, EmailStatus } from '../types/email';
2
+ interface EmailLeadsState {
3
+ leads: EmailLead[];
4
+ totalCount: number;
5
+ currentPage: number;
6
+ pageSize: number;
7
+ isLoading: boolean;
8
+ isPolling: boolean;
9
+ error: string | null;
10
+ searchQuery: string;
11
+ statusFilter: EmailStatus | '';
12
+ dateFilter: 'today' | 'yesterday' | 'all';
13
+ newLeadsCount: number;
14
+ hasNewLeads: boolean;
15
+ lastFetchedLeadIds: Set<string>;
16
+ showNewLeadsAlert: boolean;
17
+ pollingIntervalId: NodeJS.Timeout | null;
18
+ isPollingEnabled: boolean;
19
+ fetchLeads: (params?: Partial<EmailLeadsQueryParams>) => Promise<void>;
20
+ setPage: (page: number) => void;
21
+ setPageSize: (size: number) => void;
22
+ setSearchQuery: (query: string) => void;
23
+ setStatusFilter: (status: EmailStatus | '') => void;
24
+ setDateFilter: (filter: 'today' | 'yesterday' | 'all') => void;
25
+ startPolling: () => void;
26
+ stopPolling: () => void;
27
+ pollForNewLeads: () => Promise<void>;
28
+ clearNewLeadsNotification: () => void;
29
+ acknowledgeNewLeads: () => void;
30
+ reset: () => void;
31
+ }
32
+ export declare const useEmailLeadsStore: import("zustand").UseBoundStore<Omit<import("zustand").StoreApi<EmailLeadsState>, "subscribe"> & {
33
+ subscribe: {
34
+ (listener: (selectedState: EmailLeadsState, previousSelectedState: EmailLeadsState) => void): () => void;
35
+ <U>(selector: (state: EmailLeadsState) => U, listener: (selectedState: U, previousSelectedState: U) => void, options?: {
36
+ equalityFn?: (a: U, b: U) => boolean;
37
+ fireImmediately?: boolean;
38
+ }): () => void;
39
+ };
40
+ }>;
41
+ export declare const useEmailLeads: () => EmailLead[];
42
+ export declare const useEmailLeadsLoading: () => boolean;
43
+ export declare const useEmailLeadsError: () => string;
44
+ export declare const useNewLeadsNotification: () => {
45
+ count: number;
46
+ hasNew: boolean;
47
+ showAlert: boolean;
48
+ };
49
+ export declare const useEmailLeadsPagination: () => {
50
+ currentPage: number;
51
+ pageSize: number;
52
+ totalCount: number;
53
+ totalPages: number;
54
+ };
55
+ export {};
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom';
@@ -0,0 +1,304 @@
1
+ export interface SearchFormData {
2
+ origin: string;
3
+ destination: string;
4
+ pickupEarliest: string;
5
+ pickupHours: string;
6
+ dropoffHours: string;
7
+ equipmentType: string;
8
+ length: string;
9
+ weight: string;
10
+ volume?: string;
11
+ }
12
+ export interface CarrierSearchPayload {
13
+ origin: string;
14
+ destination: string;
15
+ cargo_type: string;
16
+ weight: number;
17
+ volume: number;
18
+ pickup_date: string;
19
+ delivery_date: string;
20
+ max_results: number;
21
+ }
22
+ export interface CarrierSearchResponse {
23
+ success: boolean;
24
+ data: {
25
+ workflow_id: string;
26
+ carriers: CarrierResult[];
27
+ estimated_completion_time: string;
28
+ search_metadata: {
29
+ total_results: number;
30
+ search_time: number;
31
+ filters_applied: string[];
32
+ };
33
+ };
34
+ message?: string;
35
+ }
36
+ export interface WorkflowStatusResponse {
37
+ _id: string | null;
38
+ created_at: string;
39
+ updated_at: string;
40
+ workflow_id: string;
41
+ status: 'pending' | 'processing' | 'completed' | 'failed';
42
+ input_details: WorkflowInputDetails;
43
+ carriers: WorkflowCarrier[];
44
+ total_carriers_found: number;
45
+ total_carriers_vetted: number;
46
+ completed_at: string | null;
47
+ processing_time_seconds: number | null;
48
+ summary: string | null;
49
+ }
50
+ export interface WorkflowInputDetails {
51
+ _id: string | null;
52
+ created_at: string;
53
+ updated_at: string;
54
+ origin: string;
55
+ destination: string;
56
+ cargo_type: string;
57
+ weight: number;
58
+ volume: number;
59
+ pickup_date: string;
60
+ delivery_date: string;
61
+ budget_range: number | null;
62
+ required_certifications: string[] | null;
63
+ preferred_carrier_types: string[] | null;
64
+ max_results: number;
65
+ }
66
+ export interface WorkflowCarrier {
67
+ _id: string | null;
68
+ created_at: string;
69
+ updated_at: string;
70
+ carrier_id: string;
71
+ carrier_name: string;
72
+ contact_info: CarrierContactInfo;
73
+ source: string;
74
+ type_of_load: string;
75
+ fleet_size: number;
76
+ years_in_business: number;
77
+ dot_number: string;
78
+ vetting_result: 'ACCEPT' | 'REJECT' | 'PENDING';
79
+ vetting_details: VettingDetails;
80
+ match_score: number;
81
+ rfm_score: RFMScore;
82
+ }
83
+ export interface CarrierContactInfo {
84
+ email: string;
85
+ phone: string;
86
+ contact_person: string;
87
+ }
88
+ export interface VettingDetails {
89
+ compliance_score: number;
90
+ reliability_score: number;
91
+ overall_score: number;
92
+ }
93
+ export interface RFMScore {
94
+ segment: string;
95
+ score: number;
96
+ }
97
+ export interface CarrierResult {
98
+ id: string;
99
+ name: string;
100
+ source?: string;
101
+ rating: number;
102
+ price: number;
103
+ estimatedTime?: string;
104
+ responseTime?: string;
105
+ equipment: string;
106
+ location?: string;
107
+ capacity?: string;
108
+ experience?: string;
109
+ dotNumber?: string;
110
+ contactInfo?: CarrierContactInfo;
111
+ matchScore?: number;
112
+ vettingResult?: 'ACCEPT' | 'REJECT' | 'PENDING';
113
+ vettingDetails?: VettingDetails;
114
+ rfmScore?: RFMScore;
115
+ isSelected?: boolean;
116
+ }
117
+ export interface CallQueueItem {
118
+ id: string;
119
+ carrierName: string;
120
+ callDuration: number;
121
+ maxDuration: number;
122
+ callStatus: 'waiting' | 'in-progress' | 'completed' | 'failed';
123
+ dealStatus: 'pending' | 'negotiating' | 'agreed' | 'declined';
124
+ agreedRate: number | null;
125
+ contactInfo: string;
126
+ notes?: string;
127
+ }
128
+ export interface SearchMetadata {
129
+ searchId: string;
130
+ timestamp: Date;
131
+ totalResults: number;
132
+ searchCriteria: {
133
+ origin: string;
134
+ destination: string;
135
+ pickupDate?: string;
136
+ deliveryDate?: string;
137
+ equipmentType: string;
138
+ weight?: number;
139
+ volume?: number;
140
+ };
141
+ processingTime?: number;
142
+ status?: string;
143
+ }
144
+ export interface CallDetails {
145
+ id: string;
146
+ callId: string;
147
+ timestamp: Date;
148
+ duration: number;
149
+ participants: CallParticipant[];
150
+ direction: 'inbound' | 'outbound';
151
+ status: CallStatus;
152
+ result: CallResult;
153
+ quality: CallQuality;
154
+ network: NetworkInfo;
155
+ device: DeviceInfo;
156
+ codec: CodecInfo;
157
+ technicalParams: TechnicalParameters;
158
+ transcription?: CallTranscription;
159
+ metadata: CallMetadata;
160
+ }
161
+ export interface CallParticipant {
162
+ id: string;
163
+ name: string;
164
+ role: 'caller' | 'receiver' | 'moderator';
165
+ phoneNumber?: string;
166
+ email?: string;
167
+ company?: string;
168
+ joinTime: Date;
169
+ leaveTime?: Date;
170
+ }
171
+ export interface CallQuality {
172
+ overallScore: number;
173
+ signalStrength: number;
174
+ latency: number;
175
+ jitter: number;
176
+ packetLoss: number;
177
+ audioQuality: 'excellent' | 'good' | 'fair' | 'poor';
178
+ connectionStability: 'stable' | 'unstable' | 'intermittent';
179
+ }
180
+ export interface NetworkInfo {
181
+ ipAddress: string;
182
+ connectionType: 'wifi' | 'ethernet' | 'cellular' | 'unknown';
183
+ bandwidth: number;
184
+ provider: string;
185
+ location: {
186
+ city: string;
187
+ state: string;
188
+ country: string;
189
+ };
190
+ }
191
+ export interface DeviceInfo {
192
+ browser: string;
193
+ browserVersion: string;
194
+ operatingSystem: string;
195
+ osVersion: string;
196
+ microphone: string;
197
+ speaker: string;
198
+ camera?: string;
199
+ deviceType: 'desktop' | 'mobile' | 'tablet';
200
+ }
201
+ export interface CodecInfo {
202
+ audioCodec: string;
203
+ bitrate: number;
204
+ sampleRate: number;
205
+ channels: number;
206
+ compression: string;
207
+ }
208
+ export interface TechnicalParameters {
209
+ rtpPackets: {
210
+ sent: number;
211
+ received: number;
212
+ lost: number;
213
+ };
214
+ bandwidth: {
215
+ upload: number;
216
+ download: number;
217
+ };
218
+ cpu: {
219
+ usage: number;
220
+ temperature?: number;
221
+ };
222
+ memory: {
223
+ used: number;
224
+ available: number;
225
+ };
226
+ }
227
+ export interface CallTranscription {
228
+ id: string;
229
+ fullTranscript: TranscriptSegment[];
230
+ speakers: SpeakerInfo[];
231
+ sentimentAnalysis: SentimentAnalysis;
232
+ keyPhrases: KeyPhrase[];
233
+ summary: string;
234
+ confidence: number;
235
+ language: string;
236
+ }
237
+ export interface TranscriptSegment {
238
+ id: string;
239
+ speakerId: string;
240
+ text: string;
241
+ timestamp: number;
242
+ duration: number;
243
+ confidence: number;
244
+ sentiment?: 'positive' | 'negative' | 'neutral';
245
+ }
246
+ export interface SpeakerInfo {
247
+ id: string;
248
+ name: string;
249
+ voiceProfile: {
250
+ pitch: number;
251
+ tone: string;
252
+ accent?: string;
253
+ };
254
+ speakingTime: number;
255
+ wordCount: number;
256
+ }
257
+ export interface SentimentAnalysis {
258
+ overall: 'positive' | 'negative' | 'neutral';
259
+ score: number;
260
+ emotions: {
261
+ joy: number;
262
+ anger: number;
263
+ fear: number;
264
+ sadness: number;
265
+ surprise: number;
266
+ };
267
+ trends: SentimentTrend[];
268
+ }
269
+ export interface SentimentTrend {
270
+ timestamp: number;
271
+ sentiment: 'positive' | 'negative' | 'neutral';
272
+ score: number;
273
+ }
274
+ export interface KeyPhrase {
275
+ phrase: string;
276
+ frequency: number;
277
+ importance: number;
278
+ category: 'business' | 'technical' | 'emotional' | 'other';
279
+ timestamps: number[];
280
+ }
281
+ export interface CallMetadata {
282
+ recordingUrl?: string;
283
+ recordingSize?: number;
284
+ callCost?: number;
285
+ region: string;
286
+ serverLocation: string;
287
+ encryption: boolean;
288
+ compliance: {
289
+ gdpr: boolean;
290
+ hipaa: boolean;
291
+ sox: boolean;
292
+ };
293
+ }
294
+ export interface CallResult {
295
+ outcome: 'successful' | 'failed' | 'abandoned' | 'transferred';
296
+ reason?: string;
297
+ followUpRequired: boolean;
298
+ nextAction?: string;
299
+ dealValue?: number;
300
+ agreementReached: boolean;
301
+ }
302
+ export type EquipmentType = 'Dry Van' | 'Refrigerated' | 'Flatbed' | 'Step Deck' | 'Lowboy' | 'Tanker' | 'Container' | 'Other';
303
+ export type CallStatus = 'waiting' | 'in-progress' | 'completed' | 'failed';
304
+ export type DealStatus = 'pending' | 'negotiating' | 'agreed' | 'declined';
@@ -0,0 +1,208 @@
1
+ export type EmailType = 'inquiry' | 'quote' | 'followup';
2
+ export type EmailStatus = 'new' | 'qualified' | 'contacted' | 'rejected';
3
+ export type EmailLoadType = 'FTL' | 'LTL' | 'PARTIAL';
4
+ export type EmailModeOfService = 'TRUCK' | 'RAIL' | 'AIR' | 'OCEAN';
5
+ export interface ApiEmailLead {
6
+ id: string;
7
+ tenant_id: string;
8
+ created_by: string;
9
+ shipper_email: string;
10
+ shipper_name: string;
11
+ shipper_company_name: string | null;
12
+ origin: string;
13
+ destination: string;
14
+ pickup_timestamp: string | null;
15
+ delivery_timestamp: string | null;
16
+ load_type: EmailLoadType | null;
17
+ mode_of_service: EmailModeOfService | null;
18
+ equipment_type: string | null;
19
+ gross_weight: number | null;
20
+ number_of_pallets: number | null;
21
+ email_message_id: string;
22
+ email_conversation_id: string;
23
+ email_subject: string;
24
+ sender_email: string | null;
25
+ sender_name: string | null;
26
+ receiver_email: string | null;
27
+ received_datetime: string | null;
28
+ status: EmailStatus;
29
+ is_duplicate: boolean;
30
+ duplicate_of: string | null;
31
+ notes: string | null;
32
+ created_at: string;
33
+ updated_at: string;
34
+ }
35
+ export interface EmailLead {
36
+ id: string;
37
+ tenantId: string;
38
+ createdBy: string;
39
+ shipperEmail: string;
40
+ shipperName: string;
41
+ shipperCompanyName: string | null;
42
+ origin: string;
43
+ destination: string;
44
+ pickupTimestamp: string | null;
45
+ deliveryTimestamp: string | null;
46
+ loadType: EmailLoadType | null;
47
+ modeOfService: EmailModeOfService | null;
48
+ equipmentType: string | null;
49
+ grossWeight: number | null;
50
+ numberOfPallets: number | null;
51
+ emailMessageId: string;
52
+ emailConversationId: string;
53
+ emailSubject: string;
54
+ senderEmail: string | null;
55
+ senderName: string | null;
56
+ receiverEmail: string | null;
57
+ receivedDatetime: string | null;
58
+ status: EmailStatus;
59
+ isDuplicate: boolean;
60
+ duplicateOf: string | null;
61
+ notes: string | null;
62
+ createdAt: string;
63
+ updatedAt: string;
64
+ }
65
+ export interface EmailLeadsApiResponse {
66
+ success: boolean;
67
+ leads: ApiEmailLead[];
68
+ count: number;
69
+ page: number;
70
+ size: number;
71
+ }
72
+ export interface EmailLeadsQueryParams {
73
+ page?: number;
74
+ size?: number;
75
+ search?: string;
76
+ status?: EmailStatus | '';
77
+ date_filter?: 'today' | 'yesterday' | 'all' | '';
78
+ }
79
+ export interface EmailFilters {
80
+ status?: EmailStatus | '';
81
+ type?: EmailType | '';
82
+ confidenceMin?: number;
83
+ confidenceMax?: number;
84
+ dateStart?: string;
85
+ dateEnd?: string;
86
+ search?: string;
87
+ dateFilter?: 'today' | 'yesterday' | 'all';
88
+ }
89
+ export interface EmailParticipant {
90
+ id: string;
91
+ name: string;
92
+ email: string;
93
+ avatarUrl?: string;
94
+ }
95
+ export interface EmailMessage {
96
+ id: string;
97
+ sender: 'user' | 'shipper' | 'carrier';
98
+ senderEmail: string;
99
+ senderName: string;
100
+ content: string;
101
+ timestamp: string;
102
+ isRead: boolean;
103
+ subject?: string;
104
+ loadType?: string;
105
+ equipmentType?: string;
106
+ }
107
+ export interface EmailThread {
108
+ id: string;
109
+ participantEmail: string;
110
+ participantName: string;
111
+ participantType: 'shipper' | 'carrier';
112
+ messages: EmailMessage[];
113
+ unreadCount: number;
114
+ lastMessageAt: string;
115
+ isDraft?: boolean;
116
+ }
117
+ export interface EmailLeadDetail {
118
+ id: string;
119
+ shipperName: string;
120
+ fromLocation: string;
121
+ toLocation: string;
122
+ pickupDate: string;
123
+ dropDate: string;
124
+ status: EmailStatus;
125
+ receivedAt: string;
126
+ shipperThreads: EmailThread[];
127
+ carrierThreads: EmailThread[];
128
+ }
129
+ export interface EmailConversation {
130
+ id: string;
131
+ subject: string;
132
+ participants: EmailParticipant[];
133
+ messages: EmailMessage[];
134
+ }
135
+ export interface ApiLeadEmail {
136
+ id: string;
137
+ tenant_id: string;
138
+ created_by: string | null;
139
+ message_id: string;
140
+ conversation_id: string;
141
+ conversation_index: string | null;
142
+ sender_email: string;
143
+ receiver_email: string;
144
+ subject: string;
145
+ received_datetime: string;
146
+ body_html: string;
147
+ body_text: string;
148
+ category: string | null;
149
+ classification_confidence: number | null;
150
+ status: string;
151
+ user_id: string;
152
+ metadata: Record<string, any>;
153
+ referenced_lead_id: string | null;
154
+ processed_at: string | null;
155
+ created_at: string;
156
+ updated_at: string;
157
+ }
158
+ export interface LeadEmail {
159
+ id: string;
160
+ tenantId: string;
161
+ createdBy: string | null;
162
+ messageId: string;
163
+ conversationId: string;
164
+ conversationIndex: string | null;
165
+ senderEmail: string;
166
+ receiverEmail: string;
167
+ subject: string;
168
+ receivedDatetime: string;
169
+ bodyHtml: string;
170
+ bodyText: string;
171
+ category: string | null;
172
+ classificationConfidence: number | null;
173
+ status: string;
174
+ userId: string;
175
+ metadata: Record<string, any>;
176
+ referencedLeadId: string | null;
177
+ processedAt: string | null;
178
+ createdAt: string;
179
+ updatedAt: string;
180
+ }
181
+ export interface LeadEmailsApiResponse {
182
+ success: boolean;
183
+ emails: ApiLeadEmail[];
184
+ count: number;
185
+ }
186
+ export interface LeadEmailsResponse {
187
+ success: boolean;
188
+ emails: LeadEmail[];
189
+ count: number;
190
+ }
191
+ export interface SendEmailRequest {
192
+ to: {
193
+ email: string;
194
+ }[];
195
+ conversation_id: string;
196
+ subject: string;
197
+ body_html: string;
198
+ }
199
+ export interface ApiSendEmailResponse {
200
+ success: boolean;
201
+ reply: boolean;
202
+ email: ApiLeadEmail;
203
+ }
204
+ export interface SendEmailResponse {
205
+ success: boolean;
206
+ reply: boolean;
207
+ email: LeadEmail;
208
+ }
@@ -0,0 +1,37 @@
1
+ export interface Message {
2
+ id: string;
3
+ content: string;
4
+ sender: 'user' | 'bot';
5
+ timestamp: Date;
6
+ }
7
+ export interface ChatSession {
8
+ id: string;
9
+ title: string;
10
+ messages: Message[];
11
+ createdAt: Date;
12
+ updatedAt: Date;
13
+ }
14
+ export interface WidgetTheme {
15
+ primaryColor?: string;
16
+ headerBg?: string;
17
+ headerText?: string;
18
+ headerTitle?: string;
19
+ headerLogo?: string;
20
+ userBubble?: string;
21
+ botBubble?: string;
22
+ fontFamily?: string;
23
+ bubbleIcon?: string;
24
+ }
25
+ export interface WidgetConfig {
26
+ pangentsApiKey: string;
27
+ tenantId?: string;
28
+ theme?: WidgetTheme;
29
+ }
30
+ export interface ChatState {
31
+ isOpen: boolean;
32
+ currentSession: ChatSession | null;
33
+ sessions: ChatSession[];
34
+ isLoading: boolean;
35
+ error: string | null;
36
+ }
37
+ export type WidgetScreen = 'chat' | 'settings' | 'history';
@@ -0,0 +1,59 @@
1
+ import { SearchFormData, SearchMetadata, CarrierResult } from './carrier';
2
+ export interface WorkflowInputParams {
3
+ id: string | null;
4
+ created_at: string;
5
+ updated_at: string;
6
+ origin: string;
7
+ destination: string;
8
+ cargo_type: string;
9
+ weight: number;
10
+ volume: number;
11
+ pickup_date: string;
12
+ delivery_date: string;
13
+ budget_range: string | null;
14
+ required_certifications: string | null;
15
+ preferred_carrier_types: string | null;
16
+ max_results: number;
17
+ }
18
+ export interface WorkflowItem {
19
+ _id: string | null;
20
+ created_at: string;
21
+ updated_at: string;
22
+ workflow_id: string;
23
+ workflow_name: string | null;
24
+ status: 'completed' | 'pending' | 'processing' | 'failed';
25
+ input_params: WorkflowInputParams;
26
+ completed_at: string | null;
27
+ total_carriers: number;
28
+ }
29
+ export interface WorkflowListResponse {
30
+ _id: string | null;
31
+ created_at: string;
32
+ updated_at: string;
33
+ workflows: WorkflowItem[];
34
+ total_count: number;
35
+ page: number;
36
+ page_size: number;
37
+ }
38
+ export interface DeleteWorkflowResponse {
39
+ _id: string | null;
40
+ created_at: string;
41
+ updated_at: string;
42
+ workflow_id: string;
43
+ deleted: boolean;
44
+ message: string;
45
+ }
46
+ export interface SearchHistoryItem {
47
+ id: string;
48
+ searchFormData: SearchFormData;
49
+ searchMetadata: SearchMetadata;
50
+ resultsCount: number;
51
+ timestamp: Date;
52
+ title: string;
53
+ }
54
+ export interface SearchHistoryContextType {
55
+ searchHistory: SearchHistoryItem[];
56
+ addSearchToHistory: (searchData: SearchFormData, metadata: SearchMetadata, results: CarrierResult[]) => void;
57
+ deleteSearchFromHistory: (searchId: string) => void;
58
+ clearSearchHistory: () => void;
59
+ }
@@ -0,0 +1,9 @@
1
+ export declare const PANGENTS_API_KEY = "pangents-demo-key-2025";
2
+ export interface ApiKeyValidationResult {
3
+ isValid: boolean;
4
+ error?: string;
5
+ }
6
+ export declare function validateApiKey(apiKey: string): ApiKeyValidationResult;
7
+ export declare function getApiKeyFromUrl(): string | null;
8
+ export declare function getApiKeyFromConfig(): string | null;
9
+ export declare function getApiKey(): string | null;
@@ -0,0 +1,5 @@
1
+ import { Message, ChatSession } from '../types';
2
+ export declare const mockMessages: Message[];
3
+ export declare const mockSessions: ChatSession[];
4
+ export declare const mockBotResponses: string[];
5
+ export declare const getRandomBotResponse: () => string;