catalist-support-agent 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin-portal.d.ts +43 -0
- package/dist/admin-portal.d.ts.map +1 -0
- package/dist/admin-portal.js +166 -0
- package/dist/admin-portal.js.map +1 -0
- package/dist/analysis/entities.d.ts +73 -0
- package/dist/analysis/entities.d.ts.map +1 -0
- package/dist/analysis/entities.js +378 -0
- package/dist/analysis/entities.js.map +1 -0
- package/dist/analysis/index.d.ts +44 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +243 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/intent.d.ts +49 -0
- package/dist/analysis/intent.d.ts.map +1 -0
- package/dist/analysis/intent.js +320 -0
- package/dist/analysis/intent.js.map +1 -0
- package/dist/analysis/sentiment.d.ts +57 -0
- package/dist/analysis/sentiment.d.ts.map +1 -0
- package/dist/analysis/sentiment.js +351 -0
- package/dist/analysis/sentiment.js.map +1 -0
- package/dist/brand/compliance.d.ts +122 -0
- package/dist/brand/compliance.d.ts.map +1 -0
- package/dist/brand/compliance.js +378 -0
- package/dist/brand/compliance.js.map +1 -0
- package/dist/brand/forbidden-terms.d.ts +99 -0
- package/dist/brand/forbidden-terms.d.ts.map +1 -0
- package/dist/brand/forbidden-terms.js +265 -0
- package/dist/brand/forbidden-terms.js.map +1 -0
- package/dist/brand/index.d.ts +10 -0
- package/dist/brand/index.d.ts.map +1 -0
- package/dist/brand/index.js +12 -0
- package/dist/brand/index.js.map +1 -0
- package/dist/config.d.ts +325 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +492 -0
- package/dist/config.js.map +1 -0
- package/dist/delivery/index.d.ts +84 -0
- package/dist/delivery/index.d.ts.map +1 -0
- package/dist/delivery/index.js +435 -0
- package/dist/delivery/index.js.map +1 -0
- package/dist/embeddings/cache.d.ts +96 -0
- package/dist/embeddings/cache.d.ts.map +1 -0
- package/dist/embeddings/cache.js +193 -0
- package/dist/embeddings/cache.js.map +1 -0
- package/dist/embeddings/index.d.ts +152 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +337 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/openai-client.d.ts +67 -0
- package/dist/embeddings/openai-client.d.ts.map +1 -0
- package/dist/embeddings/openai-client.js +190 -0
- package/dist/embeddings/openai-client.js.map +1 -0
- package/dist/errors.d.ts +302 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +508 -0
- package/dist/errors.js.map +1 -0
- package/dist/escalation/index.d.ts +93 -0
- package/dist/escalation/index.d.ts.map +1 -0
- package/dist/escalation/index.js +436 -0
- package/dist/escalation/index.js.map +1 -0
- package/dist/extraction/deduplication.d.ts +97 -0
- package/dist/extraction/deduplication.d.ts.map +1 -0
- package/dist/extraction/deduplication.js +271 -0
- package/dist/extraction/deduplication.js.map +1 -0
- package/dist/extraction/gmail-extractor.d.ts +160 -0
- package/dist/extraction/gmail-extractor.d.ts.map +1 -0
- package/dist/extraction/gmail-extractor.js +396 -0
- package/dist/extraction/gmail-extractor.js.map +1 -0
- package/dist/extraction/gmail-token-manager.d.ts +36 -0
- package/dist/extraction/gmail-token-manager.d.ts.map +1 -0
- package/dist/extraction/gmail-token-manager.js +146 -0
- package/dist/extraction/gmail-token-manager.js.map +1 -0
- package/dist/extraction/index.d.ts +13 -0
- package/dist/extraction/index.d.ts.map +1 -0
- package/dist/extraction/index.js +20 -0
- package/dist/extraction/index.js.map +1 -0
- package/dist/extraction/pii-handler.d.ts +100 -0
- package/dist/extraction/pii-handler.d.ts.map +1 -0
- package/dist/extraction/pii-handler.js +295 -0
- package/dist/extraction/pii-handler.js.map +1 -0
- package/dist/extraction/pipeline.d.ts +94 -0
- package/dist/extraction/pipeline.d.ts.map +1 -0
- package/dist/extraction/pipeline.js +380 -0
- package/dist/extraction/pipeline.js.map +1 -0
- package/dist/extraction/quality-filter.d.ts +99 -0
- package/dist/extraction/quality-filter.d.ts.map +1 -0
- package/dist/extraction/quality-filter.js +370 -0
- package/dist/extraction/quality-filter.js.map +1 -0
- package/dist/extraction/rate-limiter.d.ts +90 -0
- package/dist/extraction/rate-limiter.d.ts.map +1 -0
- package/dist/extraction/rate-limiter.js +242 -0
- package/dist/extraction/rate-limiter.js.map +1 -0
- package/dist/extraction/state-manager.d.ts +126 -0
- package/dist/extraction/state-manager.d.ts.map +1 -0
- package/dist/extraction/state-manager.js +344 -0
- package/dist/extraction/state-manager.js.map +1 -0
- package/dist/generation/index.d.ts +75 -0
- package/dist/generation/index.d.ts.map +1 -0
- package/dist/generation/index.js +641 -0
- package/dist/generation/index.js.map +1 -0
- package/dist/index.d.ts +96 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +233 -0
- package/dist/index.js.map +1 -0
- package/dist/intake/index.d.ts +15 -0
- package/dist/intake/index.d.ts.map +1 -0
- package/dist/intake/index.js +19 -0
- package/dist/intake/index.js.map +1 -0
- package/dist/intake/normalizer.d.ts +163 -0
- package/dist/intake/normalizer.d.ts.map +1 -0
- package/dist/intake/normalizer.js +309 -0
- package/dist/intake/normalizer.js.map +1 -0
- package/dist/intake/postmark.d.ts +72 -0
- package/dist/intake/postmark.d.ts.map +1 -0
- package/dist/intake/postmark.js +276 -0
- package/dist/intake/postmark.js.map +1 -0
- package/dist/intake/slack.d.ts +106 -0
- package/dist/intake/slack.d.ts.map +1 -0
- package/dist/intake/slack.js +378 -0
- package/dist/intake/slack.js.map +1 -0
- package/dist/intake/twilio.d.ts +86 -0
- package/dist/intake/twilio.d.ts.map +1 -0
- package/dist/intake/twilio.js +283 -0
- package/dist/intake/twilio.js.map +1 -0
- package/dist/knowledge/index.d.ts +100 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +516 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/invoice-resolver.d.ts +62 -0
- package/dist/knowledge/invoice-resolver.d.ts.map +1 -0
- package/dist/knowledge/invoice-resolver.js +267 -0
- package/dist/knowledge/invoice-resolver.js.map +1 -0
- package/dist/types.d.ts +535 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +48 -0
- package/dist/types.js.map +1 -0
- package/ga-service-account.json +13 -0
- package/gmail-knowledge-migration.sql +149 -0
- package/nul +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,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(/ /g, ' ')
|
|
230
|
+
.replace(/&/g, '&')
|
|
231
|
+
.replace(/</g, '<')
|
|
232
|
+
.replace(/>/g, '>')
|
|
233
|
+
.replace(/"/g, '"')
|
|
234
|
+
.replace(/'/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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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"}
|