crewly 1.5.21 → 1.6.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 (113) hide show
  1. package/config/roles/orchestrator/prompt.md +182 -25
  2. package/config/skills/agent/core/cancel-followup/SKILL.md +38 -0
  3. package/config/skills/agent/core/cancel-followup/execute.sh +111 -0
  4. package/config/skills/agent/core/cancel-followup/execute.test.sh +42 -0
  5. package/config/skills/agent/core/list-my-followups/SKILL.md +36 -0
  6. package/config/skills/agent/core/list-my-followups/execute.sh +93 -0
  7. package/config/skills/agent/core/list-my-followups/execute.test.sh +41 -0
  8. package/config/skills/agent/core/schedule-followup/SKILL.md +53 -0
  9. package/config/skills/agent/core/schedule-followup/execute.sh +195 -0
  10. package/config/skills/agent/core/schedule-followup/execute.test.sh +48 -0
  11. package/config/skills/agent/core/watch-for-event/SKILL.md +60 -0
  12. package/config/skills/agent/core/watch-for-event/execute.sh +177 -0
  13. package/config/skills/agent/core/watch-for-event/execute.test.sh +43 -0
  14. package/config/skills/orchestrator/credential-manager/SKILL.md +218 -0
  15. package/config/skills/orchestrator/credential-manager/execute.sh +166 -0
  16. package/dist/backend/backend/src/controllers/credentials/credentials.controller.d.ts +80 -0
  17. package/dist/backend/backend/src/controllers/credentials/credentials.controller.d.ts.map +1 -0
  18. package/dist/backend/backend/src/controllers/credentials/credentials.controller.js +365 -0
  19. package/dist/backend/backend/src/controllers/credentials/credentials.controller.js.map +1 -0
  20. package/dist/backend/backend/src/controllers/credentials/credentials.routes.d.ts +26 -0
  21. package/dist/backend/backend/src/controllers/credentials/credentials.routes.d.ts.map +1 -0
  22. package/dist/backend/backend/src/controllers/credentials/credentials.routes.js +40 -0
  23. package/dist/backend/backend/src/controllers/credentials/credentials.routes.js.map +1 -0
  24. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +23 -14
  25. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  26. package/dist/backend/backend/src/scripts/backfill-mission-priority.d.ts +3 -1
  27. package/dist/backend/backend/src/scripts/backfill-mission-priority.d.ts.map +1 -1
  28. package/dist/backend/backend/src/scripts/backfill-mission-priority.js +16 -4
  29. package/dist/backend/backend/src/scripts/backfill-mission-priority.js.map +1 -1
  30. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
  31. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +22 -2
  32. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
  33. package/dist/backend/backend/src/services/credential/credential-store.service.d.ts +161 -0
  34. package/dist/backend/backend/src/services/credential/credential-store.service.d.ts.map +1 -0
  35. package/dist/backend/backend/src/services/credential/credential-store.service.js +298 -0
  36. package/dist/backend/backend/src/services/credential/credential-store.service.js.map +1 -0
  37. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts +117 -0
  38. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -0
  39. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +293 -0
  40. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -0
  41. package/dist/backend/backend/src/services/project/task.service.d.ts +18 -2
  42. package/dist/backend/backend/src/services/project/task.service.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/project/task.service.js +69 -53
  44. package/dist/backend/backend/src/services/project/task.service.js.map +1 -1
  45. package/dist/backend/backend/src/services/v3/contract-matcher.d.ts +20 -0
  46. package/dist/backend/backend/src/services/v3/contract-matcher.d.ts.map +1 -0
  47. package/dist/backend/backend/src/services/v3/contract-matcher.js +33 -0
  48. package/dist/backend/backend/src/services/v3/contract-matcher.js.map +1 -0
  49. package/dist/backend/backend/src/services/v3/escalation.service.d.ts +20 -1
  50. package/dist/backend/backend/src/services/v3/escalation.service.d.ts.map +1 -1
  51. package/dist/backend/backend/src/services/v3/escalation.service.js +97 -28
  52. package/dist/backend/backend/src/services/v3/escalation.service.js.map +1 -1
  53. package/dist/backend/backend/src/services/v3/service-contract-gate.service.d.ts +6 -4
  54. package/dist/backend/backend/src/services/v3/service-contract-gate.service.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/v3/service-contract-gate.service.js +18 -28
  56. package/dist/backend/backend/src/services/v3/service-contract-gate.service.js.map +1 -1
  57. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.d.ts.map +1 -1
  58. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.js +14 -9
  59. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.js.map +1 -1
  60. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +34 -1
  61. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
  62. package/dist/backend/backend/src/services/v3/trigger-engine.service.js +115 -5
  63. package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
  64. package/dist/backend/backend/src/types/credential.types.d.ts +185 -0
  65. package/dist/backend/backend/src/types/credential.types.d.ts.map +1 -0
  66. package/dist/backend/backend/src/types/credential.types.js +76 -0
  67. package/dist/backend/backend/src/types/credential.types.js.map +1 -0
  68. package/dist/backend/backend/src/utils/encryption.utils.d.ts +57 -0
  69. package/dist/backend/backend/src/utils/encryption.utils.d.ts.map +1 -0
  70. package/dist/backend/backend/src/utils/encryption.utils.js +162 -0
  71. package/dist/backend/backend/src/utils/encryption.utils.js.map +1 -0
  72. package/dist/cli/backend/src/services/credential/credential-store.service.d.ts +161 -0
  73. package/dist/cli/backend/src/services/credential/credential-store.service.d.ts.map +1 -0
  74. package/dist/cli/backend/src/services/credential/credential-store.service.js +298 -0
  75. package/dist/cli/backend/src/services/credential/credential-store.service.js.map +1 -0
  76. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts +117 -0
  77. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -0
  78. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +293 -0
  79. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -0
  80. package/dist/cli/backend/src/services/settings/settings.service.d.ts +168 -0
  81. package/dist/cli/backend/src/services/settings/settings.service.d.ts.map +1 -0
  82. package/dist/cli/backend/src/services/settings/settings.service.js +312 -0
  83. package/dist/cli/backend/src/services/settings/settings.service.js.map +1 -0
  84. package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts +159 -0
  85. package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts.map +1 -0
  86. package/dist/cli/backend/src/services/skill/skill-executor.service.js +626 -0
  87. package/dist/cli/backend/src/services/skill/skill-executor.service.js.map +1 -0
  88. package/dist/cli/backend/src/services/skill/skill.service.d.ts +273 -0
  89. package/dist/cli/backend/src/services/skill/skill.service.d.ts.map +1 -0
  90. package/dist/cli/backend/src/services/skill/skill.service.js +655 -0
  91. package/dist/cli/backend/src/services/skill/skill.service.js.map +1 -0
  92. package/dist/cli/backend/src/types/credential.types.d.ts +185 -0
  93. package/dist/cli/backend/src/types/credential.types.d.ts.map +1 -0
  94. package/dist/cli/backend/src/types/credential.types.js +76 -0
  95. package/dist/cli/backend/src/types/credential.types.js.map +1 -0
  96. package/dist/cli/backend/src/utils/encryption.utils.d.ts +57 -0
  97. package/dist/cli/backend/src/utils/encryption.utils.d.ts.map +1 -0
  98. package/dist/cli/backend/src/utils/encryption.utils.js +162 -0
  99. package/dist/cli/backend/src/utils/encryption.utils.js.map +1 -0
  100. package/dist/cli/backend/src/utils/skill-md-parser.d.ts +38 -0
  101. package/dist/cli/backend/src/utils/skill-md-parser.d.ts.map +1 -0
  102. package/dist/cli/backend/src/utils/skill-md-parser.js +47 -0
  103. package/dist/cli/backend/src/utils/skill-md-parser.js.map +1 -0
  104. package/frontend/dist/assets/{index-dc92ab64.css → index-6aaa0630.css} +1 -1
  105. package/frontend/dist/assets/{index-76d76633.js → index-9e6d97d1.js} +334 -328
  106. package/frontend/dist/index.html +2 -2
  107. package/package.json +1 -1
  108. package/config/experts/empathetic-resolver/expert.json +0 -11
  109. package/config/experts/empathetic-resolver.md +0 -32
  110. package/config/experts/pragmatic-architect/expert.json +0 -11
  111. package/config/experts/pragmatic-architect.md +0 -32
  112. package/config/experts/viral-alchemist/expert.json +0 -11
  113. package/config/experts/viral-alchemist.md +0 -32
