@jclaw/core 0.1.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/dist/auto-skill/generator.d.ts +30 -0
- package/dist/auto-skill/generator.d.ts.map +1 -0
- package/dist/auto-skill/generator.js +262 -0
- package/dist/auto-skill/generator.js.map +1 -0
- package/dist/auto-skill/index.d.ts +11 -0
- package/dist/auto-skill/index.d.ts.map +1 -0
- package/dist/auto-skill/index.js +10 -0
- package/dist/auto-skill/index.js.map +1 -0
- package/dist/auto-skill/installer.d.ts +44 -0
- package/dist/auto-skill/installer.d.ts.map +1 -0
- package/dist/auto-skill/installer.js +201 -0
- package/dist/auto-skill/installer.js.map +1 -0
- package/dist/auto-skill/types.d.ts +179 -0
- package/dist/auto-skill/types.d.ts.map +1 -0
- package/dist/auto-skill/types.js +9 -0
- package/dist/auto-skill/types.js.map +1 -0
- package/dist/cli/commands/config.d.ts +16 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +119 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/exec.d.ts +12 -0
- package/dist/cli/commands/exec.d.ts.map +1 -0
- package/dist/cli/commands/exec.js +41 -0
- package/dist/cli/commands/exec.js.map +1 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +91 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/run.d.ts +9 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +13 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/context/index.d.ts +6 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +12 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/memsearch-client.d.ts +34 -0
- package/dist/context/memsearch-client.d.ts.map +1 -0
- package/dist/context/memsearch-client.js +182 -0
- package/dist/context/memsearch-client.js.map +1 -0
- package/dist/context/mock-client.d.ts +116 -0
- package/dist/context/mock-client.d.ts.map +1 -0
- package/dist/context/mock-client.js +150 -0
- package/dist/context/mock-client.js.map +1 -0
- package/dist/context/openviking-client.d.ts +87 -0
- package/dist/context/openviking-client.d.ts.map +1 -0
- package/dist/context/openviking-client.js +166 -0
- package/dist/context/openviking-client.js.map +1 -0
- package/dist/context/openviking-mcp-client.d.ts +29 -0
- package/dist/context/openviking-mcp-client.d.ts.map +1 -0
- package/dist/context/openviking-mcp-client.js +81 -0
- package/dist/context/openviking-mcp-client.js.map +1 -0
- package/dist/context/simple-memory-client.d.ts +43 -0
- package/dist/context/simple-memory-client.d.ts.map +1 -0
- package/dist/context/simple-memory-client.enhanced.d.ts +39 -0
- package/dist/context/simple-memory-client.enhanced.d.ts.map +1 -0
- package/dist/context/simple-memory-client.enhanced.js +207 -0
- package/dist/context/simple-memory-client.enhanced.js.map +1 -0
- package/dist/context/simple-memory-client.js +270 -0
- package/dist/context/simple-memory-client.js.map +1 -0
- package/dist/evolution/continuous.d.ts +127 -0
- package/dist/evolution/continuous.d.ts.map +1 -0
- package/dist/evolution/continuous.js +238 -0
- package/dist/evolution/continuous.js.map +1 -0
- package/dist/evolution/engine.d.ts +97 -0
- package/dist/evolution/engine.d.ts.map +1 -0
- package/dist/evolution/engine.js +187 -0
- package/dist/evolution/engine.js.map +1 -0
- package/dist/evolution/evolver-adapter.d.ts +104 -0
- package/dist/evolution/evolver-adapter.d.ts.map +1 -0
- package/dist/evolution/evolver-adapter.js +227 -0
- package/dist/evolution/evolver-adapter.js.map +1 -0
- package/dist/evolution/index.d.ts +9 -0
- package/dist/evolution/index.d.ts.map +1 -0
- package/dist/evolution/index.js +8 -0
- package/dist/evolution/index.js.map +1 -0
- package/dist/evolution/memory.d.ts +106 -0
- package/dist/evolution/memory.d.ts.map +1 -0
- package/dist/evolution/memory.js +232 -0
- package/dist/evolution/memory.js.map +1 -0
- package/dist/evolution/mutation.d.ts +66 -0
- package/dist/evolution/mutation.d.ts.map +1 -0
- package/dist/evolution/mutation.js +139 -0
- package/dist/evolution/mutation.js.map +1 -0
- package/dist/evolution/sandbox.d.ts +96 -0
- package/dist/evolution/sandbox.d.ts.map +1 -0
- package/dist/evolution/sandbox.js +194 -0
- package/dist/evolution/sandbox.js.map +1 -0
- package/dist/evolution/types.d.ts +93 -0
- package/dist/evolution/types.d.ts.map +1 -0
- package/dist/evolution/types.js +9 -0
- package/dist/evolution/types.js.map +1 -0
- package/dist/executor/index.d.ts +10 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/executor/index.js +10 -0
- package/dist/executor/index.js.map +1 -0
- package/dist/executor/interface.d.ts +9 -0
- package/dist/executor/interface.d.ts.map +1 -0
- package/dist/executor/interface.js +9 -0
- package/dist/executor/interface.js.map +1 -0
- package/dist/executor/local.d.ts +36 -0
- package/dist/executor/local.d.ts.map +1 -0
- package/dist/executor/local.js +95 -0
- package/dist/executor/local.js.map +1 -0
- package/dist/extension-system/capability-router.d.ts +106 -0
- package/dist/extension-system/capability-router.d.ts.map +1 -0
- package/dist/extension-system/capability-router.js +167 -0
- package/dist/extension-system/capability-router.js.map +1 -0
- package/dist/extension-system/index.d.ts +11 -0
- package/dist/extension-system/index.d.ts.map +1 -0
- package/dist/extension-system/index.js +11 -0
- package/dist/extension-system/index.js.map +1 -0
- package/dist/extension-system/loader.d.ts +93 -0
- package/dist/extension-system/loader.d.ts.map +1 -0
- package/dist/extension-system/loader.js +245 -0
- package/dist/extension-system/loader.js.map +1 -0
- package/dist/extension-system/registry.d.ts +112 -0
- package/dist/extension-system/registry.d.ts.map +1 -0
- package/dist/extension-system/registry.js +161 -0
- package/dist/extension-system/registry.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/network/client.d.ts +130 -0
- package/dist/network/client.d.ts.map +1 -0
- package/dist/network/client.js +230 -0
- package/dist/network/client.js.map +1 -0
- package/dist/network/index.d.ts +10 -0
- package/dist/network/index.d.ts.map +1 -0
- package/dist/network/index.js +10 -0
- package/dist/network/index.js.map +1 -0
- package/dist/network/protocol.d.ts +159 -0
- package/dist/network/protocol.d.ts.map +1 -0
- package/dist/network/protocol.js +118 -0
- package/dist/network/protocol.js.map +1 -0
- package/dist/runtime/agent.d.ts +124 -0
- package/dist/runtime/agent.d.ts.map +1 -0
- package/dist/runtime/agent.js +286 -0
- package/dist/runtime/agent.js.map +1 -0
- package/dist/runtime/agent_fixed.d.ts +39 -0
- package/dist/runtime/agent_fixed.d.ts.map +1 -0
- package/dist/runtime/agent_fixed.js +193 -0
- package/dist/runtime/agent_fixed.js.map +1 -0
- package/dist/runtime/index.d.ts +11 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +11 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/llm-client.d.ts +108 -0
- package/dist/runtime/llm-client.d.ts.map +1 -0
- package/dist/runtime/llm-client.js +125 -0
- package/dist/runtime/llm-client.js.map +1 -0
- package/dist/runtime/task-executor.d.ts +92 -0
- package/dist/runtime/task-executor.d.ts.map +1 -0
- package/dist/runtime/task-executor.js +203 -0
- package/dist/runtime/task-executor.js.map +1 -0
- package/dist/skill-sh/adapter.d.ts +40 -0
- package/dist/skill-sh/adapter.d.ts.map +1 -0
- package/dist/skill-sh/adapter.js +258 -0
- package/dist/skill-sh/adapter.js.map +1 -0
- package/dist/skill-sh/converter.d.ts +37 -0
- package/dist/skill-sh/converter.d.ts.map +1 -0
- package/dist/skill-sh/converter.js +175 -0
- package/dist/skill-sh/converter.js.map +1 -0
- package/dist/skill-sh/discovery.d.ts +29 -0
- package/dist/skill-sh/discovery.d.ts.map +1 -0
- package/dist/skill-sh/discovery.js +189 -0
- package/dist/skill-sh/discovery.js.map +1 -0
- package/dist/skill-sh/index.d.ts +19 -0
- package/dist/skill-sh/index.d.ts.map +1 -0
- package/dist/skill-sh/index.js +20 -0
- package/dist/skill-sh/index.js.map +1 -0
- package/dist/skill-sh/quality.d.ts +51 -0
- package/dist/skill-sh/quality.d.ts.map +1 -0
- package/dist/skill-sh/quality.js +146 -0
- package/dist/skill-sh/quality.js.map +1 -0
- package/dist/skill-sh/registry.d.ts +58 -0
- package/dist/skill-sh/registry.d.ts.map +1 -0
- package/dist/skill-sh/registry.js +118 -0
- package/dist/skill-sh/registry.js.map +1 -0
- package/dist/skill-sh/types.d.ts +228 -0
- package/dist/skill-sh/types.d.ts.map +1 -0
- package/dist/skill-sh/types.js +9 -0
- package/dist/skill-sh/types.js.map +1 -0
- package/dist/types.d.ts +199 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AutoSkill Generator - Enhanced Version
|
|
3
|
+
*
|
|
4
|
+
* Improved code generation with templates, validation, and evolution
|
|
5
|
+
*
|
|
6
|
+
* @module @jclaw/core/auto-skill/generator
|
|
7
|
+
*/
|
|
8
|
+
import type { Task } from '../types.js';
|
|
9
|
+
import type { ExtensionRegistry } from '../extension-system/registry.js';
|
|
10
|
+
import type { LLMClient } from '../runtime/llm-client.js';
|
|
11
|
+
import type { EvolutionEngine } from '../evolution/engine.js';
|
|
12
|
+
import type { AutoSkillConfig, CapabilityGap, DiscoveryResult, GeneratedExtension, GenerationResult } from './types.js';
|
|
13
|
+
export declare class AutoSkillGenerator {
|
|
14
|
+
private llmClient;
|
|
15
|
+
private registry;
|
|
16
|
+
private evolutionEngine;
|
|
17
|
+
private readonly config;
|
|
18
|
+
constructor(llmClient: LLMClient, registry: ExtensionRegistry, evolutionEngine: EvolutionEngine, config?: Partial<AutoSkillConfig>);
|
|
19
|
+
discoverCapabilities(task: Task): Promise<DiscoveryResult>;
|
|
20
|
+
generateExtension(gap: CapabilityGap, attempt?: number): Promise<GenerationResult>;
|
|
21
|
+
private findTemplateForCapability;
|
|
22
|
+
private generateCode;
|
|
23
|
+
private optimizeCode;
|
|
24
|
+
private validateCode;
|
|
25
|
+
saveExtension(extension: GeneratedExtension): Promise<string>;
|
|
26
|
+
}
|
|
27
|
+
export declare function createAutoSkillGenerator(llmClient: LLMClient, registry: ExtensionRegistry, evolutionEngine: EvolutionEngine, config?: Partial<AutoSkillConfig>): AutoSkillGenerator;
|
|
28
|
+
export declare function addCodeTemplate(name: string, template: string): void;
|
|
29
|
+
export declare function getAvailableTemplates(): string[];
|
|
30
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/auto-skill/generator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAoFpB,qBAAa,kBAAkB;IAI3B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,eAAe;IALzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;gBAGzC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,iBAAiB,EAC3B,eAAe,EAAE,eAAe,EACxC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAK7B,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC;IAyC1D,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,SAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8CnF,OAAO,CAAC,yBAAyB;YAUnB,YAAY;YAqBZ,YAAY;YAuBZ,YAAY;IAUpB,aAAa,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;CAapE;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,iBAAiB,EAC3B,eAAe,EAAE,eAAe,EAChC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAChC,kBAAkB,CAEpB;AAGD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEpE;AAGD,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AutoSkill Generator - Enhanced Version
|
|
3
|
+
*
|
|
4
|
+
* Improved code generation with templates, validation, and evolution
|
|
5
|
+
*
|
|
6
|
+
* @module @jclaw/core/auto-skill/generator
|
|
7
|
+
*/
|
|
8
|
+
import { writeFile, mkdir } from 'fs/promises';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
const DEFAULT_CONFIG = {
|
|
11
|
+
enabled: true,
|
|
12
|
+
maxGenerationAttempts: 3,
|
|
13
|
+
storageDir: './.jclaw/auto-skills',
|
|
14
|
+
autoInstall: true,
|
|
15
|
+
minFitness: 0.7,
|
|
16
|
+
generationTimeout: 120000,
|
|
17
|
+
enableEvolution: true,
|
|
18
|
+
};
|
|
19
|
+
// Pre-built code templates for common capabilities
|
|
20
|
+
const CODE_TEMPLATES = {
|
|
21
|
+
http_client: `/**
|
|
22
|
+
* Auto-generated HTTP Client Extension
|
|
23
|
+
*/
|
|
24
|
+
import type { Extension, AgentRuntime } from '@jclaw/core';
|
|
25
|
+
|
|
26
|
+
export const autoHttpClientExtension: Extension = {
|
|
27
|
+
name: 'auto-http-client',
|
|
28
|
+
version: '1.0.0',
|
|
29
|
+
description: 'HTTP client for making API requests',
|
|
30
|
+
capabilities: [
|
|
31
|
+
{
|
|
32
|
+
name: 'http_client',
|
|
33
|
+
description: 'Make HTTP requests to external APIs',
|
|
34
|
+
handler: async (options: { url: string; method?: string; headers?: Record<string, string>; body?: any }) => {
|
|
35
|
+
const response = await fetch(options.url, {
|
|
36
|
+
method: options.method || 'GET',
|
|
37
|
+
headers: { 'Content-Type': 'application/json', ...options.headers },
|
|
38
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
39
|
+
});
|
|
40
|
+
return await response.json();
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
async install(_runtime: AgentRuntime): Promise<void> {
|
|
45
|
+
console.log('Installing HTTP client capability...');
|
|
46
|
+
},
|
|
47
|
+
async uninstall(): Promise<void> {
|
|
48
|
+
console.log('Uninstalling HTTP client capability...');
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export default autoHttpClientExtension;`,
|
|
53
|
+
file_operations: `/**
|
|
54
|
+
* Auto-generated File Operations Extension
|
|
55
|
+
*/
|
|
56
|
+
import type { Extension, AgentRuntime } from '@jclaw/core';
|
|
57
|
+
import { readFile, writeFile, mkdir, readdir } from 'fs/promises';
|
|
58
|
+
import { existsSync } from 'fs';
|
|
59
|
+
|
|
60
|
+
export const autoFileOpsExtension: Extension = {
|
|
61
|
+
name: 'auto-file-operations',
|
|
62
|
+
version: '1.0.0',
|
|
63
|
+
description: 'File system operations',
|
|
64
|
+
capabilities: [
|
|
65
|
+
{
|
|
66
|
+
name: 'file_read',
|
|
67
|
+
description: 'Read file contents',
|
|
68
|
+
handler: async (path: string) => await readFile(path, 'utf-8'),
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'file_write',
|
|
72
|
+
description: 'Write file contents',
|
|
73
|
+
handler: async (path: string, content: string) => {
|
|
74
|
+
await writeFile(path, content, 'utf-8');
|
|
75
|
+
return { success: true };
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
async install(_runtime: AgentRuntime): Promise<void> {
|
|
80
|
+
console.log('Installing file operations capability...');
|
|
81
|
+
},
|
|
82
|
+
async uninstall(): Promise<void> {
|
|
83
|
+
console.log('Uninstalling file operations capability...');
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export default autoFileOpsExtension;`,
|
|
88
|
+
};
|
|
89
|
+
export class AutoSkillGenerator {
|
|
90
|
+
llmClient;
|
|
91
|
+
registry;
|
|
92
|
+
evolutionEngine;
|
|
93
|
+
config;
|
|
94
|
+
constructor(llmClient, registry, evolutionEngine, config) {
|
|
95
|
+
this.llmClient = llmClient;
|
|
96
|
+
this.registry = registry;
|
|
97
|
+
this.evolutionEngine = evolutionEngine;
|
|
98
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
99
|
+
}
|
|
100
|
+
async discoverCapabilities(task) {
|
|
101
|
+
const existingCapabilities = this.registry.getCapabilityNames();
|
|
102
|
+
const prompt = `Analyze the task and identify missing capabilities.
|
|
103
|
+
|
|
104
|
+
Task: ${task.prompt}
|
|
105
|
+
|
|
106
|
+
Existing Capabilities:
|
|
107
|
+
${existingCapabilities.map(c => `- ${c}`).join('\n')}
|
|
108
|
+
|
|
109
|
+
Return JSON:
|
|
110
|
+
{
|
|
111
|
+
"taskAnalysis": "Brief analysis",
|
|
112
|
+
"gaps": [
|
|
113
|
+
{
|
|
114
|
+
"capability": "snake_case_name",
|
|
115
|
+
"description": "What this does",
|
|
116
|
+
"complexity": "simple|medium|complex",
|
|
117
|
+
"reasoning": "Why needed"
|
|
118
|
+
}
|
|
119
|
+
],
|
|
120
|
+
"suggestedCapabilities": ["existing_cap"]
|
|
121
|
+
}`;
|
|
122
|
+
try {
|
|
123
|
+
const response = await this.llmClient.chat([
|
|
124
|
+
{ role: 'system', content: 'You are a capability analyzer.' },
|
|
125
|
+
{ role: 'user', content: prompt }
|
|
126
|
+
]);
|
|
127
|
+
const content = response.content;
|
|
128
|
+
const jsonMatch = content.match(/{[\s\S]*}/);
|
|
129
|
+
if (!jsonMatch)
|
|
130
|
+
throw new Error('No JSON found');
|
|
131
|
+
return JSON.parse(jsonMatch[0]);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.error('Discovery failed:', error);
|
|
135
|
+
return { taskAnalysis: 'Failed to analyze', gaps: [], suggestedCapabilities: [] };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async generateExtension(gap, attempt = 1) {
|
|
139
|
+
const steps = [
|
|
140
|
+
{ name: 'analyze', status: 'success' },
|
|
141
|
+
{ name: 'generate', status: 'running' },
|
|
142
|
+
{ name: 'validate', status: 'pending' },
|
|
143
|
+
];
|
|
144
|
+
try {
|
|
145
|
+
const templateKey = this.findTemplateForCapability(gap.capability);
|
|
146
|
+
let code;
|
|
147
|
+
if (templateKey) {
|
|
148
|
+
code = CODE_TEMPLATES[templateKey] || '';
|
|
149
|
+
console.log(' Using template for:', templateKey);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
code = await this.generateCode(gap);
|
|
153
|
+
}
|
|
154
|
+
steps[1].status = 'success';
|
|
155
|
+
steps[2].status = 'running';
|
|
156
|
+
const validation = await this.validateCode(code);
|
|
157
|
+
if (!validation.valid) {
|
|
158
|
+
steps[2].status = 'failed';
|
|
159
|
+
if (attempt < this.config.maxGenerationAttempts) {
|
|
160
|
+
return this.generateExtension(gap, attempt + 1);
|
|
161
|
+
}
|
|
162
|
+
return { success: false, steps, error: validation.error };
|
|
163
|
+
}
|
|
164
|
+
steps[2].status = 'success';
|
|
165
|
+
if (this.config.enableEvolution) {
|
|
166
|
+
code = await this.optimizeCode(code, gap);
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
success: true,
|
|
170
|
+
extension: { name: `auto-${gap.capability}`, code, gap, version: '1.0.0', generatedAt: new Date(), model: 'gpt-4o' },
|
|
171
|
+
steps
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
176
|
+
return { success: false, steps, error: errorMessage };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
findTemplateForCapability(capability) {
|
|
180
|
+
const templates = Object.keys(CODE_TEMPLATES);
|
|
181
|
+
for (const template of templates) {
|
|
182
|
+
if (capability.includes(template) || template.includes(capability)) {
|
|
183
|
+
return template;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
async generateCode(gap) {
|
|
189
|
+
const prompt = `Generate a complete JClaw Extension for capability: ${gap.capability}
|
|
190
|
+
|
|
191
|
+
Description: ${gap.description}
|
|
192
|
+
|
|
193
|
+
Requirements:
|
|
194
|
+
1. Implement Extension interface from '@jclaw/core'
|
|
195
|
+
2. Include install() and uninstall() methods
|
|
196
|
+
3. Export as default
|
|
197
|
+
4. Use TypeScript
|
|
198
|
+
5. Add proper error handling`;
|
|
199
|
+
const response = await this.llmClient.chat([
|
|
200
|
+
{ role: 'system', content: 'You are a TypeScript expert.' },
|
|
201
|
+
{ role: 'user', content: prompt }
|
|
202
|
+
]);
|
|
203
|
+
const codeMatch = response.content.match(/```typescript\n([\s\S]*?)```/);
|
|
204
|
+
return codeMatch && codeMatch[1] ? codeMatch[1].trim() : response.content.trim();
|
|
205
|
+
}
|
|
206
|
+
async optimizeCode(code, gap) {
|
|
207
|
+
const prompt = `Optimize this TypeScript code for better quality:
|
|
208
|
+
|
|
209
|
+
${code}
|
|
210
|
+
|
|
211
|
+
Focus on:
|
|
212
|
+
1. Error handling
|
|
213
|
+
2. Type safety
|
|
214
|
+
3. Performance
|
|
215
|
+
4. Readability`;
|
|
216
|
+
try {
|
|
217
|
+
const response = await this.llmClient.chat([
|
|
218
|
+
{ role: 'system', content: 'You are a code optimizer.' },
|
|
219
|
+
{ role: 'user', content: prompt }
|
|
220
|
+
]);
|
|
221
|
+
const codeMatch = response.content.match(/```typescript\n([\s\S]*?)```/);
|
|
222
|
+
return codeMatch && codeMatch[1] ? codeMatch[1].trim() : response.content.trim();
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return code;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
async validateCode(code) {
|
|
229
|
+
const required = ['export', 'install', 'uninstall', 'capabilities'];
|
|
230
|
+
for (const part of required) {
|
|
231
|
+
if (!code.includes(part)) {
|
|
232
|
+
return { valid: false, error: `Missing: ${part}` };
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return { valid: true };
|
|
236
|
+
}
|
|
237
|
+
async saveExtension(extension) {
|
|
238
|
+
const dir = join(this.config.storageDir, extension.name);
|
|
239
|
+
await mkdir(join(dir, 'src'), { recursive: true });
|
|
240
|
+
await writeFile(join(dir, 'src', 'index.ts'), extension.code);
|
|
241
|
+
await writeFile(join(dir, 'package.json'), JSON.stringify({
|
|
242
|
+
name: extension.name,
|
|
243
|
+
version: extension.version,
|
|
244
|
+
type: 'module',
|
|
245
|
+
main: 'dist/index.js',
|
|
246
|
+
dependencies: { '@jclaw/core': '^0.1.0' }
|
|
247
|
+
}, null, 2));
|
|
248
|
+
return dir;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
export function createAutoSkillGenerator(llmClient, registry, evolutionEngine, config) {
|
|
252
|
+
return new AutoSkillGenerator(llmClient, registry, evolutionEngine, config);
|
|
253
|
+
}
|
|
254
|
+
// Add more code templates
|
|
255
|
+
export function addCodeTemplate(name, template) {
|
|
256
|
+
CODE_TEMPLATES[name] = template;
|
|
257
|
+
}
|
|
258
|
+
// Get all available templates
|
|
259
|
+
export function getAvailableTemplates() {
|
|
260
|
+
return Object.keys(CODE_TEMPLATES);
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/auto-skill/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AutoSkill Module
|
|
3
|
+
*
|
|
4
|
+
* Automatic skill discovery, generation, and installation.
|
|
5
|
+
*
|
|
6
|
+
* @module @jclaw/core/auto-skill
|
|
7
|
+
*/
|
|
8
|
+
export { AutoSkillGenerator, createAutoSkillGenerator, } from './generator.js';
|
|
9
|
+
export { AutoSkillInstaller, createAutoSkillInstaller, } from './installer.js';
|
|
10
|
+
export type { AutoSkillConfig, CapabilityGap, DiscoveryResult, GeneratedExtension, GenerationResult, GenerationStep, InstallationResult, SkillUsageStats, AutoSkillMetadata, SkillVersion, } from './types.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auto-skill/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,eAAe,EACf,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,YAAY,GACb,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AutoSkill Module
|
|
3
|
+
*
|
|
4
|
+
* Automatic skill discovery, generation, and installation.
|
|
5
|
+
*
|
|
6
|
+
* @module @jclaw/core/auto-skill
|
|
7
|
+
*/
|
|
8
|
+
export { AutoSkillGenerator, createAutoSkillGenerator, } from './generator.js';
|
|
9
|
+
export { AutoSkillInstaller, createAutoSkillInstaller, } from './installer.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auto-skill/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AutoSkill Installer
|
|
3
|
+
*
|
|
4
|
+
* Compiles and installs generated skills.
|
|
5
|
+
*
|
|
6
|
+
* @module @jclaw/core/auto-skill/installer
|
|
7
|
+
*/
|
|
8
|
+
import type { ExtensionRegistry } from '../extension-system/registry.js';
|
|
9
|
+
import type { GeneratedExtension, InstallationResult } from './types.js';
|
|
10
|
+
export declare class AutoSkillInstaller {
|
|
11
|
+
private registry;
|
|
12
|
+
private storageDir;
|
|
13
|
+
constructor(registry: ExtensionRegistry, storageDir?: string);
|
|
14
|
+
/**
|
|
15
|
+
* 编译并安装生成的 Extension
|
|
16
|
+
*/
|
|
17
|
+
install(extension: GeneratedExtension): Promise<InstallationResult>;
|
|
18
|
+
/**
|
|
19
|
+
* 保存源文件
|
|
20
|
+
*/
|
|
21
|
+
private saveSourceFiles;
|
|
22
|
+
/**
|
|
23
|
+
* 安装 npm 依赖
|
|
24
|
+
*/
|
|
25
|
+
private installDependencies;
|
|
26
|
+
/**
|
|
27
|
+
* 编译 TypeScript
|
|
28
|
+
*/
|
|
29
|
+
private compileExtension;
|
|
30
|
+
/**
|
|
31
|
+
* 验证 Extension 接口
|
|
32
|
+
*/
|
|
33
|
+
private isValidExtension;
|
|
34
|
+
/**
|
|
35
|
+
* 卸载已安装的 skill
|
|
36
|
+
*/
|
|
37
|
+
uninstall(skillName: string): Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* 列出已安装的 auto skills
|
|
40
|
+
*/
|
|
41
|
+
listInstalled(): Promise<string[]>;
|
|
42
|
+
}
|
|
43
|
+
export declare function createAutoSkillInstaller(registry: ExtensionRegistry, storageDir?: string): AutoSkillInstaller;
|
|
44
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/auto-skill/installer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEzE,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,UAAU;gBADV,QAAQ,EAAE,iBAAiB,EAC3B,UAAU,GAAE,MAA+B;IAGrD;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiEzE;;OAEG;YACW,eAAe;IAgD7B;;OAEG;YACW,mBAAmB;IAYjC;;OAEG;YACW,gBAAgB;IAe9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAepD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAYzC;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,iBAAiB,EAC3B,UAAU,CAAC,EAAE,MAAM,GAClB,kBAAkB,CAEpB"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AutoSkill Installer
|
|
3
|
+
*
|
|
4
|
+
* Compiles and installs generated skills.
|
|
5
|
+
*
|
|
6
|
+
* @module @jclaw/core/auto-skill/installer
|
|
7
|
+
*/
|
|
8
|
+
import { execSync } from 'child_process';
|
|
9
|
+
import { writeFile, mkdir, rm } from 'fs/promises';
|
|
10
|
+
import { existsSync } from 'fs';
|
|
11
|
+
import { join } from 'path';
|
|
12
|
+
import { readdir } from 'fs/promises';
|
|
13
|
+
export class AutoSkillInstaller {
|
|
14
|
+
registry;
|
|
15
|
+
storageDir;
|
|
16
|
+
constructor(registry, storageDir = './.jclaw/auto-skills') {
|
|
17
|
+
this.registry = registry;
|
|
18
|
+
this.storageDir = storageDir;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 编译并安装生成的 Extension
|
|
22
|
+
*/
|
|
23
|
+
async install(extension) {
|
|
24
|
+
const extensionDir = join(this.storageDir, extension.name);
|
|
25
|
+
try {
|
|
26
|
+
// 1. 保存源代码
|
|
27
|
+
await this.saveSourceFiles(extensionDir, extension);
|
|
28
|
+
// 2. 安装依赖
|
|
29
|
+
await this.installDependencies(extensionDir);
|
|
30
|
+
// 3. 编译 TypeScript
|
|
31
|
+
const compileOutput = await this.compileExtension(extensionDir);
|
|
32
|
+
// 4. 验证编译结果
|
|
33
|
+
const distPath = join(extensionDir, 'dist', 'index.js');
|
|
34
|
+
if (!existsSync(distPath)) {
|
|
35
|
+
throw new Error('Compilation failed: dist/index.js not found');
|
|
36
|
+
}
|
|
37
|
+
// 5. 动态加载并注册
|
|
38
|
+
const module = await import(distPath);
|
|
39
|
+
const extensionInstance = module.default;
|
|
40
|
+
if (!extensionInstance) {
|
|
41
|
+
throw new Error('Extension does not export default');
|
|
42
|
+
}
|
|
43
|
+
// 验证 Extension 接口
|
|
44
|
+
if (!this.isValidExtension(extensionInstance)) {
|
|
45
|
+
throw new Error('Extension does not implement required interface');
|
|
46
|
+
}
|
|
47
|
+
// 注册到系统
|
|
48
|
+
this.registry.register(extensionInstance);
|
|
49
|
+
return {
|
|
50
|
+
success: true,
|
|
51
|
+
extensionName: extension.name,
|
|
52
|
+
installPath: extensionDir,
|
|
53
|
+
compileOutput,
|
|
54
|
+
validationResult: {
|
|
55
|
+
passed: true,
|
|
56
|
+
errors: []
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
62
|
+
// 清理失败的安装
|
|
63
|
+
try {
|
|
64
|
+
await rm(extensionDir, { recursive: true, force: true });
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// 忽略清理错误
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
success: false,
|
|
71
|
+
extensionName: extension.name,
|
|
72
|
+
installPath: extensionDir,
|
|
73
|
+
error: errorMessage
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 保存源文件
|
|
79
|
+
*/
|
|
80
|
+
async saveSourceFiles(extensionDir, extension) {
|
|
81
|
+
// 创建目录结构
|
|
82
|
+
const srcDir = join(extensionDir, 'src');
|
|
83
|
+
await mkdir(srcDir, { recursive: true });
|
|
84
|
+
// 保存主代码文件
|
|
85
|
+
await writeFile(join(srcDir, 'index.ts'), extension.code);
|
|
86
|
+
// 创建 package.json
|
|
87
|
+
const packageJson = {
|
|
88
|
+
name: extension.name,
|
|
89
|
+
version: extension.version,
|
|
90
|
+
type: 'module',
|
|
91
|
+
main: 'dist/index.js',
|
|
92
|
+
types: 'dist/index.d.ts',
|
|
93
|
+
dependencies: {
|
|
94
|
+
'@jclaw/core': '^0.1.0'
|
|
95
|
+
},
|
|
96
|
+
devDependencies: {
|
|
97
|
+
typescript: '^5.3.0'
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
await writeFile(join(extensionDir, 'package.json'), JSON.stringify(packageJson, null, 2));
|
|
101
|
+
// 创建 tsconfig.json
|
|
102
|
+
const tsConfig = {
|
|
103
|
+
compilerOptions: {
|
|
104
|
+
target: 'ES2022',
|
|
105
|
+
module: 'NodeNext',
|
|
106
|
+
moduleResolution: 'NodeNext',
|
|
107
|
+
strict: true,
|
|
108
|
+
esModuleInterop: true,
|
|
109
|
+
skipLibCheck: true,
|
|
110
|
+
forceConsistentCasingInFileNames: true,
|
|
111
|
+
declaration: true,
|
|
112
|
+
outDir: 'dist'
|
|
113
|
+
},
|
|
114
|
+
include: ['src/**/*']
|
|
115
|
+
};
|
|
116
|
+
await writeFile(join(extensionDir, 'tsconfig.json'), JSON.stringify(tsConfig, null, 2));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 安装 npm 依赖
|
|
120
|
+
*/
|
|
121
|
+
async installDependencies(extensionDir) {
|
|
122
|
+
try {
|
|
123
|
+
execSync('npm install', {
|
|
124
|
+
cwd: extensionDir,
|
|
125
|
+
stdio: 'pipe',
|
|
126
|
+
timeout: 60000
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
throw new Error(`Failed to install dependencies: ${error}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 编译 TypeScript
|
|
135
|
+
*/
|
|
136
|
+
async compileExtension(extensionDir) {
|
|
137
|
+
try {
|
|
138
|
+
const output = execSync('npx tsc', {
|
|
139
|
+
cwd: extensionDir,
|
|
140
|
+
stdio: 'pipe',
|
|
141
|
+
encoding: 'utf-8',
|
|
142
|
+
timeout: 60000
|
|
143
|
+
});
|
|
144
|
+
return output;
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
148
|
+
throw new Error(`Compilation failed: ${errorMessage}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* 验证 Extension 接口
|
|
153
|
+
*/
|
|
154
|
+
isValidExtension(obj) {
|
|
155
|
+
if (typeof obj !== 'object' || obj === null) {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
const ext = obj;
|
|
159
|
+
return (typeof ext.name === 'string' &&
|
|
160
|
+
typeof ext.version === 'string' &&
|
|
161
|
+
typeof ext.description === 'string' &&
|
|
162
|
+
Array.isArray(ext.capabilities) &&
|
|
163
|
+
typeof ext.install === 'function' &&
|
|
164
|
+
typeof ext.uninstall === 'function');
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* 卸载已安装的 skill
|
|
168
|
+
*/
|
|
169
|
+
async uninstall(skillName) {
|
|
170
|
+
try {
|
|
171
|
+
// 从 registry 注销
|
|
172
|
+
this.registry.unregister(skillName);
|
|
173
|
+
// 删除文件
|
|
174
|
+
const extensionDir = join(this.storageDir, skillName);
|
|
175
|
+
await rm(extensionDir, { recursive: true, force: true });
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* 列出已安装的 auto skills
|
|
184
|
+
*/
|
|
185
|
+
async listInstalled() {
|
|
186
|
+
if (!existsSync(this.storageDir)) {
|
|
187
|
+
return [];
|
|
188
|
+
}
|
|
189
|
+
try {
|
|
190
|
+
const items = await readdir(this.storageDir);
|
|
191
|
+
return items;
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return [];
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
export function createAutoSkillInstaller(registry, storageDir) {
|
|
199
|
+
return new AutoSkillInstaller(registry, storageDir);
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/auto-skill/installer.ts"],"names":[],"mappings":"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"}
|