monty-autonomous-fullstack-dev-multillm 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +81 -0
- package/README.md +608 -0
- package/bin/cli.js +448 -0
- package/dist/agents/coding.d.ts +15 -0
- package/dist/agents/coding.d.ts.map +1 -0
- package/dist/agents/coding.js +189 -0
- package/dist/agents/coding.js.map +1 -0
- package/dist/agents/initializer.d.ts +15 -0
- package/dist/agents/initializer.d.ts.map +1 -0
- package/dist/agents/initializer.js +87 -0
- package/dist/agents/initializer.js.map +1 -0
- package/dist/agents/prompts/arbitrator.md +143 -0
- package/dist/agents/prompts/coding.md +247 -0
- package/dist/agents/prompts/initializer.md +98 -0
- package/dist/config/agent-config.d.ts +103 -0
- package/dist/config/agent-config.d.ts.map +1 -0
- package/dist/config/agent-config.js +138 -0
- package/dist/config/agent-config.js.map +1 -0
- package/dist/config/auth-config.d.ts +152 -0
- package/dist/config/auth-config.d.ts.map +1 -0
- package/dist/config/auth-config.js +139 -0
- package/dist/config/auth-config.js.map +1 -0
- package/dist/config/mcp-config.d.ts +109 -0
- package/dist/config/mcp-config.d.ts.map +1 -0
- package/dist/config/mcp-config.js +234 -0
- package/dist/config/mcp-config.js.map +1 -0
- package/dist/config/provider-config.d.ts +139 -0
- package/dist/config/provider-config.d.ts.map +1 -0
- package/dist/config/provider-config.js +344 -0
- package/dist/config/provider-config.js.map +1 -0
- package/dist/config/subagents-config.d.ts +85 -0
- package/dist/config/subagents-config.d.ts.map +1 -0
- package/dist/config/subagents-config.js +430 -0
- package/dist/config/subagents-config.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +385 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/arbitrator.d.ts +93 -0
- package/dist/orchestrator/arbitrator.d.ts.map +1 -0
- package/dist/orchestrator/arbitrator.js +330 -0
- package/dist/orchestrator/arbitrator.js.map +1 -0
- package/dist/orchestrator/index.d.ts +113 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +217 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/review-coordinator.d.ts +143 -0
- package/dist/orchestrator/review-coordinator.d.ts.map +1 -0
- package/dist/orchestrator/review-coordinator.js +401 -0
- package/dist/orchestrator/review-coordinator.js.map +1 -0
- package/dist/orchestrator/task-classifier.d.ts +87 -0
- package/dist/orchestrator/task-classifier.d.ts.map +1 -0
- package/dist/orchestrator/task-classifier.js +250 -0
- package/dist/orchestrator/task-classifier.js.map +1 -0
- package/dist/providers/anthropic-provider.d.ts +64 -0
- package/dist/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/providers/anthropic-provider.js +264 -0
- package/dist/providers/anthropic-provider.js.map +1 -0
- package/dist/providers/base-provider.d.ts +219 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +143 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/cursor-provider.d.ts +82 -0
- package/dist/providers/cursor-provider.d.ts.map +1 -0
- package/dist/providers/cursor-provider.js +321 -0
- package/dist/providers/cursor-provider.js.map +1 -0
- package/dist/providers/google-provider.d.ts +75 -0
- package/dist/providers/google-provider.d.ts.map +1 -0
- package/dist/providers/google-provider.js +274 -0
- package/dist/providers/google-provider.js.map +1 -0
- package/dist/providers/index.d.ts +92 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +233 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-provider.d.ts +83 -0
- package/dist/providers/openai-provider.d.ts.map +1 -0
- package/dist/providers/openai-provider.js +295 -0
- package/dist/providers/openai-provider.js.map +1 -0
- package/dist/templates/feature_list.template.json +66 -0
- package/dist/templates/progress.template.txt +51 -0
- package/dist/utils/auth-manager.d.ts +121 -0
- package/dist/utils/auth-manager.d.ts.map +1 -0
- package/dist/utils/auth-manager.js +560 -0
- package/dist/utils/auth-manager.js.map +1 -0
- package/dist/utils/budget-enforcer.d.ts +181 -0
- package/dist/utils/budget-enforcer.d.ts.map +1 -0
- package/dist/utils/budget-enforcer.js +386 -0
- package/dist/utils/budget-enforcer.js.map +1 -0
- package/dist/utils/chatgpt-detector.d.ts +51 -0
- package/dist/utils/chatgpt-detector.d.ts.map +1 -0
- package/dist/utils/chatgpt-detector.js +274 -0
- package/dist/utils/chatgpt-detector.js.map +1 -0
- package/dist/utils/claude-code-detector.d.ts +39 -0
- package/dist/utils/claude-code-detector.d.ts.map +1 -0
- package/dist/utils/claude-code-detector.js +153 -0
- package/dist/utils/claude-code-detector.js.map +1 -0
- package/dist/utils/code-quality.d.ts +58 -0
- package/dist/utils/code-quality.d.ts.map +1 -0
- package/dist/utils/code-quality.js +258 -0
- package/dist/utils/code-quality.js.map +1 -0
- package/dist/utils/context-primer.d.ts +50 -0
- package/dist/utils/context-primer.d.ts.map +1 -0
- package/dist/utils/context-primer.js +429 -0
- package/dist/utils/context-primer.js.map +1 -0
- package/dist/utils/dependency-management.d.ts +40 -0
- package/dist/utils/dependency-management.d.ts.map +1 -0
- package/dist/utils/dependency-management.js +123 -0
- package/dist/utils/dependency-management.js.map +1 -0
- package/dist/utils/environment-validation.d.ts +33 -0
- package/dist/utils/environment-validation.d.ts.map +1 -0
- package/dist/utils/environment-validation.js +136 -0
- package/dist/utils/environment-validation.js.map +1 -0
- package/dist/utils/error-recovery.d.ts +60 -0
- package/dist/utils/error-recovery.d.ts.map +1 -0
- package/dist/utils/error-recovery.js +183 -0
- package/dist/utils/error-recovery.js.map +1 -0
- package/dist/utils/feature-list.d.ts +102 -0
- package/dist/utils/feature-list.d.ts.map +1 -0
- package/dist/utils/feature-list.js +191 -0
- package/dist/utils/feature-list.js.map +1 -0
- package/dist/utils/gemini-detector.d.ts +65 -0
- package/dist/utils/gemini-detector.d.ts.map +1 -0
- package/dist/utils/gemini-detector.js +340 -0
- package/dist/utils/gemini-detector.js.map +1 -0
- package/dist/utils/git-utils.d.ts +48 -0
- package/dist/utils/git-utils.d.ts.map +1 -0
- package/dist/utils/git-utils.js +110 -0
- package/dist/utils/git-utils.js.map +1 -0
- package/dist/utils/health-check.d.ts +32 -0
- package/dist/utils/health-check.d.ts.map +1 -0
- package/dist/utils/health-check.js +152 -0
- package/dist/utils/health-check.js.map +1 -0
- package/dist/utils/hooks-manager.d.ts +154 -0
- package/dist/utils/hooks-manager.d.ts.map +1 -0
- package/dist/utils/hooks-manager.js +359 -0
- package/dist/utils/hooks-manager.js.map +1 -0
- package/dist/utils/multi-auth-manager.d.ts +144 -0
- package/dist/utils/multi-auth-manager.d.ts.map +1 -0
- package/dist/utils/multi-auth-manager.js +588 -0
- package/dist/utils/multi-auth-manager.js.map +1 -0
- package/dist/utils/progress.d.ts +49 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +209 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/project-detection.d.ts +40 -0
- package/dist/utils/project-detection.d.ts.map +1 -0
- package/dist/utils/project-detection.js +230 -0
- package/dist/utils/project-detection.js.map +1 -0
- package/dist/utils/session-manager.d.ts +119 -0
- package/dist/utils/session-manager.d.ts.map +1 -0
- package/dist/utils/session-manager.js +389 -0
- package/dist/utils/session-manager.js.map +1 -0
- package/dist/utils/skills-manager.d.ts +113 -0
- package/dist/utils/skills-manager.d.ts.map +1 -0
- package/dist/utils/skills-manager.js +332 -0
- package/dist/utils/skills-manager.js.map +1 -0
- package/dist/utils/structured-output.d.ts +117 -0
- package/dist/utils/structured-output.d.ts.map +1 -0
- package/dist/utils/structured-output.js +191 -0
- package/dist/utils/structured-output.js.map +1 -0
- package/dist/utils/subagent-manager.d.ts +143 -0
- package/dist/utils/subagent-manager.d.ts.map +1 -0
- package/dist/utils/subagent-manager.js +326 -0
- package/dist/utils/subagent-manager.js.map +1 -0
- package/dist/utils/supabase-setup.d.ts +50 -0
- package/dist/utils/supabase-setup.d.ts.map +1 -0
- package/dist/utils/supabase-setup.js +151 -0
- package/dist/utils/supabase-setup.js.map +1 -0
- package/dist/utils/token-refresh.d.ts +21 -0
- package/dist/utils/token-refresh.d.ts.map +1 -0
- package/dist/utils/token-refresh.js +77 -0
- package/dist/utils/token-refresh.js.map +1 -0
- package/dist/utils/tos-warning.d.ts +115 -0
- package/dist/utils/tos-warning.d.ts.map +1 -0
- package/dist/utils/tos-warning.js +304 -0
- package/dist/utils/tos-warning.js.map +1 -0
- package/dist/utils/usage-monitor.d.ts +156 -0
- package/dist/utils/usage-monitor.d.ts.map +1 -0
- package/dist/utils/usage-monitor.js +296 -0
- package/dist/utils/usage-monitor.js.map +1 -0
- package/package.json +105 -0
- package/scripts/init.ps1 +73 -0
- package/scripts/init.sh +86 -0
- package/scripts/test-auth.sh +90 -0
- package/templates/feature_list.template.json +66 -0
- package/templates/progress.template.txt +51 -0
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills Manager
|
|
3
|
+
* Implements skill loading and management for the Claude Agent SDK.
|
|
4
|
+
* Skills are specialized SKILL.md files that extend agent capabilities.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 Dobeu Tech Solutions LLC
|
|
7
|
+
* Licensed under CC BY-NC 4.0
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
|
|
10
|
+
import { join, basename, dirname, relative } from 'path';
|
|
11
|
+
import { homedir } from 'os';
|
|
12
|
+
/**
|
|
13
|
+
* Skill search paths
|
|
14
|
+
*/
|
|
15
|
+
export const SKILL_SEARCH_PATHS = [
|
|
16
|
+
// Workspace skills (highest priority)
|
|
17
|
+
'.claude/skills',
|
|
18
|
+
'.cursor/skills',
|
|
19
|
+
'.codex/skills',
|
|
20
|
+
// User-level skills
|
|
21
|
+
join(homedir(), '.claude', 'skills'),
|
|
22
|
+
join(homedir(), '.codex', 'skills'),
|
|
23
|
+
// System skills (from package)
|
|
24
|
+
join(dirname(__dirname), 'skills'),
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* Parse YAML frontmatter from SKILL.md content
|
|
28
|
+
*/
|
|
29
|
+
export function parseSkillFrontmatter(content) {
|
|
30
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
31
|
+
if (!frontmatterMatch) {
|
|
32
|
+
// Return default metadata if no frontmatter
|
|
33
|
+
return {
|
|
34
|
+
name: 'Unnamed Skill',
|
|
35
|
+
description: 'No description provided',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const frontmatter = frontmatterMatch[1];
|
|
39
|
+
const metadata = {
|
|
40
|
+
name: 'Unnamed Skill',
|
|
41
|
+
description: 'No description provided',
|
|
42
|
+
};
|
|
43
|
+
// Simple YAML-like parsing (for basic key: value pairs)
|
|
44
|
+
if (!frontmatter)
|
|
45
|
+
return metadata;
|
|
46
|
+
const lines = frontmatter.split('\n');
|
|
47
|
+
for (const line of lines) {
|
|
48
|
+
const match = line.match(/^(\w+):\s*(.+)$/);
|
|
49
|
+
if (match) {
|
|
50
|
+
const [, key, value] = match;
|
|
51
|
+
if (!key || !value)
|
|
52
|
+
continue;
|
|
53
|
+
switch (key.toLowerCase()) {
|
|
54
|
+
case 'name':
|
|
55
|
+
metadata.name = value.replace(/^["']|["']$/g, '');
|
|
56
|
+
break;
|
|
57
|
+
case 'description':
|
|
58
|
+
metadata.description = value.replace(/^["']|["']$/g, '');
|
|
59
|
+
break;
|
|
60
|
+
case 'category':
|
|
61
|
+
metadata.category = value.replace(/^["']|["']$/g, '');
|
|
62
|
+
break;
|
|
63
|
+
case 'version':
|
|
64
|
+
metadata.version = value.replace(/^["']|["']$/g, '');
|
|
65
|
+
break;
|
|
66
|
+
case 'author':
|
|
67
|
+
metadata.author = value.replace(/^["']|["']$/g, '');
|
|
68
|
+
break;
|
|
69
|
+
case 'priority':
|
|
70
|
+
const priorityValue = parseInt(value, 10);
|
|
71
|
+
if (!isNaN(priorityValue)) {
|
|
72
|
+
metadata.priority = priorityValue;
|
|
73
|
+
}
|
|
74
|
+
break;
|
|
75
|
+
case 'triggers':
|
|
76
|
+
// Handle array format: triggers: ["trigger1", "trigger2"]
|
|
77
|
+
const triggersMatch = value.match(/\[(.*)\]/);
|
|
78
|
+
if (triggersMatch && triggersMatch[1]) {
|
|
79
|
+
metadata.triggers = triggersMatch[1]
|
|
80
|
+
.split(',')
|
|
81
|
+
.map(t => t.trim().replace(/^["']|["']$/g, ''));
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return metadata;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get skill content without frontmatter
|
|
91
|
+
*/
|
|
92
|
+
export function getSkillContent(content) {
|
|
93
|
+
return content.replace(/^---\n[\s\S]*?\n---\n*/, '').trim();
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Load a single skill from a path
|
|
97
|
+
*/
|
|
98
|
+
export function loadSkill(skillPath, baseDir, source) {
|
|
99
|
+
try {
|
|
100
|
+
if (!existsSync(skillPath)) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
const content = readFileSync(skillPath, 'utf-8');
|
|
104
|
+
const metadata = parseSkillFrontmatter(content);
|
|
105
|
+
const skillContent = getSkillContent(content);
|
|
106
|
+
return {
|
|
107
|
+
path: skillPath,
|
|
108
|
+
relativePath: relative(baseDir, skillPath),
|
|
109
|
+
name: metadata.name || basename(dirname(skillPath)),
|
|
110
|
+
content: skillContent,
|
|
111
|
+
metadata,
|
|
112
|
+
source,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.warn(`Failed to load skill from ${skillPath}:`, error);
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Recursively find SKILL.md files in a directory
|
|
122
|
+
*/
|
|
123
|
+
export function findSkillFiles(directory) {
|
|
124
|
+
const skillFiles = [];
|
|
125
|
+
if (!existsSync(directory)) {
|
|
126
|
+
return skillFiles;
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
const entries = readdirSync(directory);
|
|
130
|
+
for (const entry of entries) {
|
|
131
|
+
const entryPath = join(directory, entry);
|
|
132
|
+
const stat = statSync(entryPath);
|
|
133
|
+
if (stat.isDirectory()) {
|
|
134
|
+
// Check for SKILL.md in subdirectory
|
|
135
|
+
const skillPath = join(entryPath, 'SKILL.md');
|
|
136
|
+
if (existsSync(skillPath)) {
|
|
137
|
+
skillFiles.push(skillPath);
|
|
138
|
+
}
|
|
139
|
+
// Recursively search subdirectories
|
|
140
|
+
skillFiles.push(...findSkillFiles(entryPath));
|
|
141
|
+
}
|
|
142
|
+
else if (entry === 'SKILL.md') {
|
|
143
|
+
skillFiles.push(entryPath);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
console.warn(`Failed to search directory ${directory}:`, error);
|
|
149
|
+
}
|
|
150
|
+
return skillFiles;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Load all skills from search paths
|
|
154
|
+
*/
|
|
155
|
+
export function loadAllSkills(projectRoot = process.cwd()) {
|
|
156
|
+
const skills = [];
|
|
157
|
+
const loadedPaths = new Set();
|
|
158
|
+
// Helper to determine source type
|
|
159
|
+
const getSource = (path) => {
|
|
160
|
+
if (path.startsWith(projectRoot))
|
|
161
|
+
return 'workspace';
|
|
162
|
+
if (path.startsWith(homedir()))
|
|
163
|
+
return 'user';
|
|
164
|
+
if (path.includes('marketplace'))
|
|
165
|
+
return 'marketplace';
|
|
166
|
+
return 'system';
|
|
167
|
+
};
|
|
168
|
+
// Search all configured paths
|
|
169
|
+
for (const searchPath of SKILL_SEARCH_PATHS) {
|
|
170
|
+
const fullPath = searchPath.startsWith('/') || searchPath.includes(':')
|
|
171
|
+
? searchPath
|
|
172
|
+
: join(projectRoot, searchPath);
|
|
173
|
+
const skillFiles = findSkillFiles(fullPath);
|
|
174
|
+
for (const skillFile of skillFiles) {
|
|
175
|
+
if (!loadedPaths.has(skillFile)) {
|
|
176
|
+
loadedPaths.add(skillFile);
|
|
177
|
+
const skill = loadSkill(skillFile, projectRoot, getSource(fullPath));
|
|
178
|
+
if (skill) {
|
|
179
|
+
skills.push(skill);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Sort by priority (higher priority first) then by name
|
|
185
|
+
skills.sort((a, b) => {
|
|
186
|
+
const priorityDiff = (b.metadata.priority || 0) - (a.metadata.priority || 0);
|
|
187
|
+
if (priorityDiff !== 0)
|
|
188
|
+
return priorityDiff;
|
|
189
|
+
return a.name.localeCompare(b.name);
|
|
190
|
+
});
|
|
191
|
+
return skills;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Find skills that match a query or context
|
|
195
|
+
*/
|
|
196
|
+
export function findMatchingSkills(skills, query) {
|
|
197
|
+
const lowerQuery = query.toLowerCase();
|
|
198
|
+
return skills.filter(skill => {
|
|
199
|
+
// Check name
|
|
200
|
+
if (skill.name.toLowerCase().includes(lowerQuery)) {
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
// Check description
|
|
204
|
+
if (skill.metadata.description.toLowerCase().includes(lowerQuery)) {
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
// Check triggers
|
|
208
|
+
if (skill.metadata.triggers) {
|
|
209
|
+
for (const trigger of skill.metadata.triggers) {
|
|
210
|
+
if (lowerQuery.includes(trigger.toLowerCase())) {
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Check category
|
|
216
|
+
if (skill.metadata.category?.toLowerCase().includes(lowerQuery)) {
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
return false;
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Format skills for inclusion in agent prompt
|
|
224
|
+
*/
|
|
225
|
+
export function formatSkillsForPrompt(skills) {
|
|
226
|
+
if (skills.length === 0) {
|
|
227
|
+
return '';
|
|
228
|
+
}
|
|
229
|
+
const sections = [];
|
|
230
|
+
sections.push('## Available Skills\n');
|
|
231
|
+
sections.push('The following specialized skills are available to assist with specific tasks:\n');
|
|
232
|
+
for (const skill of skills) {
|
|
233
|
+
sections.push(`### ${skill.name}`);
|
|
234
|
+
sections.push(`**Source:** ${skill.source}`);
|
|
235
|
+
if (skill.metadata.category) {
|
|
236
|
+
sections.push(`**Category:** ${skill.metadata.category}`);
|
|
237
|
+
}
|
|
238
|
+
sections.push(`**Description:** ${skill.metadata.description}`);
|
|
239
|
+
if (skill.metadata.triggers && skill.metadata.triggers.length > 0) {
|
|
240
|
+
sections.push(`**Triggers:** ${skill.metadata.triggers.join(', ')}`);
|
|
241
|
+
}
|
|
242
|
+
sections.push('');
|
|
243
|
+
sections.push('```');
|
|
244
|
+
sections.push(skill.content);
|
|
245
|
+
sections.push('```');
|
|
246
|
+
sections.push('');
|
|
247
|
+
}
|
|
248
|
+
return sections.join('\n');
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Get skills summary for status display
|
|
252
|
+
*/
|
|
253
|
+
export function getSkillsSummary(skills) {
|
|
254
|
+
if (skills.length === 0) {
|
|
255
|
+
return 'No skills loaded';
|
|
256
|
+
}
|
|
257
|
+
const bySource = {};
|
|
258
|
+
for (const skill of skills) {
|
|
259
|
+
bySource[skill.source] = (bySource[skill.source] || 0) + 1;
|
|
260
|
+
}
|
|
261
|
+
const parts = Object.entries(bySource)
|
|
262
|
+
.map(([source, count]) => `${count} ${source}`)
|
|
263
|
+
.join(', ');
|
|
264
|
+
return `${skills.length} skills loaded (${parts})`;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Skills Manager class for stateful skill management
|
|
268
|
+
*/
|
|
269
|
+
export class SkillsManager {
|
|
270
|
+
skills = [];
|
|
271
|
+
projectRoot;
|
|
272
|
+
constructor(projectRoot = process.cwd()) {
|
|
273
|
+
this.projectRoot = projectRoot;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Load all available skills
|
|
277
|
+
*/
|
|
278
|
+
load() {
|
|
279
|
+
this.skills = loadAllSkills(this.projectRoot);
|
|
280
|
+
return this.skills;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Get all loaded skills
|
|
284
|
+
*/
|
|
285
|
+
getAll() {
|
|
286
|
+
return this.skills;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Find skills matching a query
|
|
290
|
+
*/
|
|
291
|
+
find(query) {
|
|
292
|
+
return findMatchingSkills(this.skills, query);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Get skills formatted for prompt inclusion
|
|
296
|
+
*/
|
|
297
|
+
formatForPrompt() {
|
|
298
|
+
return formatSkillsForPrompt(this.skills);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Get summary for status display
|
|
302
|
+
*/
|
|
303
|
+
getSummary() {
|
|
304
|
+
return getSkillsSummary(this.skills);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get skill by name
|
|
308
|
+
*/
|
|
309
|
+
getByName(name) {
|
|
310
|
+
return this.skills.find(s => s.name.toLowerCase() === name.toLowerCase());
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Get skills by category
|
|
314
|
+
*/
|
|
315
|
+
getByCategory(category) {
|
|
316
|
+
return this.skills.filter(s => s.metadata.category?.toLowerCase() === category.toLowerCase());
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Get skills by source
|
|
320
|
+
*/
|
|
321
|
+
getBySource(source) {
|
|
322
|
+
return this.skills.filter(s => s.source === source);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Create a skills manager instance
|
|
327
|
+
*/
|
|
328
|
+
export function createSkillsManager(projectRoot) {
|
|
329
|
+
return new SkillsManager(projectRoot);
|
|
330
|
+
}
|
|
331
|
+
export default SkillsManager;
|
|
332
|
+
//# sourceMappingURL=skills-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-manager.js","sourceRoot":"","sources":["../../src/utils/skills-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured Output Validation (Feature A5)
|
|
3
|
+
* Ensures consistent JSON output format across sessions
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2025 Dobeu Tech Solutions LLC
|
|
6
|
+
* Licensed under CC BY-NC 4.0
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Session output schema for consistent reporting
|
|
10
|
+
*/
|
|
11
|
+
export interface SessionOutput {
|
|
12
|
+
session_id: string;
|
|
13
|
+
timestamp: string;
|
|
14
|
+
duration_seconds: number;
|
|
15
|
+
status: 'success' | 'partial' | 'failed' | 'interrupted';
|
|
16
|
+
features: {
|
|
17
|
+
total: number;
|
|
18
|
+
completed: number;
|
|
19
|
+
in_progress: string[];
|
|
20
|
+
failed: string[];
|
|
21
|
+
};
|
|
22
|
+
actions: {
|
|
23
|
+
files_created: string[];
|
|
24
|
+
files_modified: string[];
|
|
25
|
+
files_deleted: string[];
|
|
26
|
+
commands_executed: string[];
|
|
27
|
+
tests_run: number;
|
|
28
|
+
tests_passed: number;
|
|
29
|
+
};
|
|
30
|
+
next_session: {
|
|
31
|
+
recommended_feature: string | null;
|
|
32
|
+
blockers: string[];
|
|
33
|
+
notes: string[];
|
|
34
|
+
skip_tools: string[];
|
|
35
|
+
priority_tools: string[];
|
|
36
|
+
};
|
|
37
|
+
metrics: {
|
|
38
|
+
tokens_input: number;
|
|
39
|
+
tokens_output: number;
|
|
40
|
+
api_calls: number;
|
|
41
|
+
estimated_cost_usd: number;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Tool applicability result
|
|
46
|
+
*/
|
|
47
|
+
export interface ToolApplicability {
|
|
48
|
+
tool: string;
|
|
49
|
+
applicable: boolean;
|
|
50
|
+
reason: string;
|
|
51
|
+
priority: 'high' | 'medium' | 'low' | 'skip';
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Session notation for agent continuity
|
|
55
|
+
*/
|
|
56
|
+
export interface SessionNotation {
|
|
57
|
+
session_id: string;
|
|
58
|
+
ended_at: string;
|
|
59
|
+
summary: string;
|
|
60
|
+
features_completed: string[];
|
|
61
|
+
next_steps: string[];
|
|
62
|
+
recommended_feature: string | null;
|
|
63
|
+
tools_used: string[];
|
|
64
|
+
tools_skipped: string[];
|
|
65
|
+
tool_recommendations: ToolApplicability[];
|
|
66
|
+
blockers: string[];
|
|
67
|
+
warnings: string[];
|
|
68
|
+
important_context: string[];
|
|
69
|
+
file_changes: {
|
|
70
|
+
path: string;
|
|
71
|
+
action: 'created' | 'modified' | 'deleted';
|
|
72
|
+
}[];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create default session output
|
|
76
|
+
*/
|
|
77
|
+
export declare function createSessionOutput(sessionId: string): SessionOutput;
|
|
78
|
+
/**
|
|
79
|
+
* Validate session output against schema
|
|
80
|
+
*/
|
|
81
|
+
export declare function validateSessionOutput(output: unknown): output is SessionOutput;
|
|
82
|
+
/**
|
|
83
|
+
* Save session output to file
|
|
84
|
+
*/
|
|
85
|
+
export declare function saveSessionOutput(agentDir: string, output: SessionOutput): void;
|
|
86
|
+
/**
|
|
87
|
+
* Load last session output
|
|
88
|
+
*/
|
|
89
|
+
export declare function loadLastSessionOutput(agentDir: string): SessionOutput | null;
|
|
90
|
+
/**
|
|
91
|
+
* Create session notation for next agent
|
|
92
|
+
*/
|
|
93
|
+
export declare function createSessionNotation(sessionId: string, summary: string, toolRecommendations: ToolApplicability[]): SessionNotation;
|
|
94
|
+
/**
|
|
95
|
+
* Save session notation
|
|
96
|
+
*/
|
|
97
|
+
export declare function saveSessionNotation(agentDir: string, notation: SessionNotation): void;
|
|
98
|
+
/**
|
|
99
|
+
* Load last session notation
|
|
100
|
+
*/
|
|
101
|
+
export declare function loadLastSessionNotation(agentDir: string): SessionNotation | null;
|
|
102
|
+
/**
|
|
103
|
+
* Generate output format schema for SDK
|
|
104
|
+
*/
|
|
105
|
+
export declare function getOutputFormatSchema(): object;
|
|
106
|
+
declare const _default: {
|
|
107
|
+
createSessionOutput: typeof createSessionOutput;
|
|
108
|
+
validateSessionOutput: typeof validateSessionOutput;
|
|
109
|
+
saveSessionOutput: typeof saveSessionOutput;
|
|
110
|
+
loadLastSessionOutput: typeof loadLastSessionOutput;
|
|
111
|
+
createSessionNotation: typeof createSessionNotation;
|
|
112
|
+
saveSessionNotation: typeof saveSessionNotation;
|
|
113
|
+
loadLastSessionNotation: typeof loadLastSessionNotation;
|
|
114
|
+
getOutputFormatSchema: typeof getOutputFormatSchema;
|
|
115
|
+
};
|
|
116
|
+
export default _default;
|
|
117
|
+
//# sourceMappingURL=structured-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.d.ts","sourceRoot":"","sources":["../../src/utils/structured-output.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAC;IAGzD,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IAGF,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IAGF,YAAY,EAAE;QACZ,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IAGF,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IAGjB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAG7B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAGnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,oBAAoB,EAAE,iBAAiB,EAAE,CAAC;IAG1C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IAGnB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAA;KAAE,EAAE,CAAC;CAC9E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAkCpE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,aAAa,CAe9E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAwB/E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAW5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,mBAAmB,EAAE,iBAAiB,EAAE,GACvC,eAAe,CAgBjB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAsBrF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAUhF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAgB9C;;;;;;;;;;;AAED,wBASE"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured Output Validation (Feature A5)
|
|
3
|
+
* Ensures consistent JSON output format across sessions
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2025 Dobeu Tech Solutions LLC
|
|
6
|
+
* Licensed under CC BY-NC 4.0
|
|
7
|
+
*/
|
|
8
|
+
import { writeFileSync, readFileSync, existsSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Create default session output
|
|
12
|
+
*/
|
|
13
|
+
export function createSessionOutput(sessionId) {
|
|
14
|
+
return {
|
|
15
|
+
session_id: sessionId,
|
|
16
|
+
timestamp: new Date().toISOString(),
|
|
17
|
+
duration_seconds: 0,
|
|
18
|
+
status: 'success',
|
|
19
|
+
features: {
|
|
20
|
+
total: 0,
|
|
21
|
+
completed: 0,
|
|
22
|
+
in_progress: [],
|
|
23
|
+
failed: [],
|
|
24
|
+
},
|
|
25
|
+
actions: {
|
|
26
|
+
files_created: [],
|
|
27
|
+
files_modified: [],
|
|
28
|
+
files_deleted: [],
|
|
29
|
+
commands_executed: [],
|
|
30
|
+
tests_run: 0,
|
|
31
|
+
tests_passed: 0,
|
|
32
|
+
},
|
|
33
|
+
next_session: {
|
|
34
|
+
recommended_feature: null,
|
|
35
|
+
blockers: [],
|
|
36
|
+
notes: [],
|
|
37
|
+
skip_tools: [],
|
|
38
|
+
priority_tools: [],
|
|
39
|
+
},
|
|
40
|
+
metrics: {
|
|
41
|
+
tokens_input: 0,
|
|
42
|
+
tokens_output: 0,
|
|
43
|
+
api_calls: 0,
|
|
44
|
+
estimated_cost_usd: 0,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Validate session output against schema
|
|
50
|
+
*/
|
|
51
|
+
export function validateSessionOutput(output) {
|
|
52
|
+
if (typeof output !== 'object' || output === null)
|
|
53
|
+
return false;
|
|
54
|
+
const o = output;
|
|
55
|
+
return (typeof o.session_id === 'string' &&
|
|
56
|
+
typeof o.timestamp === 'string' &&
|
|
57
|
+
typeof o.duration_seconds === 'number' &&
|
|
58
|
+
['success', 'partial', 'failed', 'interrupted'].includes(o.status) &&
|
|
59
|
+
typeof o.features === 'object' &&
|
|
60
|
+
typeof o.actions === 'object' &&
|
|
61
|
+
typeof o.next_session === 'object' &&
|
|
62
|
+
typeof o.metrics === 'object');
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Save session output to file
|
|
66
|
+
*/
|
|
67
|
+
export function saveSessionOutput(agentDir, output) {
|
|
68
|
+
const outputPath = join(agentDir, 'session_output.json');
|
|
69
|
+
const historyPath = join(agentDir, 'session_history.json');
|
|
70
|
+
// Save current output
|
|
71
|
+
writeFileSync(outputPath, JSON.stringify(output, null, 2));
|
|
72
|
+
// Append to history
|
|
73
|
+
let history = [];
|
|
74
|
+
if (existsSync(historyPath)) {
|
|
75
|
+
try {
|
|
76
|
+
history = JSON.parse(readFileSync(historyPath, 'utf-8'));
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
history = [];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Keep last 50 sessions
|
|
83
|
+
history.push(output);
|
|
84
|
+
if (history.length > 50) {
|
|
85
|
+
history = history.slice(-50);
|
|
86
|
+
}
|
|
87
|
+
writeFileSync(historyPath, JSON.stringify(history, null, 2));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Load last session output
|
|
91
|
+
*/
|
|
92
|
+
export function loadLastSessionOutput(agentDir) {
|
|
93
|
+
const outputPath = join(agentDir, 'session_output.json');
|
|
94
|
+
if (!existsSync(outputPath))
|
|
95
|
+
return null;
|
|
96
|
+
try {
|
|
97
|
+
const data = JSON.parse(readFileSync(outputPath, 'utf-8'));
|
|
98
|
+
return validateSessionOutput(data) ? data : null;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Create session notation for next agent
|
|
106
|
+
*/
|
|
107
|
+
export function createSessionNotation(sessionId, summary, toolRecommendations) {
|
|
108
|
+
return {
|
|
109
|
+
session_id: sessionId,
|
|
110
|
+
ended_at: new Date().toISOString(),
|
|
111
|
+
summary,
|
|
112
|
+
features_completed: [],
|
|
113
|
+
next_steps: [],
|
|
114
|
+
recommended_feature: null,
|
|
115
|
+
tools_used: [],
|
|
116
|
+
tools_skipped: [],
|
|
117
|
+
tool_recommendations: toolRecommendations,
|
|
118
|
+
blockers: [],
|
|
119
|
+
warnings: [],
|
|
120
|
+
important_context: [],
|
|
121
|
+
file_changes: [],
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Save session notation
|
|
126
|
+
*/
|
|
127
|
+
export function saveSessionNotation(agentDir, notation) {
|
|
128
|
+
const notationPath = join(agentDir, 'session_notation.json');
|
|
129
|
+
const historyPath = join(agentDir, 'notation_history.json');
|
|
130
|
+
writeFileSync(notationPath, JSON.stringify(notation, null, 2));
|
|
131
|
+
// Append to history
|
|
132
|
+
let history = [];
|
|
133
|
+
if (existsSync(historyPath)) {
|
|
134
|
+
try {
|
|
135
|
+
history = JSON.parse(readFileSync(historyPath, 'utf-8'));
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
history = [];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
history.push(notation);
|
|
142
|
+
if (history.length > 20) {
|
|
143
|
+
history = history.slice(-20);
|
|
144
|
+
}
|
|
145
|
+
writeFileSync(historyPath, JSON.stringify(history, null, 2));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Load last session notation
|
|
149
|
+
*/
|
|
150
|
+
export function loadLastSessionNotation(agentDir) {
|
|
151
|
+
const notationPath = join(agentDir, 'session_notation.json');
|
|
152
|
+
if (!existsSync(notationPath))
|
|
153
|
+
return null;
|
|
154
|
+
try {
|
|
155
|
+
return JSON.parse(readFileSync(notationPath, 'utf-8'));
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Generate output format schema for SDK
|
|
163
|
+
*/
|
|
164
|
+
export function getOutputFormatSchema() {
|
|
165
|
+
return {
|
|
166
|
+
type: 'json_schema',
|
|
167
|
+
schema: {
|
|
168
|
+
type: 'object',
|
|
169
|
+
properties: {
|
|
170
|
+
session_id: { type: 'string' },
|
|
171
|
+
status: { type: 'string', enum: ['success', 'partial', 'failed', 'interrupted'] },
|
|
172
|
+
features_completed: { type: 'array', items: { type: 'string' } },
|
|
173
|
+
next_recommended: { type: 'string' },
|
|
174
|
+
blockers: { type: 'array', items: { type: 'string' } },
|
|
175
|
+
summary: { type: 'string' },
|
|
176
|
+
},
|
|
177
|
+
required: ['session_id', 'status', 'summary'],
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
export default {
|
|
182
|
+
createSessionOutput,
|
|
183
|
+
validateSessionOutput,
|
|
184
|
+
saveSessionOutput,
|
|
185
|
+
loadLastSessionOutput,
|
|
186
|
+
createSessionNotation,
|
|
187
|
+
saveSessionNotation,
|
|
188
|
+
loadLastSessionNotation,
|
|
189
|
+
getOutputFormatSchema,
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=structured-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.js","sourceRoot":"","sources":["../../src/utils/structured-output.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAsF5B;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,OAAO;QACL,UAAU,EAAE,SAAS;QACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,gBAAgB,EAAE,CAAC;QACnB,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE;YACR,KAAK,EAAE,CAAC;YACR,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,EAAE;YACf,MAAM,EAAE,EAAE;SACX;QACD,OAAO,EAAE;YACP,aAAa,EAAE,EAAE;YACjB,cAAc,EAAE,EAAE;YAClB,aAAa,EAAE,EAAE;YACjB,iBAAiB,EAAE,EAAE;YACrB,SAAS,EAAE,CAAC;YACZ,YAAY,EAAE,CAAC;SAChB;QACD,YAAY,EAAE;YACZ,mBAAmB,EAAE,IAAI;YACzB,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,EAAE;SACnB;QACD,OAAO,EAAE;YACP,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,kBAAkB,EAAE,CAAC;SACtB;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACnD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAEhE,MAAM,CAAC,GAAG,MAAiC,CAAC;IAE5C,OAAO,CACL,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;QAChC,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAC/B,OAAO,CAAC,CAAC,gBAAgB,KAAK,QAAQ;QACtC,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAgB,CAAC;QAC5E,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;QAC9B,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;QAC7B,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ;QAClC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAC9B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,MAAqB;IACvE,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;IAE3D,sBAAsB;IACtB,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE3D,oBAAoB;IACpB,IAAI,OAAO,GAAoB,EAAE,CAAC;IAClC,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACxB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAEzD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3D,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,OAAe,EACf,mBAAwC;IAExC,OAAO;QACL,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAClC,OAAO;QACP,kBAAkB,EAAE,EAAE;QACtB,UAAU,EAAE,EAAE;QACd,mBAAmB,EAAE,IAAI;QACzB,UAAU,EAAE,EAAE;QACd,aAAa,EAAE,EAAE;QACjB,oBAAoB,EAAE,mBAAmB;QACzC,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,iBAAiB,EAAE,EAAE;QACrB,YAAY,EAAE,EAAE;KACjB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,QAAyB;IAC7E,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;IAE5D,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/D,oBAAoB;IACpB,IAAI,OAAO,GAAsB,EAAE,CAAC;IACpC,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACxB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;IAE7D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC9B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE;gBACjF,kBAAkB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAChE,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACpC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBACtD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC5B;YACD,QAAQ,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC;SAC9C;KACF,CAAC;AACJ,CAAC;AAED,eAAe;IACb,mBAAmB;IACnB,qBAAqB;IACrB,iBAAiB;IACjB,qBAAqB;IACrB,qBAAqB;IACrB,mBAAmB;IACnB,uBAAuB;IACvB,qBAAqB;CACtB,CAAC"}
|