@@ -0,0 +1,655 @@
1
+ /**
2
+ * Skill Service
3
+ *
4
+ * Manages AI agent skills including loading from directories,
5
+ * CRUD operations, and skill matching for prompts.
6
+ *
7
+ * Skills are the evolution of the SOP (Standard Operating Procedures) system,
8
+ * combining prompts, scripts, environment variables, and browser automation.
9
+ *
10
+ * @module services/skill/skill.service
11
+ */
12
+ import { promises as fs } from 'fs';
13
+ import * as path from 'path';
14
+ import { existsSync } from 'fs';
15
+ import { SKILL_CONSTANTS, createDefaultSkill, skillToSummary, validateCreateSkillInput, validateUpdateSkillInput, matchesSkillFilter, } from '../../types/skill.types.js';
16
+ import { LoggerService } from '../core/logger.service.js';
17
+ import { parseSkillMd } from '../../utils/skill-md-parser.js';
18
+ /**
19
+ * Service for managing AI agent skills
20
+ *
21
+ * Handles:
22
+ * - Loading built-in skills from config/skills/
23
+ * - Managing user-created skills in ~/.crewly/skills/
24
+ * - CRUD operations for skills
25
+ * - Skill matching for prompts
26
+ * - Integration with role service for skill assignment
27
+ */
28
+ export class SkillService {
29
+ builtinSkillsDir;
30
+ userSkillsDir;
31
+ marketplaceSkillsDir;
32
+ skillsCache = new Map();
33
+ initialized = false;
34
+ logger = LoggerService.getInstance().createComponentLogger('SkillService');
35
+ /**
36
+ * Create a new SkillService instance
37
+ *
38
+ * @param options - Configuration options
39
+ */
40
+ constructor(options) {
41
+ this.builtinSkillsDir =
42
+ options?.builtinSkillsDir ?? path.join(process.cwd(), 'config', 'skills');
43
+ this.userSkillsDir =
44
+ options?.userSkillsDir ??
45
+ path.join(process.env.HOME || '~', '.crewly', SKILL_CONSTANTS.PATHS.SKILLS_DIR);
46
+ this.marketplaceSkillsDir =
47
+ options?.marketplaceSkillsDir ??
48
+ path.join(process.env.HOME || '~', '.crewly', 'marketplace', 'skills');
49
+ }
50
+ /**
51
+ * Initialize the service by loading all skills
52
+ *
53
+ * Creates user skills directory if it doesn't exist and loads
54
+ * both built-in and user-defined skills into memory.
55
+ */
56
+ async initialize() {
57
+ if (this.initialized)
58
+ return;
59
+ await this.ensureUserSkillsDir();
60
+ await this.loadAllSkills();
61
+ this.initialized = true;
62
+ }
63
+ /**
64
+ * Get all skills, optionally filtered
65
+ *
66
+ * @param filter - Optional filter criteria
67
+ * @returns Array of skill summaries
68
+ */
69
+ async listSkills(filter) {
70
+ await this.ensureInitialized();
71
+ let skills = Array.from(this.skillsCache.values());
72
+ if (filter) {
73
+ skills = skills.filter((skill) => matchesSkillFilter(skill, filter));
74
+ }
75
+ return skills.map(skillToSummary);
76
+ }
77
+ /**
78
+ * Get a skill by ID with full prompt content
79
+ *
80
+ * @param id - Skill identifier
81
+ * @returns Skill with prompt content or null if not found
82
+ */
83
+ async getSkill(id) {
84
+ await this.ensureInitialized();
85
+ const skill = this.skillsCache.get(id);
86
+ if (!skill)
87
+ return null;
88
+ const promptContent = await this.loadPromptContent(skill);
89
+ return { ...skill, promptContent };
90
+ }
91
+ /**
92
+ * Get skills matching a prompt/input
93
+ *
94
+ * Used by agents to find relevant skills for a task. Scores skills
95
+ * based on trigger matches, tag matches, name matches, and description
96
+ * keyword matches.
97
+ *
98
+ * @param input - User input or prompt to match against
99
+ * @param roleId - Optional role ID to filter by
100
+ * @param maxResults - Maximum number of results to return (default: 5)
101
+ * @returns Array of matching skills with prompt content, sorted by relevance
102
+ */
103
+ async matchSkills(input, roleId, maxResults = 5) {
104
+ await this.ensureInitialized();
105
+ const inputLower = input.toLowerCase();
106
+ const matches = [];
107
+ for (const skill of this.skillsCache.values()) {
108
+ if (!skill.isEnabled)
109
+ continue;
110
+ // Check role assignment if provided
111
+ if (roleId && !skill.assignableRoles.includes(roleId) && skill.assignableRoles.length > 0) {
112
+ continue;
113
+ }
114
+ let score = 0;
115
+ // Check triggers (highest priority)
116
+ for (const trigger of skill.triggers) {
117
+ if (inputLower.includes(trigger.toLowerCase())) {
118
+ score += 10;
119
+ }
120
+ }
121
+ // Check tags
122
+ for (const tag of skill.tags) {
123
+ if (inputLower.includes(tag.toLowerCase())) {
124
+ score += 3;
125
+ }
126
+ }
127
+ // Check name
128
+ if (inputLower.includes(skill.name.toLowerCase())) {
129
+ score += 5;
130
+ }
131
+ // Check description keywords
132
+ const descWords = skill.description.toLowerCase().split(/\s+/);
133
+ for (const word of descWords) {
134
+ if (word.length > 3 && inputLower.includes(word)) {
135
+ score += 1;
136
+ }
137
+ }
138
+ if (score > 0) {
139
+ matches.push({ skill, score });
140
+ }
141
+ }
142
+ // Sort by score descending
143
+ matches.sort((a, b) => b.score - a.score);
144
+ // Get top results with prompt content
145
+ const topMatches = matches.slice(0, maxResults);
146
+ return Promise.all(topMatches.map(async ({ skill }) => ({
147
+ ...skill,
148
+ promptContent: await this.loadPromptContent(skill),
149
+ })));
150
+ }
151
+ /**
152
+ * Create a new user-defined skill
153
+ *
154
+ * @param input - Skill creation input
155
+ * @returns The created skill
156
+ * @throws SkillValidationError if input is invalid
157
+ */
158
+ async createSkill(input) {
159
+ await this.ensureInitialized();
160
+ const errors = validateCreateSkillInput(input);
161
+ if (errors.length > 0) {
162
+ throw new SkillValidationError(errors);
163
+ }
164
+ const skill = createDefaultSkill({ ...input, skillType: input.skillType });
165
+ skill.execution = input.execution;
166
+ skill.environment = input.environment;
167
+ skill.runtime = input.runtime;
168
+ skill.notices = input.notices;
169
+ skill.assignableRoles = input.assignableRoles ?? [];
170
+ skill.triggers = input.triggers ?? [];
171
+ skill.tags = input.tags ?? [];
172
+ await this.saveSkill(skill, input.promptContent);
173
+ this.skillsCache.set(skill.id, skill);
174
+ return skill;
175
+ }
176
+ /**
177
+ * Update an existing skill
178
+ *
179
+ * @param id - Skill identifier
180
+ * @param input - Update input with partial skill data
181
+ * @returns The updated skill
182
+ * @throws SkillNotFoundError if skill doesn't exist
183
+ * @throws BuiltinSkillModificationError if trying to modify a built-in skill
184
+ */
185
+ async updateSkill(id, input) {
186
+ await this.ensureInitialized();
187
+ const existing = this.skillsCache.get(id);
188
+ if (!existing) {
189
+ throw new SkillNotFoundError(id);
190
+ }
191
+ if (existing.isBuiltin) {
192
+ throw new BuiltinSkillModificationError('update');
193
+ }
194
+ const validationErrors = validateUpdateSkillInput(input);
195
+ if (validationErrors.length > 0) {
196
+ throw new SkillValidationError(validationErrors);
197
+ }
198
+ const updated = {
199
+ ...existing,
200
+ name: input.name ?? existing.name,
201
+ description: input.description ?? existing.description,
202
+ category: input.category ?? existing.category,
203
+ skillType: input.skillType ?? existing.skillType,
204
+ execution: input.execution ?? existing.execution,
205
+ environment: input.environment ?? existing.environment,
206
+ runtime: input.runtime ?? existing.runtime,
207
+ notices: input.notices ?? existing.notices,
208
+ assignableRoles: input.assignableRoles ?? existing.assignableRoles,
209
+ triggers: input.triggers ?? existing.triggers,
210
+ tags: input.tags ?? existing.tags,
211
+ isEnabled: input.isEnabled ?? existing.isEnabled,
212
+ updatedAt: new Date().toISOString(),
213
+ };
214
+ await this.saveSkill(updated, input.promptContent);
215
+ this.skillsCache.set(id, updated);
216
+ return updated;
217
+ }
218
+ /**
219
+ * Delete a user-created skill
220
+ *
221
+ * @param id - Skill identifier
222
+ * @throws SkillNotFoundError if skill doesn't exist
223
+ * @throws BuiltinSkillModificationError if trying to delete a built-in skill
224
+ */
225
+ async deleteSkill(id) {
226
+ await this.ensureInitialized();
227
+ const skill = this.skillsCache.get(id);
228
+ if (!skill) {
229
+ throw new SkillNotFoundError(id);
230
+ }
231
+ if (skill.isBuiltin) {
232
+ throw new BuiltinSkillModificationError('delete');
233
+ }
234
+ const skillDir = path.join(this.userSkillsDir, id);
235
+ await fs.rm(skillDir, { recursive: true, force: true });
236
+ this.skillsCache.delete(id);
237
+ }
238
+ /**
239
+ * Enable or disable a skill
240
+ *
241
+ * @param id - Skill identifier
242
+ * @param enabled - Whether to enable or disable
243
+ * @returns The updated skill
244
+ */
245
+ async setSkillEnabled(id, enabled) {
246
+ return this.updateSkill(id, { isEnabled: enabled });
247
+ }
248
+ /**
249
+ * Get skills assigned to a specific role
250
+ *
251
+ * @param roleId - Role identifier
252
+ * @returns Array of skill summaries for the role
253
+ */
254
+ async getSkillsForRole(roleId) {
255
+ return this.listSkills({ roleId, isEnabled: true });
256
+ }
257
+ /**
258
+ * Refresh skills from disk (reload)
259
+ *
260
+ * Clears the cache and reloads all skills from both
261
+ * built-in and user directories.
262
+ */
263
+ async refresh() {
264
+ this.skillsCache.clear();
265
+ this.initialized = false;
266
+ await this.initialize();
267
+ }
268
+ /**
269
+ * Get the count of all skills
270
+ *
271
+ * @returns Total number of skills in cache
272
+ */
273
+ async getSkillCount() {
274
+ await this.ensureInitialized();
275
+ return this.skillsCache.size;
276
+ }
277
+ /**
278
+ * Check if a skill exists
279
+ *
280
+ * @param id - Skill identifier
281
+ * @returns True if skill exists
282
+ */
283
+ async skillExists(id) {
284
+ await this.ensureInitialized();
285
+ return this.skillsCache.has(id);
286
+ }
287
+ // ==========================================================================
288
+ // Private methods
289
+ // ==========================================================================
290
+ /**
291
+ * Ensure the service is initialized before operations
292
+ */
293
+ async ensureInitialized() {
294
+ if (!this.initialized) {
295
+ await this.initialize();
296
+ }
297
+ }
298
+ /**
299
+ * Ensure the user skills directory exists
300
+ */
301
+ async ensureUserSkillsDir() {
302
+ await fs.mkdir(this.userSkillsDir, { recursive: true });
303
+ }
304
+ /**
305
+ * Load all skills from both builtin and user directories
306
+ */
307
+ async loadAllSkills() {
308
+ // Load built-in skills
309
+ try {
310
+ if (existsSync(this.builtinSkillsDir)) {
311
+ const builtinSkills = await this.loadSkillsFromDir(this.builtinSkillsDir, true);
312
+ for (const skill of builtinSkills) {
313
+ this.skillsCache.set(skill.id, skill);
314
+ }
315
+ }
316
+ }
317
+ catch (error) {
318
+ // Log warning but don't fail - built-in skills may not exist yet
319
+ this.logger.warn('Failed to load built-in skills', { error: error instanceof Error ? error.message : String(error) });
320
+ }
321
+ // Load user skills
322
+ try {
323
+ if (existsSync(this.userSkillsDir)) {
324
+ const userSkills = await this.loadSkillsFromDir(this.userSkillsDir, false);
325
+ for (const skill of userSkills) {
326
+ this.skillsCache.set(skill.id, skill);
327
+ }
328
+ }
329
+ }
330
+ catch (error) {
331
+ // Log warning but don't fail - user skills may not exist yet
332
+ this.logger.warn('Failed to load user skills', { error: error instanceof Error ? error.message : String(error) });
333
+ }
334
+ // Load marketplace-installed skills
335
+ try {
336
+ if (existsSync(this.marketplaceSkillsDir)) {
337
+ const marketplaceSkills = await this.loadSkillsFromDir(this.marketplaceSkillsDir, false);
338
+ for (const skill of marketplaceSkills) {
339
+ skill.isMarketplace = true;
340
+ this.skillsCache.set(skill.id, skill);
341
+ }
342
+ }
343
+ }
344
+ catch (error) {
345
+ this.logger.warn('Failed to load marketplace skills', { error: error instanceof Error ? error.message : String(error) });
346
+ }
347
+ }
348
+ /**
349
+ * Check if a directory is a skill directory (has SKILL.md or legacy skill.json).
350
+ *
351
+ * @param dir - Directory path to check
352
+ * @returns True if the directory contains a skill definition
353
+ */
354
+ isSkillDirectory(dir) {
355
+ return existsSync(path.join(dir, 'SKILL.md')) || existsSync(path.join(dir, 'skill.json'));
356
+ }
357
+ /**
358
+ * Load skills from a directory
359
+ *
360
+ * Handles both flat structure (SKILL.md in immediate subdirs)
361
+ * and nested category structure (category/skill/SKILL.md).
362
+ *
363
+ * @param dir - Directory path
364
+ * @param isBuiltin - Whether these are built-in skills
365
+ * @returns Array of loaded skills
366
+ */
367
+ async loadSkillsFromDir(dir, isBuiltin) {
368
+ const skills = [];
369
+ const entries = await fs.readdir(dir, { withFileTypes: true });
370
+ for (const entry of entries) {
371
+ if (!entry.isDirectory())
372
+ continue;
373
+ const subDir = path.join(dir, entry.name);
374
+ if (this.isSkillDirectory(subDir)) {
375
+ const skill = await this.loadSkillFromDir(subDir, isBuiltin);
376
+ if (skill) {
377
+ skills.push(skill);
378
+ }
379
+ }
380
+ else {
381
+ // This might be a category directory, recurse into it
382
+ const nestedSkills = await this.loadNestedSkills(subDir, isBuiltin);
383
+ skills.push(...nestedSkills);
384
+ }
385
+ }
386
+ return skills;
387
+ }
388
+ /**
389
+ * Load skills from nested directories (category/skill structure)
390
+ *
391
+ * @param categoryDir - Category directory path
392
+ * @param isBuiltin - Whether these are built-in skills
393
+ * @returns Array of loaded skills from the category
394
+ */
395
+ async loadNestedSkills(categoryDir, isBuiltin) {
396
+ const skills = [];
397
+ try {
398
+ const entries = await fs.readdir(categoryDir, { withFileTypes: true });
399
+ for (const entry of entries) {
400
+ if (!entry.isDirectory())
401
+ continue;
402
+ const skillDir = path.join(categoryDir, entry.name);
403
+ if (this.isSkillDirectory(skillDir)) {
404
+ const skill = await this.loadSkillFromDir(skillDir, isBuiltin);
405
+ if (skill) {
406
+ skills.push(skill);
407
+ }
408
+ }
409
+ }
410
+ }
411
+ catch (error) {
412
+ this.logger.warn('Failed to load nested skills', { categoryDir, error: error instanceof Error ? error.message : String(error) });
413
+ }
414
+ return skills;
415
+ }
416
+ /**
417
+ * Load a single skill from a directory. Tries SKILL.md first,
418
+ * then falls back to legacy skill.json format.
419
+ *
420
+ * @param skillDir - Directory containing the skill
421
+ * @param isBuiltin - Whether this is a built-in skill
422
+ * @returns Loaded skill or null if loading fails
423
+ */
424
+ async loadSkillFromDir(skillDir, isBuiltin) {
425
+ const skillMdPath = path.join(skillDir, 'SKILL.md');
426
+ if (existsSync(skillMdPath)) {
427
+ return this.loadSkillFromSkillMd(skillDir, skillMdPath, isBuiltin);
428
+ }
429
+ // Legacy fallback: skill.json
430
+ const skillJsonPath = path.join(skillDir, 'skill.json');
431
+ if (existsSync(skillJsonPath)) {
432
+ return this.loadSkillFromLegacyJson(skillDir, skillJsonPath, isBuiltin);
433
+ }
434
+ return null;
435
+ }
436
+ /**
437
+ * Load a skill from SKILL.md format (YAML frontmatter + markdown body).
438
+ *
439
+ * @param skillDir - Directory containing the skill
440
+ * @param skillMdPath - Path to SKILL.md file
441
+ * @param isBuiltin - Whether this is a built-in skill
442
+ * @returns Loaded skill or null if loading fails
443
+ */
444
+ async loadSkillFromSkillMd(skillDir, skillMdPath, isBuiltin) {
445
+ try {
446
+ const content = await fs.readFile(skillMdPath, 'utf-8');
447
+ const { frontmatter, body } = parseSkillMd(content);
448
+ const dirName = path.basename(skillDir);
449
+ const fm = frontmatter;
450
+ // Validate required fields
451
+ if (!fm.name || !fm.description) {
452
+ this.logger.warn('SKILL.md missing required fields (name/description)', { skillDir });
453
+ return null;
454
+ }
455
+ const skill = {
456
+ id: fm.id || `skill-${dirName}`,
457
+ name: fm.name,
458
+ description: fm.description,
459
+ category: (fm.category || 'general'),
460
+ skillType: (fm.skillType || 'claude-skill'),
461
+ promptFile: skillMdPath, // body content is in the SKILL.md itself
462
+ execution: fm.execution,
463
+ environment: fm.environment,
464
+ credentials: fm.credentials,
465
+ runtime: fm.runtime,
466
+ notices: fm.notices,
467
+ assignableRoles: fm.assignableRoles || [],
468
+ triggers: fm.triggers || [],
469
+ tags: fm.tags || [],
470
+ version: fm.version || '1.0.0',
471
+ requiredTier: fm.requiredTier,
472
+ fallbackSkill: fm.fallbackSkill,
473
+ isBuiltin,
474
+ isEnabled: true,
475
+ createdAt: fm.createdAt || new Date().toISOString(),
476
+ updatedAt: fm.updatedAt || new Date().toISOString(),
477
+ };
478
+ return skill;
479
+ }
480
+ catch (error) {
481
+ this.logger.warn('Failed to load skill from SKILL.md', { skillDir, error: error instanceof Error ? error.message : String(error) });
482
+ return null;
483
+ }
484
+ }
485
+ /**
486
+ * Load a single skill from a legacy skill.json file.
487
+ *
488
+ * @param skillDir - Directory containing the skill
489
+ * @param skillJsonPath - Path to skill.json file
490
+ * @param isBuiltin - Whether this is a built-in skill
491
+ * @returns Loaded skill or null if loading fails
492
+ */
493
+ async loadSkillFromLegacyJson(skillDir, skillJsonPath, isBuiltin) {
494
+ try {
495
+ const content = await fs.readFile(skillJsonPath, 'utf-8');
496
+ const data = JSON.parse(content);
497
+ const skill = {
498
+ ...data,
499
+ isBuiltin,
500
+ isEnabled: true,
501
+ promptFile: path.join(skillDir, data.promptFile || 'instructions.md'),
502
+ };
503
+ return skill;
504
+ }
505
+ catch (error) {
506
+ this.logger.warn('Failed to load skill', { skillDir, error: error instanceof Error ? error.message : String(error) });
507
+ return null;
508
+ }
509
+ }
510
+ /**
511
+ * Load prompt content for a skill.
512
+ *
513
+ * For SKILL.md format, extracts the markdown body (after frontmatter).
514
+ * For legacy format, reads the separate instructions.md file.
515
+ *
516
+ * @param skill - Skill to load prompt for
517
+ * @returns Prompt content string
518
+ */
519
+ async loadPromptContent(skill) {
520
+ try {
521
+ const content = await fs.readFile(skill.promptFile, 'utf-8');
522
+ // If promptFile points to a SKILL.md, extract just the body
523
+ if (skill.promptFile.endsWith('SKILL.md')) {
524
+ const { body } = parseSkillMd(content);
525
+ return body;
526
+ }
527
+ return content;
528
+ }
529
+ catch (error) {
530
+ this.logger.warn('Failed to load prompt for skill', { skillId: skill.id, error: error instanceof Error ? error.message : String(error) });
531
+ return '';
532
+ }
533
+ }
534
+ /**
535
+ * Save a skill to disk in SKILL.md format (YAML frontmatter + markdown body).
536
+ *
537
+ * @param skill - Skill to save
538
+ * @param promptContent - Optional prompt content (markdown body)
539
+ */
540
+ async saveSkill(skill, promptContent) {
541
+ // Lazy import to avoid circular dependency issues at module load time
542
+ const { stringify: stringifyYAML } = await import('yaml');
543
+ const skillDir = path.join(this.userSkillsDir, skill.id);
544
+ await fs.mkdir(skillDir, { recursive: true });
545
+ // Build frontmatter object (id included for reload identity)
546
+ const frontmatter = {
547
+ id: skill.id,
548
+ name: skill.name,
549
+ description: skill.description,
550
+ version: skill.version,
551
+ category: skill.category,
552
+ skillType: skill.skillType,
553
+ };
554
+ if (skill.assignableRoles?.length)
555
+ frontmatter.assignableRoles = skill.assignableRoles;
556
+ if (skill.triggers?.length)
557
+ frontmatter.triggers = skill.triggers;
558
+ if (skill.tags?.length)
559
+ frontmatter.tags = skill.tags;
560
+ if (skill.execution)
561
+ frontmatter.execution = skill.execution;
562
+ if (skill.environment)
563
+ frontmatter.environment = skill.environment;
564
+ if (skill.runtime)
565
+ frontmatter.runtime = skill.runtime;
566
+ if (skill.notices?.length)
567
+ frontmatter.notices = skill.notices;
568
+ if (skill.requiredTier)
569
+ frontmatter.requiredTier = skill.requiredTier;
570
+ if (skill.fallbackSkill)
571
+ frontmatter.fallbackSkill = skill.fallbackSkill;
572
+ const yamlStr = stringifyYAML(frontmatter).trim();
573
+ const body = promptContent || '';
574
+ const skillMdContent = `---\n${yamlStr}\n---\n\n${body}\n`;
575
+ const skillMdPath = path.join(skillDir, 'SKILL.md');
576
+ await fs.writeFile(skillMdPath, skillMdContent);
577
+ // Update skill's prompt file path
578
+ skill.promptFile = skillMdPath;
579
+ }
580
+ }
581
+ // =============================================================================
582
+ // Error Classes
583
+ // =============================================================================
584
+ /**
585
+ * Error thrown when a skill is not found
586
+ */
587
+ export class SkillNotFoundError extends Error {
588
+ skillId;
589
+ /**
590
+ * Create a SkillNotFoundError
591
+ *
592
+ * @param id - ID of the skill that was not found
593
+ */
594
+ constructor(skillId) {
595
+ super(`Skill not found: ${skillId}`);
596
+ this.skillId = skillId;
597
+ this.name = 'SkillNotFoundError';
598
+ }
599
+ }
600
+ /**
601
+ * Error thrown when skill validation fails
602
+ */
603
+ export class SkillValidationError extends Error {
604
+ errors;
605
+ /**
606
+ * Create a SkillValidationError
607
+ *
608
+ * @param errors - Array of validation error messages
609
+ */
610
+ constructor(errors) {
611
+ super(`Skill validation failed: ${errors.join(', ')}`);
612
+ this.errors = errors;
613
+ this.name = 'SkillValidationError';
614
+ }
615
+ }
616
+ /**
617
+ * Error thrown when attempting to modify a built-in skill
618
+ */
619
+ export class BuiltinSkillModificationError extends Error {
620
+ action;
621
+ /**
622
+ * Create a BuiltinSkillModificationError
623
+ *
624
+ * @param action - The action that was attempted (e.g., 'update', 'delete')
625
+ */
626
+ constructor(action) {
627
+ super(`Cannot ${action} a built-in skill`);
628
+ this.action = action;
629
+ this.name = 'BuiltinSkillModificationError';
630
+ }
631
+ }
632
+ // =============================================================================
633
+ // Singleton Instance
634
+ // =============================================================================
635
+ let skillServiceInstance = null;
636
+ /**
637
+ * Get the singleton SkillService instance
638
+ *
639
+ * @returns The shared SkillService instance
640
+ */
641
+ export function getSkillService() {
642
+ if (!skillServiceInstance) {
643
+ skillServiceInstance = new SkillService();
644
+ }
645
+ return skillServiceInstance;
646
+ }
647
+ /**
648
+ * Reset the singleton SkillService instance
649
+ *
650
+ * Used primarily for testing to ensure a clean state.
651
+ */
652
+ export function resetSkillService() {
653
+ skillServiceInstance = null;
654
+ }
655
+ //# sourceMappingURL=skill.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/skill/skill.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAQL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAgB9D;;;;;;;;;GASG;AACH,MAAM,OAAO,YAAY;IACN,gBAAgB,CAAS;IACzB,aAAa,CAAS;IACtB,oBAAoB,CAAS;IACtC,WAAW,GAAuB,IAAI,GAAG,EAAE,CAAC;IAC5C,WAAW,GAAG,KAAK,CAAC;IACX,MAAM,GAAoB,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAE7G;;;;OAIG;IACH,YAAY,OAA6B;QACvC,IAAI,CAAC,gBAAgB;YACnB,OAAO,EAAE,gBAAgB,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5E,IAAI,CAAC,aAAa;YAChB,OAAO,EAAE,aAAa;gBACtB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,SAAS,EAAE,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAClF,IAAI,CAAC,oBAAoB;YACvB,OAAO,EAAE,oBAAoB;gBAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC3E,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACjC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,MAAoB;QACnC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QAEnD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC1D,OAAO,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,CAAC;IACrC,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,MAAe,EAAE,UAAU,GAAG,CAAC;QAC9D,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,OAAO,GAAsC,EAAE,CAAC;QAEtD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,SAAS;gBAAE,SAAS;YAE/B,oCAAoC;YACpC,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1F,SAAS;YACX,CAAC;YAED,IAAI,KAAK,GAAG,CAAC,CAAC;YAEd,oCAAoC;YACpC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACrC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;oBAC/C,KAAK,IAAI,EAAE,CAAC;gBACd,CAAC;YACH,CAAC;YAED,aAAa;YACb,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;oBAC3C,KAAK,IAAI,CAAC,CAAC;gBACb,CAAC;YACH,CAAC;YAED,aAAa;YACb,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAClD,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;YAED,6BAA6B;YAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/D,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjD,KAAK,IAAI,CAAC,CAAC;gBACb,CAAC;YACH,CAAC;YAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAE1C,sCAAsC;QACtC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAChD,OAAO,OAAO,CAAC,GAAG,CAChB,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACnC,GAAG,KAAK;YACR,aAAa,EAAE,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;SACnD,CAAC,CAAC,CACJ,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,CAAC,KAAuB;QACvC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3E,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAClC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACtC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC;QACpD,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAE9B,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAEtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU,EAAE,KAAuB;QACnD,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,OAAO,GAAU;YACrB,GAAG,QAAQ;YACX,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;YACjC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW;YACtD,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ;YAC7C,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS;YAChD,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS;YAChD,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW;YACtD,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;YAC1C,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;YAC1C,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,QAAQ,CAAC,eAAe;YAClE,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ;YAC7C,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;YACjC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS;YAChD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAElC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,eAAe,CAAC,EAAU,EAAE,OAAgB;QAChD,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,gBAAgB,CAAC,MAAc;QACnC,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,6EAA6E;IAC7E,kBAAkB;IAClB,6EAA6E;IAE7E;;OAEG;IACK,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB;QAC/B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QACzB,uBAAuB;QACvB,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACtC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;gBAChF,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;oBAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iEAAiE;YACjE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxH,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBACnC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;gBAC3E,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;oBAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,6DAA6D;YAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpH,CAAC;QAED,oCAAoC;QACpC,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBAC1C,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;gBACzF,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;oBACtC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;oBAC3B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3H,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,gBAAgB,CAAC,GAAW;QAClC,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,iBAAiB,CAAC,GAAW,EAAE,SAAkB;QAC7D,MAAM,MAAM,GAAY,EAAE,CAAC;QAE3B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YAEnC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE1C,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC7D,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,sDAAsD;gBACtD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACpE,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,SAAkB;QACpE,MAAM,MAAM,GAAY,EAAE,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAEvE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBAAE,SAAS;gBAEnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEpD,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;oBAC/D,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACrB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnI,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,gBAAgB,CAC5B,QAAgB,EAChB,SAAkB;QAElB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEpD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACrE,CAAC;QAED,8BAA8B;QAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,oBAAoB,CAChC,QAAgB,EAChB,WAAmB,EACnB,SAAkB;QAElB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YAEpD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,EAAE,GAAG,WAAsC,CAAC;YAElD,2BAA2B;YAC3B,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qDAAqD,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACtF,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,KAAK,GAAU;gBACnB,EAAE,EAAG,EAAE,CAAC,EAAa,IAAI,SAAS,OAAO,EAAE;gBAC3C,IAAI,EAAE,EAAE,CAAC,IAAc;gBACvB,WAAW,EAAE,EAAE,CAAC,WAAqB;gBACrC,QAAQ,EAAE,CAAE,EAAE,CAAC,QAAmB,IAAI,SAAS,CAAsB;gBACrE,SAAS,EAAE,CAAE,EAAE,CAAC,SAAoB,IAAI,cAAc,CAAuB;gBAC7E,UAAU,EAAE,WAAW,EAAE,yCAAyC;gBAClE,SAAS,EAAE,EAAE,CAAC,SAA+B;gBAC7C,WAAW,EAAE,EAAE,CAAC,WAAmC;gBACnD,WAAW,EAAE,EAAE,CAAC,WAAmC;gBACnD,OAAO,EAAE,EAAE,CAAC,OAA2B;gBACvC,OAAO,EAAE,EAAE,CAAC,OAA2B;gBACvC,eAAe,EAAG,EAAE,CAAC,eAA4B,IAAI,EAAE;gBACvD,QAAQ,EAAG,EAAE,CAAC,QAAqB,IAAI,EAAE;gBACzC,IAAI,EAAG,EAAE,CAAC,IAAiB,IAAI,EAAE;gBACjC,OAAO,EAAG,EAAE,CAAC,OAAkB,IAAI,OAAO;gBAC1C,YAAY,EAAE,EAAE,CAAC,YAAkC;gBACnD,aAAa,EAAE,EAAE,CAAC,aAAmC;gBACrD,SAAS;gBACT,SAAS,EAAE,IAAI;gBACf,SAAS,EAAG,EAAE,CAAC,SAAoB,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC/D,SAAS,EAAG,EAAE,CAAC,SAAoB,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAChE,CAAC;YAEF,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpI,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,uBAAuB,CACnC,QAAgB,EAChB,aAAqB,EACrB,SAAkB;QAElB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAuB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAErD,MAAM,KAAK,GAAU;gBACnB,GAAG,IAAI;gBACP,SAAS;gBACT,SAAS,EAAE,IAAI;gBACf,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,IAAI,iBAAiB,CAAC;aACtE,CAAC;YAEF,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACtH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,iBAAiB,CAAC,KAAY;QAC1C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAE7D,4DAA4D;YAC5D,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1I,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,SAAS,CAAC,KAAY,EAAE,aAAsB;QAC1D,sEAAsE;QACtE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QAE1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,6DAA6D;QAC7D,MAAM,WAAW,GAA4B;YAC3C,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC;QAEF,IAAI,KAAK,CAAC,eAAe,EAAE,MAAM;YAAE,WAAW,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;QACvF,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM;YAAE,WAAW,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAClE,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM;YAAE,WAAW,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACtD,IAAI,KAAK,CAAC,SAAS;YAAE,WAAW,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAC7D,IAAI,KAAK,CAAC,WAAW;YAAE,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACnE,IAAI,KAAK,CAAC,OAAO;YAAE,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QACvD,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM;YAAE,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/D,IAAI,KAAK,CAAC,YAAY;YAAE,WAAW,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACtE,IAAI,KAAK,CAAC,aAAa;YAAE,WAAW,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QAEzE,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,aAAa,IAAI,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,QAAQ,OAAO,YAAY,IAAI,IAAI,CAAC;QAE3D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAEhD,kCAAkC;QAClC,KAAK,CAAC,UAAU,GAAG,WAAW,CAAC;IACjC,CAAC;CACF;AAED,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAMf;IAL5B;;;;OAIG;IACH,YAA4B,OAAe;QACzC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QADX,YAAO,GAAP,OAAO,CAAQ;QAEzC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAMjB;IAL5B;;;;OAIG;IACH,YAA4B,MAAgB;QAC1C,KAAK,CAAC,4BAA4B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAD7B,WAAM,GAAN,MAAM,CAAU;QAE1C,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IAM1B;IAL5B;;;;OAIG;IACH,YAA4B,MAAc;QACxC,KAAK,CAAC,UAAU,MAAM,mBAAmB,CAAC,CAAC;QADjB,WAAM,GAAN,MAAM,CAAQ;QAExC,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC9C,CAAC;CACF;AAED,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF,IAAI,oBAAoB,GAAwB,IAAI,CAAC;AAErD;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,oBAAoB,GAAG,IAAI,YAAY,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,oBAAoB,GAAG,IAAI,CAAC;AAC9B,CAAC"}