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