@sowonai/crewx-sdk 0.1.0-dev.3 → 0.1.0-dev.30
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/README.md +28 -0
- package/dist/config/yaml-loader.js +6 -2
- package/dist/config/yaml-loader.js.map +1 -1
- package/dist/conversation/conversation-history.interface.d.ts +6 -4
- package/dist/core/agent/agent-factory.d.ts +7 -7
- package/dist/core/agent/agent-factory.js +23 -0
- package/dist/core/agent/agent-factory.js.map +1 -1
- package/dist/core/agent/agent-runtime.d.ts +18 -2
- package/dist/core/agent/agent-runtime.js +128 -24
- package/dist/core/agent/agent-runtime.js.map +1 -1
- package/dist/core/agent/index.d.ts +1 -1
- package/dist/core/agent/index.js +2 -1
- package/dist/core/agent/index.js.map +1 -1
- package/dist/core/providers/ai-provider.interface.d.ts +1 -0
- package/dist/core/providers/ai-provider.interface.js.map +1 -1
- package/dist/core/providers/base-ai.provider.d.ts +7 -0
- package/dist/core/providers/base-ai.provider.js +8 -4
- package/dist/core/providers/base-ai.provider.js.map +1 -1
- package/dist/core/providers/dynamic-provider.factory.d.ts +64 -0
- package/dist/core/providers/dynamic-provider.factory.js +533 -0
- package/dist/core/providers/dynamic-provider.factory.js.map +1 -0
- package/dist/core/providers/index.d.ts +3 -0
- package/dist/core/providers/index.js +7 -1
- package/dist/core/providers/index.js.map +1 -1
- package/dist/core/providers/mock.provider.d.ts +13 -0
- package/dist/core/providers/mock.provider.js +55 -0
- package/dist/core/providers/mock.provider.js.map +1 -0
- package/dist/core/providers/provider-factory.d.ts +3 -0
- package/dist/core/providers/provider-factory.js +27 -0
- package/dist/core/providers/provider-factory.js.map +1 -0
- package/dist/index.d.ts +17 -4
- package/dist/index.js +31 -1
- package/dist/index.js.map +1 -1
- package/dist/schema/skills-parser.d.ts +8 -0
- package/dist/schema/skills-parser.js +421 -0
- package/dist/schema/skills-parser.js.map +1 -0
- package/dist/schema/skills.types.d.ts +144 -0
- package/dist/schema/skills.types.js +41 -0
- package/dist/schema/skills.types.js.map +1 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.js +19 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/layout-loader.service.d.ts +18 -0
- package/dist/services/layout-loader.service.js +266 -0
- package/dist/services/layout-loader.service.js.map +1 -0
- package/dist/services/layout-renderer.service.d.ts +25 -0
- package/dist/services/layout-renderer.service.js +226 -0
- package/dist/services/layout-renderer.service.js.map +1 -0
- package/dist/services/props-validator.service.d.ts +29 -0
- package/dist/services/props-validator.service.js +332 -0
- package/dist/services/props-validator.service.js.map +1 -0
- package/dist/skills/adapter/claude-skill-adapter.d.ts +11 -0
- package/dist/skills/adapter/claude-skill-adapter.js +222 -0
- package/dist/skills/adapter/claude-skill-adapter.js.map +1 -0
- package/dist/skills/index.d.ts +6 -0
- package/dist/skills/index.js +31 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/runtime/progressive-loader.d.ts +27 -0
- package/dist/skills/runtime/progressive-loader.js +186 -0
- package/dist/skills/runtime/progressive-loader.js.map +1 -0
- package/dist/skills/runtime/runtime-requirements-validator.d.ts +23 -0
- package/dist/skills/runtime/runtime-requirements-validator.js +248 -0
- package/dist/skills/runtime/runtime-requirements-validator.js.map +1 -0
- package/dist/skills/runtime/skill-runtime.service.d.ts +42 -0
- package/dist/skills/runtime/skill-runtime.service.js +434 -0
- package/dist/skills/runtime/skill-runtime.service.js.map +1 -0
- package/dist/types/agent.types.d.ts +10 -2
- package/dist/types/agent.types.js.map +1 -1
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/layout.types.d.ts +113 -0
- package/dist/types/layout.types.js +22 -0
- package/dist/types/layout.types.js.map +1 -0
- package/dist/types/provider.types.d.ts +12 -0
- package/dist/types/provider.types.js +3 -0
- package/dist/types/provider.types.js.map +1 -0
- package/dist/types/skill-runtime.types.d.ts +244 -0
- package/dist/types/skill-runtime.types.js +44 -0
- package/dist/types/skill-runtime.types.js.map +1 -0
- package/dist/types/template.types.d.ts +38 -0
- package/dist/types/template.types.js +3 -0
- package/dist/types/template.types.js.map +1 -0
- package/package.json +14 -13
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ClaudeSkillAdapter = void 0;
|
|
7
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
10
|
+
class ClaudeSkillAdapter {
|
|
11
|
+
async extractMetadata(skillFilePath) {
|
|
12
|
+
try {
|
|
13
|
+
const content = await promises_1.default.readFile(skillFilePath, 'utf-8');
|
|
14
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
15
|
+
if (!frontmatterMatch) {
|
|
16
|
+
throw new Error('No YAML frontmatter found in skill file');
|
|
17
|
+
}
|
|
18
|
+
const frontmatter = js_yaml_1.default.load(frontmatterMatch[1] || '');
|
|
19
|
+
if (!frontmatter.name) {
|
|
20
|
+
throw new Error('Skill name is required in frontmatter');
|
|
21
|
+
}
|
|
22
|
+
if (!frontmatter.description) {
|
|
23
|
+
throw new Error('Skill description is required in frontmatter');
|
|
24
|
+
}
|
|
25
|
+
if (!frontmatter.version) {
|
|
26
|
+
throw new Error('Skill version is required in frontmatter');
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
name: frontmatter.name,
|
|
30
|
+
description: frontmatter.description,
|
|
31
|
+
version: frontmatter.version,
|
|
32
|
+
dependencies: frontmatter.dependencies || [],
|
|
33
|
+
runtime: frontmatter.runtime || {},
|
|
34
|
+
visibility: frontmatter.visibility || 'public',
|
|
35
|
+
...frontmatter
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw new Error(`Failed to extract metadata from ${skillFilePath}: ${error.message}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
parseContent(fullContent) {
|
|
43
|
+
try {
|
|
44
|
+
const contentWithoutFrontmatter = fullContent.replace(/^---\n[\s\S]*?\n---\n/, '');
|
|
45
|
+
const sections = {
|
|
46
|
+
role: this.extractSection(contentWithoutFrontmatter, 'Role'),
|
|
47
|
+
task: this.extractSection(contentWithoutFrontmatter, 'Task'),
|
|
48
|
+
instructions: this.extractSection(contentWithoutFrontmatter, 'Instructions'),
|
|
49
|
+
raw: contentWithoutFrontmatter
|
|
50
|
+
};
|
|
51
|
+
return sections;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
throw new Error(`Failed to parse skill content: ${error.message}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
mapToCrewXAgent(skill) {
|
|
58
|
+
const { metadata, content } = skill;
|
|
59
|
+
let systemPrompt = '';
|
|
60
|
+
if (content?.role) {
|
|
61
|
+
systemPrompt += `## Role\n${content.role}\n\n`;
|
|
62
|
+
}
|
|
63
|
+
if (content?.task) {
|
|
64
|
+
systemPrompt += `## Task\n${content.task}\n\n`;
|
|
65
|
+
}
|
|
66
|
+
if (content?.instructions) {
|
|
67
|
+
systemPrompt += `## Instructions\n${content.instructions}\n\n`;
|
|
68
|
+
}
|
|
69
|
+
const capabilities = [];
|
|
70
|
+
if (metadata.runtime?.python) {
|
|
71
|
+
capabilities.push(`python:${metadata.runtime.python}`);
|
|
72
|
+
}
|
|
73
|
+
if (metadata.runtime?.node) {
|
|
74
|
+
capabilities.push(`node:${metadata.runtime.node}`);
|
|
75
|
+
}
|
|
76
|
+
if (metadata.runtime?.docker) {
|
|
77
|
+
capabilities.push('docker');
|
|
78
|
+
}
|
|
79
|
+
const agent = {
|
|
80
|
+
id: metadata.name,
|
|
81
|
+
name: this.formatDisplayName(metadata.name),
|
|
82
|
+
description: metadata.description,
|
|
83
|
+
provider: 'cli/claude',
|
|
84
|
+
capabilities: capabilities.length > 0 ? capabilities : undefined,
|
|
85
|
+
inline: {
|
|
86
|
+
type: 'agent',
|
|
87
|
+
version: metadata.version,
|
|
88
|
+
dependencies: metadata.dependencies,
|
|
89
|
+
system_prompt: systemPrompt.trim() || `You are ${metadata.name}, ${metadata.description.toLowerCase()}.`
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
return agent;
|
|
93
|
+
}
|
|
94
|
+
async validateSkillFile(filePath) {
|
|
95
|
+
const errors = [];
|
|
96
|
+
try {
|
|
97
|
+
const stats = await promises_1.default.stat(filePath);
|
|
98
|
+
if (!stats.isFile()) {
|
|
99
|
+
errors.push({
|
|
100
|
+
skillName: path_1.default.basename(filePath),
|
|
101
|
+
field: 'file',
|
|
102
|
+
message: 'Path is not a file',
|
|
103
|
+
actual: filePath
|
|
104
|
+
});
|
|
105
|
+
return { valid: false, errors };
|
|
106
|
+
}
|
|
107
|
+
if (!filePath.endsWith('.md')) {
|
|
108
|
+
errors.push({
|
|
109
|
+
skillName: path_1.default.basename(filePath),
|
|
110
|
+
field: 'extension',
|
|
111
|
+
message: 'Skill file must have .md extension',
|
|
112
|
+
actual: path_1.default.extname(filePath)
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
const content = await promises_1.default.readFile(filePath, 'utf-8');
|
|
116
|
+
if (!content.includes('---')) {
|
|
117
|
+
errors.push({
|
|
118
|
+
skillName: path_1.default.basename(filePath),
|
|
119
|
+
field: 'frontmatter',
|
|
120
|
+
message: 'Skill file must contain YAML frontmatter',
|
|
121
|
+
actual: 'missing'
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
const metadata = await this.extractMetadata(filePath);
|
|
126
|
+
if (!/^[a-z0-9-]+$/.test(metadata.name)) {
|
|
127
|
+
errors.push({
|
|
128
|
+
skillName: metadata.name,
|
|
129
|
+
field: 'name',
|
|
130
|
+
message: 'Skill name must be kebab-case (lowercase letters, numbers, and hyphens only)',
|
|
131
|
+
actual: metadata.name
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
if (!/^\d+\.\d+\.\d+$/.test(metadata.version)) {
|
|
135
|
+
errors.push({
|
|
136
|
+
skillName: metadata.name,
|
|
137
|
+
field: 'version',
|
|
138
|
+
message: 'Version must follow semantic versioning (e.g., "1.0.0")',
|
|
139
|
+
actual: metadata.version
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
if (metadata.description.length < 10) {
|
|
143
|
+
errors.push({
|
|
144
|
+
skillName: metadata.name,
|
|
145
|
+
field: 'description',
|
|
146
|
+
message: 'Description must be at least 10 characters long',
|
|
147
|
+
actual: metadata.description
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
const parsedContent = this.parseContent(content);
|
|
151
|
+
if (!parsedContent.role && !parsedContent.task && !parsedContent.instructions) {
|
|
152
|
+
errors.push({
|
|
153
|
+
skillName: metadata.name,
|
|
154
|
+
field: 'content',
|
|
155
|
+
message: 'Skill must have at least one of: Role, Task, or Instructions section',
|
|
156
|
+
actual: 'missing sections'
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
errors.push({
|
|
162
|
+
skillName: path_1.default.basename(filePath),
|
|
163
|
+
field: 'parsing',
|
|
164
|
+
message: `Failed to parse skill file: ${error.message}`,
|
|
165
|
+
actual: error.message
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
errors.push({
|
|
171
|
+
skillName: path_1.default.basename(filePath),
|
|
172
|
+
field: 'file_access',
|
|
173
|
+
message: `Failed to read skill file: ${error.message}`,
|
|
174
|
+
actual: error.message
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
valid: errors.length === 0,
|
|
179
|
+
errors
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
async discoverSkills(directory) {
|
|
183
|
+
try {
|
|
184
|
+
const entries = await promises_1.default.readdir(directory, { withFileTypes: true });
|
|
185
|
+
const skillFiles = [];
|
|
186
|
+
for (const entry of entries) {
|
|
187
|
+
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
188
|
+
const filePath = path_1.default.join(directory, entry.name);
|
|
189
|
+
try {
|
|
190
|
+
const content = await promises_1.default.readFile(filePath, 'utf-8');
|
|
191
|
+
if (content.includes('---') && content.includes('name:')) {
|
|
192
|
+
skillFiles.push(filePath);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return skillFiles;
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
throw new Error(`Failed to discover skills in directory ${directory}: ${error.message}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
extractSection(content, sectionName) {
|
|
207
|
+
const sectionRegex = new RegExp(`^##\\s*${sectionName}\\s*$\\n([\\s\\S]*?)(?=\\n##|\\n$|$)`, 'im');
|
|
208
|
+
const match = content.match(sectionRegex);
|
|
209
|
+
if (match && match[1]) {
|
|
210
|
+
return match[1].trim();
|
|
211
|
+
}
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
formatDisplayName(name) {
|
|
215
|
+
return name
|
|
216
|
+
.split('-')
|
|
217
|
+
.map(word => word.charAt(0).toUpperCase() + (word.slice(1) || ''))
|
|
218
|
+
.join(' ');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
exports.ClaudeSkillAdapter = ClaudeSkillAdapter;
|
|
222
|
+
//# sourceMappingURL=claude-skill-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-skill-adapter.js","sourceRoot":"","sources":["../../../src/skills/adapter/claude-skill-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from '../types/skill-runtime.types';
|
|
2
|
+
export { ProgressiveSkillLoader } from './runtime/progressive-loader';
|
|
3
|
+
export { ClaudeSkillAdapter } from './adapter/claude-skill-adapter';
|
|
4
|
+
export { SystemRuntimeValidator, MockRuntimeValidator } from './runtime/runtime-requirements-validator';
|
|
5
|
+
export type { SkillMetadata, SkillContent, SkillDefinition, SkillsConfig, CrewxProjectConfig, AgentDefinition, SkillParserOptions, SkillManifest, } from '../schema/skills.types';
|
|
6
|
+
export { SkillLoadError, SkillNotFoundError, SkillDependencyError, SkillVersionMismatchError, } from '../schema/skills.types';
|
|
@@ -0,0 +1,31 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.SkillVersionMismatchError = exports.SkillDependencyError = exports.SkillNotFoundError = exports.SkillLoadError = exports.MockRuntimeValidator = exports.SystemRuntimeValidator = exports.ClaudeSkillAdapter = exports.ProgressiveSkillLoader = void 0;
|
|
18
|
+
__exportStar(require("../types/skill-runtime.types"), exports);
|
|
19
|
+
var progressive_loader_1 = require("./runtime/progressive-loader");
|
|
20
|
+
Object.defineProperty(exports, "ProgressiveSkillLoader", { enumerable: true, get: function () { return progressive_loader_1.ProgressiveSkillLoader; } });
|
|
21
|
+
var claude_skill_adapter_1 = require("./adapter/claude-skill-adapter");
|
|
22
|
+
Object.defineProperty(exports, "ClaudeSkillAdapter", { enumerable: true, get: function () { return claude_skill_adapter_1.ClaudeSkillAdapter; } });
|
|
23
|
+
var runtime_requirements_validator_1 = require("./runtime/runtime-requirements-validator");
|
|
24
|
+
Object.defineProperty(exports, "SystemRuntimeValidator", { enumerable: true, get: function () { return runtime_requirements_validator_1.SystemRuntimeValidator; } });
|
|
25
|
+
Object.defineProperty(exports, "MockRuntimeValidator", { enumerable: true, get: function () { return runtime_requirements_validator_1.MockRuntimeValidator; } });
|
|
26
|
+
var skills_types_1 = require("../schema/skills.types");
|
|
27
|
+
Object.defineProperty(exports, "SkillLoadError", { enumerable: true, get: function () { return skills_types_1.SkillLoadError; } });
|
|
28
|
+
Object.defineProperty(exports, "SkillNotFoundError", { enumerable: true, get: function () { return skills_types_1.SkillNotFoundError; } });
|
|
29
|
+
Object.defineProperty(exports, "SkillDependencyError", { enumerable: true, get: function () { return skills_types_1.SkillDependencyError; } });
|
|
30
|
+
Object.defineProperty(exports, "SkillVersionMismatchError", { enumerable: true, get: function () { return skills_types_1.SkillVersionMismatchError; } });
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAQA,+DAA6C;AAG7C,mEAAsE;AAA7D,4HAAA,sBAAsB,OAAA;AAG/B,uEAAoE;AAA3D,0HAAA,kBAAkB,OAAA;AAG3B,2FAAwG;AAA/F,wIAAA,sBAAsB,OAAA;AAAE,sIAAA,oBAAoB,OAAA;AAcrD,uDAKgC;AAJ9B,8GAAA,cAAc,OAAA;AACd,kHAAA,kBAAkB,OAAA;AAClB,oHAAA,oBAAoB,OAAA;AACpB,yHAAA,yBAAyB,OAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { IProgressiveSkillLoader } from '../../types/skill-runtime.types';
|
|
2
|
+
import { SkillMetadata, SkillDefinition } from '../../schema/skills.types';
|
|
3
|
+
import { ClaudeSkillAdapter } from '../adapter/claude-skill-adapter';
|
|
4
|
+
export declare class ProgressiveSkillLoader implements IProgressiveSkillLoader {
|
|
5
|
+
private readonly claudeAdapter;
|
|
6
|
+
private readonly metadataCache;
|
|
7
|
+
private readonly contentCache;
|
|
8
|
+
private readonly cacheTimestamps;
|
|
9
|
+
private readonly defaultTTL;
|
|
10
|
+
constructor(claudeAdapter: ClaudeSkillAdapter);
|
|
11
|
+
loadMetadata(skillPaths: string[]): Promise<SkillMetadata[]>;
|
|
12
|
+
loadFullContent(skillName: string): Promise<SkillDefinition>;
|
|
13
|
+
isFullyLoaded(skillName: string): boolean;
|
|
14
|
+
preloadContent(skillNames: string[]): Promise<void>;
|
|
15
|
+
clearContentCache(): Promise<void>;
|
|
16
|
+
getCacheStats(): {
|
|
17
|
+
metadataCache: number;
|
|
18
|
+
contentCache: number;
|
|
19
|
+
totalItems: number;
|
|
20
|
+
};
|
|
21
|
+
clearAllCaches(): void;
|
|
22
|
+
cleanupExpiredCache(): void;
|
|
23
|
+
private loadMetadataFromPath;
|
|
24
|
+
private deduplicateMetadata;
|
|
25
|
+
private findSkillFile;
|
|
26
|
+
private isCacheExpired;
|
|
27
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ProgressiveSkillLoader = void 0;
|
|
7
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
8
|
+
class ProgressiveSkillLoader {
|
|
9
|
+
constructor(claudeAdapter) {
|
|
10
|
+
this.metadataCache = new Map();
|
|
11
|
+
this.contentCache = new Map();
|
|
12
|
+
this.cacheTimestamps = new Map();
|
|
13
|
+
this.defaultTTL = 30 * 60 * 1000;
|
|
14
|
+
this.claudeAdapter = claudeAdapter;
|
|
15
|
+
}
|
|
16
|
+
async loadMetadata(skillPaths) {
|
|
17
|
+
const allMetadata = [];
|
|
18
|
+
for (const skillPath of skillPaths) {
|
|
19
|
+
try {
|
|
20
|
+
const metadata = await this.loadMetadataFromPath(skillPath);
|
|
21
|
+
allMetadata.push(...metadata);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.warn(`Failed to load metadata from ${skillPath}:`, error);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const uniqueMetadata = this.deduplicateMetadata(allMetadata);
|
|
28
|
+
for (const metadata of uniqueMetadata) {
|
|
29
|
+
this.metadataCache.set(metadata.name, metadata);
|
|
30
|
+
this.cacheTimestamps.set(`metadata:${metadata.name}`, Date.now());
|
|
31
|
+
}
|
|
32
|
+
return uniqueMetadata;
|
|
33
|
+
}
|
|
34
|
+
async loadFullContent(skillName) {
|
|
35
|
+
const cached = this.contentCache.get(skillName);
|
|
36
|
+
if (cached && !this.isCacheExpired(`content:${skillName}`)) {
|
|
37
|
+
return cached;
|
|
38
|
+
}
|
|
39
|
+
const metadata = this.metadataCache.get(skillName);
|
|
40
|
+
if (!metadata) {
|
|
41
|
+
throw new Error(`Skill "${skillName}" not found. Load metadata first.`);
|
|
42
|
+
}
|
|
43
|
+
const skillFilePath = await this.findSkillFile(skillName);
|
|
44
|
+
if (!skillFilePath) {
|
|
45
|
+
throw new Error(`Skill file for "${skillName}" not found`);
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const fullContent = await promises_1.default.readFile(skillFilePath, 'utf-8');
|
|
49
|
+
const content = this.claudeAdapter.parseContent(fullContent);
|
|
50
|
+
const definition = {
|
|
51
|
+
metadata,
|
|
52
|
+
content,
|
|
53
|
+
filePath: skillFilePath,
|
|
54
|
+
fullyLoaded: true
|
|
55
|
+
};
|
|
56
|
+
this.contentCache.set(skillName, definition);
|
|
57
|
+
this.cacheTimestamps.set(`content:${skillName}`, Date.now());
|
|
58
|
+
return definition;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
throw new Error(`Failed to load full content for skill "${skillName}": ${error.message}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
isFullyLoaded(skillName) {
|
|
65
|
+
const cached = this.contentCache.get(skillName);
|
|
66
|
+
return cached?.fullyLoaded || false;
|
|
67
|
+
}
|
|
68
|
+
async preloadContent(skillNames) {
|
|
69
|
+
const loadPromises = skillNames.map(skillName => this.loadFullContent(skillName).catch(error => {
|
|
70
|
+
console.warn(`Failed to preload content for skill "${skillName}":`, error);
|
|
71
|
+
return null;
|
|
72
|
+
}));
|
|
73
|
+
await Promise.all(loadPromises);
|
|
74
|
+
}
|
|
75
|
+
async clearContentCache() {
|
|
76
|
+
this.contentCache.clear();
|
|
77
|
+
const keysToDelete = [];
|
|
78
|
+
for (const [key] of this.cacheTimestamps) {
|
|
79
|
+
if (key.startsWith('content:')) {
|
|
80
|
+
keysToDelete.push(key);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
for (const key of keysToDelete) {
|
|
84
|
+
this.cacheTimestamps.delete(key);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
getCacheStats() {
|
|
88
|
+
return {
|
|
89
|
+
metadataCache: this.metadataCache.size,
|
|
90
|
+
contentCache: this.contentCache.size,
|
|
91
|
+
totalItems: this.metadataCache.size + this.contentCache.size
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
clearAllCaches() {
|
|
95
|
+
this.metadataCache.clear();
|
|
96
|
+
this.contentCache.clear();
|
|
97
|
+
this.cacheTimestamps.clear();
|
|
98
|
+
}
|
|
99
|
+
cleanupExpiredCache() {
|
|
100
|
+
const now = Date.now();
|
|
101
|
+
const keysToDelete = [];
|
|
102
|
+
for (const [key, timestamp] of this.cacheTimestamps) {
|
|
103
|
+
if (now - timestamp > this.defaultTTL) {
|
|
104
|
+
keysToDelete.push(key);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
for (const key of keysToDelete) {
|
|
108
|
+
this.cacheTimestamps.delete(key);
|
|
109
|
+
if (key.startsWith('metadata:')) {
|
|
110
|
+
const skillName = key.replace('metadata:', '');
|
|
111
|
+
this.metadataCache.delete(skillName);
|
|
112
|
+
}
|
|
113
|
+
else if (key.startsWith('content:')) {
|
|
114
|
+
const skillName = key.replace('content:', '');
|
|
115
|
+
this.contentCache.delete(skillName);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async loadMetadataFromPath(skillPath) {
|
|
120
|
+
const metadata = [];
|
|
121
|
+
try {
|
|
122
|
+
const stats = await promises_1.default.stat(skillPath);
|
|
123
|
+
if (stats.isFile() && skillPath.endsWith('.md')) {
|
|
124
|
+
const skillMetadata = await this.claudeAdapter.extractMetadata(skillPath);
|
|
125
|
+
metadata.push(skillMetadata);
|
|
126
|
+
}
|
|
127
|
+
else if (stats.isDirectory()) {
|
|
128
|
+
const skillFiles = await this.claudeAdapter.discoverSkills(skillPath);
|
|
129
|
+
for (const filePath of skillFiles) {
|
|
130
|
+
try {
|
|
131
|
+
const skillMetadata = await this.claudeAdapter.extractMetadata(filePath);
|
|
132
|
+
metadata.push(skillMetadata);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
console.warn(`Failed to load metadata from ${filePath}:`, error);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
throw new Error(`Failed to load metadata from path ${skillPath}: ${error.message}`);
|
|
142
|
+
}
|
|
143
|
+
return metadata;
|
|
144
|
+
}
|
|
145
|
+
deduplicateMetadata(metadata) {
|
|
146
|
+
const seen = new Set();
|
|
147
|
+
const unique = [];
|
|
148
|
+
for (const item of metadata) {
|
|
149
|
+
if (!seen.has(item.name)) {
|
|
150
|
+
seen.add(item.name);
|
|
151
|
+
unique.push(item);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return unique;
|
|
155
|
+
}
|
|
156
|
+
async findSkillFile(skillName) {
|
|
157
|
+
const metadata = this.metadataCache.get(skillName);
|
|
158
|
+
if (!metadata) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
const possiblePaths = [
|
|
162
|
+
`./skills/${skillName}.md`,
|
|
163
|
+
`~/.claude/skills/${skillName}.md`,
|
|
164
|
+
`./${skillName}.md`
|
|
165
|
+
];
|
|
166
|
+
for (const possiblePath of possiblePaths) {
|
|
167
|
+
try {
|
|
168
|
+
const expandedPath = possiblePath.replace('~', process.env.HOME || '');
|
|
169
|
+
await promises_1.default.access(expandedPath);
|
|
170
|
+
return expandedPath;
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
isCacheExpired(key) {
|
|
178
|
+
const timestamp = this.cacheTimestamps.get(key);
|
|
179
|
+
if (!timestamp) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
return Date.now() - timestamp > this.defaultTTL;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
exports.ProgressiveSkillLoader = ProgressiveSkillLoader;
|
|
186
|
+
//# sourceMappingURL=progressive-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progressive-loader.js","sourceRoot":"","sources":["../../../src/skills/runtime/progressive-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { RuntimeRequirementsValidator, RuntimeInfo } from '../../types/skill-runtime.types';
|
|
2
|
+
export declare class SystemRuntimeValidator implements RuntimeRequirementsValidator {
|
|
3
|
+
validatePython(requirement: string): Promise<boolean>;
|
|
4
|
+
validateNode(requirement: string): Promise<boolean>;
|
|
5
|
+
validateDocker(): Promise<boolean>;
|
|
6
|
+
validateMemory(requirement: string): Promise<boolean>;
|
|
7
|
+
getCurrentRuntime(): Promise<RuntimeInfo>;
|
|
8
|
+
private compareVersions;
|
|
9
|
+
private compareVersionArrays;
|
|
10
|
+
private parseMemoryRequirement;
|
|
11
|
+
}
|
|
12
|
+
export declare class MockRuntimeValidator implements RuntimeRequirementsValidator {
|
|
13
|
+
private mockResults;
|
|
14
|
+
private mockRuntime;
|
|
15
|
+
constructor(mockResults?: Record<string, boolean>);
|
|
16
|
+
validatePython(requirement: string): Promise<boolean>;
|
|
17
|
+
validateNode(requirement: string): Promise<boolean>;
|
|
18
|
+
validateDocker(): Promise<boolean>;
|
|
19
|
+
validateMemory(requirement: string): Promise<boolean>;
|
|
20
|
+
getCurrentRuntime(): Promise<RuntimeInfo>;
|
|
21
|
+
setMockResult(component: string, result: boolean): void;
|
|
22
|
+
setMockRuntime(runtime: Partial<RuntimeInfo>): void;
|
|
23
|
+
}
|