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,267 @@
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 { createClient } from '@supabase/supabase-js';
14
+ import { config } from '../config.js';
15
+ // =============================================================================
16
+ // Invoice Number Patterns
17
+ // =============================================================================
18
+ /**
19
+ * Catalist invoice numbers are 7-digit numbers starting with 91
20
+ * Examples: 9107893, 9107894
21
+ */
22
+ const CATALIST_INVOICE_PATTERN = /\b(91\d{5})\b/g;
23
+ /**
24
+ * General invoice reference patterns
25
+ * Matches: "invoice #123", "INV-123", "invoice 123"
26
+ */
27
+ const GENERAL_INVOICE_PATTERN = /(?:invoice|inv)[\s#:\-]*([A-Z0-9-]{4,20})/gi;
28
+ // =============================================================================
29
+ // Invoice Resolver Service
30
+ // =============================================================================
31
+ export class InvoiceResolverService {
32
+ supabase;
33
+ constructor() {
34
+ this.supabase = createClient(config.supabase.url, config.supabase.serviceRoleKey);
35
+ }
36
+ /**
37
+ * Resolve which invoice a customer is asking about
38
+ *
39
+ * @param customerId - The customer's ID (from User table)
40
+ * @param extractedInvoiceNumbers - Invoice numbers already extracted by entity extraction
41
+ * @param messageText - The message body
42
+ * @param subject - The email subject line (optional)
43
+ * @returns ResolvedInvoice if we can determine which invoice, null otherwise
44
+ */
45
+ async resolveInvoice(customerId, extractedInvoiceNumbers, messageText, subject) {
46
+ // Combine subject and message for invoice number extraction
47
+ const fullText = subject ? `${subject}\n${messageText}` : messageText;
48
+ // Step 1: Try to find invoice number from extracted entities or our own extraction
49
+ const invoiceNumbers = this.extractInvoiceNumbers(fullText, extractedInvoiceNumbers);
50
+ const firstInvoiceNumber = invoiceNumbers[0];
51
+ if (firstInvoiceNumber) {
52
+ // Try to look up the invoice by number
53
+ const invoice = await this.lookupByNumber(firstInvoiceNumber, customerId);
54
+ if (invoice) {
55
+ console.info('Invoice resolution:', {
56
+ customerId,
57
+ source: 'extracted_number',
58
+ confidence: 'explicit',
59
+ invoiceId: invoice.invoiceId,
60
+ invoiceNumber: invoice.invoiceNumber,
61
+ });
62
+ return {
63
+ invoice,
64
+ confidence: 'explicit',
65
+ source: 'extracted_number',
66
+ };
67
+ }
68
+ // Invoice number provided but not found or belongs to different customer
69
+ // Fall through to auto-resolution
70
+ }
71
+ // Step 2: Get customer's invoices for auto-resolution
72
+ const invoices = await this.getCustomerInvoices(customerId);
73
+ if (invoices.length === 0) {
74
+ console.info('Invoice resolution:', {
75
+ customerId,
76
+ source: 'unresolved',
77
+ confidence: 'none',
78
+ reason: 'no_invoices',
79
+ });
80
+ return null;
81
+ }
82
+ // Step 3: Filter to unpaid invoices (status = 'issued')
83
+ const unpaid = invoices.filter((inv) => inv.status === 'issued');
84
+ // Step 4: Apply resolution logic
85
+ if (unpaid.length === 1) {
86
+ const singleUnpaid = unpaid[0];
87
+ // Single unpaid invoice - high confidence this is what they're asking about
88
+ console.info('Invoice resolution:', {
89
+ customerId,
90
+ source: 'single_unpaid',
91
+ confidence: 'high',
92
+ invoiceId: singleUnpaid.invoiceId,
93
+ invoiceNumber: singleUnpaid.invoiceNumber,
94
+ });
95
+ return {
96
+ invoice: singleUnpaid,
97
+ confidence: 'high',
98
+ source: 'single_unpaid',
99
+ };
100
+ }
101
+ if (unpaid.length === 0) {
102
+ // No unpaid invoices - use the most recent one
103
+ const mostRecent = this.getMostRecentInvoice(invoices);
104
+ if (mostRecent) {
105
+ console.info('Invoice resolution:', {
106
+ customerId,
107
+ source: 'most_recent',
108
+ confidence: 'medium',
109
+ invoiceId: mostRecent.invoiceId,
110
+ invoiceNumber: mostRecent.invoiceNumber,
111
+ });
112
+ return {
113
+ invoice: mostRecent,
114
+ confidence: 'medium',
115
+ source: 'most_recent',
116
+ };
117
+ }
118
+ }
119
+ // Multiple unpaid invoices and no number provided - cannot resolve
120
+ console.info('Invoice resolution:', {
121
+ customerId,
122
+ source: 'unresolved',
123
+ confidence: 'none',
124
+ reason: 'multiple_unpaid',
125
+ unpaidCount: unpaid.length,
126
+ });
127
+ return null;
128
+ }
129
+ /**
130
+ * Extract invoice numbers from text using multiple patterns
131
+ */
132
+ extractInvoiceNumbers(text, existingNumbers) {
133
+ const numbers = new Set(existingNumbers ?? []);
134
+ // Extract Catalist-specific invoice numbers (7 digits starting with 91)
135
+ const catalistMatches = text.matchAll(CATALIST_INVOICE_PATTERN);
136
+ for (const match of catalistMatches) {
137
+ if (match[1]) {
138
+ numbers.add(match[1]);
139
+ }
140
+ }
141
+ // Extract general invoice references
142
+ const generalMatches = text.matchAll(GENERAL_INVOICE_PATTERN);
143
+ for (const match of generalMatches) {
144
+ if (match[1]) {
145
+ numbers.add(match[1]);
146
+ }
147
+ }
148
+ return Array.from(numbers);
149
+ }
150
+ /**
151
+ * Look up an invoice by number, verifying it belongs to the customer
152
+ */
153
+ async lookupByNumber(invoiceNumber, customerId) {
154
+ const { data, error } = await this.supabase
155
+ .from('Invoice')
156
+ .select(`
157
+ id, order_id, invoice_num, status, total, subtotal,
158
+ fees_total, tax_total, shipping_total, discount_total,
159
+ issued_at, due_at, paid_at, pdf_url, notes, user_id
160
+ `)
161
+ .eq('invoice_num', invoiceNumber)
162
+ .single();
163
+ if (error || !data) {
164
+ return null;
165
+ }
166
+ // Security check: verify invoice belongs to this customer
167
+ if (String(data.user_id) !== String(customerId)) {
168
+ console.warn('Invoice lookup: invoice belongs to different customer', {
169
+ invoiceNumber,
170
+ requestedBy: customerId,
171
+ actualOwner: data.user_id,
172
+ });
173
+ return null;
174
+ }
175
+ return this.mapToInvoiceContext(data);
176
+ }
177
+ /**
178
+ * Get all invoices for a customer
179
+ */
180
+ async getCustomerInvoices(customerId) {
181
+ const { data, error } = await this.supabase
182
+ .from('Invoice')
183
+ .select(`
184
+ id, order_id, invoice_num, status, total, subtotal,
185
+ fees_total, tax_total, shipping_total, discount_total,
186
+ issued_at, due_at, paid_at, pdf_url, notes
187
+ `)
188
+ .eq('user_id', customerId)
189
+ .order('issued_at', { ascending: false })
190
+ .limit(20);
191
+ if (error || !data) {
192
+ return [];
193
+ }
194
+ return data.map(this.mapToInvoiceContext);
195
+ }
196
+ /**
197
+ * Get the most recent invoice from a list
198
+ */
199
+ getMostRecentInvoice(invoices) {
200
+ if (invoices.length === 0) {
201
+ return null;
202
+ }
203
+ // Already sorted by issued_at descending from the query
204
+ const first = invoices[0];
205
+ return first ?? null;
206
+ }
207
+ /**
208
+ * Map database record to InvoiceContext
209
+ */
210
+ mapToInvoiceContext(record) {
211
+ return {
212
+ invoiceId: record.id,
213
+ invoiceNumber: record.invoice_num,
214
+ status: record.status,
215
+ total: Number(record.total) || 0,
216
+ subtotal: Number(record.subtotal) || 0,
217
+ feesTotal: Number(record.fees_total) || 0,
218
+ taxTotal: Number(record.tax_total) || 0,
219
+ shippingTotal: Number(record.shipping_total) || 0,
220
+ discountTotal: Number(record.discount_total) || 0,
221
+ issuedAt: record.issued_at,
222
+ dueAt: record.due_at,
223
+ paidAt: record.paid_at,
224
+ pdfUrl: record.pdf_url,
225
+ notes: record.notes,
226
+ };
227
+ }
228
+ /**
229
+ * Get count of unpaid invoices for a customer
230
+ * Useful for the response generation to know if clarification is needed
231
+ */
232
+ async getUnpaidInvoiceCount(customerId) {
233
+ const { count, error } = await this.supabase
234
+ .from('Invoice')
235
+ .select('id', { count: 'exact', head: true })
236
+ .eq('user_id', customerId)
237
+ .eq('status', 'issued');
238
+ if (error) {
239
+ return 0;
240
+ }
241
+ return count ?? 0;
242
+ }
243
+ }
244
+ // =============================================================================
245
+ // Singleton and Utility Functions
246
+ // =============================================================================
247
+ let invoiceResolverService = null;
248
+ export function getInvoiceResolverService() {
249
+ if (!invoiceResolverService) {
250
+ invoiceResolverService = new InvoiceResolverService();
251
+ }
252
+ return invoiceResolverService;
253
+ }
254
+ /**
255
+ * Resolve which invoice a customer is asking about
256
+ */
257
+ export async function resolveInvoice(customerId, extractedInvoiceNumbers, messageText, subject) {
258
+ return getInvoiceResolverService().resolveInvoice(customerId, extractedInvoiceNumbers, messageText, subject);
259
+ }
260
+ /**
261
+ * Check if text contains invoice-related keywords
262
+ */
263
+ export function isInvoiceRelatedQuery(text) {
264
+ const invoiceKeywords = /\b(invoice|invoices|billing|bill|payment|pay|receipt|statement)\b/i;
265
+ return invoiceKeywords.test(text);
266
+ }
267
+ //# sourceMappingURL=invoice-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-resolver.js","sourceRoot":"","sources":["../../src/knowledge/invoice-resolver.ts"],"names":[],"mappings":"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"}