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.
- package/dist/admin-portal.d.ts +43 -0
- package/dist/admin-portal.d.ts.map +1 -0
- package/dist/admin-portal.js +166 -0
- package/dist/admin-portal.js.map +1 -0
- package/dist/analysis/entities.d.ts +73 -0
- package/dist/analysis/entities.d.ts.map +1 -0
- package/dist/analysis/entities.js +378 -0
- package/dist/analysis/entities.js.map +1 -0
- package/dist/analysis/index.d.ts +44 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +243 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/intent.d.ts +49 -0
- package/dist/analysis/intent.d.ts.map +1 -0
- package/dist/analysis/intent.js +320 -0
- package/dist/analysis/intent.js.map +1 -0
- package/dist/analysis/sentiment.d.ts +57 -0
- package/dist/analysis/sentiment.d.ts.map +1 -0
- package/dist/analysis/sentiment.js +351 -0
- package/dist/analysis/sentiment.js.map +1 -0
- package/dist/brand/compliance.d.ts +122 -0
- package/dist/brand/compliance.d.ts.map +1 -0
- package/dist/brand/compliance.js +378 -0
- package/dist/brand/compliance.js.map +1 -0
- package/dist/brand/forbidden-terms.d.ts +99 -0
- package/dist/brand/forbidden-terms.d.ts.map +1 -0
- package/dist/brand/forbidden-terms.js +265 -0
- package/dist/brand/forbidden-terms.js.map +1 -0
- package/dist/brand/index.d.ts +10 -0
- package/dist/brand/index.d.ts.map +1 -0
- package/dist/brand/index.js +12 -0
- package/dist/brand/index.js.map +1 -0
- package/dist/config.d.ts +325 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +492 -0
- package/dist/config.js.map +1 -0
- package/dist/delivery/index.d.ts +84 -0
- package/dist/delivery/index.d.ts.map +1 -0
- package/dist/delivery/index.js +435 -0
- package/dist/delivery/index.js.map +1 -0
- package/dist/embeddings/cache.d.ts +96 -0
- package/dist/embeddings/cache.d.ts.map +1 -0
- package/dist/embeddings/cache.js +193 -0
- package/dist/embeddings/cache.js.map +1 -0
- package/dist/embeddings/index.d.ts +152 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +337 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/openai-client.d.ts +67 -0
- package/dist/embeddings/openai-client.d.ts.map +1 -0
- package/dist/embeddings/openai-client.js +190 -0
- package/dist/embeddings/openai-client.js.map +1 -0
- package/dist/errors.d.ts +302 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +508 -0
- package/dist/errors.js.map +1 -0
- package/dist/escalation/index.d.ts +93 -0
- package/dist/escalation/index.d.ts.map +1 -0
- package/dist/escalation/index.js +436 -0
- package/dist/escalation/index.js.map +1 -0
- package/dist/extraction/deduplication.d.ts +97 -0
- package/dist/extraction/deduplication.d.ts.map +1 -0
- package/dist/extraction/deduplication.js +271 -0
- package/dist/extraction/deduplication.js.map +1 -0
- package/dist/extraction/gmail-extractor.d.ts +160 -0
- package/dist/extraction/gmail-extractor.d.ts.map +1 -0
- package/dist/extraction/gmail-extractor.js +396 -0
- package/dist/extraction/gmail-extractor.js.map +1 -0
- package/dist/extraction/gmail-token-manager.d.ts +36 -0
- package/dist/extraction/gmail-token-manager.d.ts.map +1 -0
- package/dist/extraction/gmail-token-manager.js +146 -0
- package/dist/extraction/gmail-token-manager.js.map +1 -0
- package/dist/extraction/index.d.ts +13 -0
- package/dist/extraction/index.d.ts.map +1 -0
- package/dist/extraction/index.js +20 -0
- package/dist/extraction/index.js.map +1 -0
- package/dist/extraction/pii-handler.d.ts +100 -0
- package/dist/extraction/pii-handler.d.ts.map +1 -0
- package/dist/extraction/pii-handler.js +295 -0
- package/dist/extraction/pii-handler.js.map +1 -0
- package/dist/extraction/pipeline.d.ts +94 -0
- package/dist/extraction/pipeline.d.ts.map +1 -0
- package/dist/extraction/pipeline.js +380 -0
- package/dist/extraction/pipeline.js.map +1 -0
- package/dist/extraction/quality-filter.d.ts +99 -0
- package/dist/extraction/quality-filter.d.ts.map +1 -0
- package/dist/extraction/quality-filter.js +370 -0
- package/dist/extraction/quality-filter.js.map +1 -0
- package/dist/extraction/rate-limiter.d.ts +90 -0
- package/dist/extraction/rate-limiter.d.ts.map +1 -0
- package/dist/extraction/rate-limiter.js +242 -0
- package/dist/extraction/rate-limiter.js.map +1 -0
- package/dist/extraction/state-manager.d.ts +126 -0
- package/dist/extraction/state-manager.d.ts.map +1 -0
- package/dist/extraction/state-manager.js +344 -0
- package/dist/extraction/state-manager.js.map +1 -0
- package/dist/generation/index.d.ts +75 -0
- package/dist/generation/index.d.ts.map +1 -0
- package/dist/generation/index.js +641 -0
- package/dist/generation/index.js.map +1 -0
- package/dist/index.d.ts +96 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +233 -0
- package/dist/index.js.map +1 -0
- package/dist/intake/index.d.ts +15 -0
- package/dist/intake/index.d.ts.map +1 -0
- package/dist/intake/index.js +19 -0
- package/dist/intake/index.js.map +1 -0
- package/dist/intake/normalizer.d.ts +163 -0
- package/dist/intake/normalizer.d.ts.map +1 -0
- package/dist/intake/normalizer.js +309 -0
- package/dist/intake/normalizer.js.map +1 -0
- package/dist/intake/postmark.d.ts +72 -0
- package/dist/intake/postmark.d.ts.map +1 -0
- package/dist/intake/postmark.js +276 -0
- package/dist/intake/postmark.js.map +1 -0
- package/dist/intake/slack.d.ts +106 -0
- package/dist/intake/slack.d.ts.map +1 -0
- package/dist/intake/slack.js +378 -0
- package/dist/intake/slack.js.map +1 -0
- package/dist/intake/twilio.d.ts +86 -0
- package/dist/intake/twilio.d.ts.map +1 -0
- package/dist/intake/twilio.js +283 -0
- package/dist/intake/twilio.js.map +1 -0
- package/dist/knowledge/index.d.ts +100 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +516 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/invoice-resolver.d.ts +62 -0
- package/dist/knowledge/invoice-resolver.d.ts.map +1 -0
- package/dist/knowledge/invoice-resolver.js +267 -0
- package/dist/knowledge/invoice-resolver.js.map +1 -0
- package/dist/types.d.ts +535 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +48 -0
- package/dist/types.js.map +1 -0
- package/ga-service-account.json +13 -0
- package/gmail-knowledge-migration.sql +149 -0
- package/nul +1 -0
- 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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"}
|