@vibe-agent-toolkit/cli 0.1.0 → 0.1.1

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 (37) hide show
  1. package/README.md +67 -4
  2. package/dist/bin.js +15 -12
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/agent/index.d.ts.map +1 -1
  5. package/dist/commands/agent/index.js +0 -37
  6. package/dist/commands/agent/index.js.map +1 -1
  7. package/dist/commands/audit/cache-detector.d.ts +32 -0
  8. package/dist/commands/audit/cache-detector.d.ts.map +1 -0
  9. package/dist/commands/audit/cache-detector.js +68 -0
  10. package/dist/commands/audit/cache-detector.js.map +1 -0
  11. package/dist/commands/audit/hierarchical-output.d.ts +41 -0
  12. package/dist/commands/audit/hierarchical-output.d.ts.map +1 -0
  13. package/dist/commands/audit/hierarchical-output.js +267 -0
  14. package/dist/commands/audit/hierarchical-output.js.map +1 -0
  15. package/dist/commands/audit.d.ts +18 -0
  16. package/dist/commands/audit.d.ts.map +1 -0
  17. package/dist/commands/audit.js +386 -0
  18. package/dist/commands/audit.js.map +1 -0
  19. package/dist/commands/doctor.d.ts +106 -0
  20. package/dist/commands/doctor.d.ts.map +1 -0
  21. package/dist/commands/doctor.js +499 -0
  22. package/dist/commands/doctor.js.map +1 -0
  23. package/dist/commands/resources/scan.d.ts.map +1 -1
  24. package/dist/commands/resources/scan.js +8 -0
  25. package/dist/commands/resources/scan.js.map +1 -1
  26. package/dist/utils/config-loader.d.ts +6 -0
  27. package/dist/utils/config-loader.d.ts.map +1 -1
  28. package/dist/utils/config-loader.js +18 -0
  29. package/dist/utils/config-loader.js.map +1 -1
  30. package/docs/audit.md +446 -0
  31. package/docs/doctor.md +268 -0
  32. package/docs/index.md +32 -0
  33. package/package.json +11 -8
  34. package/dist/commands/agent/audit.d.ts +0 -9
  35. package/dist/commands/agent/audit.d.ts.map +0 -1
  36. package/dist/commands/agent/audit.js +0 -139
  37. package/dist/commands/agent/audit.js.map +0 -1
package/docs/index.md CHANGED
@@ -79,6 +79,38 @@ vat resources scan docs/ # Scan specific directory
79
79
 
80
80
  ---
81
81
 
82
+ ### `doctor`
83
+
84
+ Diagnose vat setup and environment health
85
+
86
+ **What it does:**
87
+
88
+ - Checks Node.js version (>=20 required)
89
+ - Checks Git installation and repository
90
+ - Validates configuration file exists and is valid
91
+ - Checks vat version and available updates
92
+ - Verifies CLI build status (in VAT source tree)
93
+
94
+ **When to use:** Before starting development, after updates, or debugging issues
95
+
96
+ **Exit codes:**
97
+
98
+ - `0` - All checks passed
99
+ - `1` - One or more checks failed
100
+
101
+ **Creates/modifies:** None (read-only diagnostics)
102
+
103
+ **Examples:**
104
+
105
+ ```bash
106
+ vat doctor # Run diagnostic checks
107
+ vat doctor --verbose # Show all checks (including passing)
108
+ ```
109
+
110
+ **More details:** `vat doctor --help` or see `packages/cli/docs/doctor.md`
111
+
112
+ ---
113
+
82
114
  ### `agent build`
83
115
 
84
116
  Build agent for deployment to target runtime
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibe-agent-toolkit/cli",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Command-line interface for vibe-agent-toolkit",
5
5
  "type": "module",
