@sowonai/crewx-cli 0.8.0-rc.5 → 0.8.0-rc.9

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.
@@ -0,0 +1,584 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var SkillService_1;
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.SkillService = void 0;
47
+ const common_1 = require("@nestjs/common");
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const crewx_sdk_1 = require("@sowonai/crewx-sdk");
51
+ const child_process_1 = require("child_process");
52
+ let SkillService = SkillService_1 = class SkillService {
53
+ constructor() {
54
+ this.logger = new common_1.Logger(SkillService_1.name);
55
+ this.crewxDir = path.join(process.cwd(), '.crewx');
56
+ this.installedSkillsDir = path.join(this.crewxDir, 'skills');
57
+ this.registryPath = path.join(this.crewxDir, 'registry.json');
58
+ this.skillsDirs = [
59
+ path.join(process.cwd(), 'skills'),
60
+ this.installedSkillsDir
61
+ ];
62
+ }
63
+ loadRegistry() {
64
+ try {
65
+ if (fs.existsSync(this.registryPath)) {
66
+ const content = fs.readFileSync(this.registryPath, 'utf-8');
67
+ return JSON.parse(content);
68
+ }
69
+ }
70
+ catch (e) {
71
+ this.logger.warn(`Failed to load registry: ${e}`);
72
+ }
73
+ return { skills: {} };
74
+ }
75
+ saveRegistry(registry) {
76
+ this.ensureCrewxDir();
77
+ fs.writeFileSync(this.registryPath, JSON.stringify(registry, null, 2));
78
+ }
79
+ ensureCrewxDir() {
80
+ if (!fs.existsSync(this.crewxDir)) {
81
+ fs.mkdirSync(this.crewxDir, { recursive: true });
82
+ }
83
+ }
84
+ ensureInstalledSkillsDir() {
85
+ this.ensureCrewxDir();
86
+ if (!fs.existsSync(this.installedSkillsDir)) {
87
+ fs.mkdirSync(this.installedSkillsDir, { recursive: true });
88
+ }
89
+ }
90
+ parseSource(source) {
91
+ if (source.startsWith('npm:')) {
92
+ return { type: 'npm', package: source.slice(4) };
93
+ }
94
+ if (source.startsWith('template:')) {
95
+ return { type: 'template', name: source.slice(9) };
96
+ }
97
+ if (source.startsWith('github:')) {
98
+ const rest = source.slice(7);
99
+ const atIndex = rest.lastIndexOf('@');
100
+ if (atIndex > 0 && !rest.slice(0, atIndex).includes('/')) {
101
+ return null;
102
+ }
103
+ if (atIndex > 0) {
104
+ return { type: 'github', repo: rest.slice(0, atIndex), version: rest.slice(atIndex + 1) };
105
+ }
106
+ return { type: 'github', repo: rest };
107
+ }
108
+ return null;
109
+ }
110
+ async discover() {
111
+ const skills = [];
112
+ for (const dirPath of this.skillsDirs) {
113
+ if (!fs.existsSync(dirPath))
114
+ continue;
115
+ try {
116
+ const dirs = fs.readdirSync(dirPath, { withFileTypes: true })
117
+ .filter(d => d.isDirectory());
118
+ for (const dir of dirs) {
119
+ const skillPath = path.join(dirPath, dir.name);
120
+ const skillMdPath = path.join(skillPath, 'SKILL.md');
121
+ if (fs.existsSync(skillMdPath)) {
122
+ try {
123
+ const manifest = (0, crewx_sdk_1.parseSkillManifestFromFile)(skillMdPath, {
124
+ loadContent: false,
125
+ validationMode: 'lenient'
126
+ });
127
+ const entryPoint = this.detectEntryPoint(skillPath, dir.name);
128
+ if (entryPoint) {
129
+ skills.push({
130
+ name: manifest.metadata.name || dir.name,
131
+ description: manifest.metadata.description || '',
132
+ version: manifest.metadata.version || '0.0.0',
133
+ entryPoint,
134
+ path: skillPath,
135
+ });
136
+ }
137
+ }
138
+ catch (e) {
139
+ this.logger.debug(`Failed to parse SKILL.md in ${skillPath}: ${e}`);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ catch (e) {
145
+ this.logger.warn(`Failed to read skills directory ${dirPath}: ${e}`);
146
+ }
147
+ }
148
+ return skills;
149
+ }
150
+ async getSkill(name) {
151
+ const skills = await this.discover();
152
+ return skills.find(s => s.name === name) || null;
153
+ }
154
+ detectEntryPoint(skillPath, skillName) {
155
+ const candidates = [
156
+ `${skillName}.js`,
157
+ `${skillName}.sh`,
158
+ `${skillName}.py`,
159
+ 'index.js',
160
+ 'main.js',
161
+ ];
162
+ for (const candidate of candidates) {
163
+ const fullPath = path.join(skillPath, candidate);
164
+ if (fs.existsSync(fullPath)) {
165
+ return candidate;
166
+ }
167
+ }
168
+ return null;
169
+ }
170
+ async execute(name, args) {
171
+ const skill = await this.getSkill(name);
172
+ if (!skill) {
173
+ throw new Error(`Skill '${name}' not found`);
174
+ }
175
+ const entryPath = path.join(skill.path, skill.entryPoint);
176
+ return new Promise((resolve, reject) => {
177
+ let command;
178
+ let cmdArgs;
179
+ if (skill.entryPoint.endsWith('.js')) {
180
+ command = 'node';
181
+ cmdArgs = [entryPath, ...args];
182
+ }
183
+ else if (skill.entryPoint.endsWith('.sh')) {
184
+ command = 'sh';
185
+ cmdArgs = [entryPath, ...args];
186
+ }
187
+ else if (skill.entryPoint.endsWith('.py')) {
188
+ command = 'python3';
189
+ cmdArgs = [entryPath, ...args];
190
+ }
191
+ else {
192
+ reject(new Error(`Unsupported entry point: ${skill.entryPoint}`));
193
+ return;
194
+ }
195
+ const child = (0, child_process_1.spawn)(command, cmdArgs, {
196
+ cwd: skill.path,
197
+ stdio: 'inherit'
198
+ });
199
+ child.on('close', (code) => {
200
+ resolve({ code: code || 0, output: '' });
201
+ });
202
+ child.on('error', (err) => {
203
+ reject(err);
204
+ });
205
+ });
206
+ }
207
+ async add(sourceStr) {
208
+ const source = this.parseSource(sourceStr);
209
+ if (!source) {
210
+ return {
211
+ success: false,
212
+ name: '',
213
+ message: `Invalid source format: ${sourceStr}. Use npm:<package>, template:<name>, or github:<owner/repo>`
214
+ };
215
+ }
216
+ switch (source.type) {
217
+ case 'npm':
218
+ return this.addFromNpm(source.package);
219
+ case 'template':
220
+ return this.addFromTemplate(source.name);
221
+ case 'github':
222
+ return {
223
+ success: false,
224
+ name: '',
225
+ message: 'GitHub source is planned for Phase 1.5 (v0.8.1+). Use npm: or template: for now.'
226
+ };
227
+ default:
228
+ return { success: false, name: '', message: `Unknown source type` };
229
+ }
230
+ }
231
+ validatePackageName(packageName) {
232
+ if (packageName.startsWith('-')) {
233
+ return false;
234
+ }
235
+ const validNpmPackagePattern = /^(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*(@[a-z0-9-._~]+)?$/i;
236
+ return validNpmPackagePattern.test(packageName);
237
+ }
238
+ async addFromNpm(packageName) {
239
+ this.ensureInstalledSkillsDir();
240
+ if (!this.validatePackageName(packageName)) {
241
+ return {
242
+ success: false,
243
+ name: '',
244
+ message: `Invalid package name: ${packageName}. Package name contains invalid characters.`
245
+ };
246
+ }
247
+ try {
248
+ const tempDir = path.join(this.crewxDir, '.tmp-install');
249
+ if (fs.existsSync(tempDir)) {
250
+ fs.rmSync(tempDir, { recursive: true });
251
+ }
252
+ fs.mkdirSync(tempDir, { recursive: true });
253
+ fs.writeFileSync(path.join(tempDir, 'package.json'), JSON.stringify({ name: 'temp', private: true }));
254
+ this.logger.log(`Installing ${packageName} from npm...`);
255
+ (0, child_process_1.execSync)(`npm install ${packageName} --prefix "${tempDir}"`, {
256
+ stdio: 'inherit'
257
+ });
258
+ const nodeModulesPath = path.join(tempDir, 'node_modules');
259
+ const installedPkgPath = this.findInstalledPackage(nodeModulesPath, packageName);
260
+ if (!installedPkgPath) {
261
+ fs.rmSync(tempDir, { recursive: true });
262
+ return { success: false, name: '', message: `Failed to locate installed package: ${packageName}` };
263
+ }
264
+ const skillMdPath = path.join(installedPkgPath, 'SKILL.md');
265
+ if (!fs.existsSync(skillMdPath)) {
266
+ fs.rmSync(tempDir, { recursive: true });
267
+ return { success: false, name: '', message: `Package ${packageName} does not contain a SKILL.md file` };
268
+ }
269
+ const manifest = (0, crewx_sdk_1.parseSkillManifestFromFile)(skillMdPath, {
270
+ loadContent: false,
271
+ validationMode: 'lenient'
272
+ });
273
+ const skillName = manifest.metadata.name || path.basename(installedPkgPath);
274
+ const skillVersion = manifest.metadata.version || '0.0.0';
275
+ const customSkillPath = path.join(process.cwd(), 'skills', skillName);
276
+ if (fs.existsSync(customSkillPath)) {
277
+ fs.rmSync(tempDir, { recursive: true });
278
+ return {
279
+ success: false,
280
+ name: skillName,
281
+ message: `Skill '${skillName}' already exists in skills/ directory (custom skills take priority)`
282
+ };
283
+ }
284
+ const targetPath = path.join(this.installedSkillsDir, skillName);
285
+ if (fs.existsSync(targetPath)) {
286
+ fs.rmSync(targetPath, { recursive: true });
287
+ }
288
+ this.copyDir(installedPkgPath, targetPath);
289
+ fs.rmSync(tempDir, { recursive: true });
290
+ const registry = this.loadRegistry();
291
+ registry.skills[skillName] = {
292
+ source: 'npm',
293
+ package: packageName,
294
+ version: skillVersion,
295
+ installed: new Date().toISOString()
296
+ };
297
+ this.saveRegistry(registry);
298
+ return {
299
+ success: true,
300
+ name: skillName,
301
+ message: `Successfully installed ${skillName}@${skillVersion} from npm:${packageName}`
302
+ };
303
+ }
304
+ catch (e) {
305
+ return { success: false, name: '', message: `Failed to install from npm: ${e}` };
306
+ }
307
+ }
308
+ findInstalledPackage(nodeModulesPath, packageName) {
309
+ if (packageName.startsWith('@')) {
310
+ const parts = packageName.split('/');
311
+ const scope = parts[0];
312
+ const name = parts[1];
313
+ if (scope && name) {
314
+ const scopedPath = path.join(nodeModulesPath, scope, name);
315
+ if (fs.existsSync(scopedPath)) {
316
+ return scopedPath;
317
+ }
318
+ }
319
+ }
320
+ else {
321
+ const directPath = path.join(nodeModulesPath, packageName);
322
+ if (fs.existsSync(directPath)) {
323
+ return directPath;
324
+ }
325
+ }
326
+ return null;
327
+ }
328
+ copyDir(src, dest) {
329
+ fs.mkdirSync(dest, { recursive: true });
330
+ const entries = fs.readdirSync(src, { withFileTypes: true });
331
+ for (const entry of entries) {
332
+ const srcPath = path.join(src, entry.name);
333
+ const destPath = path.join(dest, entry.name);
334
+ if (entry.isDirectory()) {
335
+ if (entry.name === 'node_modules')
336
+ continue;
337
+ this.copyDir(srcPath, destPath);
338
+ }
339
+ else {
340
+ fs.copyFileSync(srcPath, destPath);
341
+ }
342
+ }
343
+ }
344
+ async addFromTemplate(templateName) {
345
+ this.ensureInstalledSkillsDir();
346
+ const builtInTemplates = {
347
+ hello: {
348
+ description: 'Simple greeting demo skill',
349
+ files: {
350
+ 'SKILL.md': `---
351
+ name: {{name}}
352
+ description: A simple greeting skill
353
+ version: 0.0.1
354
+ ---
355
+
356
+ # {{name}} Skill
357
+
358
+ A simple greeting skill created from template.
359
+
360
+ ## Usage
361
+ \`\`\`bash
362
+ node skills/{{name}}/{{name}}.js [name]
363
+ \`\`\`
364
+ `,
365
+ '{{name}}.js': `#!/usr/bin/env node
366
+
367
+ const args = process.argv.slice(2);
368
+
369
+ if (args.includes('--help') || args.includes('-h')) {
370
+ console.log('Usage: node {{name}}.js [name]');
371
+ process.exit(0);
372
+ }
373
+
374
+ const name = args[0] || 'World';
375
+ console.log(\`Hello, \${name}! (from {{name}} skill)\`);
376
+ `
377
+ }
378
+ },
379
+ memory: {
380
+ description: 'Key-value memory storage skill',
381
+ files: {
382
+ 'SKILL.md': `---
383
+ name: {{name}}
384
+ description: Simple key-value memory storage
385
+ version: 0.0.1
386
+ ---
387
+
388
+ # {{name}} Skill
389
+
390
+ A simple key-value memory storage skill.
391
+
392
+ ## Commands
393
+ - \`save <key> <value>\` - Save a value
394
+ - \`load <key>\` - Load a value
395
+ - \`list\` - List all keys
396
+ - \`delete <key>\` - Delete a key
397
+ `,
398
+ '{{name}}.js': `#!/usr/bin/env node
399
+
400
+ const fs = require('fs');
401
+ const path = require('path');
402
+
403
+ const dataFile = path.join(__dirname, 'data.json');
404
+
405
+ function loadData() {
406
+ try {
407
+ return JSON.parse(fs.readFileSync(dataFile, 'utf-8'));
408
+ } catch {
409
+ return {};
410
+ }
411
+ }
412
+
413
+ function saveData(data) {
414
+ fs.writeFileSync(dataFile, JSON.stringify(data, null, 2));
415
+ }
416
+
417
+ const [command, ...args] = process.argv.slice(2);
418
+
419
+ switch (command) {
420
+ case 'save':
421
+ const data = loadData();
422
+ data[args[0]] = args.slice(1).join(' ');
423
+ saveData(data);
424
+ console.log(\`Saved: \${args[0]}\`);
425
+ break;
426
+ case 'load':
427
+ const stored = loadData();
428
+ console.log(stored[args[0]] || '(not found)');
429
+ break;
430
+ case 'list':
431
+ console.log(Object.keys(loadData()).join('\\n') || '(empty)');
432
+ break;
433
+ case 'delete':
434
+ const d = loadData();
435
+ delete d[args[0]];
436
+ saveData(d);
437
+ console.log(\`Deleted: \${args[0]}\`);
438
+ break;
439
+ default:
440
+ console.log('Usage: {{name}}.js <save|load|list|delete> [args]');
441
+ }
442
+ `
443
+ }
444
+ },
445
+ api: {
446
+ description: 'HTTP API client skill',
447
+ files: {
448
+ 'SKILL.md': `---
449
+ name: {{name}}
450
+ description: HTTP API client skill
451
+ version: 0.0.1
452
+ ---
453
+
454
+ # {{name}} Skill
455
+
456
+ An HTTP API client skill for making REST requests.
457
+
458
+ ## Commands
459
+ - \`get <url>\` - GET request
460
+ - \`post <url> <data>\` - POST request with JSON data
461
+ `,
462
+ '{{name}}.js': `#!/usr/bin/env node
463
+
464
+ const https = require('https');
465
+ const http = require('http');
466
+
467
+ const [method, url, ...rest] = process.argv.slice(2);
468
+
469
+ if (!method || !url) {
470
+ console.log('Usage: {{name}}.js <get|post> <url> [data]');
471
+ process.exit(1);
472
+ }
473
+
474
+ const client = url.startsWith('https') ? https : http;
475
+
476
+ const req = client.request(url, { method: method.toUpperCase() }, (res) => {
477
+ let data = '';
478
+ res.on('data', chunk => data += chunk);
479
+ res.on('end', () => console.log(data));
480
+ });
481
+
482
+ if (method.toLowerCase() === 'post' && rest.length) {
483
+ req.setHeader('Content-Type', 'application/json');
484
+ req.write(rest.join(' '));
485
+ }
486
+
487
+ req.end();
488
+ `
489
+ }
490
+ }
491
+ };
492
+ const template = builtInTemplates[templateName];
493
+ if (!template) {
494
+ const available = Object.keys(builtInTemplates).join(', ');
495
+ return {
496
+ success: false,
497
+ name: '',
498
+ message: `Template '${templateName}' not found. Available: ${available}`
499
+ };
500
+ }
501
+ let skillName = templateName;
502
+ let counter = 1;
503
+ while (fs.existsSync(path.join(this.installedSkillsDir, skillName)) ||
504
+ fs.existsSync(path.join(process.cwd(), 'skills', skillName))) {
505
+ skillName = `${templateName}-${counter}`;
506
+ counter++;
507
+ }
508
+ const targetPath = path.join(this.installedSkillsDir, skillName);
509
+ fs.mkdirSync(targetPath, { recursive: true });
510
+ for (const [fileNameTemplate, contentTemplate] of Object.entries(template.files)) {
511
+ const fileName = fileNameTemplate.replace(/\{\{name\}\}/g, skillName);
512
+ const content = contentTemplate.replace(/\{\{name\}\}/g, skillName);
513
+ const filePath = path.join(targetPath, fileName);
514
+ fs.writeFileSync(filePath, content);
515
+ if (fileName.endsWith('.js')) {
516
+ fs.chmodSync(filePath, '755');
517
+ }
518
+ }
519
+ const registry = this.loadRegistry();
520
+ registry.skills[skillName] = {
521
+ source: 'template',
522
+ template: templateName,
523
+ version: '0.0.1',
524
+ installed: new Date().toISOString()
525
+ };
526
+ this.saveRegistry(registry);
527
+ return {
528
+ success: true,
529
+ name: skillName,
530
+ message: `Successfully created skill '${skillName}' from template '${templateName}' at .crewx/skills/${skillName}/`
531
+ };
532
+ }
533
+ validateSkillName(name) {
534
+ if (name === '.' || name === '..') {
535
+ return false;
536
+ }
537
+ if (name.includes('/') || name.includes('\\') || name.includes('..')) {
538
+ return false;
539
+ }
540
+ const validSkillNamePattern = /^[a-z0-9-._~]+$/i;
541
+ return validSkillNamePattern.test(name);
542
+ }
543
+ async remove(name) {
544
+ if (!this.validateSkillName(name)) {
545
+ return {
546
+ success: false,
547
+ message: `Invalid skill name: '${name}'. Skill name cannot contain path separators (/, \\, ..).`
548
+ };
549
+ }
550
+ const installedPath = path.join(this.installedSkillsDir, name);
551
+ const registry = this.loadRegistry();
552
+ if (!fs.existsSync(installedPath)) {
553
+ const customPath = path.join(process.cwd(), 'skills', name);
554
+ if (fs.existsSync(customPath)) {
555
+ return {
556
+ success: false,
557
+ message: `'${name}' is a custom skill in skills/ directory. Remove it manually if intended.`
558
+ };
559
+ }
560
+ return { success: false, message: `Skill '${name}' not found in installed skills.` };
561
+ }
562
+ try {
563
+ fs.rmSync(installedPath, { recursive: true });
564
+ delete registry.skills[name];
565
+ this.saveRegistry(registry);
566
+ return { success: true, message: `Successfully removed skill '${name}'` };
567
+ }
568
+ catch (e) {
569
+ return { success: false, message: `Failed to remove skill '${name}': ${e}` };
570
+ }
571
+ }
572
+ getRegistry() {
573
+ return this.loadRegistry();
574
+ }
575
+ getAvailableTemplates() {
576
+ return ['hello', 'memory', 'api'];
577
+ }
578
+ };
579
+ exports.SkillService = SkillService;
580
+ exports.SkillService = SkillService = SkillService_1 = __decorate([
581
+ (0, common_1.Injectable)(),
582
+ __metadata("design:paramtypes", [])
583
+ ], SkillService);
584
+ //# sourceMappingURL=skill.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.service.js","sourceRoot":"","sources":["../../src/services/skill.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,uCAAyB;AACzB,2CAA6B;AAC7B,kDAAgE;AAChE,iDAAgD;AA6BzC,IAAM,YAAY,oBAAlB,MAAM,YAAY;IAOvB;QANiB,WAAM,GAAG,IAAI,eAAM,CAAC,cAAY,CAAC,IAAI,CAAC,CAAC;QAOtD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAG9D,IAAI,CAAC,UAAU,GAAG;YAChB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC;YAClC,IAAI,CAAC,kBAAkB;SACxB,CAAC;IACJ,CAAC;IAMO,YAAY;QAClB,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACxB,CAAC;IAEO,YAAY,CAAC,QAAuB;QAC1C,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAEO,wBAAwB;QAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC5C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAMD,WAAW,CAAC,MAAc;QAExB,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAEzD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC;YAC5F,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,GAAoB,EAAE,CAAC;QAEnC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,SAAS;YAEtC,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;qBACxD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBAElC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACrB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;oBAErD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wBAC7B,IAAI,CAAC;4BAED,MAAM,QAAQ,GAAG,IAAA,sCAA0B,EAAC,WAAW,EAAE;gCACrD,WAAW,EAAE,KAAK;gCAClB,cAAc,EAAE,SAAS;6BAC5B,CAAC,CAAC;4BAEH,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;4BAE9D,IAAI,UAAU,EAAE,CAAC;gCACb,MAAM,CAAC,IAAI,CAAC;oCACR,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI;oCACxC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE;oCAChD,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,IAAI,OAAO;oCAC7C,UAAU;oCACV,IAAI,EAAE,SAAS;iCAClB,CAAC,CAAC;4BACP,CAAC;wBACL,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACT,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,SAAS,KAAK,CAAC,EAAE,CAAC,CAAC;wBACxE,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC;YACzE,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC;IACnD,CAAC;IAEO,gBAAgB,CAAC,SAAiB,EAAE,SAAiB;QAC3D,MAAM,UAAU,GAAG;YACjB,GAAG,SAAS,KAAK;YACjB,GAAG,SAAS,KAAK;YACjB,GAAG,SAAS,KAAK;YACjB,UAAU;YACV,SAAS;SACV,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACjD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,IAAc;QACxC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAE1D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,IAAI,OAAe,CAAC;YACpB,IAAI,OAAiB,CAAC;YAEtB,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO,GAAG,MAAM,CAAC;gBACjB,OAAO,GAAG,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;YACnC,CAAC;iBAAM,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1C,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,GAAG,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;YACnC,CAAC;iBAAM,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1C,OAAO,GAAG,SAAS,CAAC;gBACpB,OAAO,GAAG,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACH,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAClE,OAAO;YACZ,CAAC;YAED,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,OAAO,EAAE,OAAO,EAAE;gBAClC,GAAG,EAAE,KAAK,CAAC,IAAI;gBACf,KAAK,EAAE,SAAS;aACnB,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACvB,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACtB,MAAM,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC;IAMD,KAAK,CAAC,GAAG,CAAC,SAAiB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,0BAA0B,SAAS,8DAA8D;aAC3G,CAAC;QACJ,CAAC;QAED,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,KAAK;gBACR,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzC,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3C,KAAK,QAAQ;gBACX,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,EAAE;oBACR,OAAO,EAAE,kFAAkF;iBAC5F,CAAC;YACJ;gBACE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC;QACxE,CAAC;IACH,CAAC;IAOO,mBAAmB,CAAC,WAAmB;QAE7C,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QAKD,MAAM,sBAAsB,GAAG,0EAA0E,CAAC;QAC1G,OAAO,sBAAsB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,WAAmB;QAC1C,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAGhC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,yBAAyB,WAAW,6CAA6C;aAC3F,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YAEH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YACzD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,CAAC;YACD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAG3C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAGtG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,WAAW,cAAc,CAAC,CAAC;YACzD,IAAA,wBAAQ,EAAC,eAAe,WAAW,cAAc,OAAO,GAAG,EAAE;gBAC3D,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;YAGH,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YAC3D,MAAM,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;YAEjF,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,uCAAuC,WAAW,EAAE,EAAE,CAAC;YACrG,CAAC;YAGD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;YAC5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,WAAW,mCAAmC,EAAE,CAAC;YAC1G,CAAC;YAGD,MAAM,QAAQ,GAAG,IAAA,sCAA0B,EAAC,WAAW,EAAE;gBACvD,WAAW,EAAE,KAAK;gBAClB,cAAc,EAAE,SAAS;aAC1B,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YAC5E,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC;YAG1D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YACtE,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,UAAU,SAAS,qEAAqE;iBAClG,CAAC;YACJ,CAAC;YAGD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;YACjE,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAE9B,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;YAGD,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;YAG3C,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAGxC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG;gBAC3B,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,YAAY;gBACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YACF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAE5B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,0BAA0B,SAAS,IAAI,YAAY,aAAa,WAAW,EAAE;aACvF,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,+BAA+B,CAAC,EAAE,EAAE,CAAC;QACnF,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,eAAuB,EAAE,WAAmB;QAEvE,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;gBAClB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC3D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,OAAO,UAAU,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;YAC3D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,OAAO,UAAU,CAAC;YACpB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,OAAO,CAAC,GAAW,EAAE,IAAY;QACvC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAExB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;oBAAE,SAAS;gBAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,YAAoB;QAChD,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAGhC,MAAM,gBAAgB,GAA2E;YAC/F,KAAK,EAAE;gBACL,WAAW,EAAE,4BAA4B;gBACzC,KAAK,EAAE;oBACL,UAAU,EAAE;;;;;;;;;;;;;;CAcrB;oBACS,aAAa,EAAE;;;;;;;;;;;CAWxB;iBACQ;aACF;YACD,MAAM,EAAE;gBACN,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE;oBACL,UAAU,EAAE;;;;;;;;;;;;;;;CAerB;oBACS,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CxB;iBACQ;aACF;YACD,GAAG,EAAE;gBACH,WAAW,EAAE,uBAAuB;gBACpC,KAAK,EAAE;oBACL,UAAU,EAAE;;;;;;;;;;;;;CAarB;oBACS,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BxB;iBACQ;aACF;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,aAAa,YAAY,2BAA2B,SAAS,EAAE;aACzE,CAAC;QACJ,CAAC;QAGD,IAAI,SAAS,GAAG,YAAY,CAAC;QAC7B,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;YAC5D,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;YACpE,SAAS,GAAG,GAAG,YAAY,IAAI,OAAO,EAAE,CAAC;YACzC,OAAO,EAAE,CAAC;QACZ,CAAC;QAGD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QACjE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAG9C,KAAK,MAAM,CAAC,gBAAgB,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACjF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;YACtE,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;YACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACjD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAGpC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAGD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACrC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG;YAC3B,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,YAAY;YACtB,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAE5B,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,+BAA+B,SAAS,oBAAoB,YAAY,sBAAsB,SAAS,GAAG;SACpH,CAAC;IACJ,CAAC;IAWO,iBAAiB,CAAC,IAAY;QAEpC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC;QACf,CAAC;QAGD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;QACjD,OAAO,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QAEvB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,wBAAwB,IAAI,2DAA2D;aACjG,CAAC;QACJ,CAAC;QAGD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAErC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAElC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,IAAI,IAAI,2EAA2E;iBAC7F,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,IAAI,kCAAkC,EAAE,CAAC;QACvF,CAAC;QAED,IAAI,CAAC;YAEH,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAG9C,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAE5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,+BAA+B,IAAI,GAAG,EAAE,CAAC;QAC5E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,2BAA2B,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QAC/E,CAAC;IACH,CAAC;IAMD,WAAW;QACT,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAED,qBAAqB;QACnB,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;CACF,CAAA;AA/oBY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;;GACA,YAAY,CA+oBxB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const skill_service_1 = require("./skill.service");
5
+ const getService = () => {
6
+ return new skill_service_1.SkillService();
7
+ };
8
+ (0, vitest_1.describe)('SkillService Security', () => {
9
+ (0, vitest_1.describe)('validatePackageName', () => {
10
+ (0, vitest_1.it)('should reject package names starting with hyphen', () => {
11
+ const service = getService();
12
+ (0, vitest_1.expect)(service.validatePackageName('-g')).toBe(false);
13
+ (0, vitest_1.expect)(service.validatePackageName('--unsafe')).toBe(false);
14
+ });
15
+ (0, vitest_1.it)('should accept valid package names', () => {
16
+ const service = getService();
17
+ (0, vitest_1.expect)(service.validatePackageName('safe-package')).toBe(true);
18
+ (0, vitest_1.expect)(service.validatePackageName('pkg-1')).toBe(true);
19
+ (0, vitest_1.expect)(service.validatePackageName('@scope/package')).toBe(true);
20
+ });
21
+ });
22
+ (0, vitest_1.describe)('validateSkillName', () => {
23
+ (0, vitest_1.it)('should reject dangerous path components', () => {
24
+ const service = getService();
25
+ (0, vitest_1.expect)(service.validateSkillName('.')).toBe(false);
26
+ (0, vitest_1.expect)(service.validateSkillName('..')).toBe(false);
27
+ });
28
+ (0, vitest_1.it)('should accept valid skill names', () => {
29
+ const service = getService();
30
+ (0, vitest_1.expect)(service.validateSkillName('my-skill')).toBe(true);
31
+ (0, vitest_1.expect)(service.validateSkillName('skill_123')).toBe(true);
32
+ });
33
+ });
34
+ });
35
+ //# sourceMappingURL=skill.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.service.spec.js","sourceRoot":"","sources":["../../src/services/skill.service.spec.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,mDAA+C;AAG/C,MAAM,UAAU,GAAG,GAAG,EAAE;IACpB,OAAO,IAAI,4BAAY,EAAS,CAAC;AACrC,CAAC,CAAC;AAEF,IAAA,iBAAQ,EAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAA,iBAAQ,EAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,IAAA,WAAE,EAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAE7B,IAAA,eAAM,EAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtD,IAAA,eAAM,EAAC,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,IAAA,eAAM,EAAC,OAAO,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/D,IAAA,eAAM,EAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,IAAA,eAAM,EAAC,OAAO,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAE7B,IAAA,eAAM,EAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnD,IAAA,eAAM,EAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,IAAA,eAAM,EAAC,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,IAAA,eAAM,EAAC,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -25,4 +25,8 @@ export declare class SlackMessageFormatter extends BaseMessageFormatter {
25
25
  formatSimpleMessage(message: string, emoji?: string): (Block | KnownBlock)[];
26
26
  private validateBlockCount;
27
27
  private splitIntoSections;
28
+ private forceSplitLongLine;
29
+ private findBestBreakPoint;
30
+ private ensureMaxLength;
31
+ private truncateAtMrkdwnLevel;
28
32
  }