catalist-support-agent 1.0.0

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 (140) hide show
  1. package/dist/admin-portal.d.ts +43 -0
  2. package/dist/admin-portal.d.ts.map +1 -0
  3. package/dist/admin-portal.js +166 -0
  4. package/dist/admin-portal.js.map +1 -0
  5. package/dist/analysis/entities.d.ts +73 -0
  6. package/dist/analysis/entities.d.ts.map +1 -0
  7. package/dist/analysis/entities.js +378 -0
  8. package/dist/analysis/entities.js.map +1 -0
  9. package/dist/analysis/index.d.ts +44 -0
  10. package/dist/analysis/index.d.ts.map +1 -0
  11. package/dist/analysis/index.js +243 -0
  12. package/dist/analysis/index.js.map +1 -0
  13. package/dist/analysis/intent.d.ts +49 -0
  14. package/dist/analysis/intent.d.ts.map +1 -0
  15. package/dist/analysis/intent.js +320 -0
  16. package/dist/analysis/intent.js.map +1 -0
  17. package/dist/analysis/sentiment.d.ts +57 -0
  18. package/dist/analysis/sentiment.d.ts.map +1 -0
  19. package/dist/analysis/sentiment.js +351 -0
  20. package/dist/analysis/sentiment.js.map +1 -0
  21. package/dist/brand/compliance.d.ts +122 -0
  22. package/dist/brand/compliance.d.ts.map +1 -0
  23. package/dist/brand/compliance.js +378 -0
  24. package/dist/brand/compliance.js.map +1 -0
  25. package/dist/brand/forbidden-terms.d.ts +99 -0
  26. package/dist/brand/forbidden-terms.d.ts.map +1 -0
  27. package/dist/brand/forbidden-terms.js +265 -0
  28. package/dist/brand/forbidden-terms.js.map +1 -0
  29. package/dist/brand/index.d.ts +10 -0
  30. package/dist/brand/index.d.ts.map +1 -0
  31. package/dist/brand/index.js +12 -0
  32. package/dist/brand/index.js.map +1 -0
  33. package/dist/config.d.ts +325 -0
  34. package/dist/config.d.ts.map +1 -0
  35. package/dist/config.js +492 -0
  36. package/dist/config.js.map +1 -0
  37. package/dist/delivery/index.d.ts +84 -0
  38. package/dist/delivery/index.d.ts.map +1 -0
  39. package/dist/delivery/index.js +435 -0
  40. package/dist/delivery/index.js.map +1 -0
  41. package/dist/embeddings/cache.d.ts +96 -0
  42. package/dist/embeddings/cache.d.ts.map +1 -0
  43. package/dist/embeddings/cache.js +193 -0
  44. package/dist/embeddings/cache.js.map +1 -0
  45. package/dist/embeddings/index.d.ts +152 -0
  46. package/dist/embeddings/index.d.ts.map +1 -0
  47. package/dist/embeddings/index.js +337 -0
  48. package/dist/embeddings/index.js.map +1 -0
  49. package/dist/embeddings/openai-client.d.ts +67 -0
  50. package/dist/embeddings/openai-client.d.ts.map +1 -0
  51. package/dist/embeddings/openai-client.js +190 -0
  52. package/dist/embeddings/openai-client.js.map +1 -0
  53. package/dist/errors.d.ts +302 -0
  54. package/dist/errors.d.ts.map +1 -0
  55. package/dist/errors.js +508 -0
  56. package/dist/errors.js.map +1 -0
  57. package/dist/escalation/index.d.ts +93 -0
  58. package/dist/escalation/index.d.ts.map +1 -0
  59. package/dist/escalation/index.js +436 -0
  60. package/dist/escalation/index.js.map +1 -0
  61. package/dist/extraction/deduplication.d.ts +97 -0
  62. package/dist/extraction/deduplication.d.ts.map +1 -0
  63. package/dist/extraction/deduplication.js +271 -0
  64. package/dist/extraction/deduplication.js.map +1 -0
  65. package/dist/extraction/gmail-extractor.d.ts +160 -0
  66. package/dist/extraction/gmail-extractor.d.ts.map +1 -0
  67. package/dist/extraction/gmail-extractor.js +396 -0
  68. package/dist/extraction/gmail-extractor.js.map +1 -0
  69. package/dist/extraction/gmail-token-manager.d.ts +36 -0
  70. package/dist/extraction/gmail-token-manager.d.ts.map +1 -0
  71. package/dist/extraction/gmail-token-manager.js +146 -0
  72. package/dist/extraction/gmail-token-manager.js.map +1 -0
  73. package/dist/extraction/index.d.ts +13 -0
  74. package/dist/extraction/index.d.ts.map +1 -0
  75. package/dist/extraction/index.js +20 -0
  76. package/dist/extraction/index.js.map +1 -0
  77. package/dist/extraction/pii-handler.d.ts +100 -0
  78. package/dist/extraction/pii-handler.d.ts.map +1 -0
  79. package/dist/extraction/pii-handler.js +295 -0
  80. package/dist/extraction/pii-handler.js.map +1 -0
  81. package/dist/extraction/pipeline.d.ts +94 -0
  82. package/dist/extraction/pipeline.d.ts.map +1 -0
  83. package/dist/extraction/pipeline.js +380 -0
  84. package/dist/extraction/pipeline.js.map +1 -0
  85. package/dist/extraction/quality-filter.d.ts +99 -0
  86. package/dist/extraction/quality-filter.d.ts.map +1 -0
  87. package/dist/extraction/quality-filter.js +370 -0
  88. package/dist/extraction/quality-filter.js.map +1 -0
  89. package/dist/extraction/rate-limiter.d.ts +90 -0
  90. package/dist/extraction/rate-limiter.d.ts.map +1 -0
  91. package/dist/extraction/rate-limiter.js +242 -0
  92. package/dist/extraction/rate-limiter.js.map +1 -0
  93. package/dist/extraction/state-manager.d.ts +126 -0
  94. package/dist/extraction/state-manager.d.ts.map +1 -0
  95. package/dist/extraction/state-manager.js +344 -0
  96. package/dist/extraction/state-manager.js.map +1 -0
  97. package/dist/generation/index.d.ts +75 -0
  98. package/dist/generation/index.d.ts.map +1 -0
  99. package/dist/generation/index.js +641 -0
  100. package/dist/generation/index.js.map +1 -0
  101. package/dist/index.d.ts +96 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +233 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/intake/index.d.ts +15 -0
  106. package/dist/intake/index.d.ts.map +1 -0
  107. package/dist/intake/index.js +19 -0
  108. package/dist/intake/index.js.map +1 -0
  109. package/dist/intake/normalizer.d.ts +163 -0
  110. package/dist/intake/normalizer.d.ts.map +1 -0
  111. package/dist/intake/normalizer.js +309 -0
  112. package/dist/intake/normalizer.js.map +1 -0
  113. package/dist/intake/postmark.d.ts +72 -0
  114. package/dist/intake/postmark.d.ts.map +1 -0
  115. package/dist/intake/postmark.js +276 -0
  116. package/dist/intake/postmark.js.map +1 -0
  117. package/dist/intake/slack.d.ts +106 -0
  118. package/dist/intake/slack.d.ts.map +1 -0
  119. package/dist/intake/slack.js +378 -0
  120. package/dist/intake/slack.js.map +1 -0
  121. package/dist/intake/twilio.d.ts +86 -0
  122. package/dist/intake/twilio.d.ts.map +1 -0
  123. package/dist/intake/twilio.js +283 -0
  124. package/dist/intake/twilio.js.map +1 -0
  125. package/dist/knowledge/index.d.ts +100 -0
  126. package/dist/knowledge/index.d.ts.map +1 -0
  127. package/dist/knowledge/index.js +516 -0
  128. package/dist/knowledge/index.js.map +1 -0
  129. package/dist/knowledge/invoice-resolver.d.ts +62 -0
  130. package/dist/knowledge/invoice-resolver.d.ts.map +1 -0
  131. package/dist/knowledge/invoice-resolver.js +267 -0
  132. package/dist/knowledge/invoice-resolver.js.map +1 -0
  133. package/dist/types.d.ts +535 -0
  134. package/dist/types.d.ts.map +1 -0
  135. package/dist/types.js +48 -0
  136. package/dist/types.js.map +1 -0
  137. package/ga-service-account.json +13 -0
  138. package/gmail-knowledge-migration.sql +149 -0
  139. package/nul +1 -0
  140. package/package.json +55 -0