6
6
  "bin": {
@@ -40,21 +40,24 @@
40
40
  "license": "MIT",
41
41
  "dependencies": {
42
42
  "@anthropic-ai/sdk": "^0.71.2",
43
- "@vibe-agent-toolkit/agent-config": "0.1.0",
44
- "@vibe-agent-toolkit/discovery": "0.1.0",
45
- "@vibe-agent-toolkit/rag": "0.1.0",
46
- "@vibe-agent-toolkit/rag-lancedb": "0.1.0",
47
- "@vibe-agent-toolkit/resources": "0.1.0",
48
- "@vibe-agent-toolkit/runtime-claude-skills": "0.1.0",
49
- "@vibe-agent-toolkit/utils": "0.1.0",
43
+ "@vibe-agent-toolkit/agent-config": "0.1.1",
44
+ "@vibe-agent-toolkit/discovery": "0.1.1",
45
+ "@vibe-agent-toolkit/rag": "0.1.1",
46
+ "@vibe-agent-toolkit/rag-lancedb": "0.1.1",
47
+ "@vibe-agent-toolkit/resources": "0.1.1",
48
+ "@vibe-agent-toolkit/runtime-claude-skills": "0.1.1",
49
+ "@vibe-agent-toolkit/utils": "0.1.1",
50
50
  "commander": "^12.1.0",
51
51
  "js-yaml": "^4.1.0",
52
+ "semver": "^7.7.3",
52
53
  "zod": "^3.24.1"
53
54
  },
54
55
  "devDependencies": {
55
56
  "@types/js-yaml": "^4.0.9",
56
57
  "@types/node": "^22.10.5",
58
+ "@types/semver": "^7.7.1",
57
59
  "rimraf": "^6.0.1",
60
+ "tar": "^7.5.2",
58
61
  "typescript": "^5.7.3",
59
62
  "vitest": "^2.1.8"
60
63
  },
@@ -1,9 +0,0 @@
1
- /**
2
- * Agent audit command - audits Claude Skills for quality and compatibility
3
- */
4
- export interface AuditCommandOptions {
5
- debug?: boolean;
6
- recursive?: boolean;
7
- }
8
- export declare function auditCommand(targetPath: string | undefined, options: AuditCommandOptions): Promise<void>;
9
- //# sourceMappingURL=audit.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/commands/agent/audit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -1,139 +0,0 @@
1
- /**
2
- * Agent audit command - audits Claude Skills for quality and compatibility
3
- */
4
- import * as path from 'node:path';
5
- import { detectFormat } from '@vibe-agent-toolkit/discovery';
6
- import { validateSkill } from '@vibe-agent-toolkit/runtime-claude-skills';
7
- import { handleCommandError } from '../../utils/command-error.js';
8
- import { createLogger } from '../../utils/logger.js';
9
- import { writeYamlOutput } from '../../utils/output.js';
10
- export async function auditCommand(targetPath, options) {
11
- const logger = createLogger(options.debug ? { debug: true } : {});
12
- const startTime = Date.now();
13
- try {
14
- const scanPath = targetPath ? path.resolve(targetPath) : process.cwd();
15
- logger.debug(`Auditing Claude Skills at: ${scanPath}`);
16
- // Get validation results
17
- const results = await getValidationResults(scanPath, options.recursive ?? false, logger);
18
- // Calculate and output summary
19
- const summary = calculateSummary(results, startTime);
20
- writeYamlOutput(summary);
21
- // Log human-readable output and exit
22
- handleAuditResults(results, summary, logger);
23
- }
24
- catch (error) {
25
- handleCommandError(error, logger, startTime, 'AgentAudit');
26
- }
27
- }
28
- async function getValidationResults(scanPath, recursive, logger) {
29
- const format = detectFormat(scanPath);
30
- if (format === 'claude-skill') {
31
- logger.debug('Detected single Claude Skill');
32
- const result = await validateSkill({ skillPath: scanPath });
33
- return [result];
34
- }
35
- if (format === 'vat-agent') {
36
- const skillPath = path.join(scanPath, 'SKILL.md');
37
- logger.debug('Detected VAT agent, validating SKILL.md');
38
- const result = await validateSkill({ skillPath, isVATGenerated: true });
39
- return [result];
40
- }
41
- logger.debug('Scanning directory for Claude Skills');
42
- return scanDirectory(scanPath, recursive, logger);
43
- }
44
- function calculateSummary(results, startTime) {
45
- const successCount = results.filter((r) => r.status === 'success').length;
46
- const warningCount = results.filter((r) => r.status === 'warning').length;
47
- const errorCount = results.filter((r) => r.status === 'error').length;
48
- const totalErrors = results.reduce((sum, r) => sum + r.issues.filter(i => i.severity === 'error').length, 0);
49
- const totalWarnings = results.reduce((sum, r) => sum + r.issues.filter(i => i.severity === 'warning').length, 0);
50
- const totalInfo = results.reduce((sum, r) => sum + r.issues.filter(i => i.severity === 'info').length, 0);
51
- let status;
52
- if (errorCount > 0) {
53
- status = 'error';
54
- }
55
- else if (warningCount > 0) {
56
- status = 'warning';
57
- }
58
- else {
59
- status = 'success';
60
- }
61
- return {
62
- status,
63
- summary: {
64
- filesScanned: results.length,
65
- success: successCount,
66
- warnings: warningCount,
67
- errors: errorCount,
68
- },
69
- issues: {
70
- errors: totalErrors,
71
- warnings: totalWarnings,
72
- info: totalInfo,
73
- },
74
- files: results,
75
- duration: `${Date.now() - startTime}ms`,
76
- };
77
- }
78
- function handleAuditResults(results, summary, logger) {
79
- const { errors: errorCount, warnings: warningCount, success: successCount } = summary.summary;
80
- if (errorCount > 0) {
81
- logErrors(results, errorCount, logger);
82
- process.exit(1);
83
- }
84
- if (warningCount > 0) {
85
- logWarnings(results, warningCount, logger);
86
- }
87
- else {
88
- logger.info(`Audit successful: ${successCount} file(s) passed`);
89
- }
90
- process.exit(0);
91
- }
92
- function logErrors(results, errorCount, logger) {
93
- logger.error(`Audit failed: ${errorCount} file(s) with errors`);
94
- const errorResults = results.filter((r) => r.status === 'error');
95
- for (const result of errorResults) {
96
- logger.error(`\n${result.path}:`);
97
- const errorIssues = result.issues.filter((i) => i.severity === 'error');
98
- logIssues(errorIssues, logger.error.bind(logger));
99
- }
100
- }
101
- function logWarnings(results, warningCount, logger) {
102
- logger.info(`Audit passed with warnings: ${warningCount} file(s)`);
103
- const warningResults = results.filter((r) => r.status === 'warning');
104
- for (const result of warningResults) {
105
- logger.info(`\n${result.path}:`);
106
- const warningIssues = result.issues.filter((i) => i.severity === 'warning');
107
- logIssues(warningIssues, logger.info.bind(logger));
108
- }
109
- }
110
- function logIssues(issues, logFn) {
111
- for (const issue of issues) {
112
- logFn(` [${issue.code}] ${issue.message}`);
113
- if (issue.location) {
114
- logFn(` at: ${issue.location}`);
115
- }
116
- if (issue.fix) {
117
- logFn(` fix: ${issue.fix}`);
118
- }
119
- }
120
- }
121
- async function scanDirectory(dirPath, recursive, logger) {
122
- const fs = await import('node:fs/promises');
123
- const results = [];
124
- const entries = await fs.readdir(dirPath, { withFileTypes: true });
125
- for (const entry of entries) {
126
- const fullPath = path.join(dirPath, entry.name);
127
- if (entry.isFile() && entry.name === 'SKILL.md') {
128
- logger.debug(`Validating: ${fullPath}`);
129
- const result = await validateSkill({ skillPath: fullPath });
130
- results.push(result);
131
- }
132
- else if (entry.isDirectory() && recursive) {
133
- const subResults = await scanDirectory(fullPath, recursive, logger);
134
- results.push(...subResults);
135
- }
136
- }
137
- return results;
138
- }
139
- //# sourceMappingURL=audit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/commands/agent/audit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAyB,MAAM,2CAA2C,CAAC;AAEjG,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAOxD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAA8B,EAC9B,OAA4B;IAE5B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;QAEvD,yBAAyB;QACzB,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,EAAE,MAAM,CAAC,CAAC;QAEzF,+BAA+B;QAC/B,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,eAAe,CAAC,OAAO,CAAC,CAAC;QAEzB,qCAAqC;QACrC,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,QAAgB,EAChB,SAAkB,EAClB,MAAuC;IAEvC,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEtC,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,OAAO,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACrD,OAAO,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA2B,EAAE,SAAiB;IACtE,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAC5F,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAC5F,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAExF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,CAAmB,EAAE,EAAE,CACtE,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAC7D,CAAC;IACF,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,CAAmB,EAAE,EAAE,CACxE,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,CAC/D,CAAC;IACF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,CAAmB,EAAE,EAAE,CACpE,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAC5D,CAAC;IAEF,IAAI,MAAc,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,GAAG,OAAO,CAAC;IACnB,CAAC;SAAM,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO,EAAE;YACP,YAAY,EAAE,OAAO,CAAC,MAAM;YAC5B,OAAO,EAAE,YAAY;YACrB,QAAQ,EAAE,YAAY;YACtB,MAAM,EAAE,UAAU;SACnB;QACD,MAAM,EAAE;YACN,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,aAAa;YACvB,IAAI,EAAE,SAAS;SAChB;QACD,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI;KACxC,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,OAA2B,EAC3B,OAA2E,EAC3E,MAAuC;IAEvC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAE9F,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,qBAAqB,YAAY,iBAAiB,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,SAAS,CAChB,OAA2B,EAC3B,UAAkB,EAClB,MAAuC;IAEvC,MAAM,CAAC,KAAK,CAAC,iBAAiB,UAAU,sBAAsB,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IAEnF,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAuB,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QAC9F,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAClB,OAA2B,EAC3B,YAAoB,EACpB,MAAuC;IAEvC,MAAM,CAAC,IAAI,CAAC,+BAA+B,YAAY,UAAU,CAAC,CAAC;IACnE,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAEvF,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QACjC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAuB,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;QAClG,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAChB,MAAiF,EACjF,KAAgC;IAEhC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,KAAK,CAAC,WAAW,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YACd,KAAK,CAAC,YAAY,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,OAAe,EACf,SAAkB,EAClB,MAAuC;IAEvC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,SAAS,EAAE,CAAC;YAC5C,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}