catalist-support-agent 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/dist/admin-portal.d.ts +43 -0
  2. package/dist/admin-portal.d.ts.map +1 -0
  3. package/dist/admin-portal.js +166 -0
  4. package/dist/admin-portal.js.map +1 -0
  5. package/dist/analysis/entities.d.ts +73 -0
  6. package/dist/analysis/entities.d.ts.map +1 -0
  7. package/dist/analysis/entities.js +378 -0
  8. package/dist/analysis/entities.js.map +1 -0
  9. package/dist/analysis/index.d.ts +44 -0
  10. package/dist/analysis/index.d.ts.map +1 -0
  11. package/dist/analysis/index.js +243 -0
  12. package/dist/analysis/index.js.map +1 -0
  13. package/dist/analysis/intent.d.ts +49 -0
  14. package/dist/analysis/intent.d.ts.map +1 -0
  15. package/dist/analysis/intent.js +320 -0
  16. package/dist/analysis/intent.js.map +1 -0
  17. package/dist/analysis/sentiment.d.ts +57 -0
  18. package/dist/analysis/sentiment.d.ts.map +1 -0
  19. package/dist/analysis/sentiment.js +351 -0
  20. package/dist/analysis/sentiment.js.map +1 -0
  21. package/dist/brand/compliance.d.ts +122 -0
  22. package/dist/brand/compliance.d.ts.map +1 -0
  23. package/dist/brand/compliance.js +378 -0
  24. package/dist/brand/compliance.js.map +1 -0
  25. package/dist/brand/forbidden-terms.d.ts +99 -0
  26. package/dist/brand/forbidden-terms.d.ts.map +1 -0
  27. package/dist/brand/forbidden-terms.js +265 -0
  28. package/dist/brand/forbidden-terms.js.map +1 -0
  29. package/dist/brand/index.d.ts +10 -0
  30. package/dist/brand/index.d.ts.map +1 -0
  31. package/dist/brand/index.js +12 -0
  32. package/dist/brand/index.js.map +1 -0
  33. package/dist/config.d.ts +325 -0
  34. package/dist/config.d.ts.map +1 -0
  35. package/dist/config.js +492 -0
  36. package/dist/config.js.map +1 -0
  37. package/dist/delivery/index.d.ts +84 -0
  38. package/dist/delivery/index.d.ts.map +1 -0
  39. package/dist/delivery/index.js +435 -0
  40. package/dist/delivery/index.js.map +1 -0
  41. package/dist/embeddings/cache.d.ts +96 -0
  42. package/dist/embeddings/cache.d.ts.map +1 -0
  43. package/dist/embeddings/cache.js +193 -0
  44. package/dist/embeddings/cache.js.map +1 -0
  45. package/dist/embeddings/index.d.ts +152 -0
  46. package/dist/embeddings/index.d.ts.map +1 -0
  47. package/dist/embeddings/index.js +337 -0
  48. package/dist/embeddings/index.js.map +1 -0
  49. package/dist/embeddings/openai-client.d.ts +67 -0
  50. package/dist/embeddings/openai-client.d.ts.map +1 -0
  51. package/dist/embeddings/openai-client.js +190 -0
  52. package/dist/embeddings/openai-client.js.map +1 -0
  53. package/dist/errors.d.ts +302 -0
  54. package/dist/errors.d.ts.map +1 -0
  55. package/dist/errors.js +508 -0
  56. package/dist/errors.js.map +1 -0
  57. package/dist/escalation/index.d.ts +93 -0
  58. package/dist/escalation/index.d.ts.map +1 -0
  59. package/dist/escalation/index.js +436 -0
  60. package/dist/escalation/index.js.map +1 -0
  61. package/dist/extraction/deduplication.d.ts +97 -0
  62. package/dist/extraction/deduplication.d.ts.map +1 -0
  63. package/dist/extraction/deduplication.js +271 -0
  64. package/dist/extraction/deduplication.js.map +1 -0
  65. package/dist/extraction/gmail-extractor.d.ts +160 -0
  66. package/dist/extraction/gmail-extractor.d.ts.map +1 -0
  67. package/dist/extraction/gmail-extractor.js +396 -0
  68. package/dist/extraction/gmail-extractor.js.map +1 -0
  69. package/dist/extraction/gmail-token-manager.d.ts +36 -0
  70. package/dist/extraction/gmail-token-manager.d.ts.map +1 -0
  71. package/dist/extraction/gmail-token-manager.js +146 -0
  72. package/dist/extraction/gmail-token-manager.js.map +1 -0
  73. package/dist/extraction/index.d.ts +13 -0
  74. package/dist/extraction/index.d.ts.map +1 -0
  75. package/dist/extraction/index.js +20 -0
  76. package/dist/extraction/index.js.map +1 -0
  77. package/dist/extraction/pii-handler.d.ts +100 -0
  78. package/dist/extraction/pii-handler.d.ts.map +1 -0
  79. package/dist/extraction/pii-handler.js +295 -0
  80. package/dist/extraction/pii-handler.js.map +1 -0
  81. package/dist/extraction/pipeline.d.ts +94 -0
  82. package/dist/extraction/pipeline.d.ts.map +1 -0
  83. package/dist/extraction/pipeline.js +380 -0
  84. package/dist/extraction/pipeline.js.map +1 -0
  85. package/dist/extraction/quality-filter.d.ts +99 -0
  86. package/dist/extraction/quality-filter.d.ts.map +1 -0
  87. package/dist/extraction/quality-filter.js +370 -0
  88. package/dist/extraction/quality-filter.js.map +1 -0
  89. package/dist/extraction/rate-limiter.d.ts +90 -0
  90. package/dist/extraction/rate-limiter.d.ts.map +1 -0
  91. package/dist/extraction/rate-limiter.js +242 -0
  92. package/dist/extraction/rate-limiter.js.map +1 -0
  93. package/dist/extraction/state-manager.d.ts +126 -0
  94. package/dist/extraction/state-manager.d.ts.map +1 -0
  95. package/dist/extraction/state-manager.js +344 -0
  96. package/dist/extraction/state-manager.js.map +1 -0
  97. package/dist/generation/index.d.ts +75 -0
  98. package/dist/generation/index.d.ts.map +1 -0
  99. package/dist/generation/index.js +641 -0
  100. package/dist/generation/index.js.map +1 -0
  101. package/dist/index.d.ts +96 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +233 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/intake/index.d.ts +15 -0
  106. package/dist/intake/index.d.ts.map +1 -0
  107. package/dist/intake/index.js +19 -0
  108. package/dist/intake/index.js.map +1 -0
  109. package/dist/intake/normalizer.d.ts +163 -0
  110. package/dist/intake/normalizer.d.ts.map +1 -0
  111. package/dist/intake/normalizer.js +309 -0
  112. package/dist/intake/normalizer.js.map +1 -0
  113. package/dist/intake/postmark.d.ts +72 -0
  114. package/dist/intake/postmark.d.ts.map +1 -0
  115. package/dist/intake/postmark.js +276 -0
  116. package/dist/intake/postmark.js.map +1 -0
  117. package/dist/intake/slack.d.ts +106 -0
  118. package/dist/intake/slack.d.ts.map +1 -0
  119. package/dist/intake/slack.js +378 -0
  120. package/dist/intake/slack.js.map +1 -0
  121. package/dist/intake/twilio.d.ts +86 -0
  122. package/dist/intake/twilio.d.ts.map +1 -0
  123. package/dist/intake/twilio.js +283 -0
  124. package/dist/intake/twilio.js.map +1 -0
  125. package/dist/knowledge/index.d.ts +100 -0
  126. package/dist/knowledge/index.d.ts.map +1 -0
  127. package/dist/knowledge/index.js +516 -0
  128. package/dist/knowledge/index.js.map +1 -0
  129. package/dist/knowledge/invoice-resolver.d.ts +62 -0
  130. package/dist/knowledge/invoice-resolver.d.ts.map +1 -0
  131. package/dist/knowledge/invoice-resolver.js +267 -0
  132. package/dist/knowledge/invoice-resolver.js.map +1 -0
  133. package/dist/types.d.ts +535 -0
  134. package/dist/types.d.ts.map +1 -0
  135. package/dist/types.js +48 -0
  136. package/dist/types.js.map +1 -0
  137. package/ga-service-account.json +13 -0
  138. package/gmail-knowledge-migration.sql +149 -0
  139. package/nul +1 -0
  140. package/package.json +55 -0