@@ -0,0 +1,516 @@
1
+ /**
2
+ * Knowledge Retrieval Module
3
+ *
4
+ * Retrieves relevant context for response generation:
5
+ * - Customer data from clients table
6
+ * - Product information from catalog
7
+ * - Order history and status
8
+ * - Policy and FAQ content
9
+ * - Similar historical conversations
10
+ * - Pre-approved response templates
11
+ */
12
+ import { createClient } from '@supabase/supabase-js';
13
+ import { config } from '../config.js';
14
+ import { EmbeddingService } from '../embeddings/index.js';
15
+ import { getInvoiceResolverService, isInvoiceRelatedQuery } from './invoice-resolver.js';
16
+ import { createCustomerId, createConversationId } from '../types.js';
17
+ // =============================================================================
18
+ // Knowledge Retrieval Service
19
+ // =============================================================================
20
+ export class KnowledgeRetrievalService {
21
+ supabase;
22
+ embeddingService = null;
23
+ effectiveConfig;
24
+ constructor(configOverride) {
25
+ this.effectiveConfig = configOverride ?? config;
26
+ this.supabase = createClient(this.effectiveConfig.supabase.url, this.effectiveConfig.supabase.serviceRoleKey);
27
+ // Initialize embedding service if OpenAI API key is available
28
+ const openaiApiKey = process.env.OPENAI_API_KEY;
29
+ if (openaiApiKey) {
30
+ try {
31
+ this.embeddingService = new EmbeddingService({
32
+ openaiApiKey,
33
+ supabaseUrl: this.effectiveConfig.supabase.url,
34
+ supabaseServiceRoleKey: this.effectiveConfig.supabase.serviceRoleKey,
35
+ });
36
+ }
37
+ catch (error) {
38
+ console.warn('Failed to initialize embedding service:', error);
39
+ }
40
+ }
41
+ }
42
+ /**
43
+ * Retrieve complete knowledge context for a message
44
+ */
45
+ async retrieveContext(message, analysis) {
46
+ const confidenceScores = {
47
+ customerData: 0,
48
+ productData: 0,
49
+ policyData: 0,
50
+ similarConversations: 0,
51
+ };
52
+ let customer;
53
+ let products;
54
+ let orders;
55
+ let policies;
56
+ let similarConversations;
57
+ let templates;
58
+ let resolvedInvoice;
59
+ // 1. Customer data retrieval
60
+ if (this.effectiveConfig.knowledge.customerDataEnabled) {
61
+ try {
62
+ customer = await this.retrieveCustomerData(message);
63
+ if (customer) {
64
+ confidenceScores.customerData = 1.0;
65
+ // Retrieve order history for identified customer
66
+ orders = await this.retrieveOrderHistory(customer.id, analysis.entities.orderNumbers);
67
+ // 1.5 Invoice resolution - if this looks like an invoice-related query
68
+ const fullText = `${message.content.subject ?? ''} ${message.content.text}`;
69
+ if (isInvoiceRelatedQuery(fullText) || analysis.intent.primary === 'documentation_request') {
70
+ try {
71
+ const resolved = await getInvoiceResolverService().resolveInvoice(customer.id, analysis.entities.orderNumbers, // orderNumbers may include invoice numbers
72
+ message.content.text, message.content.subject);
73
+ if (resolved) {
74
+ resolvedInvoice = resolved;
75
+ }
76
+ }
77
+ catch (error) {
78
+ console.warn('Invoice resolution failed:', error);
79
+ }
80
+ }
81
+ }
82
+ }
83
+ catch (error) {
84
+ // Log but don't fail - customer might be unknown
85
+ console.warn('Customer retrieval failed:', error);
86
+ confidenceScores.customerData = 0;
87
+ }
88
+ }
89
+ // 2. Product information lookup
90
+ if (this.effectiveConfig.knowledge.productLookupEnabled) {
91
+ try {
92
+ products = await this.retrieveProductInfo(analysis.entities.productNames, analysis.entities.productSkus);
93
+ confidenceScores.productData = products && products.length > 0 ? 0.9 : 0;
94
+ }
95
+ catch (error) {
96
+ console.warn('Product lookup failed:', error);
97
+ confidenceScores.productData = 0;
98
+ }
99
+ }
100
+ // 3. Response templates for intent
101
+ if (this.effectiveConfig.knowledge.templatesEnabled) {
102
+ try {
103
+ templates = await this.retrieveTemplates(analysis.intent.primary);
104
+ }
105
+ catch (error) {
106
+ console.warn('Template retrieval failed:', error);
107
+ }
108
+ }
109
+ // 4. Similar conversations (if enabled and pgvector available)
110
+ if (this.effectiveConfig.knowledge.similarConversationsEnabled) {
111
+ try {
112
+ similarConversations = await this.retrieveSimilarConversations(message.content.text, analysis.intent.primary);
113
+ confidenceScores.similarConversations =
114
+ similarConversations && similarConversations.length > 0 ? 0.7 : 0;
115
+ }
116
+ catch (error) {
117
+ console.warn('Similar conversation retrieval failed:', error);
118
+ confidenceScores.similarConversations = 0;
119
+ }
120
+ }
121
+ return {
122
+ customer,
123
+ products,
124
+ orders,
125
+ policies,
126
+ similarConversations,
127
+ templates,
128
+ resolvedInvoice,
129
+ assembledAt: new Date().toISOString(),
130
+ confidenceScores,
131
+ };
132
+ }
133
+ /**
134
+ * Retrieve customer data by sender identifiers
135
+ *
136
+ * Note: Uses the "User" table (not "Client") per actual Catalist schema
137
+ */
138
+ async retrieveCustomerData(message) {
139
+ const { sender } = message;
140
+ // Try to find customer by email
141
+ if (sender.email) {
142
+ const { data, error } = await this.supabase
143
+ .from('User')
144
+ .select('id, name, email, phone, company, is_active, type')
145
+ .ilike('email', sender.email)
146
+ .eq('is_deleted', false)
147
+ .limit(1)
148
+ .single();
149
+ if (data && !error) {
150
+ return this.mapUserToCustomerContext(data);
151
+ }
152
+ }
153
+ // Try to find customer by phone
154
+ if (sender.phone) {
155
+ const normalizedPhone = sender.phone.replace(/\D/g, '');
156
+ const { data, error } = await this.supabase
157
+ .from('User')
158
+ .select('id, name, email, phone, company, is_active, type')
159
+ .or(`phone.ilike.%${normalizedPhone}%`)
160
+ .eq('is_deleted', false)
161
+ .limit(1)
162
+ .single();
163
+ if (data && !error) {
164
+ return this.mapUserToCustomerContext(data);
165
+ }
166
+ }
167
+ // Customer not found
168
+ return undefined;
169
+ }
170
+ /**
171
+ * Map database User record to CustomerContext
172
+ */
173
+ mapUserToCustomerContext(user) {
174
+ return {
175
+ id: createCustomerId(String(user.id)),
176
+ companyName: user.company || 'Unknown',
177
+ contactName: user.name || undefined,
178
+ email: user.email,
179
+ phone: user.phone,
180
+ accountStatus: user.is_active ? 'active' : 'inactive',
181
+ tier: user.type, // 'store', etc.
182
+ };
183
+ }
184
+ /**
185
+ * Retrieve order history for a customer with associated Invoice data
186
+ *
187
+ * Note: Uses "PurchaseOrder" table (not "Order") per actual Catalist schema
188
+ * Also fetches Invoice data for each order via the Invoice table
189
+ */
190
+ async retrieveOrderHistory(customerId, specificOrderNumbers) {
191
+ let query = this.supabase
192
+ .from('PurchaseOrder')
193
+ .select('id, order_id, order_status, order_total, created_at, invoice_number, invoice_status, invoice_id')
194
+ .eq('user_id', customerId)
195
+ .eq('is_draft', false)
196
+ .order('created_at', { ascending: false })
197
+ .limit(10);
198
+ // If specific orders requested, filter to those
199
+ if (specificOrderNumbers && specificOrderNumbers.length > 0) {
200
+ query = query.in('order_id', specificOrderNumbers);
201
+ }
202
+ const { data: orders, error } = await query;
203
+ if (error || !orders) {
204
+ return [];
205
+ }
206
+ // Get order_ids for Invoice lookup
207
+ const orderIds = orders
208
+ .map((o) => o.order_id)
209
+ .filter((id) => !!id);
210
+ // Fetch associated Invoice data
211
+ let invoiceMap = new Map();
212
+ if (orderIds.length > 0) {
213
+ const { data: invoices } = await this.supabase
214
+ .from('Invoice')
215
+ .select(`
216
+ id, order_id, invoice_num, status, total, subtotal,
217
+ fees_total, tax_total, shipping_total, discount_total,
218
+ issued_at, due_at, paid_at, pdf_url, notes
219
+ `)
220
+ .in('order_id', orderIds);
221
+ if (invoices) {
222
+ for (const inv of invoices) {
223
+ invoiceMap.set(inv.order_id, {
224
+ invoiceId: inv.id,
225
+ invoiceNumber: inv.invoice_num,
226
+ status: inv.status || 'unknown',
227
+ total: Number(inv.total) || 0,
228
+ subtotal: Number(inv.subtotal) || 0,
229
+ feesTotal: Number(inv.fees_total) || 0,
230
+ taxTotal: Number(inv.tax_total) || 0,
231
+ shippingTotal: Number(inv.shipping_total) || 0,
232
+ discountTotal: Number(inv.discount_total) || 0,
233
+ issuedAt: inv.issued_at,
234
+ dueAt: inv.due_at,
235
+ paidAt: inv.paid_at,
236
+ pdfUrl: inv.pdf_url,
237
+ notes: inv.notes,
238
+ });
239
+ }
240
+ }
241
+ }
242
+ return orders.map((order) => ({
243
+ orderNumber: order.order_id || String(order.id),
244
+ status: order.order_status || 'unknown',
245
+ createdAt: order.created_at,
246
+ totalAmount: order.order_total || 0,
247
+ invoiceNumber: order.invoice_number,
248
+ invoiceStatus: order.invoice_status,
249
+ invoice: order.order_id ? invoiceMap.get(order.order_id) : undefined,
250
+ }));
251
+ }
252
+ /**
253
+ * Retrieve product information by name or SKU
254
+ *
255
+ * Note: Uses actual Catalist Catalog schema with selling_price, selling_status
256
+ */
257
+ async retrieveProductInfo(productNames, productSkus) {
258
+ if ((!productNames || productNames.length === 0) && (!productSkus || productSkus.length === 0)) {
259
+ return [];
260
+ }
261
+ const selectColumns = 'sku, name, brand, selling_price, selling_status, supplier, asin, upc';
262
+ // Search by SKU first (more precise)
263
+ if (productSkus && productSkus.length > 0) {
264
+ const { data, error } = await this.supabase
265
+ .from('Catalog')
266
+ .select(selectColumns)
267
+ .in('sku', productSkus)
268
+ .limit(10);
269
+ if (data && !error && data.length > 0) {
270
+ return data.map(this.mapCatalogToProductContext);
271
+ }
272
+ }
273
+ // Fallback to name search
274
+ if (productNames && productNames.length > 0) {
275
+ for (const name of productNames.slice(0, 3)) {
276
+ const { data, error } = await this.supabase
277
+ .from('Catalog')
278
+ .select(selectColumns)
279
+ .ilike('name', `%${name}%`)
280
+ .limit(5);
281
+ if (data && !error && data.length > 0) {
282
+ return data.map(this.mapCatalogToProductContext);
283
+ }
284
+ }
285
+ }
286
+ return [];
287
+ }
288
+ /**
289
+ * Map Catalog record to ProductContext
290
+ *
291
+ * Note: Catalist uses selling_status (boolean) not quantity
292
+ */
293
+ mapCatalogToProductContext(product) {
294
+ // selling_status: true = available for sale, false = not available
295
+ const availability = product.selling_status
296
+ ? 'in_stock'
297
+ : 'out_of_stock';
298
+ // Parse price from string (e.g., "$19.99" or "19.99")
299
+ let price;
300
+ if (product.selling_price) {
301
+ const priceStr = product.selling_price.replace(/[^0-9.]/g, '');
302
+ price = parseFloat(priceStr) || undefined;
303
+ }
304
+ return {
305
+ sku: product.sku || product.asin || product.upc || 'N/A',
306
+ name: product.name,
307
+ brand: product.brand,
308
+ category: product.supplier, // Using supplier as category proxy
309
+ price,
310
+ availability,
311
+ };
312
+ }
313
+ /**
314
+ * Retrieve response templates/knowledge for an intent
315
+ *
316
+ * Note: Uses support_knowledge table which stores Q&A pairs
317
+ */
318
+ async retrieveTemplates(intent) {
319
+ // Map intents to knowledge categories
320
+ const categoryMap = {
321
+ order_status: ['shipping', 'orders', 'tracking'],
322
+ pricing_inquiry: ['pricing', 'general'],
323
+ availability_check: ['inventory', 'products'],
324
+ documentation_request: ['invoices', 'documents', 'compliance'],
325
+ returns_damages: ['returns', 'refunds', 'damages'],
326
+ account_inquiry: ['account', 'billing'],
327
+ product_sourcing: ['products', 'catalog'],
328
+ onboarding_help: ['onboarding', 'getting-started'],
329
+ complaint: ['support', 'issues'],
330
+ feedback: ['feedback', 'general'],
331
+ general_question: ['general', 'faq'],
332
+ other: ['general'],
333
+ };
334
+ const categories = categoryMap[intent] || ['general'];
335
+ const { data, error } = await this.supabase
336
+ .from('support_knowledge')
337
+ .select('id, category, question, answer, quality_score')
338
+ .in('category', categories)
339
+ .order('quality_score', { ascending: false })
340
+ .limit(5);
341
+ if (error || !data) {
342
+ return [];
343
+ }
344
+ return data.map((knowledge) => ({
345
+ id: String(knowledge.id),
346
+ name: knowledge.question.substring(0, 50),
347
+ intent,
348
+ content: knowledge.answer,
349
+ variables: [],
350
+ applicabilityScore: knowledge.quality_score || 0.5,
351
+ }));
352
+ }
353
+ /**
354
+ * Retrieve similar historical conversations using semantic search
355
+ *
356
+ * Uses pgvector for embedding similarity search against gmail_knowledge_entries.
357
+ * Falls back to full-text search if embedding service is unavailable.
358
+ */
359
+ async retrieveSimilarConversations(messageText, intent) {
360
+ const maxResults = this.effectiveConfig.knowledge.maxSimilarConversations || 5;
361
+ const similarityThreshold = this.effectiveConfig.knowledge.similarityThreshold || 0.78;
362
+ // Try embedding-based semantic search first
363
+ if (this.embeddingService) {
364
+ try {
365
+ const results = await this.embeddingService.findSimilar(messageText, {
366
+ matchThreshold: similarityThreshold,
367
+ matchCount: maxResults,
368
+ filterIntent: intent,
369
+ onlyApproved: true,
370
+ });
371
+ return results.map((result) => ({
372
+ conversationId: createConversationId(result.id),
373
+ similarity: result.similarity,
374
+ resolution: this.mapResolutionIndicator(result.resolutionIndicator),
375
+ summary: this.buildConversationSummary(result.questionSubject, result.questionText),
376
+ successfulResponse: result.responseText,
377
+ }));
378
+ }
379
+ catch (error) {
380
+ console.warn('Embedding search failed, falling back to full-text:', error);
381
+ }
382
+ }
383
+ // Fallback to full-text search
384
+ try {
385
+ const { data, error } = await this.supabase.rpc('search_gmail_knowledge_fulltext', {
386
+ search_query: messageText.substring(0, 500), // Limit query length
387
+ result_limit: maxResults,
388
+ filter_intent: intent,
389
+ only_approved: true,
390
+ });
391
+ if (error || !data) {
392
+ console.warn('Full-text search failed:', error);
393
+ return [];
394
+ }
395
+ return data.map((row) => ({
396
+ conversationId: createConversationId(row.id),
397
+ similarity: Math.min(row.rank * 0.1, 1.0), // Normalize rank to 0-1
398
+ resolution: 'resolved', // Assume approved entries are resolved
399
+ summary: this.buildConversationSummary(row.question_subject, row.question_text),
400
+ successfulResponse: row.response_text,
401
+ }));
402
+ }
403
+ catch (error) {
404
+ console.warn('Full-text search failed:', error);
405
+ return [];
406
+ }
407
+ }
408
+ /**
409
+ * Map resolution indicator string to ResolutionType enum
410
+ */
411
+ mapResolutionIndicator(indicator) {
412
+ if (!indicator) {
413
+ return 'issue_resolved';
414
+ }
415
+ const lowerIndicator = indicator.toLowerCase();
416
+ if (lowerIndicator.includes('resolved') || lowerIndicator.includes('completed')) {
417
+ return 'issue_resolved';
418
+ }
419
+ if (lowerIndicator.includes('satisfied') || lowerIndicator.includes('happy')) {
420
+ return 'customer_satisfied';
421
+ }
422
+ if (lowerIndicator.includes('escalat')) {
423
+ return 'escalation_resolved';
424
+ }
425
+ if (lowerIndicator.includes('closed') || lowerIndicator.includes('no response')) {
426
+ return 'auto_closed';
427
+ }
428
+ return 'issue_resolved';
429
+ }
430
+ /**
431
+ * Build a summary string from question subject and text
432
+ */
433
+ buildConversationSummary(subject, text) {
434
+ const maxLength = 150;
435
+ if (subject) {
436
+ const combined = `${subject}: ${text}`;
437
+ return combined.length > maxLength
438
+ ? combined.substring(0, maxLength - 3) + '...'
439
+ : combined;
440
+ }
441
+ return text.length > maxLength
442
+ ? text.substring(0, maxLength - 3) + '...'
443
+ : text;
444
+ }
445
+ }
446
+ // =============================================================================
447
+ // Singleton and Utility Functions
448
+ // =============================================================================
449
+ let knowledgeService = null;
450
+ export function getKnowledgeRetrievalService(configOverride) {
451
+ // If configOverride is provided, always create a new instance with that config
452
+ if (configOverride) {
453
+ return new KnowledgeRetrievalService(configOverride);
454
+ }
455
+ // Otherwise, use the singleton pattern with global config
456
+ if (!knowledgeService) {
457
+ knowledgeService = new KnowledgeRetrievalService();
458
+ }
459
+ return knowledgeService;
460
+ }
461
+ /**
462
+ * Retrieve knowledge context for a message
463
+ */
464
+ export async function retrieveKnowledgeContext(message, analysis) {
465
+ return getKnowledgeRetrievalService().retrieveContext(message, analysis);
466
+ }
467
+ /**
468
+ * Quick customer lookup
469
+ */
470
+ export async function lookupCustomer(message) {
471
+ return getKnowledgeRetrievalService().retrieveCustomerData(message);
472
+ }
473
+ /**
474
+ * Check if knowledge context has sufficient data for autonomous response
475
+ */
476
+ export function hassufficientContext(context) {
477
+ const { confidenceScores } = context;
478
+ // Need at least customer data or high policy confidence
479
+ const customerKnown = confidenceScores.customerData > 0.5;
480
+ const hasProductInfo = confidenceScores.productData > 0.5;
481
+ const hasSimilarConversations = confidenceScores.similarConversations > 0.5;
482
+ // Consider sufficient if we have customer + anything else
483
+ return customerKnown || (hasProductInfo && hasSimilarConversations);
484
+ }
485
+ /**
486
+ * Calculate overall context confidence
487
+ */
488
+ export function calculateContextConfidence(context) {
489
+ const scores = context.confidenceScores;
490
+ const weights = {
491
+ customerData: 0.4,
492
+ productData: 0.2,
493
+ policyData: 0.2,
494
+ similarConversations: 0.2,
495
+ };
496
+ return (scores.customerData * weights.customerData +
497
+ scores.productData * weights.productData +
498
+ scores.policyData * weights.policyData +
499
+ scores.similarConversations * weights.similarConversations);
500
+ }
501
+ // =============================================================================
502
+ // Re-export Invoice Resolver
503
+ // =============================================================================
504
+ export { InvoiceResolverService, getInvoiceResolverService, resolveInvoice, isInvoiceRelatedQuery, } from './invoice-resolver.js';
505
+ // =============================================================================
506
+ // Aliases for backwards compatibility with main index.ts
507
+ // =============================================================================
508
+ /**
509
+ * Alias for getKnowledgeRetrievalService (used by main index.ts)
510
+ */
511
+ export const getKnowledgeService = getKnowledgeRetrievalService;
512
+ /**
513
+ * Alias for retrieveKnowledgeContext (used by main index.ts)
514
+ */
515
+ export const retrieveKnowledge = retrieveKnowledgeContext;
516
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/knowledge/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Invoice Resolution Service
3
+ *
4
+ * Intelligently resolves which invoice a customer is asking about to avoid
5
+ * unnecessary "please provide your invoice number" responses.
6
+ *
7
+ * Resolution Priority:
8
+ * 1. Invoice number extracted from message/subject -> Direct lookup
9
+ * 2. Customer has 1 unpaid invoice -> Auto-resolve to that (high confidence)
10
+ * 3. Customer has 0 unpaid but has invoices -> Use most recent (medium confidence)
11
+ * 4. Multiple unpaid invoices, no number given -> Cannot resolve (return null)
12
+ */
13
+ import type { ResolvedInvoice, CustomerId } from '../types.js';
14
+ export declare class InvoiceResolverService {
15
+ private supabase;
16
+ constructor();
17
+ /**
18
+ * Resolve which invoice a customer is asking about
19
+ *
20
+ * @param customerId - The customer's ID (from User table)
21
+ * @param extractedInvoiceNumbers - Invoice numbers already extracted by entity extraction
22
+ * @param messageText - The message body
23
+ * @param subject - The email subject line (optional)
24
+ * @returns ResolvedInvoice if we can determine which invoice, null otherwise
25
+ */
26
+ resolveInvoice(customerId: CustomerId, extractedInvoiceNumbers: string[] | undefined, messageText: string, subject?: string): Promise<ResolvedInvoice | null>;
27
+ /**
28
+ * Extract invoice numbers from text using multiple patterns
29
+ */
30
+ private extractInvoiceNumbers;
31
+ /**
32
+ * Look up an invoice by number, verifying it belongs to the customer
33
+ */
34
+ private lookupByNumber;
35
+ /**
36
+ * Get all invoices for a customer
37
+ */
38
+ private getCustomerInvoices;
39
+ /**
40
+ * Get the most recent invoice from a list
41
+ */
42
+ private getMostRecentInvoice;
43
+ /**
44
+ * Map database record to InvoiceContext
45
+ */
46
+ private mapToInvoiceContext;
47
+ /**
48
+ * Get count of unpaid invoices for a customer
49
+ * Useful for the response generation to know if clarification is needed
50
+ */
51
+ getUnpaidInvoiceCount(customerId: CustomerId): Promise<number>;
52
+ }
53
+ export declare function getInvoiceResolverService(): InvoiceResolverService;
54
+ /**
55
+ * Resolve which invoice a customer is asking about
56
+ */
57
+ export declare function resolveInvoice(customerId: CustomerId, extractedInvoiceNumbers: string[] | undefined, messageText: string, subject?: string): Promise<ResolvedInvoice | null>;
58
+ /**
59
+ * Check if text contains invoice-related keywords
60
+ */
61
+ export declare function isInvoiceRelatedQuery(text: string): boolean;
62
+ //# sourceMappingURL=invoice-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-resolver.d.ts","sourceRoot":"","sources":["../../src/knowledge/invoice-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAkB,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsB/E,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAiB;;IAMjC;;;;;;;;OAQG;IACG,cAAc,CAClB,UAAU,EAAE,UAAU,EACtB,uBAAuB,EAAE,MAAM,EAAE,GAAG,SAAS,EAC7C,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IA6FlC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;YACW,cAAc;IA+B5B;;OAEG;YACW,mBAAmB;IAmBjC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkC3B;;;OAGG;IACG,qBAAqB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CAarE;AAQD,wBAAgB,yBAAyB,IAAI,sBAAsB,CAKlE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,UAAU,EACtB,uBAAuB,EAAE,MAAM,EAAE,GAAG,SAAS,EAC7C,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAOjC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG3D"}