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,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"}
|