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,344 @@
1
+ /**
2
+ * State Manager Module
3
+ *
4
+ * Tracks extraction state for incremental Gmail sync.
5
+ * Uses Gmail History API to only process new emails since last extraction.
6
+ */
7
+ import { createClient } from '@supabase/supabase-js';
8
+ // =============================================================================
9
+ // State Manager
10
+ // =============================================================================
11
+ export class StateManager {
12
+ supabase;
13
+ constructor(config) {
14
+ this.supabase = createClient(config.supabaseUrl, config.supabaseServiceRoleKey);
15
+ }
16
+ // ===========================================================================
17
+ // Extraction State Methods
18
+ // ===========================================================================
19
+ /**
20
+ * Get extraction state for an email account
21
+ */
22
+ async getState(emailAddress) {
23
+ const { data, error } = await this.supabase
24
+ .from('gmail_extraction_state')
25
+ .select('*')
26
+ .eq('email_address', emailAddress)
27
+ .single();
28
+ if (error || !data) {
29
+ return null;
30
+ }
31
+ return this.mapStateRow(data);
32
+ }
33
+ /**
34
+ * Create or get extraction state
35
+ */
36
+ async getOrCreateState(emailAddress) {
37
+ let state = await this.getState(emailAddress);
38
+ if (!state) {
39
+ const { data, error } = await this.supabase
40
+ .from('gmail_extraction_state')
41
+ .insert({
42
+ email_address: emailAddress,
43
+ last_history_id: null,
44
+ last_extracted_at: null,
45
+ total_entries_extracted: 0,
46
+ consecutive_errors: 0,
47
+ })
48
+ .select()
49
+ .single();
50
+ if (error) {
51
+ throw new Error(`Failed to create extraction state: ${error.message}`);
52
+ }
53
+ state = this.mapStateRow(data);
54
+ }
55
+ return state;
56
+ }
57
+ /**
58
+ * Update extraction state after successful extraction
59
+ */
60
+ async updateStateSuccess(emailAddress, updates) {
61
+ const updateData = {
62
+ last_extracted_at: new Date().toISOString(),
63
+ consecutive_errors: 0,
64
+ last_error: null,
65
+ last_error_at: null,
66
+ };
67
+ if (updates.historyId) {
68
+ updateData.last_history_id = updates.historyId;
69
+ }
70
+ if (updates.entriesExtracted !== undefined) {
71
+ // Use raw SQL for increment
72
+ const { data: currentState } = await this.supabase
73
+ .from('gmail_extraction_state')
74
+ .select('total_entries_extracted')
75
+ .eq('email_address', emailAddress)
76
+ .single();
77
+ updateData.total_entries_extracted =
78
+ (currentState?.total_entries_extracted || 0) + updates.entriesExtracted;
79
+ }
80
+ if (updates.batchId) {
81
+ updateData.last_batch_id = updates.batchId;
82
+ }
83
+ const { error } = await this.supabase
84
+ .from('gmail_extraction_state')
85
+ .update(updateData)
86
+ .eq('email_address', emailAddress);
87
+ if (error) {
88
+ throw new Error(`Failed to update extraction state: ${error.message}`);
89
+ }
90
+ }
91
+ /**
92
+ * Record extraction error
93
+ */
94
+ async recordError(emailAddress, errorMessage) {
95
+ // Get current state
96
+ const state = await this.getOrCreateState(emailAddress);
97
+ const { error } = await this.supabase
98
+ .from('gmail_extraction_state')
99
+ .update({
100
+ consecutive_errors: state.consecutiveErrors + 1,
101
+ last_error: errorMessage,
102
+ last_error_at: new Date().toISOString(),
103
+ })
104
+ .eq('email_address', emailAddress);
105
+ if (error) {
106
+ throw new Error(`Failed to record error: ${error.message}`);
107
+ }
108
+ }
109
+ /**
110
+ * Check if we should back off due to errors
111
+ */
112
+ async shouldBackOff(emailAddress, maxConsecutiveErrors = 5) {
113
+ const state = await this.getState(emailAddress);
114
+ if (!state) {
115
+ return false;
116
+ }
117
+ return state.consecutiveErrors >= maxConsecutiveErrors;
118
+ }
119
+ // ===========================================================================
120
+ // Batch Management Methods
121
+ // ===========================================================================
122
+ /**
123
+ * Create a new import batch
124
+ */
125
+ async createBatch(emailAccount, dateRangeStart, dateRangeEnd, config) {
126
+ const { data, error } = await this.supabase
127
+ .from('gmail_import_batches')
128
+ .insert({
129
+ email_account: emailAccount,
130
+ date_range_start: dateRangeStart.toISOString(),
131
+ date_range_end: dateRangeEnd.toISOString(),
132
+ status: 'pending',
133
+ config_used: config || {},
134
+ })
135
+ .select('id')
136
+ .single();
137
+ if (error) {
138
+ throw new Error(`Failed to create batch: ${error.message}`);
139
+ }
140
+ return data.id;
141
+ }
142
+ /**
143
+ * Start a batch (mark as in_progress)
144
+ */
145
+ async startBatch(batchId, totalThreads) {
146
+ const { error } = await this.supabase
147
+ .from('gmail_import_batches')
148
+ .update({
149
+ status: 'in_progress',
150
+ started_at: new Date().toISOString(),
151
+ total_threads_found: totalThreads,
152
+ })
153
+ .eq('id', batchId);
154
+ if (error) {
155
+ throw new Error(`Failed to start batch: ${error.message}`);
156
+ }
157
+ }
158
+ /**
159
+ * Update batch progress
160
+ */
161
+ async updateBatchProgress(batchId, progress) {
162
+ const updateData = {};
163
+ if (progress.threadsProcessed !== undefined) {
164
+ updateData.threads_processed = progress.threadsProcessed;
165
+ }
166
+ if (progress.entriesCreated !== undefined) {
167
+ updateData.entries_created = progress.entriesCreated;
168
+ }
169
+ if (progress.entriesSkipped !== undefined) {
170
+ updateData.entries_skipped = progress.entriesSkipped;
171
+ }
172
+ if (progress.errorsEncountered !== undefined) {
173
+ updateData.errors_encountered = progress.errorsEncountered;
174
+ }
175
+ const { error } = await this.supabase
176
+ .from('gmail_import_batches')
177
+ .update(updateData)
178
+ .eq('id', batchId);
179
+ if (error) {
180
+ throw new Error(`Failed to update batch progress: ${error.message}`);
181
+ }
182
+ }
183
+ /**
184
+ * Add error to batch error log
185
+ */
186
+ async addBatchError(batchId, errorMessage) {
187
+ // Fetch current error log
188
+ const { data: batch } = await this.supabase
189
+ .from('gmail_import_batches')
190
+ .select('error_log, errors_encountered')
191
+ .eq('id', batchId)
192
+ .single();
193
+ const currentLog = batch?.error_log || [];
194
+ const newLog = [
195
+ ...currentLog,
196
+ { timestamp: new Date().toISOString(), error: errorMessage },
197
+ ];
198
+ const { error } = await this.supabase
199
+ .from('gmail_import_batches')
200
+ .update({
201
+ error_log: newLog,
202
+ errors_encountered: (batch?.errors_encountered || 0) + 1,
203
+ })
204
+ .eq('id', batchId);
205
+ if (error) {
206
+ throw new Error(`Failed to add batch error: ${error.message}`);
207
+ }
208
+ }
209
+ /**
210
+ * Complete a batch
211
+ */
212
+ async completeBatch(batchId, status = 'completed') {
213
+ const { error } = await this.supabase
214
+ .from('gmail_import_batches')
215
+ .update({
216
+ status,
217
+ completed_at: new Date().toISOString(),
218
+ })
219
+ .eq('id', batchId);
220
+ if (error) {
221
+ throw new Error(`Failed to complete batch: ${error.message}`);
222
+ }
223
+ }
224
+ /**
225
+ * Get batch info
226
+ */
227
+ async getBatch(batchId) {
228
+ const { data, error } = await this.supabase
229
+ .from('gmail_import_batches')
230
+ .select('*')
231
+ .eq('id', batchId)
232
+ .single();
233
+ if (error || !data) {
234
+ return null;
235
+ }
236
+ return this.mapBatchRow(data);
237
+ }
238
+ /**
239
+ * Get recent batches for an email account
240
+ */
241
+ async getRecentBatches(emailAccount, limit = 10) {
242
+ const { data, error } = await this.supabase
243
+ .from('gmail_import_batches')
244
+ .select('*')
245
+ .eq('email_account', emailAccount)
246
+ .order('created_at', { ascending: false })
247
+ .limit(limit);
248
+ if (error || !data) {
249
+ return [];
250
+ }
251
+ return data.map((row) => this.mapBatchRow(row));
252
+ }
253
+ // ===========================================================================
254
+ // Statistics Methods
255
+ // ===========================================================================
256
+ /**
257
+ * Get overall extraction statistics
258
+ */
259
+ async getStats() {
260
+ const [entriesResult, recentBatches] = await Promise.all([
261
+ this.supabase.rpc('get_gmail_knowledge_stats'),
262
+ this.getRecentBatches('sales@catalistgroup.co', 5),
263
+ ]);
264
+ const stats = entriesResult.data?.[0] || {
265
+ total_entries: 0,
266
+ pending_entries: 0,
267
+ approved_entries: 0,
268
+ entries_with_embeddings: 0,
269
+ };
270
+ return {
271
+ totalEntries: stats.total_entries || 0,
272
+ pendingEntries: stats.pending_entries || 0,
273
+ approvedEntries: stats.approved_entries || 0,
274
+ entriesWithEmbeddings: stats.entries_with_embeddings || 0,
275
+ recentBatches,
276
+ };
277
+ }
278
+ // ===========================================================================
279
+ // Helper Methods
280
+ // ===========================================================================
281
+ mapStateRow(row) {
282
+ return {
283
+ id: row.id,
284
+ emailAddress: row.email_address,
285
+ lastHistoryId: row.last_history_id,
286
+ lastExtractedAt: row.last_extracted_at ? new Date(row.last_extracted_at) : null,
287
+ totalEntriesExtracted: row.total_entries_extracted,
288
+ lastBatchId: row.last_batch_id,
289
+ consecutiveErrors: row.consecutive_errors,
290
+ lastError: row.last_error,
291
+ lastErrorAt: row.last_error_at ? new Date(row.last_error_at) : null,
292
+ createdAt: new Date(row.created_at),
293
+ updatedAt: new Date(row.updated_at),
294
+ };
295
+ }
296
+ mapBatchRow(row) {
297
+ return {
298
+ id: row.id,
299
+ emailAccount: row.email_account,
300
+ dateRangeStart: new Date(row.date_range_start),
301
+ dateRangeEnd: new Date(row.date_range_end),
302
+ status: row.status,
303
+ totalThreadsFound: row.total_threads_found,
304
+ threadsProcessed: row.threads_processed,
305
+ entriesCreated: row.entries_created,
306
+ entriesSkipped: row.entries_skipped,
307
+ errorsEncountered: row.errors_encountered,
308
+ startedAt: row.started_at ? new Date(row.started_at) : null,
309
+ completedAt: row.completed_at ? new Date(row.completed_at) : null,
310
+ errorLog: row.error_log || [],
311
+ configUsed: row.config_used || {},
312
+ createdAt: new Date(row.created_at),
313
+ updatedAt: new Date(row.updated_at),
314
+ };
315
+ }
316
+ }
317
+ // =============================================================================
318
+ // Singleton Instance
319
+ // =============================================================================
320
+ let stateManagerInstance = null;
321
+ /**
322
+ * Get singleton state manager instance
323
+ */
324
+ export function getStateManager() {
325
+ if (!stateManagerInstance) {
326
+ const supabaseUrl = process.env.SUPABASE_URL || process.env.NEXT_PUBLIC_SUPABASE_URL;
327
+ const supabaseServiceRoleKey = process.env.SUPABASE_SERVICE_ROLE_KEY;
328
+ if (!supabaseUrl || !supabaseServiceRoleKey) {
329
+ throw new Error('SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY are required');
330
+ }
331
+ stateManagerInstance = new StateManager({
332
+ supabaseUrl,
333
+ supabaseServiceRoleKey,
334
+ });
335
+ }
336
+ return stateManagerInstance;
337
+ }
338
+ /**
339
+ * Reset the singleton (for testing)
340
+ */
341
+ export function resetStateManager() {
342
+ stateManagerInstance = null;
343
+ }
344
+ //# sourceMappingURL=state-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../src/extraction/state-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Response Generation Module
3
+ *
4
+ * Generates brand-compliant responses using Claude:
5
+ * - Assembles context from analysis and knowledge
6
+ * - Applies brand voice guidelines
7
+ * - Enforces forbidden terms rules
8
+ * - Formats for target channel
9
+ * - Validates before sending
10
+ */
11
+ import { type Config } from '../config.js';
12
+ import type { GeneratedResponse, InboundMessage, AnalysisResult, KnowledgeContext, SupportChannel } from '../types.js';
13
+ export declare class ResponseGenerationService {
14
+ private client;
15
+ private effectiveConfig;
16
+ constructor(configOverride?: Config);
17
+ private getClient;
18
+ /**
19
+ * Generate a response for a message
20
+ */
21
+ generateResponse(message: InboundMessage, analysis: AnalysisResult, knowledge: KnowledgeContext, options?: {
22
+ targetChannel?: SupportChannel;
23
+ maxAttempts?: number;
24
+ }): Promise<GeneratedResponse>;
25
+ /**
26
+ * Build context prompt for Claude
27
+ */
28
+ private buildContextPrompt;
29
+ /**
30
+ * Call Claude to generate response
31
+ */
32
+ private callClaude;
33
+ /**
34
+ * Format response for target channel
35
+ */
36
+ private formatForChannel;
37
+ /**
38
+ * Format text as HTML for email
39
+ */
40
+ private formatAsHtml;
41
+ /**
42
+ * Format text for SMS (truncate and simplify)
43
+ */
44
+ private formatForSms;
45
+ /**
46
+ * Format text as Slack blocks
47
+ */
48
+ private formatAsSlackBlocks;
49
+ /**
50
+ * Extract citations from response
51
+ */
52
+ private extractCitations;
53
+ /**
54
+ * Calculate quality score for response
55
+ */
56
+ private calculateQualityScore;
57
+ }
58
+ /**
59
+ * Remove common AI writing patterns to make responses sound more natural
60
+ * Based on Wikipedia's "Signs of AI writing" guide
61
+ */
62
+ export declare function humanizeResponse(text: string): string;
63
+ export declare function getResponseGenerationService(configOverride?: Config): ResponseGenerationService;
64
+ /**
65
+ * Generate a response for a message
66
+ */
67
+ export declare function generateResponse(message: InboundMessage, analysis: AnalysisResult, knowledge: KnowledgeContext, options?: {
68
+ targetChannel?: SupportChannel;
69
+ maxAttempts?: number;
70
+ }): Promise<GeneratedResponse>;
71
+ /**
72
+ * Check if response is ready to send
73
+ */
74
+ export declare function isResponseReadyToSend(response: GeneratedResponse): boolean;
75
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generation/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AASnD,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,gBAAgB,EAIhB,cAAc,EAGf,MAAM,aAAa,CAAC;AAgKrB,qBAAa,yBAAyB;IACpC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,eAAe,CAAS;gBAEpB,cAAc,CAAC,EAAE,MAAM;IAInC,OAAO,CAAC,SAAS;IAejB;;OAEG;IACG,gBAAgB,CACpB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,gBAAgB,EAC3B,OAAO,GAAE;QACP,aAAa,CAAC,EAAE,cAAc,CAAC;QAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;KACjB,GACL,OAAO,CAAC,iBAAiB,CAAC;IAiH7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwH1B;;OAEG;YACW,UAAU;IA2BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoCxB;;OAEG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA+BxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAqB9B;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqGrD;AAQD,wBAAgB,4BAA4B,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,yBAAyB,CAU/F;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,gBAAgB,EAC3B,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,cAAc,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACjE,OAAO,CAAC,iBAAiB,CAAC,CAE5B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAK1E"}