@praveencs/agent 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/README.md +1007 -0
- package/bin/agent.ts +6 -0
- package/dist/bin/agent.d.ts +3 -0
- package/dist/bin/agent.d.ts.map +1 -0
- package/dist/bin/agent.js +5 -0
- package/dist/bin/agent.js.map +1 -0
- package/dist/src/cli/commands/config.d.ts +3 -0
- package/dist/src/cli/commands/config.d.ts.map +1 -0
- package/dist/src/cli/commands/config.js +54 -0
- package/dist/src/cli/commands/config.js.map +1 -0
- package/dist/src/cli/commands/daemon.d.ts +3 -0
- package/dist/src/cli/commands/daemon.d.ts.map +1 -0
- package/dist/src/cli/commands/daemon.js +43 -0
- package/dist/src/cli/commands/daemon.js.map +1 -0
- package/dist/src/cli/commands/doctor.d.ts +3 -0
- package/dist/src/cli/commands/doctor.d.ts.map +1 -0
- package/dist/src/cli/commands/doctor.js +84 -0
- package/dist/src/cli/commands/doctor.js.map +1 -0
- package/dist/src/cli/commands/init.d.ts +8 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -0
- package/dist/src/cli/commands/init.js +112 -0
- package/dist/src/cli/commands/init.js.map +1 -0
- package/dist/src/cli/commands/mcp.d.ts +3 -0
- package/dist/src/cli/commands/mcp.d.ts.map +1 -0
- package/dist/src/cli/commands/mcp.js +26 -0
- package/dist/src/cli/commands/mcp.js.map +1 -0
- package/dist/src/cli/commands/plan.d.ts +3 -0
- package/dist/src/cli/commands/plan.d.ts.map +1 -0
- package/dist/src/cli/commands/plan.js +220 -0
- package/dist/src/cli/commands/plan.js.map +1 -0
- package/dist/src/cli/commands/run.d.ts +3 -0
- package/dist/src/cli/commands/run.d.ts.map +1 -0
- package/dist/src/cli/commands/run.js +192 -0
- package/dist/src/cli/commands/run.js.map +1 -0
- package/dist/src/cli/commands/skills.d.ts +3 -0
- package/dist/src/cli/commands/skills.d.ts.map +1 -0
- package/dist/src/cli/commands/skills.js +143 -0
- package/dist/src/cli/commands/skills.js.map +1 -0
- package/dist/src/cli/index.d.ts +6 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +33 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/ui/progress.d.ts +17 -0
- package/dist/src/cli/ui/progress.d.ts.map +1 -0
- package/dist/src/cli/ui/progress.js +43 -0
- package/dist/src/cli/ui/progress.js.map +1 -0
- package/dist/src/cli/ui/prompt.d.ts +10 -0
- package/dist/src/cli/ui/prompt.d.ts.map +1 -0
- package/dist/src/cli/ui/prompt.js +53 -0
- package/dist/src/cli/ui/prompt.js.map +1 -0
- package/dist/src/cli/ui/report.d.ts +6 -0
- package/dist/src/cli/ui/report.d.ts.map +1 -0
- package/dist/src/cli/ui/report.js +81 -0
- package/dist/src/cli/ui/report.js.map +1 -0
- package/dist/src/config/defaults.d.ts +3 -0
- package/dist/src/config/defaults.d.ts.map +1 -0
- package/dist/src/config/defaults.js +82 -0
- package/dist/src/config/defaults.js.map +1 -0
- package/dist/src/config/loader.d.ts +33 -0
- package/dist/src/config/loader.d.ts.map +1 -0
- package/dist/src/config/loader.js +161 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/config/schema.d.ts +530 -0
- package/dist/src/config/schema.d.ts.map +1 -0
- package/dist/src/config/schema.js +97 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/config/secrets.d.ts +31 -0
- package/dist/src/config/secrets.d.ts.map +1 -0
- package/dist/src/config/secrets.js +98 -0
- package/dist/src/config/secrets.js.map +1 -0
- package/dist/src/daemon/manager.d.ts +28 -0
- package/dist/src/daemon/manager.d.ts.map +1 -0
- package/dist/src/daemon/manager.js +77 -0
- package/dist/src/daemon/manager.js.map +1 -0
- package/dist/src/daemon/scheduler.d.ts +6 -0
- package/dist/src/daemon/scheduler.d.ts.map +1 -0
- package/dist/src/daemon/scheduler.js +82 -0
- package/dist/src/daemon/scheduler.js.map +1 -0
- package/dist/src/daemon/watcher.d.ts +16 -0
- package/dist/src/daemon/watcher.d.ts.map +1 -0
- package/dist/src/daemon/watcher.js +59 -0
- package/dist/src/daemon/watcher.js.map +1 -0
- package/dist/src/engine/executor.d.ts +51 -0
- package/dist/src/engine/executor.d.ts.map +1 -0
- package/dist/src/engine/executor.js +189 -0
- package/dist/src/engine/executor.js.map +1 -0
- package/dist/src/engine/rollback.d.ts +37 -0
- package/dist/src/engine/rollback.d.ts.map +1 -0
- package/dist/src/engine/rollback.js +95 -0
- package/dist/src/engine/rollback.js.map +1 -0
- package/dist/src/engine/types.d.ts +31 -0
- package/dist/src/engine/types.d.ts.map +1 -0
- package/dist/src/engine/types.js +2 -0
- package/dist/src/engine/types.js.map +1 -0
- package/dist/src/engine/verification.d.ts +27 -0
- package/dist/src/engine/verification.d.ts.map +1 -0
- package/dist/src/engine/verification.js +75 -0
- package/dist/src/engine/verification.js.map +1 -0
- package/dist/src/index.d.ts +17 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +13 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/llm/cache.d.ts +20 -0
- package/dist/src/llm/cache.d.ts.map +1 -0
- package/dist/src/llm/cache.js +45 -0
- package/dist/src/llm/cache.js.map +1 -0
- package/dist/src/llm/providers/anthropic.d.ts +13 -0
- package/dist/src/llm/providers/anthropic.d.ts.map +1 -0
- package/dist/src/llm/providers/anthropic.js +69 -0
- package/dist/src/llm/providers/anthropic.js.map +1 -0
- package/dist/src/llm/providers/azure.d.ts +14 -0
- package/dist/src/llm/providers/azure.d.ts.map +1 -0
- package/dist/src/llm/providers/azure.js +98 -0
- package/dist/src/llm/providers/azure.js.map +1 -0
- package/dist/src/llm/providers/ollama.d.ts +13 -0
- package/dist/src/llm/providers/ollama.d.ts.map +1 -0
- package/dist/src/llm/providers/ollama.js +80 -0
- package/dist/src/llm/providers/ollama.js.map +1 -0
- package/dist/src/llm/providers/openai.d.ts +13 -0
- package/dist/src/llm/providers/openai.d.ts.map +1 -0
- package/dist/src/llm/providers/openai.js +74 -0
- package/dist/src/llm/providers/openai.js.map +1 -0
- package/dist/src/llm/router.d.ts +26 -0
- package/dist/src/llm/router.d.ts.map +1 -0
- package/dist/src/llm/router.js +104 -0
- package/dist/src/llm/router.js.map +1 -0
- package/dist/src/llm/types.d.ts +44 -0
- package/dist/src/llm/types.d.ts.map +1 -0
- package/dist/src/llm/types.js +2 -0
- package/dist/src/llm/types.js.map +1 -0
- package/dist/src/logging/audit-log.d.ts +89 -0
- package/dist/src/logging/audit-log.d.ts.map +1 -0
- package/dist/src/logging/audit-log.js +132 -0
- package/dist/src/logging/audit-log.js.map +1 -0
- package/dist/src/logging/logger.d.ts +13 -0
- package/dist/src/logging/logger.d.ts.map +1 -0
- package/dist/src/logging/logger.js +57 -0
- package/dist/src/logging/logger.js.map +1 -0
- package/dist/src/logging/redactor.d.ts +14 -0
- package/dist/src/logging/redactor.d.ts.map +1 -0
- package/dist/src/logging/redactor.js +48 -0
- package/dist/src/logging/redactor.js.map +1 -0
- package/dist/src/mcp/handlers.d.ts +21 -0
- package/dist/src/mcp/handlers.d.ts.map +1 -0
- package/dist/src/mcp/handlers.js +156 -0
- package/dist/src/mcp/handlers.js.map +1 -0
- package/dist/src/mcp/server.d.ts +8 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +40 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/types.d.ts +20 -0
- package/dist/src/mcp/types.d.ts.map +1 -0
- package/dist/src/mcp/types.js +2 -0
- package/dist/src/mcp/types.js.map +1 -0
- package/dist/src/plans/parser.d.ts +33 -0
- package/dist/src/plans/parser.d.ts.map +1 -0
- package/dist/src/plans/parser.js +93 -0
- package/dist/src/plans/parser.js.map +1 -0
- package/dist/src/plans/propose.d.ts +26 -0
- package/dist/src/plans/propose.d.ts.map +1 -0
- package/dist/src/plans/propose.js +85 -0
- package/dist/src/plans/propose.js.map +1 -0
- package/dist/src/plans/runner.d.ts +19 -0
- package/dist/src/plans/runner.d.ts.map +1 -0
- package/dist/src/plans/runner.js +159 -0
- package/dist/src/plans/runner.js.map +1 -0
- package/dist/src/plans/triggers.d.ts +12 -0
- package/dist/src/plans/triggers.d.ts.map +1 -0
- package/dist/src/plans/triggers.js +43 -0
- package/dist/src/plans/triggers.js.map +1 -0
- package/dist/src/plans/types.d.ts +454 -0
- package/dist/src/plans/types.d.ts.map +1 -0
- package/dist/src/plans/types.js +56 -0
- package/dist/src/plans/types.js.map +1 -0
- package/dist/src/policy/audit.d.ts +35 -0
- package/dist/src/policy/audit.d.ts.map +1 -0
- package/dist/src/policy/audit.js +39 -0
- package/dist/src/policy/audit.js.map +1 -0
- package/dist/src/policy/engine.d.ts +35 -0
- package/dist/src/policy/engine.d.ts.map +1 -0
- package/dist/src/policy/engine.js +134 -0
- package/dist/src/policy/engine.js.map +1 -0
- package/dist/src/policy/scope.d.ts +27 -0
- package/dist/src/policy/scope.d.ts.map +1 -0
- package/dist/src/policy/scope.js +89 -0
- package/dist/src/policy/scope.js.map +1 -0
- package/dist/src/policy/types.d.ts +15 -0
- package/dist/src/policy/types.d.ts.map +1 -0
- package/dist/src/policy/types.js +2 -0
- package/dist/src/policy/types.js.map +1 -0
- package/dist/src/self-extend/generator.d.ts +27 -0
- package/dist/src/self-extend/generator.d.ts.map +1 -0
- package/dist/src/self-extend/generator.js +107 -0
- package/dist/src/self-extend/generator.js.map +1 -0
- package/dist/src/self-extend/publisher.d.ts +5 -0
- package/dist/src/self-extend/publisher.d.ts.map +1 -0
- package/dist/src/self-extend/publisher.js +40 -0
- package/dist/src/self-extend/publisher.js.map +1 -0
- package/dist/src/self-extend/sandbox.d.ts +10 -0
- package/dist/src/self-extend/sandbox.d.ts.map +1 -0
- package/dist/src/self-extend/sandbox.js +22 -0
- package/dist/src/self-extend/sandbox.js.map +1 -0
- package/dist/src/skills/hub/lockfile.d.ts +15 -0
- package/dist/src/skills/hub/lockfile.d.ts.map +1 -0
- package/dist/src/skills/hub/lockfile.js +13 -0
- package/dist/src/skills/hub/lockfile.js.map +1 -0
- package/dist/src/skills/hub/publisher.d.ts +7 -0
- package/dist/src/skills/hub/publisher.d.ts.map +1 -0
- package/dist/src/skills/hub/publisher.js +10 -0
- package/dist/src/skills/hub/publisher.js.map +1 -0
- package/dist/src/skills/hub/registry.d.ts +16 -0
- package/dist/src/skills/hub/registry.d.ts.map +1 -0
- package/dist/src/skills/hub/registry.js +24 -0
- package/dist/src/skills/hub/registry.js.map +1 -0
- package/dist/src/skills/index.d.ts +12 -0
- package/dist/src/skills/index.d.ts.map +1 -0
- package/dist/src/skills/index.js +82 -0
- package/dist/src/skills/index.js.map +1 -0
- package/dist/src/skills/lifecycle.d.ts +19 -0
- package/dist/src/skills/lifecycle.d.ts.map +1 -0
- package/dist/src/skills/lifecycle.js +48 -0
- package/dist/src/skills/lifecycle.js.map +1 -0
- package/dist/src/skills/loader.d.ts +43 -0
- package/dist/src/skills/loader.d.ts.map +1 -0
- package/dist/src/skills/loader.js +142 -0
- package/dist/src/skills/loader.js.map +1 -0
- package/dist/src/skills/runner.d.ts +43 -0
- package/dist/src/skills/runner.d.ts.map +1 -0
- package/dist/src/skills/runner.js +198 -0
- package/dist/src/skills/runner.js.map +1 -0
- package/dist/src/skills/types.d.ts +150 -0
- package/dist/src/skills/types.d.ts.map +1 -0
- package/dist/src/skills/types.js +31 -0
- package/dist/src/skills/types.js.map +1 -0
- package/dist/src/skills/validator.d.ts +19 -0
- package/dist/src/skills/validator.d.ts.map +1 -0
- package/dist/src/skills/validator.js +92 -0
- package/dist/src/skills/validator.js.map +1 -0
- package/dist/src/tools/core/cmd.d.ts +24 -0
- package/dist/src/tools/core/cmd.d.ts.map +1 -0
- package/dist/src/tools/core/cmd.js +55 -0
- package/dist/src/tools/core/cmd.js.map +1 -0
- package/dist/src/tools/core/fs.d.ts +76 -0
- package/dist/src/tools/core/fs.d.ts.map +1 -0
- package/dist/src/tools/core/fs.js +173 -0
- package/dist/src/tools/core/fs.js.map +1 -0
- package/dist/src/tools/core/git.d.ts +62 -0
- package/dist/src/tools/core/git.d.ts.map +1 -0
- package/dist/src/tools/core/git.js +138 -0
- package/dist/src/tools/core/git.js.map +1 -0
- package/dist/src/tools/core/project.d.ts +17 -0
- package/dist/src/tools/core/project.d.ts.map +1 -0
- package/dist/src/tools/core/project.js +104 -0
- package/dist/src/tools/core/project.js.map +1 -0
- package/dist/src/tools/plugins/loader.d.ts +13 -0
- package/dist/src/tools/plugins/loader.d.ts.map +1 -0
- package/dist/src/tools/plugins/loader.js +36 -0
- package/dist/src/tools/plugins/loader.js.map +1 -0
- package/dist/src/tools/registry.d.ts +38 -0
- package/dist/src/tools/registry.d.ts.map +1 -0
- package/dist/src/tools/registry.js +118 -0
- package/dist/src/tools/registry.js.map +1 -0
- package/dist/src/tools/types.d.ts +46 -0
- package/dist/src/tools/types.d.ts.map +1 -0
- package/dist/src/tools/types.js +10 -0
- package/dist/src/tools/types.js.map +1 -0
- package/dist/src/utils/hash.d.ts +13 -0
- package/dist/src/utils/hash.d.ts.map +1 -0
- package/dist/src/utils/hash.js +22 -0
- package/dist/src/utils/hash.js.map +1 -0
- package/dist/src/utils/paths.d.ts +45 -0
- package/dist/src/utils/paths.d.ts.map +1 -0
- package/dist/src/utils/paths.js +71 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/utils/schema.d.ts +16 -0
- package/dist/src/utils/schema.d.ts.map +1 -0
- package/dist/src/utils/schema.js +66 -0
- package/dist/src/utils/schema.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Hub registry client (Phase 3)
|
|
3
|
+
* Handles remote skill installation and publishing
|
|
4
|
+
*/
|
|
5
|
+
export class RegistryClient {
|
|
6
|
+
baseUrl;
|
|
7
|
+
constructor(baseUrl) {
|
|
8
|
+
this.baseUrl = baseUrl;
|
|
9
|
+
}
|
|
10
|
+
async search(query) {
|
|
11
|
+
// Phase 3: Implement registry search
|
|
12
|
+
console.log(`Registry search not yet available (query: ${query})`);
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
async install(name, version) {
|
|
16
|
+
// Phase 3: Download and install from registry
|
|
17
|
+
console.log(`Registry install not yet available (${name}@${version ?? 'latest'})`);
|
|
18
|
+
}
|
|
19
|
+
async publish(skillDir) {
|
|
20
|
+
// Phase 3: Publish skill to registry
|
|
21
|
+
console.log(`Registry publish not yet available (${skillDir})`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/skills/hub/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,cAAc;IACK;IAA5B,YAA4B,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAAI,CAAC;IAEhD,KAAK,CAAC,MAAM,CAAC,KAAa;QACtB,qCAAqC;QACrC,OAAO,CAAC,GAAG,CAAC,6CAA6C,KAAK,GAAG,CAAC,CAAC;QACnE,OAAO,EAAE,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,OAAgB;QACxC,8CAA8C;QAC9C,OAAO,CAAC,GAAG,CAAC,uCAAuC,IAAI,IAAI,OAAO,IAAI,QAAQ,GAAG,CAAC,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB;QAC1B,qCAAqC;QACrC,OAAO,CAAC,GAAG,CAAC,uCAAuC,QAAQ,GAAG,CAAC,CAAC;IACpE,CAAC;CACJ"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AgentConfig } from '../config/schema.js';
|
|
2
|
+
import { LoadedSkill } from './types.js';
|
|
3
|
+
export declare class SkillIndex {
|
|
4
|
+
private config;
|
|
5
|
+
private db;
|
|
6
|
+
private initialized;
|
|
7
|
+
constructor(config: AgentConfig);
|
|
8
|
+
init(skills: LoadedSkill[]): Promise<void>;
|
|
9
|
+
search(query: string, k?: number): Promise<LoadedSkill[]>;
|
|
10
|
+
private getEmbedding;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/skills/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAUzC,qBAAa,UAAU;IACnB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,EAAE,CAA6B;IACvC,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,WAAW;IAIzB,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE;IAyC1B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,SAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YAa5C,YAAY;CA2B7B"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
export class SkillIndex {
|
|
3
|
+
config;
|
|
4
|
+
db = null;
|
|
5
|
+
initialized = false;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
}
|
|
9
|
+
async init(skills) {
|
|
10
|
+
if (!this.config.models.embeddings.enabled)
|
|
11
|
+
return;
|
|
12
|
+
try {
|
|
13
|
+
// Check if hnswsqlite is available
|
|
14
|
+
const hnswlib = await import('hnswsqlite').catch(() => null);
|
|
15
|
+
if (!hnswlib) {
|
|
16
|
+
console.warn('Vector search disabled: "hnswsqlite" not found. Run "npm install hnswsqlite" to enable.');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const dbPath = path.join(process.cwd(), '.agent/skills.db');
|
|
20
|
+
// Assuming default export or named export matches
|
|
21
|
+
const Database = hnswlib.Database || hnswlib.default?.Database;
|
|
22
|
+
if (!Database) {
|
|
23
|
+
console.warn("Could not load Database from hnswsqlite");
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
this.db = new Database(dbPath);
|
|
27
|
+
// Initialize DB schema (pseudo-code as library API varies)
|
|
28
|
+
// ...
|
|
29
|
+
// Re-index all skills (simplified: clear and insert)
|
|
30
|
+
// this.db?.run('DELETE FROM skills');
|
|
31
|
+
for (const skill of skills) {
|
|
32
|
+
const vector = await this.getEmbedding(skill.manifest.description);
|
|
33
|
+
// Insert into DB
|
|
34
|
+
// console.log(`Indexing ${skill.manifest.name} with vector length ${vector.length}`);
|
|
35
|
+
}
|
|
36
|
+
this.initialized = true;
|
|
37
|
+
console.log('Skill index initialized');
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error('Failed to initialize skill index:', error);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async search(query, k = 5) {
|
|
44
|
+
if (!this.initialized || !this.db)
|
|
45
|
+
return [];
|
|
46
|
+
// embed query
|
|
47
|
+
const vector = await this.getEmbedding(query);
|
|
48
|
+
// search
|
|
49
|
+
// results = this.db.search(...)
|
|
50
|
+
// Return dummy empty for now until fully implemented
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
async getEmbedding(text) {
|
|
54
|
+
// Use OpenAI/Azure provider
|
|
55
|
+
const config = this.config.models.embeddings;
|
|
56
|
+
if (config.provider === 'azure') {
|
|
57
|
+
const { AzureOpenAI } = await import('openai');
|
|
58
|
+
const client = new AzureOpenAI({
|
|
59
|
+
apiKey: config.apiKey || process.env.AZURE_API_KEY,
|
|
60
|
+
endpoint: config.baseUrl || process.env.AZURE_API_BASE,
|
|
61
|
+
deployment: config.deploymentName || process.env.AZURE_DEPLOYMENT_NAME,
|
|
62
|
+
apiVersion: config.apiVersion || process.env.AZURE_API_VERSION,
|
|
63
|
+
});
|
|
64
|
+
const res = await client.embeddings.create({
|
|
65
|
+
model: config.model,
|
|
66
|
+
input: text,
|
|
67
|
+
});
|
|
68
|
+
return res.data[0].embedding;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// OpenAI default
|
|
72
|
+
const { OpenAI } = await import('openai');
|
|
73
|
+
const client = new OpenAI({ apiKey: config.apiKey });
|
|
74
|
+
const res = await client.embeddings.create({
|
|
75
|
+
model: config.model,
|
|
76
|
+
input: text,
|
|
77
|
+
});
|
|
78
|
+
return res.data[0].embedding;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/skills/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LoadedSkill, SkillState } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Manage skill lifecycle states: draft → approved → deprecated
|
|
4
|
+
*/
|
|
5
|
+
export declare class SkillLifecycle {
|
|
6
|
+
/**
|
|
7
|
+
* Transition a skill to a new state
|
|
8
|
+
*/
|
|
9
|
+
transition(skill: LoadedSkill, newState: SkillState): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Check if a skill can run in daemon mode
|
|
12
|
+
*/
|
|
13
|
+
canRunInDaemon(skill: LoadedSkill, allowDrafts?: boolean): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Check if a skill can be upgraded (not deprecated)
|
|
16
|
+
*/
|
|
17
|
+
canUpgrade(skill: LoadedSkill): boolean;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/skills/lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,qBAAa,cAAc;IACvB;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBzE;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,GAAE,OAAe,GAAG,OAAO;IAOzE;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO;CAG1C"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Manage skill lifecycle states: draft → approved → deprecated
|
|
5
|
+
*/
|
|
6
|
+
export class SkillLifecycle {
|
|
7
|
+
/**
|
|
8
|
+
* Transition a skill to a new state
|
|
9
|
+
*/
|
|
10
|
+
async transition(skill, newState) {
|
|
11
|
+
const currentState = skill.manifest.state ?? 'draft';
|
|
12
|
+
const validTransitions = {
|
|
13
|
+
draft: ['approved'],
|
|
14
|
+
approved: ['deprecated'],
|
|
15
|
+
deprecated: ['approved'], // Can re-approve deprecated skills
|
|
16
|
+
};
|
|
17
|
+
const allowed = validTransitions[currentState];
|
|
18
|
+
if (!allowed?.includes(newState)) {
|
|
19
|
+
throw new Error(`Cannot transition skill "${skill.manifest.name}" from "${currentState}" to "${newState}". ` +
|
|
20
|
+
`Valid transitions: ${allowed?.join(', ') ?? 'none'}`);
|
|
21
|
+
}
|
|
22
|
+
// Update manifest
|
|
23
|
+
skill.manifest.state = newState;
|
|
24
|
+
const manifestPath = path.join(skill.path, 'skill.json');
|
|
25
|
+
const content = await readFile(manifestPath, 'utf-8');
|
|
26
|
+
const manifest = JSON.parse(content);
|
|
27
|
+
manifest.state = newState;
|
|
28
|
+
await writeFile(manifestPath, JSON.stringify(manifest, null, 2) + '\n', 'utf-8');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if a skill can run in daemon mode
|
|
32
|
+
*/
|
|
33
|
+
canRunInDaemon(skill, allowDrafts = false) {
|
|
34
|
+
const state = skill.manifest.state ?? 'draft';
|
|
35
|
+
if (state === 'approved')
|
|
36
|
+
return true;
|
|
37
|
+
if (state === 'draft' && allowDrafts)
|
|
38
|
+
return true;
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if a skill can be upgraded (not deprecated)
|
|
43
|
+
*/
|
|
44
|
+
canUpgrade(skill) {
|
|
45
|
+
return skill.manifest.state !== 'deprecated';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/skills/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;GAEG;AACH,MAAM,OAAO,cAAc;IACvB;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,KAAkB,EAAE,QAAoB;QACrD,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC;QACrD,MAAM,gBAAgB,GAAqC;YACvD,KAAK,EAAE,CAAC,UAAU,CAAC;YACnB,QAAQ,EAAE,CAAC,YAAY,CAAC;YACxB,UAAU,EAAE,CAAC,UAAU,CAAC,EAAE,mCAAmC;SAChE,CAAC;QAEF,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACX,4BAA4B,KAAK,CAAC,QAAQ,CAAC,IAAI,WAAW,YAAY,SAAS,QAAQ,KAAK;gBAC5F,sBAAsB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CACxD,CAAC;QACN,CAAC;QAED,kBAAkB;QAClB,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC;QAChC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC;QAC1B,MAAM,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACrF,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,KAAkB,EAAE,cAAuB,KAAK;QAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC;QAC9C,IAAI,KAAK,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;QACtC,IAAI,KAAK,KAAK,OAAO,IAAI,WAAW;YAAE,OAAO,IAAI,CAAC;QAClD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,KAAkB;QACzB,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,KAAK,YAAY,CAAC;IACjD,CAAC;CACJ"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type LoadedSkill } from './types.js';
|
|
2
|
+
import type { AgentConfig } from '../config/schema.js';
|
|
3
|
+
/**
|
|
4
|
+
* Skill loader — discovers, validates, and loads skills
|
|
5
|
+
*/
|
|
6
|
+
export declare class SkillLoader {
|
|
7
|
+
private skills;
|
|
8
|
+
private config;
|
|
9
|
+
constructor(config: AgentConfig);
|
|
10
|
+
/**
|
|
11
|
+
* Discover and load all skills from configured paths
|
|
12
|
+
*/
|
|
13
|
+
loadAll(): Promise<LoadedSkill[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Load skills from a directory
|
|
16
|
+
*/
|
|
17
|
+
private loadFromDirectory;
|
|
18
|
+
/**
|
|
19
|
+
* Load a single skill from its directory
|
|
20
|
+
*/
|
|
21
|
+
loadSkill(skillDir: string): Promise<LoadedSkill | null>;
|
|
22
|
+
/**
|
|
23
|
+
* Get a loaded skill by name
|
|
24
|
+
*/
|
|
25
|
+
get(name: string): LoadedSkill | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* List all loaded skills
|
|
28
|
+
*/
|
|
29
|
+
list(): LoadedSkill[];
|
|
30
|
+
/**
|
|
31
|
+
* Check if a skill exists
|
|
32
|
+
*/
|
|
33
|
+
has(name: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Install a skill from a local path
|
|
36
|
+
*/
|
|
37
|
+
installFromPath(sourcePath: string, targetDir?: string): Promise<LoadedSkill | null>;
|
|
38
|
+
/**
|
|
39
|
+
* Remove a skill
|
|
40
|
+
*/
|
|
41
|
+
remove(name: string): Promise<boolean>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/skills/loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,WAAW,EAAsB,MAAM,YAAY,CAAC;AAGvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;GAEG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,EAAE,WAAW;IAI/B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAavC;;OAEG;YACW,iBAAiB;IA0B/B;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAkC9D;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI1C;;OAEG;IACH,IAAI,IAAI,WAAW,EAAE;IAIrB;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAuB1F;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAS/C"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { readFile, readdir, access } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { SkillManifestSchema } from './types.js';
|
|
4
|
+
import { validateSchema } from '../utils/schema.js';
|
|
5
|
+
import { getSkillsDir } from '../utils/paths.js';
|
|
6
|
+
/**
|
|
7
|
+
* Skill loader — discovers, validates, and loads skills
|
|
8
|
+
*/
|
|
9
|
+
export class SkillLoader {
|
|
10
|
+
skills = new Map();
|
|
11
|
+
config;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Discover and load all skills from configured paths
|
|
17
|
+
*/
|
|
18
|
+
async loadAll() {
|
|
19
|
+
this.skills.clear();
|
|
20
|
+
const paths = this.config.skills.installPaths;
|
|
21
|
+
const cwd = process.cwd();
|
|
22
|
+
for (const skillPath of paths) {
|
|
23
|
+
const absPath = path.resolve(cwd, skillPath);
|
|
24
|
+
await this.loadFromDirectory(absPath);
|
|
25
|
+
}
|
|
26
|
+
return Array.from(this.skills.values());
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Load skills from a directory
|
|
30
|
+
*/
|
|
31
|
+
async loadFromDirectory(dirPath) {
|
|
32
|
+
try {
|
|
33
|
+
await access(dirPath);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return; // Directory doesn't exist
|
|
37
|
+
}
|
|
38
|
+
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
39
|
+
for (const entry of entries) {
|
|
40
|
+
if (!entry.isDirectory())
|
|
41
|
+
continue;
|
|
42
|
+
const skillDir = path.join(dirPath, entry.name);
|
|
43
|
+
const manifestPath = path.join(skillDir, 'skill.json');
|
|
44
|
+
try {
|
|
45
|
+
await access(manifestPath);
|
|
46
|
+
const skill = await this.loadSkill(skillDir);
|
|
47
|
+
if (skill) {
|
|
48
|
+
this.skills.set(skill.manifest.name, skill);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Skip directories without skill.json
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Load a single skill from its directory
|
|
58
|
+
*/
|
|
59
|
+
async loadSkill(skillDir) {
|
|
60
|
+
const manifestPath = path.join(skillDir, 'skill.json');
|
|
61
|
+
try {
|
|
62
|
+
const content = await readFile(manifestPath, 'utf-8');
|
|
63
|
+
const raw = JSON.parse(content);
|
|
64
|
+
const result = validateSchema(SkillManifestSchema, raw, `skill.json in ${path.basename(skillDir)}`);
|
|
65
|
+
if (!result.success) {
|
|
66
|
+
console.error(`Invalid skill manifest at ${manifestPath}:\n${result.errors.join('\n')}`);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
const manifest = result.data;
|
|
70
|
+
const loaded = {
|
|
71
|
+
manifest,
|
|
72
|
+
path: skillDir,
|
|
73
|
+
};
|
|
74
|
+
// Load entrypoint content
|
|
75
|
+
const entryPath = path.join(skillDir, manifest.entrypoint);
|
|
76
|
+
if (manifest.entrypoint.endsWith('.md')) {
|
|
77
|
+
loaded.promptContent = await readFile(entryPath, 'utf-8');
|
|
78
|
+
}
|
|
79
|
+
else if (manifest.entrypoint.endsWith('.ts') || manifest.entrypoint.endsWith('.js')) {
|
|
80
|
+
loaded.workflowPath = entryPath;
|
|
81
|
+
}
|
|
82
|
+
return loaded;
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
console.error(`Failed to load skill from ${skillDir}: ${err.message}`);
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get a loaded skill by name
|
|
91
|
+
*/
|
|
92
|
+
get(name) {
|
|
93
|
+
return this.skills.get(name);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* List all loaded skills
|
|
97
|
+
*/
|
|
98
|
+
list() {
|
|
99
|
+
return Array.from(this.skills.values());
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Check if a skill exists
|
|
103
|
+
*/
|
|
104
|
+
has(name) {
|
|
105
|
+
return this.skills.has(name);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Install a skill from a local path
|
|
109
|
+
*/
|
|
110
|
+
async installFromPath(sourcePath, targetDir) {
|
|
111
|
+
const destDir = targetDir ?? getSkillsDir();
|
|
112
|
+
const absSource = path.resolve(sourcePath);
|
|
113
|
+
// Validate the skill first
|
|
114
|
+
const skill = await this.loadSkill(absSource);
|
|
115
|
+
if (!skill) {
|
|
116
|
+
throw new Error(`Invalid skill at ${absSource}`);
|
|
117
|
+
}
|
|
118
|
+
// Copy to target directory
|
|
119
|
+
const targetPath = path.join(destDir, skill.manifest.name);
|
|
120
|
+
const { cpSync } = await import('node:fs');
|
|
121
|
+
cpSync(absSource, targetPath, { recursive: true });
|
|
122
|
+
// Reload
|
|
123
|
+
const installed = await this.loadSkill(targetPath);
|
|
124
|
+
if (installed) {
|
|
125
|
+
this.skills.set(installed.manifest.name, installed);
|
|
126
|
+
}
|
|
127
|
+
return installed;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Remove a skill
|
|
131
|
+
*/
|
|
132
|
+
async remove(name) {
|
|
133
|
+
const skill = this.skills.get(name);
|
|
134
|
+
if (!skill)
|
|
135
|
+
return false;
|
|
136
|
+
const { rmSync } = await import('node:fs');
|
|
137
|
+
rmSync(skill.path, { recursive: true, force: true });
|
|
138
|
+
this.skills.delete(name);
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# 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,43 @@
|
|
|
1
|
+
import type { LoadedSkill } from './types.js';
|
|
2
|
+
import type { ExecutionContext, ToolResult } from '../tools/types.js';
|
|
3
|
+
import { ToolRegistry } from '../tools/registry.js';
|
|
4
|
+
import { PolicyEngine } from '../policy/engine.js';
|
|
5
|
+
import { LLMRouter } from '../llm/router.js';
|
|
6
|
+
export interface SkillRunResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
output?: unknown;
|
|
9
|
+
error?: string;
|
|
10
|
+
toolCalls: {
|
|
11
|
+
tool: string;
|
|
12
|
+
input: unknown;
|
|
13
|
+
result: ToolResult;
|
|
14
|
+
}[];
|
|
15
|
+
validatorResults?: {
|
|
16
|
+
name: string;
|
|
17
|
+
passed: boolean;
|
|
18
|
+
output: string;
|
|
19
|
+
}[];
|
|
20
|
+
durationMs: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Skill runner — executes a loaded skill using its entrypoint
|
|
24
|
+
*/
|
|
25
|
+
export declare class SkillRunner {
|
|
26
|
+
private registry;
|
|
27
|
+
private policy;
|
|
28
|
+
private llmRouter;
|
|
29
|
+
constructor(registry: ToolRegistry, policy: PolicyEngine, llmRouter: LLMRouter);
|
|
30
|
+
/**
|
|
31
|
+
* Execute a skill with given inputs
|
|
32
|
+
*/
|
|
33
|
+
run(skill: LoadedSkill, inputs: Record<string, unknown>, ctx: ExecutionContext): Promise<SkillRunResult>;
|
|
34
|
+
/**
|
|
35
|
+
* Run a prompt-based skill via LLM
|
|
36
|
+
*/
|
|
37
|
+
private runPromptSkill;
|
|
38
|
+
/**
|
|
39
|
+
* Run a workflow-based skill (state machine)
|
|
40
|
+
*/
|
|
41
|
+
private runWorkflowSkill;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/skills/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAM7C,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,EAAE,CAAC;IAClE,gBAAgB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvE,UAAU,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,SAAS,CAAY;gBAEjB,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS;IAM9E;;OAEG;IACG,GAAG,CACL,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,EAAE,gBAAgB,GACtB,OAAO,CAAC,cAAc,CAAC;IA4C1B;;OAEG;YACW,cAAc;IA+H5B;;OAEG;YACW,gBAAgB;CAmCjC"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { runValidators } from './validator.js';
|
|
2
|
+
import { auditEmitter, AuditEventType } from '../policy/audit.js';
|
|
3
|
+
import { zodToJsonSchema } from '../utils/schema.js';
|
|
4
|
+
/**
|
|
5
|
+
* Skill runner — executes a loaded skill using its entrypoint
|
|
6
|
+
*/
|
|
7
|
+
export class SkillRunner {
|
|
8
|
+
registry;
|
|
9
|
+
policy;
|
|
10
|
+
llmRouter;
|
|
11
|
+
constructor(registry, policy, llmRouter) {
|
|
12
|
+
this.registry = registry;
|
|
13
|
+
this.policy = policy;
|
|
14
|
+
this.llmRouter = llmRouter;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Execute a skill with given inputs
|
|
18
|
+
*/
|
|
19
|
+
async run(skill, inputs, ctx) {
|
|
20
|
+
const start = Date.now();
|
|
21
|
+
const toolCalls = [];
|
|
22
|
+
auditEmitter.emit(AuditEventType.SKILL_LOADED, {
|
|
23
|
+
name: skill.manifest.name,
|
|
24
|
+
version: skill.manifest.version,
|
|
25
|
+
entrypoint: skill.manifest.entrypoint,
|
|
26
|
+
});
|
|
27
|
+
try {
|
|
28
|
+
let output;
|
|
29
|
+
if (skill.promptContent) {
|
|
30
|
+
// Prompt-based skill: send to LLM with tool bindings
|
|
31
|
+
output = await this.runPromptSkill(skill, inputs, ctx, toolCalls);
|
|
32
|
+
}
|
|
33
|
+
else if (skill.workflowPath) {
|
|
34
|
+
// Workflow-based skill: run the state machine
|
|
35
|
+
output = await this.runWorkflowSkill(skill, inputs, ctx, toolCalls);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
throw new Error(`Skill "${skill.manifest.name}" has no valid entrypoint`);
|
|
39
|
+
}
|
|
40
|
+
// Run validators
|
|
41
|
+
const validatorResults = await runValidators(skill, ctx.cwd);
|
|
42
|
+
const allPassed = validatorResults.every((v) => v.passed);
|
|
43
|
+
return {
|
|
44
|
+
success: allPassed || validatorResults.length === 0,
|
|
45
|
+
output,
|
|
46
|
+
toolCalls,
|
|
47
|
+
validatorResults,
|
|
48
|
+
durationMs: Date.now() - start,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
return {
|
|
53
|
+
success: false,
|
|
54
|
+
error: err.message,
|
|
55
|
+
toolCalls,
|
|
56
|
+
durationMs: Date.now() - start,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Run a prompt-based skill via LLM
|
|
62
|
+
*/
|
|
63
|
+
async runPromptSkill(skill, inputs, ctx, toolCalls) {
|
|
64
|
+
// Build the prompt with inputs
|
|
65
|
+
let prompt = skill.promptContent;
|
|
66
|
+
for (const [key, value] of Object.entries(inputs)) {
|
|
67
|
+
prompt = prompt.replace(`{{${key}}}`, String(value));
|
|
68
|
+
}
|
|
69
|
+
// Get allowed tools for this skill
|
|
70
|
+
const allowedTools = skill.manifest.tools
|
|
71
|
+
.map((name) => this.registry.get(name))
|
|
72
|
+
.filter(Boolean);
|
|
73
|
+
// Send to LLM with tool definitions
|
|
74
|
+
const toolDefs = allowedTools.map((t) => ({
|
|
75
|
+
name: t.name,
|
|
76
|
+
description: t.description,
|
|
77
|
+
inputSchema: zodToJsonSchema(t.inputSchema),
|
|
78
|
+
}));
|
|
79
|
+
// Agentic loop: call LLM, execute tools, repeat
|
|
80
|
+
const messages = [
|
|
81
|
+
{ role: 'system', content: prompt },
|
|
82
|
+
{ role: 'user', content: `Execute this skill with inputs: ${JSON.stringify(inputs)}` },
|
|
83
|
+
];
|
|
84
|
+
const maxIterations = 20;
|
|
85
|
+
let lastOutput = null;
|
|
86
|
+
for (let i = 0; i < maxIterations; i++) {
|
|
87
|
+
const response = await this.llmRouter.chat({
|
|
88
|
+
messages,
|
|
89
|
+
tools: toolDefs,
|
|
90
|
+
skillName: skill.manifest.name,
|
|
91
|
+
});
|
|
92
|
+
if (response.toolCalls && response.toolCalls.length > 0) {
|
|
93
|
+
messages.push({
|
|
94
|
+
role: 'assistant',
|
|
95
|
+
content: response.content,
|
|
96
|
+
toolCalls: response.toolCalls,
|
|
97
|
+
});
|
|
98
|
+
for (const tc of response.toolCalls) {
|
|
99
|
+
// Check policy
|
|
100
|
+
const tool = this.registry.get(tc.name);
|
|
101
|
+
if (!tool) {
|
|
102
|
+
messages.push({
|
|
103
|
+
role: 'tool',
|
|
104
|
+
content: JSON.stringify({ error: `Tool ${tc.name} not found` }),
|
|
105
|
+
toolCallId: tc.id,
|
|
106
|
+
});
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
// Check permissions
|
|
110
|
+
const permResult = await this.policy.checkPermission({
|
|
111
|
+
tool: tc.name,
|
|
112
|
+
operation: tc.name,
|
|
113
|
+
description: `Skill "${skill.manifest.name}" calling ${tc.name}`,
|
|
114
|
+
permissions: tool.permissions,
|
|
115
|
+
args: tc.args,
|
|
116
|
+
riskLevel: 'medium',
|
|
117
|
+
}, ctx);
|
|
118
|
+
if (!permResult.allowed && permResult.requiresApproval) {
|
|
119
|
+
const approved = await this.policy.requestApproval({
|
|
120
|
+
tool: tc.name,
|
|
121
|
+
operation: tc.name,
|
|
122
|
+
description: `Skill "${skill.manifest.name}" calling ${tc.name}`,
|
|
123
|
+
permissions: tool.permissions,
|
|
124
|
+
args: tc.args,
|
|
125
|
+
riskLevel: 'medium',
|
|
126
|
+
}, ctx);
|
|
127
|
+
if (!approved) {
|
|
128
|
+
messages.push({
|
|
129
|
+
role: 'tool',
|
|
130
|
+
content: JSON.stringify({ error: 'Permission denied by user' }),
|
|
131
|
+
toolCallId: tc.id,
|
|
132
|
+
});
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else if (!permResult.allowed) {
|
|
137
|
+
messages.push({
|
|
138
|
+
role: 'tool',
|
|
139
|
+
content: JSON.stringify({ error: permResult.reason }),
|
|
140
|
+
toolCallId: tc.id,
|
|
141
|
+
});
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
// Execute tool
|
|
145
|
+
const result = await this.registry.execute(tc.name, tc.args, ctx);
|
|
146
|
+
toolCalls.push({ tool: tc.name, input: tc.args, result });
|
|
147
|
+
auditEmitter.emit(AuditEventType.TOOL_CALL, {
|
|
148
|
+
tool: tc.name,
|
|
149
|
+
input: tc.args,
|
|
150
|
+
success: result.success,
|
|
151
|
+
});
|
|
152
|
+
messages.push({
|
|
153
|
+
role: 'tool',
|
|
154
|
+
content: JSON.stringify(result),
|
|
155
|
+
toolCallId: tc.id,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
// No tool calls — LLM finished
|
|
161
|
+
lastOutput = response.content;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return lastOutput;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Run a workflow-based skill (state machine)
|
|
169
|
+
*/
|
|
170
|
+
async runWorkflowSkill(skill, inputs, ctx, toolCalls) {
|
|
171
|
+
try {
|
|
172
|
+
const module = await import(skill.workflowPath);
|
|
173
|
+
const workflow = module.default ?? module.run;
|
|
174
|
+
if (typeof workflow !== 'function') {
|
|
175
|
+
throw new Error(`Workflow at ${skill.workflowPath} must export a default function or "run"`);
|
|
176
|
+
}
|
|
177
|
+
// Create a scoped tool executor
|
|
178
|
+
const toolExecutor = async (toolName, args) => {
|
|
179
|
+
// Ensure tool is in the skill's allowlist
|
|
180
|
+
if (!skill.manifest.tools.includes(toolName)) {
|
|
181
|
+
return {
|
|
182
|
+
success: false,
|
|
183
|
+
error: `Tool "${toolName}" is not allowed for skill "${skill.manifest.name}"`,
|
|
184
|
+
durationMs: 0,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
const result = await this.registry.execute(toolName, args, ctx);
|
|
188
|
+
toolCalls.push({ tool: toolName, input: args, result });
|
|
189
|
+
return result;
|
|
190
|
+
};
|
|
191
|
+
return await workflow({ inputs, tools: toolExecutor, context: ctx });
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
throw new Error(`Workflow execution failed: ${err.message}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=runner.js.map
|