@@ -0,0 +1,265 @@
1
+ /**
2
+ * Forbidden Terms Detector
3
+ *
4
+ * Scans text for marketplace-specific terminology that requires escalation.
5
+ * This is a critical component for maintaining Catalist's brand positioning
6
+ * as an "AI-native B2B marketplace" (NOT a wholesale distributor).
7
+ *
8
+ * CRITICAL: Any message containing forbidden terms MUST be escalated to humans.
9
+ * The agent cannot autonomously respond to these messages.
10
+ */
11
+ import { getAllForbiddenTerms, config } from '../config.js';
12
+ // =============================================================================
13
+ // Forbidden Terms Detector Class
14
+ // =============================================================================
15
+ export class ForbiddenTermsDetector {
16
+ patterns;
17
+ terms;
18
+ termPatternMap;
19
+ constructor(customTerms) {
20
+ // Combine default forbidden terms with any custom terms
21
+ this.terms = customTerms ?? getAllForbiddenTerms();
22
+ // Build regex patterns for each term with word boundary matching
23
+ this.termPatternMap = new Map();
24
+ this.patterns = this.terms.map((term) => {
25
+ const pattern = this.buildPattern(term);
26
+ this.termPatternMap.set(term, pattern);
27
+ return pattern;
28
+ });
29
+ }
30
+ /**
31
+ * Build a regex pattern for a term that handles:
32
+ * - Word boundaries
33
+ * - Case insensitivity
34
+ * - Common variations (plurals, etc.)
35
+ * - Special characters in terms
36
+ */
37
+ buildPattern(term) {
38
+ // Escape special regex characters
39
+ const escaped = term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
40
+ // Handle common variations:
41
+ // - Add optional 's' for plurals
42
+ // - Add optional 'ing' for verb forms
43
+ // - Handle spaces that might be replaced with hyphens or underscores
44
+ const flexible = escaped
45
+ .replace(/\s+/g, '[\\s\\-_]+') // Allow spaces, hyphens, or underscores
46
+ .replace(/([a-z])$/i, '$1(?:s|ing)?'); // Optional plural/verb forms
47
+ // Use word boundaries to avoid partial matches
48
+ // \b doesn't work well with some terms, so we use lookahead/lookbehind
49
+ return new RegExp(`(?:^|[\\s\\.,!?;:'\"\\(\\[])${flexible}(?:[\\s\\.,!?;:'\"\\)\\]]|$)`, 'gi');
50
+ }
51
+ /**
52
+ * Scan text for forbidden terms
53
+ * Returns array of detected terms (empty if none found)
54
+ */
55
+ scan(text) {
56
+ if (!text || typeof text !== 'string') {
57
+ return [];
58
+ }
59
+ const normalizedText = this.normalizeText(text);
60
+ const detected = new Set();
61
+ for (const [term, pattern] of this.termPatternMap) {
62
+ // Reset regex state
63
+ pattern.lastIndex = 0;
64
+ if (pattern.test(normalizedText)) {
65
+ detected.add(term);
66
+ }
67
+ }
68
+ return Array.from(detected);
69
+ }
70
+ /**
71
+ * Quick check if text contains any forbidden terms
72
+ */
73
+ containsForbiddenTerms(text) {
74
+ if (!text || typeof text !== 'string') {
75
+ return false;
76
+ }
77
+ const normalizedText = this.normalizeText(text);
78
+ for (const pattern of this.patterns) {
79
+ pattern.lastIndex = 0;
80
+ if (pattern.test(normalizedText)) {
81
+ return true;
82
+ }
83
+ }
84
+ return false;
85
+ }
86
+ /**
87
+ * Get detailed scan results with positions
88
+ */
89
+ scanWithPositions(text) {
90
+ if (!text || typeof text !== 'string') {
91
+ return [];
92
+ }
93
+ const normalizedText = this.normalizeText(text);
94
+ const matches = [];
95
+ for (const [term, pattern] of this.termPatternMap) {
96
+ pattern.lastIndex = 0;
97
+ let match;
98
+ while ((match = pattern.exec(normalizedText)) !== null) {
99
+ matches.push({
100
+ term,
101
+ matchedText: match[0].trim(),
102
+ position: match.index,
103
+ context: this.extractContext(normalizedText, match.index, match[0].length),
104
+ });
105
+ }
106
+ }
107
+ return matches;
108
+ }
109
+ /**
110
+ * Normalize text for consistent matching
111
+ */
112
+ normalizeText(text) {
113
+ return text
114
+ .toLowerCase()
115
+ .normalize('NFD')
116
+ .replace(/[\u0300-\u036f]/g, ''); // Remove diacritics
117
+ }
118
+ /**
119
+ * Extract surrounding context for a match
120
+ */
121
+ extractContext(text, position, matchLength) {
122
+ const contextRadius = 50;
123
+ const start = Math.max(0, position - contextRadius);
124
+ const end = Math.min(text.length, position + matchLength + contextRadius);
125
+ let context = text.slice(start, end);
126
+ if (start > 0) {
127
+ context = '...' + context;
128
+ }
129
+ if (end < text.length) {
130
+ context = context + '...';
131
+ }
132
+ return context;
133
+ }
134
+ /**
135
+ * Add additional terms at runtime
136
+ */
137
+ addTerms(terms) {
138
+ for (const term of terms) {
139
+ if (!this.terms.includes(term.toLowerCase())) {
140
+ this.terms.push(term.toLowerCase());
141
+ const pattern = this.buildPattern(term);
142
+ this.termPatternMap.set(term.toLowerCase(), pattern);
143
+ this.patterns.push(pattern);
144
+ }
145
+ }
146
+ }
147
+ /**
148
+ * Get all registered forbidden terms
149
+ */
150
+ getTerms() {
151
+ return [...this.terms];
152
+ }
153
+ }
154
+ // =============================================================================
155
+ // Utility Functions
156
+ // =============================================================================
157
+ // Singleton instance for common use
158
+ let defaultDetector = null;
159
+ /**
160
+ * Get the default forbidden terms detector (singleton)
161
+ */
162
+ export function getDefaultDetector() {
163
+ if (!defaultDetector) {
164
+ defaultDetector = new ForbiddenTermsDetector();
165
+ }
166
+ return defaultDetector;
167
+ }
168
+ /**
169
+ * Quick check if text contains forbidden terms
170
+ */
171
+ export function containsForbiddenTerms(text) {
172
+ return getDefaultDetector().containsForbiddenTerms(text);
173
+ }
174
+ /**
175
+ * Scan text for forbidden terms and return all detected terms
176
+ */
177
+ export function scanForForbiddenTerms(text) {
178
+ return getDefaultDetector().scan(text);
179
+ }
180
+ /**
181
+ * Get detailed scan results
182
+ */
183
+ export function scanForForbiddenTermsDetailed(text) {
184
+ const detector = getDefaultDetector();
185
+ const matches = detector.scanWithPositions(text);
186
+ return {
187
+ hasForbiddenTerms: matches.length > 0,
188
+ detectedTerms: [...new Set(matches.map((m) => m.term))],
189
+ matches,
190
+ scannedAt: new Date().toISOString(),
191
+ };
192
+ }
193
+ /**
194
+ * Scan message content (handles both plain text and HTML)
195
+ */
196
+ export function scanMessageContent(content) {
197
+ const detector = getDefaultDetector();
198
+ const allMatches = [];
199
+ // Scan plain text
200
+ if (content.text) {
201
+ allMatches.push(...detector.scanWithPositions(content.text));
202
+ }
203
+ // Scan HTML (strip tags first)
204
+ if (content.html) {
205
+ const strippedHtml = stripHtmlTags(content.html);
206
+ allMatches.push(...detector.scanWithPositions(strippedHtml));
207
+ }
208
+ // Scan subject
209
+ if (content.subject) {
210
+ allMatches.push(...detector.scanWithPositions(content.subject));
211
+ }
212
+ // Deduplicate terms
213
+ const uniqueTerms = [...new Set(allMatches.map((m) => m.term))];
214
+ return {
215
+ hasForbiddenTerms: allMatches.length > 0,
216
+ detectedTerms: uniqueTerms,
217
+ matches: allMatches,
218
+ scannedAt: new Date().toISOString(),
219
+ };
220
+ }
221
+ /**
222
+ * Strip HTML tags from text
223
+ */
224
+ function stripHtmlTags(html) {
225
+ return html
226
+ .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '') // Remove scripts
227
+ .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '') // Remove styles
228
+ .replace(/<[^>]+>/g, ' ') // Remove all tags
229
+ .replace(/&nbsp;/g, ' ')
230
+ .replace(/&amp;/g, '&')
231
+ .replace(/&lt;/g, '<')
232
+ .replace(/&gt;/g, '>')
233
+ .replace(/&quot;/g, '"')
234
+ .replace(/&#39;/g, "'")
235
+ .replace(/\s+/g, ' ')
236
+ .trim();
237
+ }
238
+ /**
239
+ * Create brand compliance status from scan result
240
+ */
241
+ export function createComplianceStatusFromScan(scanResult) {
242
+ const now = new Date().toISOString();
243
+ if (scanResult.hasForbiddenTerms) {
244
+ return {
245
+ status: 'blocked',
246
+ detectedTerms: scanResult.detectedTerms,
247
+ blockedAt: now,
248
+ };
249
+ }
250
+ return {
251
+ status: 'compliant',
252
+ score: 100,
253
+ checkedAt: now,
254
+ };
255
+ }
256
+ /**
257
+ * Check if escalation is required based on forbidden terms
258
+ */
259
+ export function requiresEscalationForForbiddenTerms(text) {
260
+ if (!config.brandCompliance.enabled) {
261
+ return false;
262
+ }
263
+ return containsForbiddenTerms(text);
264
+ }
265
+ //# sourceMappingURL=forbidden-terms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forbidden-terms.js","sourceRoot":"","sources":["../../src/brand/forbidden-terms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Brand Compliance Module
3
+ *
4
+ * Central export for all brand compliance functionality.
5
+ * This module ensures Catalist's positioning as an "AI-native B2B marketplace"
6
+ * is consistently maintained across all support communications.
7
+ */
8
+ export { ForbiddenTermsDetector, containsForbiddenTerms, scanForForbiddenTerms, scanForForbiddenTermsDetailed, scanMessageContent, createComplianceStatusFromScan, requiresEscalationForForbiddenTerms, getDefaultDetector, type ForbiddenTermMatch, type ForbiddenTermsScanResult, } from './forbidden-terms.js';
9
+ export { BrandTerminologyEnforcer, BrandComplianceChecker, checkBrandCompliance, validateResponseForBrand, performBrandTest, getBrandVoiceGuidelines, applyBrandTerminologyCorrections, getDefaultChecker, type TerminologyCorrection, type BrandComplianceCheckResult, type ResponseValidationResult, } from './compliance.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/brand/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,EAC7B,kBAAkB,EAClB,8BAA8B,EAC9B,mCAAmC,EACnC,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACxB,gBAAgB,EAChB,uBAAuB,EACvB,gCAAgC,EAChC,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,GAC9B,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Brand Compliance Module
3
+ *
4
+ * Central export for all brand compliance functionality.
5
+ * This module ensures Catalist's positioning as an "AI-native B2B marketplace"
6
+ * is consistently maintained across all support communications.
7
+ */
8
+ // Forbidden Terms Detection
9
+ export { ForbiddenTermsDetector, containsForbiddenTerms, scanForForbiddenTerms, scanForForbiddenTermsDetailed, scanMessageContent, createComplianceStatusFromScan, requiresEscalationForForbiddenTerms, getDefaultDetector, } from './forbidden-terms.js';
10
+ // Brand Compliance Checking
11
+ export { BrandTerminologyEnforcer, BrandComplianceChecker, checkBrandCompliance, validateResponseForBrand, performBrandTest, getBrandVoiceGuidelines, applyBrandTerminologyCorrections, getDefaultChecker, } from './compliance.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/brand/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,4BAA4B;AAC5B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,EAC7B,kBAAkB,EAClB,8BAA8B,EAC9B,mCAAmC,EACnC,kBAAkB,GAGnB,MAAM,sBAAsB,CAAC;AAE9B,4BAA4B;AAC5B,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACxB,gBAAgB,EAChB,uBAAuB,EACvB,gCAAgC,EAChC,iBAAiB,GAIlB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,325 @@
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 { z } from 'zod';
9
+ declare const ConfigSchema: z.ZodObject<{
10
+ supabase: z.ZodObject<{
11
+ url: z.ZodString;
12
+ serviceRoleKey: z.ZodString;
13
+ anonKey: z.ZodOptional<z.ZodString>;
14
+ }, z.core.$strip>;
15
+ claude: z.ZodObject<{
16
+ oauthToken: z.ZodOptional<z.ZodString>;
17
+ apiKey: z.ZodOptional<z.ZodString>;
18
+ tokenCreatedAt: z.ZodOptional<z.ZodString>;
19
+ authMode: z.ZodDefault<z.ZodEnum<{
20
+ oauth: "oauth";
21
+ api_key: "api_key";
22
+ none: "none";
23
+ }>>;
24
+ model: z.ZodDefault<z.ZodString>;
25
+ maxTokens: z.ZodDefault<z.ZodNumber>;
26
+ }, z.core.$strip>;
27
+ postmark: z.ZodObject<{
28
+ enabled: z.ZodDefault<z.ZodBoolean>;
29
+ serverToken: z.ZodOptional<z.ZodString>;
30
+ fromAddress: z.ZodOptional<z.ZodString>;
31
+ replyToAddress: z.ZodOptional<z.ZodString>;
32
+ messageStream: z.ZodDefault<z.ZodString>;
33
+ webhookToken: z.ZodOptional<z.ZodString>;
34
+ }, z.core.$strip>;
35
+ twilio: z.ZodObject<{
36
+ enabled: z.ZodDefault<z.ZodBoolean>;
37
+ accountSid: z.ZodOptional<z.ZodString>;
38
+ authToken: z.ZodOptional<z.ZodString>;
39
+ fromNumber: z.ZodOptional<z.ZodString>;
40
+ messagingServiceSid: z.ZodOptional<z.ZodString>;
41
+ }, z.core.$strip>;
42
+ slack: z.ZodObject<{
43
+ enabled: z.ZodDefault<z.ZodBoolean>;
44
+ botToken: z.ZodOptional<z.ZodString>;
45
+ signingSecret: z.ZodOptional<z.ZodString>;
46
+ appId: z.ZodOptional<z.ZodString>;
47
+ }, z.core.$strip>;
48
+ agent: z.ZodObject<{
49
+ responseTimeoutMs: z.ZodDefault<z.ZodNumber>;
50
+ maxConversationTurns: z.ZodDefault<z.ZodNumber>;
51
+ confidenceThresholds: z.ZodObject<{
52
+ high: z.ZodDefault<z.ZodNumber>;
53
+ medium: z.ZodDefault<z.ZodNumber>;
54
+ escalationTrigger: z.ZodDefault<z.ZodNumber>;
55
+ }, z.core.$strip>;
56
+ maxResponseAttempts: z.ZodDefault<z.ZodNumber>;
57
+ shadowMode: z.ZodDefault<z.ZodBoolean>;
58
+ autonomyPercentage: z.ZodDefault<z.ZodNumber>;
59
+ permissionMode: z.ZodDefault<z.ZodEnum<{
60
+ default: "default";
61
+ acceptEdits: "acceptEdits";
62
+ bypassPermissions: "bypassPermissions";
63
+ plan: "plan";
64
+ }>>;
65
+ }, z.core.$strip>;
66
+ brandCompliance: z.ZodObject<{
67
+ enabled: z.ZodDefault<z.ZodBoolean>;
68
+ forbiddenTerms: z.ZodDefault<z.ZodArray<z.ZodString>>;
69
+ customForbiddenTerms: z.ZodDefault<z.ZodArray<z.ZodString>>;
70
+ voiceEnforcementLevel: z.ZodDefault<z.ZodEnum<{
71
+ strict: "strict";
72
+ moderate: "moderate";
73
+ relaxed: "relaxed";
74
+ }>>;
75
+ preSendValidation: z.ZodDefault<z.ZodBoolean>;
76
+ postSendAudit: z.ZodDefault<z.ZodBoolean>;
77
+ enforcedTerminology: z.ZodDefault<z.ZodObject<{
78
+ preferredTerms: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
79
+ }, z.core.$strip>>;
80
+ }, z.core.$strip>;
81
+ escalation: z.ZodObject<{
82
+ enabled: z.ZodDefault<z.ZodBoolean>;
83
+ defaultRecipients: z.ZodDefault<z.ZodArray<z.ZodObject<{
84
+ email: z.ZodOptional<z.ZodString>;
85
+ phone: z.ZodOptional<z.ZodString>;
86
+ slackUserId: z.ZodOptional<z.ZodString>;
87
+ name: z.ZodOptional<z.ZodString>;
88
+ }, z.core.$strip>>>;
89
+ adminBaseUrl: z.ZodDefault<z.ZodString>;
90
+ routing: z.ZodDefault<z.ZodObject<{
91
+ critical: z.ZodDefault<z.ZodArray<z.ZodEnum<{
92
+ email: "email";
93
+ sms: "sms";
94
+ slack: "slack";
95
+ }>>>;
96
+ high: z.ZodDefault<z.ZodArray<z.ZodEnum<{
97
+ email: "email";
98
+ sms: "sms";
99
+ slack: "slack";
100
+ }>>>;
101
+ medium: z.ZodDefault<z.ZodArray<z.ZodEnum<{
102
+ email: "email";
103
+ slack: "slack";
104
+ }>>>;
105
+ low: z.ZodDefault<z.ZodArray<z.ZodEnum<{
106
+ email: "email";
107
+ slack: "slack";
108
+ }>>>;
109
+ }, z.core.$strip>>;
110
+ reEscalateAfterMs: z.ZodDefault<z.ZodNumber>;
111
+ slaTargets: z.ZodDefault<z.ZodObject<{
112
+ critical: z.ZodDefault<z.ZodNumber>;
113
+ high: z.ZodDefault<z.ZodNumber>;
114
+ medium: z.ZodDefault<z.ZodNumber>;
115
+ low: z.ZodDefault<z.ZodNumber>;
116
+ }, z.core.$strip>>;
117
+ }, z.core.$strip>;
118
+ knowledge: z.ZodObject<{
119
+ customerDataEnabled: z.ZodDefault<z.ZodBoolean>;
120
+ productLookupEnabled: z.ZodDefault<z.ZodBoolean>;
121
+ similarConversationsEnabled: z.ZodDefault<z.ZodBoolean>;
122
+ maxSimilarConversations: z.ZodDefault<z.ZodNumber>;
123
+ similarityThreshold: z.ZodDefault<z.ZodNumber>;
124
+ templatesEnabled: z.ZodDefault<z.ZodBoolean>;
125
+ }, z.core.$strip>;
126
+ openai: z.ZodObject<{
127
+ apiKey: z.ZodOptional<z.ZodString>;
128
+ embeddingModel: z.ZodDefault<z.ZodString>;
129
+ embeddingDimensions: z.ZodDefault<z.ZodNumber>;
130
+ embeddingCacheMaxSize: z.ZodDefault<z.ZodNumber>;
131
+ embeddingCacheTtlMs: z.ZodDefault<z.ZodNumber>;
132
+ }, z.core.$strip>;
133
+ logging: z.ZodObject<{
134
+ level: z.ZodDefault<z.ZodEnum<{
135
+ error: "error";
136
+ debug: "debug";
137
+ info: "info";
138
+ warn: "warn";
139
+ }>>;
140
+ structured: z.ZodDefault<z.ZodBoolean>;
141
+ }, z.core.$strip>;
142
+ }, z.core.$strip>;
143
+ export type Config = z.infer<typeof ConfigSchema>;
144
+ export declare const config: {
145
+ supabase: {
146
+ url: string;
147
+ serviceRoleKey: string;
148
+ anonKey?: string | undefined;
149
+ };
150
+ claude: {
151
+ authMode: "oauth" | "api_key" | "none";
152
+ model: string;
153
+ maxTokens: number;
154
+ oauthToken?: string | undefined;
155
+ apiKey?: string | undefined;
156
+ tokenCreatedAt?: string | undefined;
157
+ };
158
+ postmark: {
159
+ enabled: boolean;
160
+ messageStream: string;
161
+ serverToken?: string | undefined;
162
+ fromAddress?: string | undefined;
163
+ replyToAddress?: string | undefined;
164
+ webhookToken?: string | undefined;
165
+ };
166
+ twilio: {
167
+ enabled: boolean;
168
+ accountSid?: string | undefined;
169
+ authToken?: string | undefined;
170
+ fromNumber?: string | undefined;
171
+ messagingServiceSid?: string | undefined;
172
+ };
173
+ slack: {
174
+ enabled: boolean;
175
+ botToken?: string | undefined;
176
+ signingSecret?: string | undefined;
177
+ appId?: string | undefined;
178
+ };
179
+ agent: {
180
+ responseTimeoutMs: number;
181
+ maxConversationTurns: number;
182
+ confidenceThresholds: {
183
+ high: number;
184
+ medium: number;
185
+ escalationTrigger: number;
186
+ };
187
+ maxResponseAttempts: number;
188
+ shadowMode: boolean;
189
+ autonomyPercentage: number;
190
+ permissionMode: "default" | "acceptEdits" | "bypassPermissions" | "plan";
191
+ };
192
+ brandCompliance: {
193
+ enabled: boolean;
194
+ forbiddenTerms: string[];
195
+ customForbiddenTerms: string[];
196
+ voiceEnforcementLevel: "strict" | "moderate" | "relaxed";
197
+ preSendValidation: boolean;
198
+ postSendAudit: boolean;
199
+ enforcedTerminology: {
200
+ preferredTerms: Record<string, string>;
201
+ };
202
+ };
203
+ escalation: {
204
+ enabled: boolean;
205
+ defaultRecipients: {
206
+ email?: string | undefined;
207
+ phone?: string | undefined;
208
+ slackUserId?: string | undefined;
209
+ name?: string | undefined;
210
+ }[];
211
+ adminBaseUrl: string;
212
+ routing: {
213
+ critical: ("email" | "sms" | "slack")[];
214
+ high: ("email" | "sms" | "slack")[];
215
+ medium: ("email" | "slack")[];
216
+ low: ("email" | "slack")[];
217
+ };
218
+ reEscalateAfterMs: number;
219
+ slaTargets: {
220
+ critical: number;
221
+ high: number;
222
+ medium: number;
223
+ low: number;
224
+ };
225
+ };
226
+ knowledge: {
227
+ customerDataEnabled: boolean;
228
+ productLookupEnabled: boolean;
229
+ similarConversationsEnabled: boolean;
230
+ maxSimilarConversations: number;
231
+ similarityThreshold: number;
232
+ templatesEnabled: boolean;
233
+ };
234
+ openai: {
235
+ embeddingModel: string;
236
+ embeddingDimensions: number;
237
+ embeddingCacheMaxSize: number;
238
+ embeddingCacheTtlMs: number;
239
+ apiKey?: string | undefined;
240
+ };
241
+ logging: {
242
+ level: "error" | "debug" | "info" | "warn";
243
+ structured: boolean;
244
+ };
245
+ };
246
+ /**
247
+ * Get all forbidden terms (default + custom)
248
+ */
249
+ export declare function getAllForbiddenTerms(): string[];
250
+ /**
251
+ * Check if a channel is configured and enabled
252
+ */
253
+ export declare function isChannelEnabled(channel: 'postmark' | 'twilio' | 'slack'): boolean;
254
+ /**
255
+ * Get escalation channels for a given severity
256
+ */
257
+ export declare function getEscalationChannels(severity: 'critical' | 'high' | 'medium' | 'low'): Array<'email' | 'sms' | 'slack'>;
258
+ /**
259
+ * Check if autonomous response is allowed (based on shadow mode and autonomy percentage)
260
+ */
261
+ export declare function isAutonomousResponseAllowed(): boolean;
262
+ /**
263
+ * Get SLA target for a severity level
264
+ */
265
+ export declare function getSlaTarget(severity: 'critical' | 'high' | 'medium' | 'low'): number;
266
+ export type AuthenticationMode = 'oauth' | 'api_key' | 'none';
267
+ export interface AuthenticationStatus {
268
+ isValid: boolean;
269
+ mode: AuthenticationMode;
270
+ message: string;
271
+ warnings: string[];
272
+ }
273
+ /**
274
+ * Validate Claude authentication configuration
275
+ */
276
+ export declare function validateAuthentication(): AuthenticationStatus;
277
+ export type ConfidenceLevel = 'high' | 'medium' | 'low';
278
+ export declare function classifyConfidence(score: number): ConfidenceLevel;
279
+ export declare function shouldEscalateByConfidence(confidence: number): boolean;
280
+ /**
281
+ * Options for creating a config with runtime overrides.
282
+ * These override the values loaded from environment variables.
283
+ */
284
+ export interface CreateConfigOptions {
285
+ supabase?: {
286
+ url?: string;
287
+ serviceRoleKey?: string;
288
+ anonKey?: string;
289
+ };
290
+ claude?: {
291
+ apiKey?: string;
292
+ oauthToken?: string;
293
+ model?: string;
294
+ maxTokens?: number;
295
+ };
296
+ }
297
+ /**
298
+ * Create a configuration object with optional runtime overrides.
299
+ *
300
+ * This function is useful when the library is imported by an application
301
+ * that already has its own environment variables (e.g., Admin Portal with
302
+ * NEXT_PUBLIC_SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, ANTHROPIC_API_KEY).
303
+ *
304
+ * The overrides are merged with the base config loaded from environment variables.
305
+ *
306
+ * @param options - Optional overrides for supabase and claude credentials
307
+ * @returns A validated Config object
308
+ *
309
+ * @example
310
+ * ```typescript
311
+ * // Use with Next.js environment variables
312
+ * const customConfig = createConfig({
313
+ * supabase: {
314
+ * url: process.env.NEXT_PUBLIC_SUPABASE_URL,
315
+ * serviceRoleKey: process.env.SUPABASE_SERVICE_ROLE_KEY,
316
+ * },
317
+ * claude: {
318
+ * apiKey: process.env.ANTHROPIC_API_KEY,
319
+ * },
320
+ * });
321
+ * ```
322
+ */
323
+ export declare function createConfig(options?: CreateConfigOptions): Config;
324
+ export {};
325
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2CxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2NhB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAgHlD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAe,CAAC;AAMnC;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAK/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAWlF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAC/C,KAAK,CAAC,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC,CAElC;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAerD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAErF;AAMD,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,oBAAoB,CA4B7D;AAMD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAExD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAQjE;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEtE;AAMD;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,MAAM,CA2CtE"}