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
package/dist/config.js
ADDED
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Support Agent Configuration
|
|
3
|
+
*
|
|
4
|
+
* Configuration module with Zod schema validation for the Support AI Agent SDK.
|
|
5
|
+
* Covers Supabase, Claude authentication, channel credentials (Postmark, Twilio, Slack),
|
|
6
|
+
* and brand compliance settings including forbidden terms list.
|
|
7
|
+
*/
|
|
8
|
+
import { config as dotenvConfig } from 'dotenv';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
// Load environment variables
|
|
11
|
+
dotenvConfig();
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Brand Compliance Configuration
|
|
14
|
+
// =============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Forbidden terms that MUST trigger escalation to human agents.
|
|
17
|
+
* Any message containing these terms cannot be handled autonomously.
|
|
18
|
+
*
|
|
19
|
+
* NOTE: Marketplace terms (Amazon, FBA, Walmart, eBay, ungating, reseller, etc.)
|
|
20
|
+
* are NOT forbidden because our clients are Amazon FBA sellers who legitimately
|
|
21
|
+
* discuss these topics when seeking order support.
|
|
22
|
+
*
|
|
23
|
+
* Only truly problematic terms remain forbidden:
|
|
24
|
+
* - Invoice manipulation requests (fraud prevention)
|
|
25
|
+
* - Competitor price matching requests (business policy)
|
|
26
|
+
*/
|
|
27
|
+
const DEFAULT_FORBIDDEN_TERMS = [
|
|
28
|
+
// Invoice manipulation (fraud prevention)
|
|
29
|
+
'edit invoice',
|
|
30
|
+
'modify invoice',
|
|
31
|
+
'change invoice',
|
|
32
|
+
'fake invoice',
|
|
33
|
+
'falsify invoice',
|
|
34
|
+
'alter invoice',
|
|
35
|
+
// Competitor pricing discussions (business policy - escalate to sales)
|
|
36
|
+
'competitor price',
|
|
37
|
+
'competitor pricing',
|
|
38
|
+
'price match',
|
|
39
|
+
'beat their price',
|
|
40
|
+
'cheaper elsewhere',
|
|
41
|
+
'found it cheaper',
|
|
42
|
+
];
|
|
43
|
+
// =============================================================================
|
|
44
|
+
// Configuration Schema
|
|
45
|
+
// =============================================================================
|
|
46
|
+
const ConfigSchema = z.object({
|
|
47
|
+
// Supabase configuration
|
|
48
|
+
supabase: z.object({
|
|
49
|
+
url: z.string().url(),
|
|
50
|
+
serviceRoleKey: z.string().min(1),
|
|
51
|
+
anonKey: z.string().optional(),
|
|
52
|
+
}),
|
|
53
|
+
// Claude Authentication configuration
|
|
54
|
+
claude: z.object({
|
|
55
|
+
oauthToken: z.string().optional(),
|
|
56
|
+
apiKey: z.string().optional(),
|
|
57
|
+
tokenCreatedAt: z.string().optional(),
|
|
58
|
+
authMode: z.enum(['oauth', 'api_key', 'none']).default('none'),
|
|
59
|
+
model: z.string().default('claude-sonnet-4-20250514'),
|
|
60
|
+
maxTokens: z.number().int().positive().default(4096),
|
|
61
|
+
}),
|
|
62
|
+
// Channel credentials - Postmark (Email)
|
|
63
|
+
postmark: z.object({
|
|
64
|
+
enabled: z.boolean().default(true),
|
|
65
|
+
serverToken: z.string().optional(),
|
|
66
|
+
fromAddress: z.string().email().optional(),
|
|
67
|
+
replyToAddress: z.string().email().optional(),
|
|
68
|
+
messageStream: z.string().default('outbound'),
|
|
69
|
+
webhookToken: z.string().optional(), // For signature validation
|
|
70
|
+
}),
|
|
71
|
+
// Channel credentials - Twilio (SMS)
|
|
72
|
+
twilio: z.object({
|
|
73
|
+
enabled: z.boolean().default(true),
|
|
74
|
+
accountSid: z.string().optional(),
|
|
75
|
+
authToken: z.string().optional(),
|
|
76
|
+
fromNumber: z.string().optional(), // E.164 format
|
|
77
|
+
messagingServiceSid: z.string().optional(),
|
|
78
|
+
}),
|
|
79
|
+
// Channel credentials - Slack
|
|
80
|
+
slack: z.object({
|
|
81
|
+
enabled: z.boolean().default(true),
|
|
82
|
+
botToken: z.string().optional(),
|
|
83
|
+
signingSecret: z.string().optional(),
|
|
84
|
+
appId: z.string().optional(),
|
|
85
|
+
}),
|
|
86
|
+
// Agent configuration
|
|
87
|
+
agent: z.object({
|
|
88
|
+
// Response generation timeout
|
|
89
|
+
responseTimeoutMs: z.number().int().positive().default(30000),
|
|
90
|
+
// Maximum conversation turns before requiring human review
|
|
91
|
+
maxConversationTurns: z.number().int().positive().default(10),
|
|
92
|
+
// Confidence thresholds
|
|
93
|
+
confidenceThresholds: z.object({
|
|
94
|
+
high: z.number().min(0).max(1).default(0.85),
|
|
95
|
+
medium: z.number().min(0).max(1).default(0.70),
|
|
96
|
+
escalationTrigger: z.number().min(0).max(1).default(0.60),
|
|
97
|
+
}),
|
|
98
|
+
// Maximum fix/response attempts before escalation
|
|
99
|
+
maxResponseAttempts: z.number().int().positive().default(3),
|
|
100
|
+
// Enable shadow mode (generates responses but routes all to human review)
|
|
101
|
+
shadowMode: z.boolean().default(true),
|
|
102
|
+
// Autonomous response percentage (0-100, used during gradual autonomy rollout)
|
|
103
|
+
autonomyPercentage: z.number().min(0).max(100).default(0),
|
|
104
|
+
// Permission mode for Claude Agent SDK
|
|
105
|
+
permissionMode: z
|
|
106
|
+
.enum(['default', 'acceptEdits', 'bypassPermissions', 'plan'])
|
|
107
|
+
.default('default'),
|
|
108
|
+
}),
|
|
109
|
+
// Brand compliance configuration
|
|
110
|
+
brandCompliance: z.object({
|
|
111
|
+
// Enable strict brand compliance checking
|
|
112
|
+
enabled: z.boolean().default(true),
|
|
113
|
+
// Forbidden terms list (auto-escalate if detected)
|
|
114
|
+
forbiddenTerms: z.array(z.string()).default(DEFAULT_FORBIDDEN_TERMS),
|
|
115
|
+
// Additional custom forbidden terms (merged with defaults)
|
|
116
|
+
customForbiddenTerms: z.array(z.string()).default([]),
|
|
117
|
+
// Brand voice enforcement level
|
|
118
|
+
voiceEnforcementLevel: z.enum(['strict', 'moderate', 'relaxed']).default('strict'),
|
|
119
|
+
// Pre-send validation enabled
|
|
120
|
+
preSendValidation: z.boolean().default(true),
|
|
121
|
+
// Post-send audit enabled
|
|
122
|
+
postSendAudit: z.boolean().default(true),
|
|
123
|
+
// Brand terminology to enforce (positive reinforcement)
|
|
124
|
+
enforcedTerminology: z
|
|
125
|
+
.object({
|
|
126
|
+
// We are a marketplace, not a distributor
|
|
127
|
+
preferredTerms: z
|
|
128
|
+
.record(z.string(), z.string())
|
|
129
|
+
.default({
|
|
130
|
+
'wholesale distributor': 'B2B marketplace',
|
|
131
|
+
vendor: 'brand partner',
|
|
132
|
+
supplier: 'seller',
|
|
133
|
+
customer: 'buyer',
|
|
134
|
+
'wholesale price': 'marketplace price',
|
|
135
|
+
'wholesale account': 'buyer account',
|
|
136
|
+
}),
|
|
137
|
+
})
|
|
138
|
+
.default({
|
|
139
|
+
preferredTerms: {
|
|
140
|
+
'wholesale distributor': 'B2B marketplace',
|
|
141
|
+
vendor: 'brand partner',
|
|
142
|
+
supplier: 'seller',
|
|
143
|
+
customer: 'buyer',
|
|
144
|
+
'wholesale price': 'marketplace price',
|
|
145
|
+
'wholesale account': 'buyer account',
|
|
146
|
+
},
|
|
147
|
+
}),
|
|
148
|
+
}),
|
|
149
|
+
// Escalation configuration
|
|
150
|
+
escalation: z.object({
|
|
151
|
+
enabled: z.boolean().default(true),
|
|
152
|
+
// Default recipients for escalations
|
|
153
|
+
defaultRecipients: z
|
|
154
|
+
.array(z.object({
|
|
155
|
+
email: z.string().email().optional(),
|
|
156
|
+
phone: z.string().optional(),
|
|
157
|
+
slackUserId: z.string().optional(),
|
|
158
|
+
name: z.string().optional(),
|
|
159
|
+
}))
|
|
160
|
+
.default([]),
|
|
161
|
+
// Admin portal base URL for escalation links
|
|
162
|
+
adminBaseUrl: z.string().url().default('https://catalist.deals'),
|
|
163
|
+
// Channel routing by severity
|
|
164
|
+
routing: z
|
|
165
|
+
.object({
|
|
166
|
+
critical: z.array(z.enum(['email', 'sms', 'slack'])).default(['email', 'sms', 'slack']),
|
|
167
|
+
high: z.array(z.enum(['email', 'sms', 'slack'])).default(['email', 'slack']),
|
|
168
|
+
medium: z.array(z.enum(['email', 'slack'])).default(['email', 'slack']),
|
|
169
|
+
low: z.array(z.enum(['email', 'slack'])).default(['email']),
|
|
170
|
+
})
|
|
171
|
+
.default({
|
|
172
|
+
critical: ['email', 'sms', 'slack'],
|
|
173
|
+
high: ['email', 'slack'],
|
|
174
|
+
medium: ['email', 'slack'],
|
|
175
|
+
low: ['email'],
|
|
176
|
+
}),
|
|
177
|
+
// Re-escalate if no response within this time
|
|
178
|
+
reEscalateAfterMs: z.number().int().positive().default(3600000), // 1 hour
|
|
179
|
+
// SLA targets by severity (in milliseconds)
|
|
180
|
+
slaTargets: z
|
|
181
|
+
.object({
|
|
182
|
+
critical: z.number().int().positive().default(900000), // 15 minutes
|
|
183
|
+
high: z.number().int().positive().default(3600000), // 1 hour
|
|
184
|
+
medium: z.number().int().positive().default(14400000), // 4 hours
|
|
185
|
+
low: z.number().int().positive().default(86400000), // 24 hours
|
|
186
|
+
})
|
|
187
|
+
.default({
|
|
188
|
+
critical: 900000,
|
|
189
|
+
high: 3600000,
|
|
190
|
+
medium: 14400000,
|
|
191
|
+
low: 86400000,
|
|
192
|
+
}),
|
|
193
|
+
}),
|
|
194
|
+
// Knowledge base configuration
|
|
195
|
+
knowledge: z.object({
|
|
196
|
+
// Enable customer data retrieval
|
|
197
|
+
customerDataEnabled: z.boolean().default(true),
|
|
198
|
+
// Enable product information lookup
|
|
199
|
+
productLookupEnabled: z.boolean().default(true),
|
|
200
|
+
// Enable similar conversation retrieval (requires pgvector)
|
|
201
|
+
similarConversationsEnabled: z.boolean().default(false),
|
|
202
|
+
// Maximum similar conversations to retrieve
|
|
203
|
+
maxSimilarConversations: z.number().int().positive().default(5),
|
|
204
|
+
// Similarity threshold for semantic search (0.0 - 1.0)
|
|
205
|
+
similarityThreshold: z.number().min(0).max(1).default(0.78),
|
|
206
|
+
// Enable response template matching
|
|
207
|
+
templatesEnabled: z.boolean().default(true),
|
|
208
|
+
}),
|
|
209
|
+
// OpenAI configuration (for embeddings)
|
|
210
|
+
openai: z.object({
|
|
211
|
+
// OpenAI API key
|
|
212
|
+
apiKey: z.string().optional(),
|
|
213
|
+
// Embedding model to use
|
|
214
|
+
embeddingModel: z.string().default('text-embedding-3-small'),
|
|
215
|
+
// Embedding dimensions
|
|
216
|
+
embeddingDimensions: z.number().int().positive().default(1536),
|
|
217
|
+
// Embedding cache max size
|
|
218
|
+
embeddingCacheMaxSize: z.number().int().positive().default(1000),
|
|
219
|
+
// Embedding cache TTL in milliseconds (5 minutes default)
|
|
220
|
+
embeddingCacheTtlMs: z.number().int().positive().default(300000),
|
|
221
|
+
}),
|
|
222
|
+
// Logging configuration
|
|
223
|
+
logging: z.object({
|
|
224
|
+
level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
|
|
225
|
+
structured: z.boolean().default(true),
|
|
226
|
+
}),
|
|
227
|
+
});
|
|
228
|
+
// =============================================================================
|
|
229
|
+
// Configuration Loading
|
|
230
|
+
// =============================================================================
|
|
231
|
+
function loadConfig() {
|
|
232
|
+
const rawConfig = {
|
|
233
|
+
supabase: {
|
|
234
|
+
url: process.env.SUPABASE_URL || process.env.NEXT_PUBLIC_SUPABASE_URL,
|
|
235
|
+
serviceRoleKey: process.env.SUPABASE_SERVICE_ROLE_KEY,
|
|
236
|
+
anonKey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
|
|
237
|
+
},
|
|
238
|
+
claude: {
|
|
239
|
+
oauthToken: process.env.CLAUDE_CODE_OAUTH_TOKEN,
|
|
240
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
241
|
+
tokenCreatedAt: process.env.CLAUDE_TOKEN_CREATED_AT,
|
|
242
|
+
authMode: process.env.CLAUDE_CODE_OAUTH_TOKEN
|
|
243
|
+
? 'oauth'
|
|
244
|
+
: process.env.ANTHROPIC_API_KEY
|
|
245
|
+
? 'api_key'
|
|
246
|
+
: 'none',
|
|
247
|
+
model: process.env.SUPPORT_AGENT_MODEL || 'claude-sonnet-4-20250514',
|
|
248
|
+
maxTokens: parseInt(process.env.SUPPORT_AGENT_MAX_TOKENS || '4096', 10),
|
|
249
|
+
},
|
|
250
|
+
postmark: {
|
|
251
|
+
enabled: process.env.POSTMARK_ENABLED !== 'false',
|
|
252
|
+
serverToken: process.env.POSTMARK_SERVER_TOKEN,
|
|
253
|
+
fromAddress: process.env.POSTMARK_FROM_ADDRESS,
|
|
254
|
+
replyToAddress: process.env.POSTMARK_REPLY_TO_ADDRESS,
|
|
255
|
+
messageStream: process.env.POSTMARK_MESSAGE_STREAM || 'outbound',
|
|
256
|
+
webhookToken: process.env.POSTMARK_WEBHOOK_TOKEN,
|
|
257
|
+
},
|
|
258
|
+
twilio: {
|
|
259
|
+
enabled: process.env.TWILIO_ENABLED !== 'false',
|
|
260
|
+
accountSid: process.env.TWILIO_ACCOUNT_SID,
|
|
261
|
+
authToken: process.env.TWILIO_AUTH_TOKEN,
|
|
262
|
+
fromNumber: process.env.TWILIO_FROM_NUMBER,
|
|
263
|
+
messagingServiceSid: process.env.TWILIO_MESSAGING_SERVICE_SID,
|
|
264
|
+
},
|
|
265
|
+
slack: {
|
|
266
|
+
enabled: process.env.SLACK_ENABLED !== 'false',
|
|
267
|
+
botToken: process.env.SLACK_BOT_TOKEN,
|
|
268
|
+
signingSecret: process.env.SLACK_SIGNING_SECRET,
|
|
269
|
+
appId: process.env.SLACK_APP_ID,
|
|
270
|
+
},
|
|
271
|
+
agent: {
|
|
272
|
+
responseTimeoutMs: parseInt(process.env.SUPPORT_AGENT_TIMEOUT_MS || '30000', 10),
|
|
273
|
+
maxConversationTurns: parseInt(process.env.SUPPORT_AGENT_MAX_TURNS || '10', 10),
|
|
274
|
+
confidenceThresholds: {
|
|
275
|
+
high: parseFloat(process.env.SUPPORT_AGENT_CONFIDENCE_HIGH || '0.85'),
|
|
276
|
+
medium: parseFloat(process.env.SUPPORT_AGENT_CONFIDENCE_MEDIUM || '0.70'),
|
|
277
|
+
escalationTrigger: parseFloat(process.env.SUPPORT_AGENT_ESCALATION_THRESHOLD || '0.60'),
|
|
278
|
+
},
|
|
279
|
+
maxResponseAttempts: parseInt(process.env.SUPPORT_AGENT_MAX_ATTEMPTS || '3', 10),
|
|
280
|
+
shadowMode: process.env.SUPPORT_AGENT_SHADOW_MODE !== 'false',
|
|
281
|
+
autonomyPercentage: parseInt(process.env.SUPPORT_AGENT_AUTONOMY_PCT || '0', 10),
|
|
282
|
+
permissionMode: process.env.SUPPORT_AGENT_PERMISSION_MODE ||
|
|
283
|
+
'default',
|
|
284
|
+
},
|
|
285
|
+
brandCompliance: {
|
|
286
|
+
enabled: process.env.BRAND_COMPLIANCE_ENABLED !== 'false',
|
|
287
|
+
forbiddenTerms: DEFAULT_FORBIDDEN_TERMS,
|
|
288
|
+
customForbiddenTerms: process.env.BRAND_CUSTOM_FORBIDDEN_TERMS
|
|
289
|
+
? process.env.BRAND_CUSTOM_FORBIDDEN_TERMS.split(',').map((t) => t.trim().toLowerCase())
|
|
290
|
+
: [],
|
|
291
|
+
voiceEnforcementLevel: process.env.BRAND_VOICE_LEVEL || 'strict',
|
|
292
|
+
preSendValidation: process.env.BRAND_PRE_SEND_VALIDATION !== 'false',
|
|
293
|
+
postSendAudit: process.env.BRAND_POST_SEND_AUDIT !== 'false',
|
|
294
|
+
},
|
|
295
|
+
escalation: {
|
|
296
|
+
enabled: process.env.ESCALATION_ENABLED !== 'false',
|
|
297
|
+
defaultRecipients: process.env.ESCALATION_DEFAULT_RECIPIENTS
|
|
298
|
+
? JSON.parse(process.env.ESCALATION_DEFAULT_RECIPIENTS)
|
|
299
|
+
: [],
|
|
300
|
+
adminBaseUrl: process.env.ADMIN_BASE_URL || 'https://catalist.deals',
|
|
301
|
+
reEscalateAfterMs: parseInt(process.env.ESCALATION_REESCALATE_MS || '3600000', 10),
|
|
302
|
+
},
|
|
303
|
+
knowledge: {
|
|
304
|
+
customerDataEnabled: process.env.KNOWLEDGE_CUSTOMER_DATA !== 'false',
|
|
305
|
+
productLookupEnabled: process.env.KNOWLEDGE_PRODUCT_LOOKUP !== 'false',
|
|
306
|
+
similarConversationsEnabled: process.env.KNOWLEDGE_SIMILAR_CONVERSATIONS === 'true',
|
|
307
|
+
maxSimilarConversations: parseInt(process.env.KNOWLEDGE_MAX_SIMILAR || '5', 10),
|
|
308
|
+
similarityThreshold: parseFloat(process.env.KNOWLEDGE_SIMILARITY_THRESHOLD || '0.78'),
|
|
309
|
+
templatesEnabled: process.env.KNOWLEDGE_TEMPLATES !== 'false',
|
|
310
|
+
},
|
|
311
|
+
openai: {
|
|
312
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
313
|
+
embeddingModel: process.env.OPENAI_EMBEDDING_MODEL || 'text-embedding-3-small',
|
|
314
|
+
embeddingDimensions: parseInt(process.env.OPENAI_EMBEDDING_DIMENSIONS || '1536', 10),
|
|
315
|
+
embeddingCacheMaxSize: parseInt(process.env.EMBEDDING_CACHE_MAX_SIZE || '1000', 10),
|
|
316
|
+
embeddingCacheTtlMs: parseInt(process.env.EMBEDDING_CACHE_TTL_MS || '300000', 10),
|
|
317
|
+
},
|
|
318
|
+
logging: {
|
|
319
|
+
level: (process.env.LOG_LEVEL || 'info'),
|
|
320
|
+
structured: process.env.LOG_STRUCTURED !== 'false',
|
|
321
|
+
},
|
|
322
|
+
};
|
|
323
|
+
const result = ConfigSchema.safeParse(rawConfig);
|
|
324
|
+
if (!result.success) {
|
|
325
|
+
console.error('Support Agent configuration validation failed:');
|
|
326
|
+
console.error(result.error.format());
|
|
327
|
+
throw new Error('Invalid support agent configuration. Please check environment variables.');
|
|
328
|
+
}
|
|
329
|
+
return result.data;
|
|
330
|
+
}
|
|
331
|
+
export const config = loadConfig();
|
|
332
|
+
// =============================================================================
|
|
333
|
+
// Configuration Utilities
|
|
334
|
+
// =============================================================================
|
|
335
|
+
/**
|
|
336
|
+
* Get all forbidden terms (default + custom)
|
|
337
|
+
*/
|
|
338
|
+
export function getAllForbiddenTerms() {
|
|
339
|
+
return [
|
|
340
|
+
...config.brandCompliance.forbiddenTerms,
|
|
341
|
+
...config.brandCompliance.customForbiddenTerms,
|
|
342
|
+
];
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Check if a channel is configured and enabled
|
|
346
|
+
*/
|
|
347
|
+
export function isChannelEnabled(channel) {
|
|
348
|
+
switch (channel) {
|
|
349
|
+
case 'postmark':
|
|
350
|
+
return config.postmark.enabled && !!config.postmark.serverToken;
|
|
351
|
+
case 'twilio':
|
|
352
|
+
return config.twilio.enabled && !!config.twilio.accountSid && !!config.twilio.authToken;
|
|
353
|
+
case 'slack':
|
|
354
|
+
return config.slack.enabled && !!config.slack.botToken;
|
|
355
|
+
default:
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Get escalation channels for a given severity
|
|
361
|
+
*/
|
|
362
|
+
export function getEscalationChannels(severity) {
|
|
363
|
+
return config.escalation.routing[severity] || ['email'];
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Check if autonomous response is allowed (based on shadow mode and autonomy percentage)
|
|
367
|
+
*/
|
|
368
|
+
export function isAutonomousResponseAllowed() {
|
|
369
|
+
if (config.agent.shadowMode) {
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
if (config.agent.autonomyPercentage === 0) {
|
|
373
|
+
return false;
|
|
374
|
+
}
|
|
375
|
+
if (config.agent.autonomyPercentage >= 100) {
|
|
376
|
+
return true;
|
|
377
|
+
}
|
|
378
|
+
// Random selection based on autonomy percentage
|
|
379
|
+
return Math.random() * 100 < config.agent.autonomyPercentage;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Get SLA target for a severity level
|
|
383
|
+
*/
|
|
384
|
+
export function getSlaTarget(severity) {
|
|
385
|
+
return config.escalation.slaTargets[severity];
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Validate Claude authentication configuration
|
|
389
|
+
*/
|
|
390
|
+
export function validateAuthentication() {
|
|
391
|
+
const warnings = [];
|
|
392
|
+
if (config.claude.authMode === 'oauth') {
|
|
393
|
+
return {
|
|
394
|
+
isValid: true,
|
|
395
|
+
mode: 'oauth',
|
|
396
|
+
message: 'Using Claude Max OAuth authentication (subscription-based)',
|
|
397
|
+
warnings,
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
if (config.claude.authMode === 'api_key') {
|
|
401
|
+
return {
|
|
402
|
+
isValid: true,
|
|
403
|
+
mode: 'api_key',
|
|
404
|
+
message: 'Using Anthropic API key authentication (per-token billing)',
|
|
405
|
+
warnings,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
return {
|
|
409
|
+
isValid: false,
|
|
410
|
+
mode: 'none',
|
|
411
|
+
message: 'No authentication configured. Set CLAUDE_CODE_OAUTH_TOKEN (recommended) or ANTHROPIC_API_KEY',
|
|
412
|
+
warnings,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
export function classifyConfidence(score) {
|
|
416
|
+
if (score >= config.agent.confidenceThresholds.high) {
|
|
417
|
+
return 'high';
|
|
418
|
+
}
|
|
419
|
+
if (score >= config.agent.confidenceThresholds.medium) {
|
|
420
|
+
return 'medium';
|
|
421
|
+
}
|
|
422
|
+
return 'low';
|
|
423
|
+
}
|
|
424
|
+
export function shouldEscalateByConfidence(confidence) {
|
|
425
|
+
return confidence < config.agent.confidenceThresholds.escalationTrigger;
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Create a configuration object with optional runtime overrides.
|
|
429
|
+
*
|
|
430
|
+
* This function is useful when the library is imported by an application
|
|
431
|
+
* that already has its own environment variables (e.g., Admin Portal with
|
|
432
|
+
* NEXT_PUBLIC_SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, ANTHROPIC_API_KEY).
|
|
433
|
+
*
|
|
434
|
+
* The overrides are merged with the base config loaded from environment variables.
|
|
435
|
+
*
|
|
436
|
+
* @param options - Optional overrides for supabase and claude credentials
|
|
437
|
+
* @returns A validated Config object
|
|
438
|
+
*
|
|
439
|
+
* @example
|
|
440
|
+
* ```typescript
|
|
441
|
+
* // Use with Next.js environment variables
|
|
442
|
+
* const customConfig = createConfig({
|
|
443
|
+
* supabase: {
|
|
444
|
+
* url: process.env.NEXT_PUBLIC_SUPABASE_URL,
|
|
445
|
+
* serviceRoleKey: process.env.SUPABASE_SERVICE_ROLE_KEY,
|
|
446
|
+
* },
|
|
447
|
+
* claude: {
|
|
448
|
+
* apiKey: process.env.ANTHROPIC_API_KEY,
|
|
449
|
+
* },
|
|
450
|
+
* });
|
|
451
|
+
* ```
|
|
452
|
+
*/
|
|
453
|
+
export function createConfig(options = {}) {
|
|
454
|
+
// Start with the base config loaded from environment
|
|
455
|
+
const baseConfig = loadConfig();
|
|
456
|
+
// If no overrides provided, return the base config
|
|
457
|
+
if (!options.supabase && !options.claude) {
|
|
458
|
+
return baseConfig;
|
|
459
|
+
}
|
|
460
|
+
// Merge overrides with base config
|
|
461
|
+
const mergedConfig = {
|
|
462
|
+
...baseConfig,
|
|
463
|
+
supabase: {
|
|
464
|
+
...baseConfig.supabase,
|
|
465
|
+
...(options.supabase?.url && { url: options.supabase.url }),
|
|
466
|
+
...(options.supabase?.serviceRoleKey && { serviceRoleKey: options.supabase.serviceRoleKey }),
|
|
467
|
+
...(options.supabase?.anonKey && { anonKey: options.supabase.anonKey }),
|
|
468
|
+
},
|
|
469
|
+
claude: {
|
|
470
|
+
...baseConfig.claude,
|
|
471
|
+
...(options.claude?.apiKey && {
|
|
472
|
+
apiKey: options.claude.apiKey,
|
|
473
|
+
authMode: 'api_key',
|
|
474
|
+
}),
|
|
475
|
+
...(options.claude?.oauthToken && {
|
|
476
|
+
oauthToken: options.claude.oauthToken,
|
|
477
|
+
authMode: 'oauth',
|
|
478
|
+
}),
|
|
479
|
+
...(options.claude?.model && { model: options.claude.model }),
|
|
480
|
+
...(options.claude?.maxTokens && { maxTokens: options.claude.maxTokens }),
|
|
481
|
+
},
|
|
482
|
+
};
|
|
483
|
+
// Re-validate the merged config
|
|
484
|
+
const result = ConfigSchema.safeParse(mergedConfig);
|
|
485
|
+
if (!result.success) {
|
|
486
|
+
console.error('Support Agent configuration validation failed after merge:');
|
|
487
|
+
console.error(result.error.format());
|
|
488
|
+
throw new Error('Invalid support agent configuration after applying overrides.');
|
|
489
|
+
}
|
|
490
|
+
return result.data;
|
|
491
|
+
}
|
|
492
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delivery Pipeline Module
|
|
3
|
+
*
|
|
4
|
+
* Handles response delivery across all channels:
|
|
5
|
+
* - Email via Postmark
|
|
6
|
+
* - SMS via Twilio
|
|
7
|
+
* - Slack messages via API
|
|
8
|
+
*
|
|
9
|
+
* Includes retry logic, status tracking, and engagement monitoring.
|
|
10
|
+
*/
|
|
11
|
+
import type { GeneratedResponse, SupportChannel, DeliveryId, BounceType } from '../types.js';
|
|
12
|
+
export declare class DeliveryService {
|
|
13
|
+
private supabase;
|
|
14
|
+
constructor();
|
|
15
|
+
/**
|
|
16
|
+
* Deliver a response via the appropriate channel
|
|
17
|
+
*/
|
|
18
|
+
deliver(response: GeneratedResponse, channel: SupportChannel, recipientInfo: RecipientInfo): Promise<DeliveryResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Deliver response via email (Postmark)
|
|
21
|
+
*/
|
|
22
|
+
private deliverEmail;
|
|
23
|
+
/**
|
|
24
|
+
* Deliver response via SMS (Twilio)
|
|
25
|
+
*/
|
|
26
|
+
private deliverSms;
|
|
27
|
+
/**
|
|
28
|
+
* Deliver response via Slack
|
|
29
|
+
*/
|
|
30
|
+
private deliverSlack;
|
|
31
|
+
/**
|
|
32
|
+
* Update delivery status
|
|
33
|
+
*/
|
|
34
|
+
private updateDeliveryStatus;
|
|
35
|
+
/**
|
|
36
|
+
* Retry a failed delivery with exponential backoff
|
|
37
|
+
*/
|
|
38
|
+
retryDelivery(deliveryId: DeliveryId, maxRetries?: number): Promise<DeliveryResult | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Handle delivery status webhook (Postmark, Twilio callbacks)
|
|
41
|
+
*/
|
|
42
|
+
handleStatusWebhook(provider: 'postmark' | 'twilio' | 'slack', messageId: string, status: 'delivered' | 'bounced' | 'failed', details?: {
|
|
43
|
+
bounceType?: BounceType;
|
|
44
|
+
error?: string;
|
|
45
|
+
}): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Record engagement metrics (opens, clicks)
|
|
48
|
+
*/
|
|
49
|
+
recordEngagement(messageId: string, event: 'open' | 'click', details?: {
|
|
50
|
+
link?: string;
|
|
51
|
+
}): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
export interface RecipientInfo {
|
|
54
|
+
email?: string;
|
|
55
|
+
phone?: string;
|
|
56
|
+
slackChannelId?: string;
|
|
57
|
+
slackThreadTs?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface DeliveryResult {
|
|
60
|
+
deliveryId: DeliveryId;
|
|
61
|
+
success: boolean;
|
|
62
|
+
messageId?: string;
|
|
63
|
+
error?: string;
|
|
64
|
+
timestamp: string;
|
|
65
|
+
}
|
|
66
|
+
export declare function getDeliveryService(): DeliveryService;
|
|
67
|
+
/**
|
|
68
|
+
* Deliver a response
|
|
69
|
+
*/
|
|
70
|
+
export declare function deliverResponse(response: GeneratedResponse, channel: SupportChannel, recipient: RecipientInfo): Promise<DeliveryResult>;
|
|
71
|
+
/**
|
|
72
|
+
* Handle delivery status webhook
|
|
73
|
+
*/
|
|
74
|
+
export declare function handleDeliveryWebhook(provider: 'postmark' | 'twilio' | 'slack', messageId: string, status: 'delivered' | 'bounced' | 'failed', details?: {
|
|
75
|
+
bounceType?: BounceType;
|
|
76
|
+
error?: string;
|
|
77
|
+
}): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Record engagement event
|
|
80
|
+
*/
|
|
81
|
+
export declare function recordEngagementEvent(messageId: string, event: 'open' | 'click', details?: {
|
|
82
|
+
link?: string;
|
|
83
|
+
}): Promise<void>;
|
|
84
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/delivery/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EACV,iBAAiB,EAEjB,cAAc,EACd,UAAU,EAGV,UAAU,EACX,MAAM,aAAa,CAAC;AAOrB,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAiB;;IAMjC;;OAEG;IACG,OAAO,CACX,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,cAAc,EACvB,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,cAAc,CAAC;IAyE1B;;OAEG;YACW,YAAY;IAgF1B;;OAEG;YACW,UAAU;IAgFxB;;OAEG;YACW,YAAY;IAqE1B;;OAEG;YACW,oBAAoB;IAclC;;OAEG;IACG,aAAa,CACjB,UAAU,EAAE,UAAU,EACtB,UAAU,GAAE,MAAU,GACrB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA0CjC;;OAEG;IACG,mBAAmB,CACvB,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,EACzC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,EAC1C,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,UAAU,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GACpD,OAAO,CAAC,IAAI,CAAC;IA4BhB;;OAEG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,OAAO,EACvB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1B,OAAO,CAAC,IAAI,CAAC;CAmCjB;AAMD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAeD,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,aAAa,GACvB,OAAO,CAAC,cAAc,CAAC,CAEzB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,EACzC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,EAC1C,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,OAAO,EACvB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAEf"}
|