@mcp-consultant-tools/powerplatform-data 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/build/PowerPlatformService.d.ts +568 -0
- package/build/PowerPlatformService.d.ts.map +1 -0
- package/build/PowerPlatformService.js +2329 -0
- package/build/PowerPlatformService.js.map +1 -0
- package/build/index.d.ts +9 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +205 -0
- package/build/index.js.map +1 -0
- package/build/utils/bestPractices.d.ts +152 -0
- package/build/utils/bestPractices.d.ts.map +1 -0
- package/build/utils/bestPractices.js +338 -0
- package/build/utils/bestPractices.js.map +1 -0
- package/build/utils/iconManager.d.ts +84 -0
- package/build/utils/iconManager.d.ts.map +1 -0
- package/build/utils/iconManager.js +342 -0
- package/build/utils/iconManager.js.map +1 -0
- package/build/utils/prompt-templates.d.ts +9 -0
- package/build/utils/prompt-templates.d.ts.map +1 -0
- package/build/utils/prompt-templates.js +31 -0
- package/build/utils/prompt-templates.js.map +1 -0
- package/build/utils/rate-limiter.d.ts +108 -0
- package/build/utils/rate-limiter.d.ts.map +1 -0
- package/build/utils/rate-limiter.js +241 -0
- package/build/utils/rate-limiter.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Icon Management Module
|
|
3
|
+
*
|
|
4
|
+
* Integrates with Fluent UI System Icons for entity icon management.
|
|
5
|
+
* Fetches SVG icons from GitHub and uploads them as web resources.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Fluent UI System Icons configuration
|
|
9
|
+
*/
|
|
10
|
+
const FLUENT_ICONS_CONFIG = {
|
|
11
|
+
baseUrl: 'https://raw.githubusercontent.com/microsoft/fluentui-system-icons/main/assets',
|
|
12
|
+
defaultSize: 24,
|
|
13
|
+
defaultStyle: 'filled'
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Icon suggestions based on entity type/name
|
|
17
|
+
*/
|
|
18
|
+
const ICON_SUGGESTIONS = {
|
|
19
|
+
// People & Organizations
|
|
20
|
+
contact: [
|
|
21
|
+
{ name: 'Person', fileName: 'person_24_filled.svg', url: '', category: 'people' },
|
|
22
|
+
{ name: 'People', fileName: 'people_24_filled.svg', url: '', category: 'people' }
|
|
23
|
+
],
|
|
24
|
+
account: [
|
|
25
|
+
{ name: 'Building', fileName: 'building_24_filled.svg', url: '', category: 'places' },
|
|
26
|
+
{ name: 'Organization', fileName: 'organization_24_filled.svg', url: '', category: 'people' }
|
|
27
|
+
],
|
|
28
|
+
customer: [
|
|
29
|
+
{ name: 'Person Circle', fileName: 'person_circle_24_filled.svg', url: '', category: 'people' }
|
|
30
|
+
],
|
|
31
|
+
// Business
|
|
32
|
+
opportunity: [
|
|
33
|
+
{ name: 'Money', fileName: 'money_24_filled.svg', url: '', category: 'commerce' },
|
|
34
|
+
{ name: 'Target', fileName: 'target_24_filled.svg', url: '', category: 'general' }
|
|
35
|
+
],
|
|
36
|
+
quote: [
|
|
37
|
+
{ name: 'Document', fileName: 'document_24_filled.svg', url: '', category: 'document' },
|
|
38
|
+
{ name: 'Document Text', fileName: 'document_text_24_filled.svg', url: '', category: 'document' }
|
|
39
|
+
],
|
|
40
|
+
order: [
|
|
41
|
+
{ name: 'Cart', fileName: 'cart_24_filled.svg', url: '', category: 'commerce' },
|
|
42
|
+
{ name: 'Receipt', fileName: 'receipt_24_filled.svg', url: '', category: 'commerce' }
|
|
43
|
+
],
|
|
44
|
+
invoice: [
|
|
45
|
+
{ name: 'Receipt Money', fileName: 'receipt_money_24_filled.svg', url: '', category: 'commerce' }
|
|
46
|
+
],
|
|
47
|
+
product: [
|
|
48
|
+
{ name: 'Box', fileName: 'box_24_filled.svg', url: '', category: 'commerce' },
|
|
49
|
+
{ name: 'Cube', fileName: 'cube_24_filled.svg', url: '', category: 'general' }
|
|
50
|
+
],
|
|
51
|
+
// Cases & Service
|
|
52
|
+
case: [
|
|
53
|
+
{ name: 'Question Circle', fileName: 'question_circle_24_filled.svg', url: '', category: 'general' },
|
|
54
|
+
{ name: 'Chat Help', fileName: 'chat_help_24_filled.svg', url: '', category: 'communication' }
|
|
55
|
+
],
|
|
56
|
+
incident: [
|
|
57
|
+
{ name: 'Alert', fileName: 'alert_24_filled.svg', url: '', category: 'general' },
|
|
58
|
+
{ name: 'Warning', fileName: 'warning_24_filled.svg', url: '', category: 'general' }
|
|
59
|
+
],
|
|
60
|
+
ticket: [
|
|
61
|
+
{ name: 'Ticket', fileName: 'ticket_24_filled.svg', url: '', category: 'general' }
|
|
62
|
+
],
|
|
63
|
+
// Tasks & Activities
|
|
64
|
+
task: [
|
|
65
|
+
{ name: 'Task List', fileName: 'task_list_24_filled.svg', url: '', category: 'productivity' },
|
|
66
|
+
{ name: 'Checkmark', fileName: 'checkmark_24_filled.svg', url: '', category: 'general' }
|
|
67
|
+
],
|
|
68
|
+
appointment: [
|
|
69
|
+
{ name: 'Calendar', fileName: 'calendar_24_filled.svg', url: '', category: 'productivity' },
|
|
70
|
+
{ name: 'Calendar Clock', fileName: 'calendar_clock_24_filled.svg', url: '', category: 'productivity' }
|
|
71
|
+
],
|
|
72
|
+
email: [
|
|
73
|
+
{ name: 'Mail', fileName: 'mail_24_filled.svg', url: '', category: 'communication' },
|
|
74
|
+
{ name: 'Mail Inbox', fileName: 'mail_inbox_24_filled.svg', url: '', category: 'communication' }
|
|
75
|
+
],
|
|
76
|
+
phonecall: [
|
|
77
|
+
{ name: 'Call', fileName: 'call_24_filled.svg', url: '', category: 'communication' },
|
|
78
|
+
{ name: 'Phone', fileName: 'phone_24_filled.svg', url: '', category: 'communication' }
|
|
79
|
+
],
|
|
80
|
+
// Reference Data
|
|
81
|
+
category: [
|
|
82
|
+
{ name: 'Tag', fileName: 'tag_24_filled.svg', url: '', category: 'general' },
|
|
83
|
+
{ name: 'Grid', fileName: 'grid_24_filled.svg', url: '', category: 'general' }
|
|
84
|
+
],
|
|
85
|
+
status: [
|
|
86
|
+
{ name: 'Status', fileName: 'status_24_filled.svg', url: '', category: 'general' },
|
|
87
|
+
{ name: 'Circle', fileName: 'circle_24_filled.svg', url: '', category: 'shapes' }
|
|
88
|
+
],
|
|
89
|
+
type: [
|
|
90
|
+
{ name: 'Options', fileName: 'options_24_filled.svg', url: '', category: 'general' }
|
|
91
|
+
],
|
|
92
|
+
reason: [
|
|
93
|
+
{ name: 'Info', fileName: 'info_24_filled.svg', url: '', category: 'general' }
|
|
94
|
+
],
|
|
95
|
+
// Documents & Files
|
|
96
|
+
document: [
|
|
97
|
+
{ name: 'Document', fileName: 'document_24_filled.svg', url: '', category: 'document' },
|
|
98
|
+
{ name: 'Document Text', fileName: 'document_text_24_filled.svg', url: '', category: 'document' }
|
|
99
|
+
],
|
|
100
|
+
file: [
|
|
101
|
+
{ name: 'Document', fileName: 'document_24_filled.svg', url: '', category: 'document' }
|
|
102
|
+
],
|
|
103
|
+
attachment: [
|
|
104
|
+
{ name: 'Attach', fileName: 'attach_24_filled.svg', url: '', category: 'document' }
|
|
105
|
+
],
|
|
106
|
+
note: [
|
|
107
|
+
{ name: 'Note', fileName: 'note_24_filled.svg', url: '', category: 'document' },
|
|
108
|
+
{ name: 'Document Edit', fileName: 'document_edit_24_filled.svg', url: '', category: 'document' }
|
|
109
|
+
],
|
|
110
|
+
// Locations
|
|
111
|
+
location: [
|
|
112
|
+
{ name: 'Location', fileName: 'location_24_filled.svg', url: '', category: 'places' },
|
|
113
|
+
{ name: 'Pin', fileName: 'pin_24_filled.svg', url: '', category: 'places' }
|
|
114
|
+
],
|
|
115
|
+
address: [
|
|
116
|
+
{ name: 'Location', fileName: 'location_24_filled.svg', url: '', category: 'places' },
|
|
117
|
+
{ name: 'Home', fileName: 'home_24_filled.svg', url: '', category: 'places' }
|
|
118
|
+
],
|
|
119
|
+
// Projects & Work
|
|
120
|
+
project: [
|
|
121
|
+
{ name: 'Briefcase', fileName: 'briefcase_24_filled.svg', url: '', category: 'productivity' },
|
|
122
|
+
{ name: 'Folder', fileName: 'folder_24_filled.svg', url: '', category: 'document' }
|
|
123
|
+
],
|
|
124
|
+
application: [
|
|
125
|
+
{ name: 'Apps', fileName: 'apps_24_filled.svg', url: '', category: 'general' },
|
|
126
|
+
{ name: 'Window', fileName: 'window_24_filled.svg', url: '', category: 'general' }
|
|
127
|
+
],
|
|
128
|
+
// Default fallback
|
|
129
|
+
default: [
|
|
130
|
+
{ name: 'Circle', fileName: 'circle_24_filled.svg', url: '', category: 'shapes' },
|
|
131
|
+
{ name: 'Square', fileName: 'square_24_filled.svg', url: '', category: 'shapes' },
|
|
132
|
+
{ name: 'Star', fileName: 'star_24_filled.svg', url: '', category: 'shapes' }
|
|
133
|
+
]
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Icon Manager Class
|
|
137
|
+
*/
|
|
138
|
+
export class IconManager {
|
|
139
|
+
baseUrl;
|
|
140
|
+
cache = new Map();
|
|
141
|
+
constructor() {
|
|
142
|
+
this.baseUrl = FLUENT_ICONS_CONFIG.baseUrl;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Suggest icons based on entity name or type
|
|
146
|
+
*/
|
|
147
|
+
suggestIcons(entityName) {
|
|
148
|
+
const lowerName = entityName.toLowerCase()
|
|
149
|
+
.replace(/^sic_/, '') // Remove publisher prefix
|
|
150
|
+
.replace(/^ref_/, ''); // Remove ref data infix
|
|
151
|
+
// Try exact match first
|
|
152
|
+
if (ICON_SUGGESTIONS[lowerName]) {
|
|
153
|
+
return this.populateUrls(ICON_SUGGESTIONS[lowerName]);
|
|
154
|
+
}
|
|
155
|
+
// Try partial match
|
|
156
|
+
for (const [key, suggestions] of Object.entries(ICON_SUGGESTIONS)) {
|
|
157
|
+
if (lowerName.includes(key) || key.includes(lowerName)) {
|
|
158
|
+
return this.populateUrls(suggestions);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Return default suggestions
|
|
162
|
+
return this.populateUrls(ICON_SUGGESTIONS.default);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Populate full URLs for icon suggestions
|
|
166
|
+
*/
|
|
167
|
+
populateUrls(suggestions) {
|
|
168
|
+
return suggestions.map(s => {
|
|
169
|
+
try {
|
|
170
|
+
const iconPath = this.constructFluentIconPath(s.fileName);
|
|
171
|
+
return {
|
|
172
|
+
...s,
|
|
173
|
+
url: `${this.baseUrl}/${iconPath}`
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
// If path construction fails, return suggestion with empty URL
|
|
178
|
+
return {
|
|
179
|
+
...s,
|
|
180
|
+
url: ''
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Parse icon filename and construct GitHub path
|
|
187
|
+
* Converts: people_community_24_filled.svg
|
|
188
|
+
* To: assets/People Community/SVG/ic_fluent_people_community_24_filled.svg
|
|
189
|
+
*/
|
|
190
|
+
constructFluentIconPath(fileName) {
|
|
191
|
+
// Remove .svg extension
|
|
192
|
+
const base = fileName.replace('.svg', '');
|
|
193
|
+
// Split into parts
|
|
194
|
+
const parts = base.split('_');
|
|
195
|
+
// Extract size (e.g., '24') and style (e.g., 'filled' or 'regular')
|
|
196
|
+
const size = parts[parts.length - 2];
|
|
197
|
+
const style = parts[parts.length - 1];
|
|
198
|
+
// Validate size and style
|
|
199
|
+
if (!size || !style || isNaN(parseInt(size))) {
|
|
200
|
+
throw new Error(`Invalid icon filename format: ${fileName}. Expected format: {icon_name}_{size}_{style}.svg (e.g., people_community_24_filled.svg)`);
|
|
201
|
+
}
|
|
202
|
+
// Icon name is everything before size and style
|
|
203
|
+
const iconNameParts = parts.slice(0, -2);
|
|
204
|
+
if (iconNameParts.length === 0) {
|
|
205
|
+
throw new Error(`Invalid icon filename format: ${fileName}. Missing icon name.`);
|
|
206
|
+
}
|
|
207
|
+
// Folder name: capitalize each word, join with space
|
|
208
|
+
const folderName = iconNameParts
|
|
209
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
|
210
|
+
.join(' ');
|
|
211
|
+
// Full filename with ic_fluent_ prefix
|
|
212
|
+
const fullFileName = `ic_fluent_${base}.svg`;
|
|
213
|
+
// Construct the full path
|
|
214
|
+
const path = `${folderName}/SVG/${fullFileName}`;
|
|
215
|
+
return path;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Fetch SVG icon from Fluent UI GitHub repository
|
|
219
|
+
*/
|
|
220
|
+
async fetchIcon(fileName) {
|
|
221
|
+
// Check cache first
|
|
222
|
+
if (this.cache.has(fileName)) {
|
|
223
|
+
return this.cache.get(fileName);
|
|
224
|
+
}
|
|
225
|
+
try {
|
|
226
|
+
// Construct the correct GitHub path
|
|
227
|
+
const iconPath = this.constructFluentIconPath(fileName);
|
|
228
|
+
const url = `${this.baseUrl}/${iconPath}`;
|
|
229
|
+
// Use global fetch if available (Node 18+)
|
|
230
|
+
const response = await global.fetch(url);
|
|
231
|
+
if (!response.ok) {
|
|
232
|
+
throw new Error(`Failed to fetch icon from GitHub: ${response.status} ${response.statusText}. URL: ${url}`);
|
|
233
|
+
}
|
|
234
|
+
const svg = await response.text();
|
|
235
|
+
// Validate it's an SVG
|
|
236
|
+
if (!svg.includes('<svg')) {
|
|
237
|
+
throw new Error('Fetched content is not a valid SVG');
|
|
238
|
+
}
|
|
239
|
+
// Cache the result
|
|
240
|
+
this.cache.set(fileName, svg);
|
|
241
|
+
return svg;
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
throw new Error(`Failed to fetch icon '${fileName}': ${error instanceof Error ? error.message : String(error)}\n\nExpected format: {icon_name}_{size}_{style}.svg (e.g., people_community_24_filled.svg)\nBrowse icons at: https://github.com/microsoft/fluentui-system-icons`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Generate web resource name for icon
|
|
249
|
+
*/
|
|
250
|
+
generateWebResourceName(entitySchemaName, iconName) {
|
|
251
|
+
const prefix = 'sic_';
|
|
252
|
+
const cleanEntityName = entitySchemaName.toLowerCase().replace(/^sic_/, '');
|
|
253
|
+
const cleanIconName = iconName.toLowerCase().replace(/\s+/g, '_');
|
|
254
|
+
return `${prefix}${cleanEntityName}_icon_${cleanIconName}`;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Generate icon vector name for EntityMetadata
|
|
258
|
+
* Uses $webresource: directive which is the correct syntax for Dynamics 365
|
|
259
|
+
* This creates a solution dependency and tells the system to look up the web resource by name
|
|
260
|
+
*/
|
|
261
|
+
generateIconVectorName(webResourceName) {
|
|
262
|
+
return `$webresource:${webResourceName}`;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Validate icon SVG content
|
|
266
|
+
*/
|
|
267
|
+
validateIconSvg(svg) {
|
|
268
|
+
if (!svg.includes('<svg')) {
|
|
269
|
+
return { valid: false, error: 'Content is not a valid SVG' };
|
|
270
|
+
}
|
|
271
|
+
if (svg.length > 100000) {
|
|
272
|
+
return { valid: false, error: 'SVG file is too large (max 100KB)' };
|
|
273
|
+
}
|
|
274
|
+
// Check for script tags (security)
|
|
275
|
+
if (svg.includes('<script')) {
|
|
276
|
+
return { valid: false, error: 'SVG contains script tags (security risk)' };
|
|
277
|
+
}
|
|
278
|
+
return { valid: true };
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Get all available icon categories
|
|
282
|
+
*/
|
|
283
|
+
getCategories() {
|
|
284
|
+
const categories = new Set();
|
|
285
|
+
for (const suggestions of Object.values(ICON_SUGGESTIONS)) {
|
|
286
|
+
suggestions.forEach(s => categories.add(s.category));
|
|
287
|
+
}
|
|
288
|
+
return Array.from(categories).sort();
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Search icons by name
|
|
292
|
+
*/
|
|
293
|
+
searchIcons(searchTerm) {
|
|
294
|
+
const results = [];
|
|
295
|
+
const lowerSearch = searchTerm.toLowerCase();
|
|
296
|
+
for (const suggestions of Object.values(ICON_SUGGESTIONS)) {
|
|
297
|
+
for (const suggestion of suggestions) {
|
|
298
|
+
if (suggestion.name.toLowerCase().includes(lowerSearch) ||
|
|
299
|
+
suggestion.fileName.toLowerCase().includes(lowerSearch)) {
|
|
300
|
+
results.push(this.populateUrls([suggestion])[0]);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return results;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get icons by category
|
|
308
|
+
*/
|
|
309
|
+
getIconsByCategory(category) {
|
|
310
|
+
const results = [];
|
|
311
|
+
for (const suggestions of Object.values(ICON_SUGGESTIONS)) {
|
|
312
|
+
for (const suggestion of suggestions) {
|
|
313
|
+
if (suggestion.category === category) {
|
|
314
|
+
results.push(this.populateUrls([suggestion])[0]);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return results;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Build custom icon URL for specific size/style
|
|
322
|
+
*/
|
|
323
|
+
buildIconUrl(iconName, size = 24, style = 'filled') {
|
|
324
|
+
const fileName = `${iconName}_${size}_${style}.svg`;
|
|
325
|
+
try {
|
|
326
|
+
const iconPath = this.constructFluentIconPath(fileName);
|
|
327
|
+
return `${this.baseUrl}/${iconPath}`;
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
throw new Error(`Failed to build icon URL for '${iconName}': ${error instanceof Error ? error.message : String(error)}`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Clear icon cache
|
|
335
|
+
*/
|
|
336
|
+
clearCache() {
|
|
337
|
+
this.cache.clear();
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
// Export singleton instance
|
|
341
|
+
export const iconManager = new IconManager();
|
|
342
|
+
//# sourceMappingURL=iconManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iconManager.js","sourceRoot":"","sources":["../../src/utils/iconManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH;;GAEG;AACH,MAAM,mBAAmB,GAAG;IAC1B,OAAO,EAAE,+EAA+E;IACxF,WAAW,EAAE,EAAE;IACf,YAAY,EAAE,QAAQ;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,gBAAgB,GAAqC;IACzD,yBAAyB;IACzB,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACjF,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;KAClF;IACD,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACrF,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,4BAA4B,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;KAC9F;IACD,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,6BAA6B,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;KAChG;IAED,WAAW;IACX,WAAW,EAAE;QACX,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;QACjF,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;KACnF;IACD,KAAK,EAAE;QACL,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;QACvF,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,6BAA6B,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;KAClG;IACD,KAAK,EAAE;QACL,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;QAC/E,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,uBAAuB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;KACtF;IACD,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,6BAA6B,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;KAClG;IACD,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;QAC7E,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;KAC/E;IAED,kBAAkB;IAClB,IAAI,EAAE;QACJ,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,+BAA+B,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;QACpG,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,yBAAyB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;KAC/F;IACD,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;QAChF,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,uBAAuB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;KACrF;IACD,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;KACnF;IAED,qBAAqB;IACrB,IAAI,EAAE;QACJ,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,yBAAyB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE;QAC7F,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,yBAAyB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;KACzF;IACD,WAAW,EAAE;QACX,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE;QAC3F,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,8BAA8B,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE;KACxG;IACD,KAAK,EAAE;QACL,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;QACpF,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,0BAA0B,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;KACjG;IACD,SAAS,EAAE;QACT,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;QACpF,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE;KACvF;IAED,iBAAiB;IACjB,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;QAC5E,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;KAC/E;IACD,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;QAClF,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;KAClF;IACD,IAAI,EAAE;QACJ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,uBAAuB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;KACrF;IACD,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;KAC/E;IAED,oBAAoB;IACpB,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;QACvF,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,6BAA6B,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;KAClG;IACD,IAAI,EAAE;QACJ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;KACxF;IACD,UAAU,EAAE;QACV,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;KACpF;IACD,IAAI,EAAE;QACJ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;QAC/E,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,6BAA6B,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;KAClG;IAED,YAAY;IACZ,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACrF,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;KAC5E;IACD,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACrF,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;KAC9E;IAED,kBAAkB;IAClB,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,yBAAyB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE;QAC7F,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;KACpF;IACD,WAAW,EAAE;QACX,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;QAC9E,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;KACnF;IAED,mBAAmB;IACnB,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACjF,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACjF,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;KAC9E;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,WAAW;IACd,OAAO,CAAS;IAChB,KAAK,GAAwB,IAAI,GAAG,EAAE,CAAC;IAE/C;QACE,IAAI,CAAC,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,UAAkB;QAC7B,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE;aACvC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAK,0BAA0B;aACnD,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAK,wBAAwB;QAErD,wBAAwB;QACxB,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;QACxD,CAAC;QAED,oBAAoB;QACpB,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAClE,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvD,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,WAA6B;QAChD,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACzB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC1D,OAAO;oBACL,GAAG,CAAC;oBACJ,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE;iBACnC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,+DAA+D;gBAC/D,OAAO;oBACL,GAAG,CAAC;oBACJ,GAAG,EAAE,EAAE;iBACR,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,uBAAuB,CAAC,QAAgB;QAC9C,wBAAwB;QACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAE1C,mBAAmB;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE9B,oEAAoE;QACpE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEtC,0BAA0B;QAC1B,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,0FAA0F,CAAC,CAAC;QACvJ,CAAC;QAED,gDAAgD;QAChD,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEzC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,sBAAsB,CAAC,CAAC;QACnF,CAAC;QAED,qDAAqD;QACrD,MAAM,UAAU,GAAG,aAAa;aAC7B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACzD,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,uCAAuC;QACvC,MAAM,YAAY,GAAG,aAAa,IAAI,MAAM,CAAC;QAE7C,0BAA0B;QAC1B,MAAM,IAAI,GAAG,GAAG,UAAU,QAAQ,YAAY,EAAE,CAAC;QAEjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC9B,oBAAoB;QACpB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;QACnC,CAAC;QAED,IAAI,CAAC;YACH,oCAAoC;YACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;YAE1C,2CAA2C;YAC3C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAEzC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,UAAU,GAAG,EAAE,CAAC,CAAC;YAC9G,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAElC,uBAAuB;YACvB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACxD,CAAC;YAED,mBAAmB;YACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAE9B,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,iKAAiK,CAAC,CAAC;QAClR,CAAC;IACH,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,gBAAwB,EAAE,QAAgB;QAChE,MAAM,MAAM,GAAG,MAAM,CAAC;QACtB,MAAM,eAAe,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAElE,OAAO,GAAG,MAAM,GAAG,eAAe,SAAS,aAAa,EAAE,CAAC;IAC7D,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,eAAuB;QAC5C,OAAO,gBAAgB,eAAe,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,GAAW;QACzB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;QAC/D,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;YACxB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;QACtE,CAAC;QAED,mCAAmC;QACnC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAC;QAC7E,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,aAAa;QACX,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC1D,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,UAAkB;QAC5B,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QAE7C,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC1D,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,IACE,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;oBACnD,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EACvD,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,QAAgB;QACjC,MAAM,OAAO,GAAqB,EAAE,CAAC;QAErC,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC1D,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,IAAI,UAAU,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBACrC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,QAAgB,EAAE,OAAe,EAAE,EAAE,QAA8B,QAAQ;QACtF,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI,IAAI,IAAI,KAAK,MAAM,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YACxD,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3H,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PowerPlatform Prompt Templates
|
|
3
|
+
* Template functions for formatted prompt responses
|
|
4
|
+
*/
|
|
5
|
+
export declare const ENTITY_OVERVIEW: (entityName: string) => string;
|
|
6
|
+
export declare const ATTRIBUTE_DETAILS: (entityName: string, attributeName: string) => string;
|
|
7
|
+
export declare const QUERY_TEMPLATE: (entityNamePlural: string) => string;
|
|
8
|
+
export declare const RELATIONSHIP_MAP: (entityName: string) => string;
|
|
9
|
+
//# sourceMappingURL=prompt-templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-templates.d.ts","sourceRoot":"","sources":["../../src/utils/prompt-templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,eAAe,GAAI,YAAY,MAAM,WAMwB,CAAC;AAE3E,eAAO,MAAM,iBAAiB,GAAI,YAAY,MAAM,EAAE,eAAe,MAAM,WAO3C,CAAC;AAEjC,eAAO,MAAM,cAAc,GAAI,kBAAkB,MAAM,WAQY,CAAC;AAEpE,eAAO,MAAM,gBAAgB,GAAI,YAAY,MAAM,WAKK,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PowerPlatform Prompt Templates
|
|
3
|
+
* Template functions for formatted prompt responses
|
|
4
|
+
*/
|
|
5
|
+
export const ENTITY_OVERVIEW = (entityName) => `## Power Platform Entity: ${entityName}\n\n` +
|
|
6
|
+
`This is an overview of the '${entityName}' entity in Microsoft Power Platform/Dataverse:\n\n` +
|
|
7
|
+
`### Entity Details\n{{entity_details}}\n\n` +
|
|
8
|
+
`### Attributes\n{{key_attributes}}\n\n` +
|
|
9
|
+
`### Relationships\n{{relationships}}\n\n` +
|
|
10
|
+
`You can query this entity using OData filters against the plural name.`;
|
|
11
|
+
export const ATTRIBUTE_DETAILS = (entityName, attributeName) => `## Attribute: ${attributeName}\n\n` +
|
|
12
|
+
`Details for the '${attributeName}' attribute of the '${entityName}' entity:\n\n` +
|
|
13
|
+
`{{attribute_details}}\n\n` +
|
|
14
|
+
`### Usage Notes\n` +
|
|
15
|
+
`- Data Type: {{data_type}}\n` +
|
|
16
|
+
`- Required: {{required}}\n` +
|
|
17
|
+
`- Max Length: {{max_length}}`;
|
|
18
|
+
export const QUERY_TEMPLATE = (entityNamePlural) => `## OData Query Template for ${entityNamePlural}\n\n` +
|
|
19
|
+
`Use this template to build queries against the ${entityNamePlural} entity:\n\n` +
|
|
20
|
+
`\`\`\`\n${entityNamePlural}?$select={{selected_fields}}&$filter={{filter_conditions}}&$orderby={{order_by}}&$top={{max_records}}\n\`\`\`\n\n` +
|
|
21
|
+
`### Common Filter Examples\n` +
|
|
22
|
+
`- Equals: \`name eq 'Contoso'\`\n` +
|
|
23
|
+
`- Contains: \`contains(name, 'Contoso')\`\n` +
|
|
24
|
+
`- Greater than date: \`createdon gt 2023-01-01T00:00:00Z\`\n` +
|
|
25
|
+
`- Multiple conditions: \`name eq 'Contoso' and statecode eq 0\``;
|
|
26
|
+
export const RELATIONSHIP_MAP = (entityName) => `## Relationship Map for ${entityName}\n\n` +
|
|
27
|
+
`This shows all relationships for the '${entityName}' entity:\n\n` +
|
|
28
|
+
`### One-to-Many Relationships (${entityName} as Primary)\n{{one_to_many_primary}}\n\n` +
|
|
29
|
+
`### One-to-Many Relationships (${entityName} as Related)\n{{one_to_many_related}}\n\n` +
|
|
30
|
+
`### Many-to-Many Relationships\n{{many_to_many}}\n\n`;
|
|
31
|
+
//# sourceMappingURL=prompt-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-templates.js","sourceRoot":"","sources":["../../src/utils/prompt-templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAE,EAAE,CACpD,6BAA6B,UAAU,MAAM;IAC7C,+BAA+B,UAAU,qDAAqD;IAC9F,4CAA4C;IAC5C,wCAAwC;IACxC,0CAA0C;IAC1C,wEAAwE,CAAC;AAE3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,UAAkB,EAAE,aAAqB,EAAE,EAAE,CAC7E,iBAAiB,aAAa,MAAM;IACpC,oBAAoB,aAAa,uBAAuB,UAAU,eAAe;IACjF,2BAA2B;IAC3B,mBAAmB;IACnB,8BAA8B;IAC9B,4BAA4B;IAC5B,8BAA8B,CAAC;AAEjC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,gBAAwB,EAAE,EAAE,CACzD,+BAA+B,gBAAgB,MAAM;IACrD,kDAAkD,gBAAgB,cAAc;IAChF,WAAW,gBAAgB,mHAAmH;IAC9I,8BAA8B;IAC9B,mCAAmC;IACnC,6CAA6C;IAC7C,8DAA8D;IAC9D,iEAAiE,CAAC;AAEpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAkB,EAAE,EAAE,CACrD,2BAA2B,UAAU,MAAM;IAC3C,yCAAyC,UAAU,eAAe;IAClE,kCAAkC,UAAU,2CAA2C;IACvF,kCAAkC,UAAU,2CAA2C;IACvF,sDAAsD,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limiter Module
|
|
3
|
+
*
|
|
4
|
+
* Implements rate limiting with exponential backoff for PowerPlatform API calls.
|
|
5
|
+
* Prevents API throttling errors (429) and manages concurrent request limits.
|
|
6
|
+
*/
|
|
7
|
+
export interface RateLimiterOptions {
|
|
8
|
+
maxRequestsPerMinute?: number;
|
|
9
|
+
maxConcurrentRequests?: number;
|
|
10
|
+
retryAttempts?: number;
|
|
11
|
+
initialBackoffMs?: number;
|
|
12
|
+
maxBackoffMs?: number;
|
|
13
|
+
backoffMultiplier?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface RequestQueueItem<T> {
|
|
16
|
+
fn: () => Promise<T>;
|
|
17
|
+
resolve: (value: T) => void;
|
|
18
|
+
reject: (error: any) => void;
|
|
19
|
+
retryCount: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Rate Limiter Class
|
|
23
|
+
*/
|
|
24
|
+
export declare class RateLimiter {
|
|
25
|
+
private options;
|
|
26
|
+
private requestTimestamps;
|
|
27
|
+
private activeRequests;
|
|
28
|
+
private queue;
|
|
29
|
+
private processing;
|
|
30
|
+
constructor(options?: RateLimiterOptions);
|
|
31
|
+
/**
|
|
32
|
+
* Execute a function with rate limiting
|
|
33
|
+
*/
|
|
34
|
+
execute<T>(fn: () => Promise<T>): Promise<T>;
|
|
35
|
+
/**
|
|
36
|
+
* Process the request queue
|
|
37
|
+
*/
|
|
38
|
+
private processQueue;
|
|
39
|
+
/**
|
|
40
|
+
* Execute a single request with retry logic
|
|
41
|
+
*/
|
|
42
|
+
private executeRequest;
|
|
43
|
+
/**
|
|
44
|
+
* Check if we can make a request without exceeding rate limits
|
|
45
|
+
*/
|
|
46
|
+
private canMakeRequest;
|
|
47
|
+
/**
|
|
48
|
+
* Record a request timestamp
|
|
49
|
+
*/
|
|
50
|
+
private recordRequest;
|
|
51
|
+
/**
|
|
52
|
+
* Remove timestamps older than 1 minute
|
|
53
|
+
*/
|
|
54
|
+
private cleanupOldTimestamps;
|
|
55
|
+
/**
|
|
56
|
+
* Calculate backoff time for retry
|
|
57
|
+
*/
|
|
58
|
+
private calculateBackoff;
|
|
59
|
+
/**
|
|
60
|
+
* Check if error is a rate limit error
|
|
61
|
+
*/
|
|
62
|
+
private isRateLimitError;
|
|
63
|
+
/**
|
|
64
|
+
* Sleep helper
|
|
65
|
+
*/
|
|
66
|
+
private sleep;
|
|
67
|
+
/**
|
|
68
|
+
* Get current rate limiter stats
|
|
69
|
+
*/
|
|
70
|
+
getStats(): {
|
|
71
|
+
activeRequests: number;
|
|
72
|
+
queuedRequests: number;
|
|
73
|
+
requestsLastMinute: number;
|
|
74
|
+
maxRequestsPerMinute: number;
|
|
75
|
+
maxConcurrentRequests: number;
|
|
76
|
+
utilizationPercentage: number;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Wait until rate limiter has capacity
|
|
80
|
+
*/
|
|
81
|
+
waitForCapacity(): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Clear the queue
|
|
84
|
+
*/
|
|
85
|
+
clearQueue(): void;
|
|
86
|
+
/**
|
|
87
|
+
* Reset rate limiter
|
|
88
|
+
*/
|
|
89
|
+
reset(): void;
|
|
90
|
+
/**
|
|
91
|
+
* Update rate limiter options
|
|
92
|
+
*/
|
|
93
|
+
updateOptions(options: Partial<RateLimiterOptions>): void;
|
|
94
|
+
}
|
|
95
|
+
export declare const rateLimiter: RateLimiter;
|
|
96
|
+
/**
|
|
97
|
+
* Helper function to wrap API calls with rate limiting
|
|
98
|
+
*/
|
|
99
|
+
export declare function withRateLimit<T>(fn: () => Promise<T>): Promise<T>;
|
|
100
|
+
/**
|
|
101
|
+
* Batch execution with rate limiting
|
|
102
|
+
* Processes an array of functions with rate limiting
|
|
103
|
+
*/
|
|
104
|
+
export declare function batchExecute<T>(fns: (() => Promise<T>)[], options?: {
|
|
105
|
+
onProgress?: (completed: number, total: number) => void;
|
|
106
|
+
onError?: (error: any, index: number) => void;
|
|
107
|
+
}): Promise<T[]>;
|
|
108
|
+
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,kBAAkB;IACjC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,UAAU,CAAkB;gBAExB,OAAO,GAAE,kBAAuB;IAW5C;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAalD;;OAEG;YACW,YAAY;IA4B1B;;OAEG;YACW,cAAc;IAsC5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAKtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAK5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,QAAQ,IAAI;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,oBAAoB,EAAE,MAAM,CAAC;QAC7B,qBAAqB,EAAE,MAAM,CAAC;QAC9B,qBAAqB,EAAE,MAAM,CAAC;KAC/B;IAaD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtC;;OAEG;IACH,UAAU,IAAI,IAAI;IAQlB;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;CAM1D;AAGD,eAAO,MAAM,WAAW,aAOtB,CAAC;AAEH;;GAEG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEvE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,GAAG,EAAE,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EACzB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C,GACA,OAAO,CAAC,CAAC,EAAE,CAAC,CA2Bd"}
|