genieceo 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/DEVELOPMENT.md +240 -0
- package/LICENSE +21 -0
- package/README.md +443 -0
- package/config.example.json +28 -0
- package/dist/agent/context.d.ts +38 -0
- package/dist/agent/context.d.ts.map +1 -0
- package/dist/agent/context.js +131 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/index.d.ts +10 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +54 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/loop.d.ts +40 -0
- package/dist/agent/loop.d.ts.map +1 -0
- package/dist/agent/loop.js +104 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/subagent.d.ts +35 -0
- package/dist/agent/subagent.d.ts.map +1 -0
- package/dist/agent/subagent.js +96 -0
- package/dist/agent/subagent.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +8 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +161 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +56 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/onboard.d.ts +6 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -0
- package/dist/cli/commands/onboard.js +277 -0
- package/dist/cli/commands/onboard.js.map +1 -0
- package/dist/cli/commands/status.d.ts +6 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +107 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +49 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/manager.d.ts +43 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +147 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/schema.d.ts +179 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +74 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/providers/llm.d.ts +46 -0
- package/dist/providers/llm.d.ts.map +1 -0
- package/dist/providers/llm.js +175 -0
- package/dist/providers/llm.js.map +1 -0
- package/dist/skills/loader.d.ts +49 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +218 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/tools/base.d.ts +42 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +90 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/filesystem.d.ts +17 -0
- package/dist/tools/filesystem.d.ts.map +1 -0
- package/dist/tools/filesystem.js +117 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/shell.d.ts +8 -0
- package/dist/tools/shell.d.ts.map +1 -0
- package/dist/tools/shell.js +79 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/spawn.d.ts +8 -0
- package/dist/tools/spawn.d.ts.map +1 -0
- package/dist/tools/spawn.js +23 -0
- package/dist/tools/spawn.js.map +1 -0
- package/dist/tools/web.d.ts +8 -0
- package/dist/tools/web.d.ts.map +1 -0
- package/dist/tools/web.js +194 -0
- package/dist/tools/web.js.map +1 -0
- package/dist/types/index.d.ts +51 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/workspace/manager.d.ts +38 -0
- package/dist/workspace/manager.d.ts.map +1 -0
- package/dist/workspace/manager.js +140 -0
- package/dist/workspace/manager.js.map +1 -0
- package/docs/ONBOARDING.md +229 -0
- package/docs/WEB_SEARCH.md +365 -0
- package/package.json +38 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Config } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* LLM Provider using @mariozechner/pi-ai
|
|
4
|
+
* Provides unified interface for multiple LLM providers with automatic model discovery
|
|
5
|
+
*/
|
|
6
|
+
export declare class LLMProvider {
|
|
7
|
+
private config;
|
|
8
|
+
constructor(config: Config);
|
|
9
|
+
/**
|
|
10
|
+
* Get the appropriate model instance based on config
|
|
11
|
+
*/
|
|
12
|
+
private getModelInstance;
|
|
13
|
+
/**
|
|
14
|
+
* Get available providers
|
|
15
|
+
*/
|
|
16
|
+
getAvailableProviders(): string[];
|
|
17
|
+
/**
|
|
18
|
+
* Get available models for a provider
|
|
19
|
+
*/
|
|
20
|
+
getAvailableModels(provider: string): Array<{
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
}>;
|
|
24
|
+
/**
|
|
25
|
+
* Generate text with automatic tool calling
|
|
26
|
+
*/
|
|
27
|
+
generate(messages: any[], tools: Record<string, any>, maxSteps?: number): Promise<{
|
|
28
|
+
text: string;
|
|
29
|
+
toolCalls: any[];
|
|
30
|
+
toolResults: any[];
|
|
31
|
+
finishReason: string;
|
|
32
|
+
usage: any;
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Get API key for provider
|
|
36
|
+
*/
|
|
37
|
+
private getApiKey;
|
|
38
|
+
/**
|
|
39
|
+
* Validate configuration
|
|
40
|
+
*/
|
|
41
|
+
validateConfig(): {
|
|
42
|
+
valid: boolean;
|
|
43
|
+
errors?: string[];
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/providers/llm.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,qBAAqB,IAAI,MAAM,EAAE;IAIjC;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBzE;;OAEG;IACG,QAAQ,CACZ,QAAQ,EAAE,GAAG,EAAE,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QACT,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,GAAG,EAAE,CAAC;QACjB,WAAW,EAAE,GAAG,EAAE,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,GAAG,CAAC;KACZ,CAAC;IAkEF;;OAEG;IACH,OAAO,CAAC,SAAS;IAWjB;;OAEG;IACH,cAAc,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;CA8CxD"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LLMProvider = void 0;
|
|
4
|
+
const pi_ai_1 = require("@mariozechner/pi-ai");
|
|
5
|
+
/**
|
|
6
|
+
* LLM Provider using @mariozechner/pi-ai
|
|
7
|
+
* Provides unified interface for multiple LLM providers with automatic model discovery
|
|
8
|
+
*/
|
|
9
|
+
class LLMProvider {
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get the appropriate model instance based on config
|
|
15
|
+
*/
|
|
16
|
+
getModelInstance() {
|
|
17
|
+
const [provider, modelId] = this.config.model.split(':');
|
|
18
|
+
if (!modelId) {
|
|
19
|
+
throw new Error('Invalid model format. Use "provider:model" (e.g., "openai:gpt-4o")');
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
// pi-ai automatically handles model discovery and validation
|
|
23
|
+
return (0, pi_ai_1.getModel)(provider, modelId);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
throw new Error(`Failed to get model ${this.config.model}: ${error instanceof Error ? error.message : error}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get available providers
|
|
31
|
+
*/
|
|
32
|
+
getAvailableProviders() {
|
|
33
|
+
return (0, pi_ai_1.getProviders)();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get available models for a provider
|
|
37
|
+
*/
|
|
38
|
+
getAvailableModels(provider) {
|
|
39
|
+
try {
|
|
40
|
+
// Validate provider exists
|
|
41
|
+
const availableProviders = (0, pi_ai_1.getProviders)();
|
|
42
|
+
if (!availableProviders.includes(provider)) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
// Safe cast: we validated the provider exists in the providers list
|
|
46
|
+
// @ts-ignore - provider is validated to exist in the providers list
|
|
47
|
+
const models = (0, pi_ai_1.getModels)(provider);
|
|
48
|
+
return models.map(m => ({ id: m.id, name: m.name }));
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Generate text with automatic tool calling
|
|
56
|
+
*/
|
|
57
|
+
async generate(messages, tools, maxSteps) {
|
|
58
|
+
try {
|
|
59
|
+
const model = this.getModelInstance();
|
|
60
|
+
// Convert tools to pi-ai format
|
|
61
|
+
const piTools = Object.entries(tools).map(([name, tool]) => ({
|
|
62
|
+
name,
|
|
63
|
+
description: tool.description || '',
|
|
64
|
+
parameters: tool.parameters || {},
|
|
65
|
+
}));
|
|
66
|
+
// Convert messages to pi-ai Context format
|
|
67
|
+
const context = {
|
|
68
|
+
messages: messages.map(msg => {
|
|
69
|
+
if (typeof msg.content === 'string') {
|
|
70
|
+
return {
|
|
71
|
+
role: msg.role,
|
|
72
|
+
content: msg.content,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return msg;
|
|
76
|
+
}),
|
|
77
|
+
tools: piTools.length > 0 ? piTools : undefined,
|
|
78
|
+
};
|
|
79
|
+
// Get API key based on provider
|
|
80
|
+
const [provider] = this.config.model.split(':');
|
|
81
|
+
const apiKey = this.getApiKey(provider);
|
|
82
|
+
// Use complete() for synchronous generation
|
|
83
|
+
const response = await (0, pi_ai_1.complete)(model, context, {
|
|
84
|
+
apiKey,
|
|
85
|
+
});
|
|
86
|
+
// Extract text from response
|
|
87
|
+
const textBlocks = response.content.filter(block => block.type === 'text');
|
|
88
|
+
const text = textBlocks.map(block => block.text).join('\n');
|
|
89
|
+
// Extract tool calls
|
|
90
|
+
const toolCalls = response.content
|
|
91
|
+
.filter(block => block.type === 'toolCall')
|
|
92
|
+
.map(block => {
|
|
93
|
+
const toolCall = block;
|
|
94
|
+
return {
|
|
95
|
+
toolCallId: toolCall.id,
|
|
96
|
+
toolName: toolCall.name,
|
|
97
|
+
args: toolCall.arguments,
|
|
98
|
+
};
|
|
99
|
+
});
|
|
100
|
+
return {
|
|
101
|
+
text,
|
|
102
|
+
toolCalls,
|
|
103
|
+
toolResults: [], // pi-ai handles tool results separately
|
|
104
|
+
finishReason: response.stopReason,
|
|
105
|
+
usage: {
|
|
106
|
+
promptTokens: response.usage.input,
|
|
107
|
+
completionTokens: response.usage.output,
|
|
108
|
+
totalTokens: response.usage.input + response.usage.output,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw new Error(`LLM generation failed: ${error instanceof Error ? error.message : error}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get API key for provider
|
|
118
|
+
*/
|
|
119
|
+
getApiKey(provider) {
|
|
120
|
+
switch (provider) {
|
|
121
|
+
case 'openai':
|
|
122
|
+
return this.config.llm.openai.apiKey;
|
|
123
|
+
case 'anthropic':
|
|
124
|
+
return this.config.llm.anthropic?.apiKey || '';
|
|
125
|
+
default:
|
|
126
|
+
throw new Error(`No API key configured for provider: ${provider}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Validate configuration
|
|
131
|
+
*/
|
|
132
|
+
validateConfig() {
|
|
133
|
+
const errors = [];
|
|
134
|
+
const [provider, modelId] = this.config.model.split(':');
|
|
135
|
+
if (!provider || !modelId) {
|
|
136
|
+
errors.push('Model must be in format "provider:model"');
|
|
137
|
+
}
|
|
138
|
+
// Check if provider exists (only validate if we have a provider string)
|
|
139
|
+
if (provider) {
|
|
140
|
+
const availableProviders = (0, pi_ai_1.getProviders)();
|
|
141
|
+
if (!availableProviders.includes(provider)) {
|
|
142
|
+
errors.push(`Unknown provider: ${provider}. Available: ${availableProviders.join(', ')}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Check API key
|
|
146
|
+
if (provider === 'openai' && !this.config.llm.openai.apiKey) {
|
|
147
|
+
errors.push('OpenAI API key is required');
|
|
148
|
+
}
|
|
149
|
+
if (provider === 'anthropic' && !this.config.llm.anthropic?.apiKey) {
|
|
150
|
+
errors.push('Anthropic API key is required but not configured');
|
|
151
|
+
}
|
|
152
|
+
// Validate model exists for provider (only if provider is valid)
|
|
153
|
+
if (provider) {
|
|
154
|
+
const availableProviders = (0, pi_ai_1.getProviders)();
|
|
155
|
+
if (availableProviders.includes(provider)) {
|
|
156
|
+
try {
|
|
157
|
+
const availableModels = this.getAvailableModels(provider);
|
|
158
|
+
const modelExists = availableModels.some(m => m.id === modelId);
|
|
159
|
+
if (availableModels.length > 0 && !modelExists) {
|
|
160
|
+
errors.push(`Model ${modelId} not found for provider ${provider}. Available models: ${availableModels.map(m => m.id).join(', ')}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
// Ignore model validation errors if provider is not configured
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
valid: errors.length === 0,
|
|
170
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
exports.LLMProvider = LLMProvider;
|
|
175
|
+
//# sourceMappingURL=llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/providers/llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Skill, Config } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Skill Loader
|
|
4
|
+
* Loads skills from built-in and workspace directories
|
|
5
|
+
*/
|
|
6
|
+
export declare class SkillLoader {
|
|
7
|
+
private builtinSkillsPath;
|
|
8
|
+
private workspaceSkillsPath;
|
|
9
|
+
private skillsCache;
|
|
10
|
+
private config?;
|
|
11
|
+
constructor(builtinSkillsPath: string, workspaceSkillsPath: string, config?: Config);
|
|
12
|
+
/**
|
|
13
|
+
* Set the config for checking skill requirements
|
|
14
|
+
*/
|
|
15
|
+
setConfig(config: Config): void;
|
|
16
|
+
/**
|
|
17
|
+
* Load all skills from builtin and workspace
|
|
18
|
+
*/
|
|
19
|
+
loadSkills(): Promise<Skill[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Load skills from a directory
|
|
22
|
+
*/
|
|
23
|
+
private loadSkillsFromDir;
|
|
24
|
+
/**
|
|
25
|
+
* Load a single skill file
|
|
26
|
+
*/
|
|
27
|
+
private loadSkillFile;
|
|
28
|
+
/**
|
|
29
|
+
* Get a specific skill by name
|
|
30
|
+
*/
|
|
31
|
+
getSkill(name: string): Promise<Skill | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Get skills marked as always-loaded
|
|
34
|
+
*/
|
|
35
|
+
getAlwaysSkills(): Promise<Skill[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Build XML summary of available skills
|
|
38
|
+
*/
|
|
39
|
+
buildSkillsSummary(): Promise<string>;
|
|
40
|
+
/**
|
|
41
|
+
* Check if skill requirements are met
|
|
42
|
+
*/
|
|
43
|
+
private checkSkillRequirements;
|
|
44
|
+
/**
|
|
45
|
+
* Get a config value by path (e.g., 'llm.openai.apiKey')
|
|
46
|
+
*/
|
|
47
|
+
private getConfigValue;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAuC9C;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,iBAAiB,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAMnF;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IA8BpC;;OAEG;YACW,iBAAiB;IAwB/B;;OAEG;YACW,aAAa;IAgB3B;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAQnD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAUzC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAwC3C;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAyB9B;;OAEG;IACH,OAAO,CAAC,cAAc;CAiBvB"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SkillLoader = void 0;
|
|
4
|
+
const promises_1 = require("fs/promises");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
/**
|
|
8
|
+
* Parse markdown frontmatter
|
|
9
|
+
*/
|
|
10
|
+
function parseFrontmatter(content) {
|
|
11
|
+
const frontmatterRegex = /^---\n([\s\S]*?)\n---\n([\s\S]*)$/;
|
|
12
|
+
const match = content.match(frontmatterRegex);
|
|
13
|
+
if (!match) {
|
|
14
|
+
return { metadata: {}, content };
|
|
15
|
+
}
|
|
16
|
+
const frontmatter = match[1];
|
|
17
|
+
const body = match[2];
|
|
18
|
+
// Simple YAML parser (handles basic cases)
|
|
19
|
+
const metadata = {};
|
|
20
|
+
const lines = frontmatter.split('\n');
|
|
21
|
+
let currentKey = '';
|
|
22
|
+
for (const line of lines) {
|
|
23
|
+
if (line.trim().startsWith('-'))
|
|
24
|
+
continue;
|
|
25
|
+
const colonIndex = line.indexOf(':');
|
|
26
|
+
if (colonIndex > -1) {
|
|
27
|
+
const key = line.substring(0, colonIndex).trim();
|
|
28
|
+
const value = line.substring(colonIndex + 1).trim();
|
|
29
|
+
if (value) {
|
|
30
|
+
currentKey = key;
|
|
31
|
+
metadata[key] = value;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { metadata, content: body };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Skill Loader
|
|
39
|
+
* Loads skills from built-in and workspace directories
|
|
40
|
+
*/
|
|
41
|
+
class SkillLoader {
|
|
42
|
+
constructor(builtinSkillsPath, workspaceSkillsPath, config) {
|
|
43
|
+
this.skillsCache = new Map();
|
|
44
|
+
this.builtinSkillsPath = builtinSkillsPath;
|
|
45
|
+
this.workspaceSkillsPath = workspaceSkillsPath;
|
|
46
|
+
this.config = config;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Set the config for checking skill requirements
|
|
50
|
+
*/
|
|
51
|
+
setConfig(config) {
|
|
52
|
+
this.config = config;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Load all skills from builtin and workspace
|
|
56
|
+
*/
|
|
57
|
+
async loadSkills() {
|
|
58
|
+
const skills = [];
|
|
59
|
+
// Load built-in skills
|
|
60
|
+
if ((0, fs_1.existsSync)(this.builtinSkillsPath)) {
|
|
61
|
+
const builtinSkills = await this.loadSkillsFromDir(this.builtinSkillsPath);
|
|
62
|
+
skills.push(...builtinSkills);
|
|
63
|
+
}
|
|
64
|
+
// Load workspace skills (override built-in if same name)
|
|
65
|
+
if ((0, fs_1.existsSync)(this.workspaceSkillsPath)) {
|
|
66
|
+
const workspaceSkills = await this.loadSkillsFromDir(this.workspaceSkillsPath);
|
|
67
|
+
// Remove built-in skills that are overridden
|
|
68
|
+
const workspaceNames = new Set(workspaceSkills.map(s => s.name));
|
|
69
|
+
const filteredBuiltin = skills.filter(s => !workspaceNames.has(s.name));
|
|
70
|
+
skills.length = 0;
|
|
71
|
+
skills.push(...filteredBuiltin, ...workspaceSkills);
|
|
72
|
+
}
|
|
73
|
+
// Cache skills
|
|
74
|
+
this.skillsCache.clear();
|
|
75
|
+
for (const skill of skills) {
|
|
76
|
+
this.skillsCache.set(skill.name, skill);
|
|
77
|
+
}
|
|
78
|
+
return skills;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Load skills from a directory
|
|
82
|
+
*/
|
|
83
|
+
async loadSkillsFromDir(dirPath) {
|
|
84
|
+
const skills = [];
|
|
85
|
+
try {
|
|
86
|
+
const entries = await (0, promises_1.readdir)(dirPath, { withFileTypes: true });
|
|
87
|
+
for (const entry of entries) {
|
|
88
|
+
if (entry.isDirectory()) {
|
|
89
|
+
const skillPath = (0, path_1.join)(dirPath, entry.name, 'SKILL.md');
|
|
90
|
+
if ((0, fs_1.existsSync)(skillPath)) {
|
|
91
|
+
const skill = await this.loadSkillFile(skillPath);
|
|
92
|
+
if (skill) {
|
|
93
|
+
skills.push(skill);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
// Directory doesn't exist or can't be read
|
|
101
|
+
}
|
|
102
|
+
return skills;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Load a single skill file
|
|
106
|
+
*/
|
|
107
|
+
async loadSkillFile(path) {
|
|
108
|
+
try {
|
|
109
|
+
const content = await (0, promises_1.readFile)(path, 'utf-8');
|
|
110
|
+
const { metadata, content: body } = parseFrontmatter(content);
|
|
111
|
+
return {
|
|
112
|
+
name: metadata.name || 'unknown',
|
|
113
|
+
description: metadata.description || '',
|
|
114
|
+
content: body.trim(),
|
|
115
|
+
metadata: metadata.metadata,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get a specific skill by name
|
|
124
|
+
*/
|
|
125
|
+
async getSkill(name) {
|
|
126
|
+
if (this.skillsCache.size === 0) {
|
|
127
|
+
await this.loadSkills();
|
|
128
|
+
}
|
|
129
|
+
return this.skillsCache.get(name) || null;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get skills marked as always-loaded
|
|
133
|
+
*/
|
|
134
|
+
async getAlwaysSkills() {
|
|
135
|
+
if (this.skillsCache.size === 0) {
|
|
136
|
+
await this.loadSkills();
|
|
137
|
+
}
|
|
138
|
+
return Array.from(this.skillsCache.values()).filter(skill => skill.metadata?.always === true);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Build XML summary of available skills
|
|
142
|
+
*/
|
|
143
|
+
async buildSkillsSummary() {
|
|
144
|
+
if (this.skillsCache.size === 0) {
|
|
145
|
+
await this.loadSkills();
|
|
146
|
+
}
|
|
147
|
+
const skills = Array.from(this.skillsCache.values());
|
|
148
|
+
if (skills.length === 0) {
|
|
149
|
+
return 'No skills available. Use readFile to load skill content when needed.';
|
|
150
|
+
}
|
|
151
|
+
const skillEntries = skills.map(skill => {
|
|
152
|
+
const available = this.checkSkillRequirements(skill);
|
|
153
|
+
const status = available ? 'available' : 'unavailable';
|
|
154
|
+
let entry = ` <skill name="${skill.name}" status="${status}">
|
|
155
|
+
<description>${skill.description}</description>`;
|
|
156
|
+
if (!available && skill.metadata?.requires) {
|
|
157
|
+
const missing = [];
|
|
158
|
+
if (skill.metadata.requires.bins) {
|
|
159
|
+
missing.push(`bins: ${skill.metadata.requires.bins.join(', ')}`);
|
|
160
|
+
}
|
|
161
|
+
if (skill.metadata.requires.config) {
|
|
162
|
+
missing.push(`config: ${skill.metadata.requires.config.join(', ')}`);
|
|
163
|
+
}
|
|
164
|
+
entry += `\n <missing>${missing.join('; ')}</missing>`;
|
|
165
|
+
}
|
|
166
|
+
entry += '\n </skill>';
|
|
167
|
+
return entry;
|
|
168
|
+
});
|
|
169
|
+
return `<skills>
|
|
170
|
+
${skillEntries.join('\n')}
|
|
171
|
+
</skills>
|
|
172
|
+
|
|
173
|
+
To use a skill, read its content with: readFile({path: "workspace/skills/{skill-name}/SKILL.md"})`;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Check if skill requirements are met
|
|
177
|
+
*/
|
|
178
|
+
checkSkillRequirements(skill) {
|
|
179
|
+
if (!skill.metadata?.requires) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
// Check for required binaries (simplified - just returns true for now)
|
|
183
|
+
// In production, you'd use 'which' or similar to check
|
|
184
|
+
if (skill.metadata.requires.bins && skill.metadata.requires.bins.length > 0) {
|
|
185
|
+
// For now, assume all bins are available
|
|
186
|
+
}
|
|
187
|
+
// Check for required config values
|
|
188
|
+
if (skill.metadata.requires.config && this.config) {
|
|
189
|
+
for (const configPath of skill.metadata.requires.config) {
|
|
190
|
+
// Navigate the config object using dot notation
|
|
191
|
+
const value = this.getConfigValue(configPath);
|
|
192
|
+
if (!value) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get a config value by path (e.g., 'llm.openai.apiKey')
|
|
201
|
+
*/
|
|
202
|
+
getConfigValue(path) {
|
|
203
|
+
if (!this.config) {
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
const keys = path.split('.');
|
|
207
|
+
let value = this.config;
|
|
208
|
+
for (const key of keys) {
|
|
209
|
+
if (value === undefined || value === null) {
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
value = value[key];
|
|
213
|
+
}
|
|
214
|
+
return value;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
exports.SkillLoader = SkillLoader;
|
|
218
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Tool as ToolType } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Tool Registry
|
|
4
|
+
* Central registry for all tools with conversion to pi-ai format
|
|
5
|
+
*/
|
|
6
|
+
export declare class ToolRegistry {
|
|
7
|
+
private tools;
|
|
8
|
+
/**
|
|
9
|
+
* Register a tool
|
|
10
|
+
*/
|
|
11
|
+
register(tool: ToolType): void;
|
|
12
|
+
/**
|
|
13
|
+
* Unregister a tool
|
|
14
|
+
*/
|
|
15
|
+
unregister(name: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get a tool by name
|
|
18
|
+
*/
|
|
19
|
+
get(name: string): ToolType | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Get all registered tools
|
|
22
|
+
*/
|
|
23
|
+
getAll(): ToolType[];
|
|
24
|
+
/**
|
|
25
|
+
* Execute a tool by name
|
|
26
|
+
*/
|
|
27
|
+
execute(name: string, params: any): Promise<any>;
|
|
28
|
+
/**
|
|
29
|
+
* Convert to pi-ai tool format
|
|
30
|
+
*/
|
|
31
|
+
toPiAiTools(): Record<string, any>;
|
|
32
|
+
/**
|
|
33
|
+
* Get list of tool names
|
|
34
|
+
*/
|
|
35
|
+
getToolNames(): string[];
|
|
36
|
+
/**
|
|
37
|
+
* Check if a tool exists
|
|
38
|
+
*/
|
|
39
|
+
has(name: string): boolean;
|
|
40
|
+
}
|
|
41
|
+
export declare function getToolRegistry(): ToolRegistry;
|
|
42
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/tools/base.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEjD;;;GAGG;AAEH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAoC;IAEjD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAI9B;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIvC;;OAEG;IACH,MAAM,IAAI,QAAQ,EAAE;IAIpB;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAetD;;OAEG;IACH,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAclC;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;IAIxB;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAG3B;AAKD,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ToolRegistry = void 0;
|
|
4
|
+
exports.getToolRegistry = getToolRegistry;
|
|
5
|
+
/**
|
|
6
|
+
* Tool Registry
|
|
7
|
+
* Central registry for all tools with conversion to pi-ai format
|
|
8
|
+
*/
|
|
9
|
+
class ToolRegistry {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.tools = new Map();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Register a tool
|
|
15
|
+
*/
|
|
16
|
+
register(tool) {
|
|
17
|
+
this.tools.set(tool.name, tool);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Unregister a tool
|
|
21
|
+
*/
|
|
22
|
+
unregister(name) {
|
|
23
|
+
this.tools.delete(name);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get a tool by name
|
|
27
|
+
*/
|
|
28
|
+
get(name) {
|
|
29
|
+
return this.tools.get(name);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get all registered tools
|
|
33
|
+
*/
|
|
34
|
+
getAll() {
|
|
35
|
+
return Array.from(this.tools.values());
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Execute a tool by name
|
|
39
|
+
*/
|
|
40
|
+
async execute(name, params) {
|
|
41
|
+
const tool = this.tools.get(name);
|
|
42
|
+
if (!tool) {
|
|
43
|
+
throw new Error(`Tool not found: ${name}`);
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
// Validate parameters with Zod schema
|
|
47
|
+
const validatedParams = tool.parameters.parse(params);
|
|
48
|
+
return await tool.execute(validatedParams);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
throw new Error(`Tool execution failed for ${name}: ${error instanceof Error ? error.message : error}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Convert to pi-ai tool format
|
|
56
|
+
*/
|
|
57
|
+
toPiAiTools() {
|
|
58
|
+
const piTools = {};
|
|
59
|
+
for (const [name, tool] of this.tools) {
|
|
60
|
+
piTools[name] = {
|
|
61
|
+
description: tool.description,
|
|
62
|
+
parameters: tool.parameters,
|
|
63
|
+
execute: tool.execute,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return piTools;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get list of tool names
|
|
70
|
+
*/
|
|
71
|
+
getToolNames() {
|
|
72
|
+
return Array.from(this.tools.keys());
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check if a tool exists
|
|
76
|
+
*/
|
|
77
|
+
has(name) {
|
|
78
|
+
return this.tools.has(name);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.ToolRegistry = ToolRegistry;
|
|
82
|
+
// Global singleton registry
|
|
83
|
+
let registryInstance = null;
|
|
84
|
+
function getToolRegistry() {
|
|
85
|
+
if (!registryInstance) {
|
|
86
|
+
registryInstance = new ToolRegistry();
|
|
87
|
+
}
|
|
88
|
+
return registryInstance;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/tools/base.ts"],"names":[],"mappings":";;;AA4FA,0CAKC;AA9FD;;;GAGG;AAEH,MAAa,YAAY;IAAzB;QACU,UAAK,GAA0B,IAAI,GAAG,EAAE,CAAC;IA8EnD,CAAC;IA5EC;;OAEG;IACH,QAAQ,CAAC,IAAc;QACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,MAAW;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC;YACH,sCAAsC;YACtC,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW;QACT,MAAM,OAAO,GAAwB,EAAE,CAAC;QAExC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,GAAG;gBACd,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC;QACJ,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACF;AA/ED,oCA+EC;AAED,4BAA4B;AAC5B,IAAI,gBAAgB,GAAwB,IAAI,CAAC;AAEjD,SAAgB,eAAe;IAC7B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
|