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.
Files changed (87) hide show
  1. package/DEVELOPMENT.md +240 -0
  2. package/LICENSE +21 -0
  3. package/README.md +443 -0
  4. package/config.example.json +28 -0
  5. package/dist/agent/context.d.ts +38 -0
  6. package/dist/agent/context.d.ts.map +1 -0
  7. package/dist/agent/context.js +131 -0
  8. package/dist/agent/context.js.map +1 -0
  9. package/dist/agent/index.d.ts +10 -0
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +54 -0
  12. package/dist/agent/index.js.map +1 -0
  13. package/dist/agent/loop.d.ts +40 -0
  14. package/dist/agent/loop.d.ts.map +1 -0
  15. package/dist/agent/loop.js +104 -0
  16. package/dist/agent/loop.js.map +1 -0
  17. package/dist/agent/subagent.d.ts +35 -0
  18. package/dist/agent/subagent.d.ts.map +1 -0
  19. package/dist/agent/subagent.js +96 -0
  20. package/dist/agent/subagent.js.map +1 -0
  21. package/dist/cli/commands/chat.d.ts +8 -0
  22. package/dist/cli/commands/chat.d.ts.map +1 -0
  23. package/dist/cli/commands/chat.js +161 -0
  24. package/dist/cli/commands/chat.js.map +1 -0
  25. package/dist/cli/commands/init.d.ts +6 -0
  26. package/dist/cli/commands/init.d.ts.map +1 -0
  27. package/dist/cli/commands/init.js +56 -0
  28. package/dist/cli/commands/init.js.map +1 -0
  29. package/dist/cli/commands/onboard.d.ts +6 -0
  30. package/dist/cli/commands/onboard.d.ts.map +1 -0
  31. package/dist/cli/commands/onboard.js +277 -0
  32. package/dist/cli/commands/onboard.js.map +1 -0
  33. package/dist/cli/commands/status.d.ts +6 -0
  34. package/dist/cli/commands/status.d.ts.map +1 -0
  35. package/dist/cli/commands/status.js +107 -0
  36. package/dist/cli/commands/status.js.map +1 -0
  37. package/dist/cli/index.d.ts +3 -0
  38. package/dist/cli/index.d.ts.map +1 -0
  39. package/dist/cli/index.js +49 -0
  40. package/dist/cli/index.js.map +1 -0
  41. package/dist/config/manager.d.ts +43 -0
  42. package/dist/config/manager.d.ts.map +1 -0
  43. package/dist/config/manager.js +147 -0
  44. package/dist/config/manager.js.map +1 -0
  45. package/dist/config/schema.d.ts +179 -0
  46. package/dist/config/schema.d.ts.map +1 -0
  47. package/dist/config/schema.js +74 -0
  48. package/dist/config/schema.js.map +1 -0
  49. package/dist/providers/llm.d.ts +46 -0
  50. package/dist/providers/llm.d.ts.map +1 -0
  51. package/dist/providers/llm.js +175 -0
  52. package/dist/providers/llm.js.map +1 -0
  53. package/dist/skills/loader.d.ts +49 -0
  54. package/dist/skills/loader.d.ts.map +1 -0
  55. package/dist/skills/loader.js +218 -0
  56. package/dist/skills/loader.js.map +1 -0
  57. package/dist/tools/base.d.ts +42 -0
  58. package/dist/tools/base.d.ts.map +1 -0
  59. package/dist/tools/base.js +90 -0
  60. package/dist/tools/base.js.map +1 -0
  61. package/dist/tools/filesystem.d.ts +17 -0
  62. package/dist/tools/filesystem.d.ts.map +1 -0
  63. package/dist/tools/filesystem.js +117 -0
  64. package/dist/tools/filesystem.js.map +1 -0
  65. package/dist/tools/shell.d.ts +8 -0
  66. package/dist/tools/shell.d.ts.map +1 -0
  67. package/dist/tools/shell.js +79 -0
  68. package/dist/tools/shell.js.map +1 -0
  69. package/dist/tools/spawn.d.ts +8 -0
  70. package/dist/tools/spawn.d.ts.map +1 -0
  71. package/dist/tools/spawn.js +23 -0
  72. package/dist/tools/spawn.js.map +1 -0
  73. package/dist/tools/web.d.ts +8 -0
  74. package/dist/tools/web.d.ts.map +1 -0
  75. package/dist/tools/web.js +194 -0
  76. package/dist/tools/web.js.map +1 -0
  77. package/dist/types/index.d.ts +51 -0
  78. package/dist/types/index.d.ts.map +1 -0
  79. package/dist/types/index.js +6 -0
  80. package/dist/types/index.js.map +1 -0
  81. package/dist/workspace/manager.d.ts +38 -0
  82. package/dist/workspace/manager.d.ts.map +1 -0
  83. package/dist/workspace/manager.js +140 -0
  84. package/dist/workspace/manager.js.map +1 -0
  85. package/docs/ONBOARDING.md +229 -0
  86. package/docs/WEB_SEARCH.md +365 -0
  87. 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"}