@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.
Files changed (279) hide show
  1. package/README.md +1007 -0
  2. package/bin/agent.ts +6 -0
  3. package/dist/bin/agent.d.ts +3 -0
  4. package/dist/bin/agent.d.ts.map +1 -0
  5. package/dist/bin/agent.js +5 -0
  6. package/dist/bin/agent.js.map +1 -0
  7. package/dist/src/cli/commands/config.d.ts +3 -0
  8. package/dist/src/cli/commands/config.d.ts.map +1 -0
  9. package/dist/src/cli/commands/config.js +54 -0
  10. package/dist/src/cli/commands/config.js.map +1 -0
  11. package/dist/src/cli/commands/daemon.d.ts +3 -0
  12. package/dist/src/cli/commands/daemon.d.ts.map +1 -0
  13. package/dist/src/cli/commands/daemon.js +43 -0
  14. package/dist/src/cli/commands/daemon.js.map +1 -0
  15. package/dist/src/cli/commands/doctor.d.ts +3 -0
  16. package/dist/src/cli/commands/doctor.d.ts.map +1 -0
  17. package/dist/src/cli/commands/doctor.js +84 -0
  18. package/dist/src/cli/commands/doctor.js.map +1 -0
  19. package/dist/src/cli/commands/init.d.ts +8 -0
  20. package/dist/src/cli/commands/init.d.ts.map +1 -0
  21. package/dist/src/cli/commands/init.js +112 -0
  22. package/dist/src/cli/commands/init.js.map +1 -0
  23. package/dist/src/cli/commands/mcp.d.ts +3 -0
  24. package/dist/src/cli/commands/mcp.d.ts.map +1 -0
  25. package/dist/src/cli/commands/mcp.js +26 -0
  26. package/dist/src/cli/commands/mcp.js.map +1 -0
  27. package/dist/src/cli/commands/plan.d.ts +3 -0
  28. package/dist/src/cli/commands/plan.d.ts.map +1 -0
  29. package/dist/src/cli/commands/plan.js +220 -0
  30. package/dist/src/cli/commands/plan.js.map +1 -0
  31. package/dist/src/cli/commands/run.d.ts +3 -0
  32. package/dist/src/cli/commands/run.d.ts.map +1 -0
  33. package/dist/src/cli/commands/run.js +192 -0
  34. package/dist/src/cli/commands/run.js.map +1 -0
  35. package/dist/src/cli/commands/skills.d.ts +3 -0
  36. package/dist/src/cli/commands/skills.d.ts.map +1 -0
  37. package/dist/src/cli/commands/skills.js +143 -0
  38. package/dist/src/cli/commands/skills.js.map +1 -0
  39. package/dist/src/cli/index.d.ts +6 -0
  40. package/dist/src/cli/index.d.ts.map +1 -0
  41. package/dist/src/cli/index.js +33 -0
  42. package/dist/src/cli/index.js.map +1 -0
  43. package/dist/src/cli/ui/progress.d.ts +17 -0
  44. package/dist/src/cli/ui/progress.d.ts.map +1 -0
  45. package/dist/src/cli/ui/progress.js +43 -0
  46. package/dist/src/cli/ui/progress.js.map +1 -0
  47. package/dist/src/cli/ui/prompt.d.ts +10 -0
  48. package/dist/src/cli/ui/prompt.d.ts.map +1 -0
  49. package/dist/src/cli/ui/prompt.js +53 -0
  50. package/dist/src/cli/ui/prompt.js.map +1 -0
  51. package/dist/src/cli/ui/report.d.ts +6 -0
  52. package/dist/src/cli/ui/report.d.ts.map +1 -0
  53. package/dist/src/cli/ui/report.js +81 -0
  54. package/dist/src/cli/ui/report.js.map +1 -0
  55. package/dist/src/config/defaults.d.ts +3 -0
  56. package/dist/src/config/defaults.d.ts.map +1 -0
  57. package/dist/src/config/defaults.js +82 -0
  58. package/dist/src/config/defaults.js.map +1 -0
  59. package/dist/src/config/loader.d.ts +33 -0
  60. package/dist/src/config/loader.d.ts.map +1 -0
  61. package/dist/src/config/loader.js +161 -0
  62. package/dist/src/config/loader.js.map +1 -0
  63. package/dist/src/config/schema.d.ts +530 -0
  64. package/dist/src/config/schema.d.ts.map +1 -0
  65. package/dist/src/config/schema.js +97 -0
  66. package/dist/src/config/schema.js.map +1 -0
  67. package/dist/src/config/secrets.d.ts +31 -0
  68. package/dist/src/config/secrets.d.ts.map +1 -0
  69. package/dist/src/config/secrets.js +98 -0
  70. package/dist/src/config/secrets.js.map +1 -0
  71. package/dist/src/daemon/manager.d.ts +28 -0
  72. package/dist/src/daemon/manager.d.ts.map +1 -0
  73. package/dist/src/daemon/manager.js +77 -0
  74. package/dist/src/daemon/manager.js.map +1 -0
  75. package/dist/src/daemon/scheduler.d.ts +6 -0
  76. package/dist/src/daemon/scheduler.d.ts.map +1 -0
  77. package/dist/src/daemon/scheduler.js +82 -0
  78. package/dist/src/daemon/scheduler.js.map +1 -0
  79. package/dist/src/daemon/watcher.d.ts +16 -0
  80. package/dist/src/daemon/watcher.d.ts.map +1 -0
  81. package/dist/src/daemon/watcher.js +59 -0
  82. package/dist/src/daemon/watcher.js.map +1 -0
  83. package/dist/src/engine/executor.d.ts +51 -0
  84. package/dist/src/engine/executor.d.ts.map +1 -0
  85. package/dist/src/engine/executor.js +189 -0
  86. package/dist/src/engine/executor.js.map +1 -0
  87. package/dist/src/engine/rollback.d.ts +37 -0
  88. package/dist/src/engine/rollback.d.ts.map +1 -0
  89. package/dist/src/engine/rollback.js +95 -0
  90. package/dist/src/engine/rollback.js.map +1 -0
  91. package/dist/src/engine/types.d.ts +31 -0
  92. package/dist/src/engine/types.d.ts.map +1 -0
  93. package/dist/src/engine/types.js +2 -0
  94. package/dist/src/engine/types.js.map +1 -0
  95. package/dist/src/engine/verification.d.ts +27 -0
  96. package/dist/src/engine/verification.d.ts.map +1 -0
  97. package/dist/src/engine/verification.js +75 -0
  98. package/dist/src/engine/verification.js.map +1 -0
  99. package/dist/src/index.d.ts +17 -0
  100. package/dist/src/index.d.ts.map +1 -0
  101. package/dist/src/index.js +13 -0
  102. package/dist/src/index.js.map +1 -0
  103. package/dist/src/llm/cache.d.ts +20 -0
  104. package/dist/src/llm/cache.d.ts.map +1 -0
  105. package/dist/src/llm/cache.js +45 -0
  106. package/dist/src/llm/cache.js.map +1 -0
  107. package/dist/src/llm/providers/anthropic.d.ts +13 -0
  108. package/dist/src/llm/providers/anthropic.d.ts.map +1 -0
  109. package/dist/src/llm/providers/anthropic.js +69 -0
  110. package/dist/src/llm/providers/anthropic.js.map +1 -0
  111. package/dist/src/llm/providers/azure.d.ts +14 -0
  112. package/dist/src/llm/providers/azure.d.ts.map +1 -0
  113. package/dist/src/llm/providers/azure.js +98 -0
  114. package/dist/src/llm/providers/azure.js.map +1 -0
  115. package/dist/src/llm/providers/ollama.d.ts +13 -0
  116. package/dist/src/llm/providers/ollama.d.ts.map +1 -0
  117. package/dist/src/llm/providers/ollama.js +80 -0
  118. package/dist/src/llm/providers/ollama.js.map +1 -0
  119. package/dist/src/llm/providers/openai.d.ts +13 -0
  120. package/dist/src/llm/providers/openai.d.ts.map +1 -0
  121. package/dist/src/llm/providers/openai.js +74 -0
  122. package/dist/src/llm/providers/openai.js.map +1 -0
  123. package/dist/src/llm/router.d.ts +26 -0
  124. package/dist/src/llm/router.d.ts.map +1 -0
  125. package/dist/src/llm/router.js +104 -0
  126. package/dist/src/llm/router.js.map +1 -0
  127. package/dist/src/llm/types.d.ts +44 -0
  128. package/dist/src/llm/types.d.ts.map +1 -0
  129. package/dist/src/llm/types.js +2 -0
  130. package/dist/src/llm/types.js.map +1 -0
  131. package/dist/src/logging/audit-log.d.ts +89 -0
  132. package/dist/src/logging/audit-log.d.ts.map +1 -0
  133. package/dist/src/logging/audit-log.js +132 -0
  134. package/dist/src/logging/audit-log.js.map +1 -0
  135. package/dist/src/logging/logger.d.ts +13 -0
  136. package/dist/src/logging/logger.d.ts.map +1 -0
  137. package/dist/src/logging/logger.js +57 -0
  138. package/dist/src/logging/logger.js.map +1 -0
  139. package/dist/src/logging/redactor.d.ts +14 -0
  140. package/dist/src/logging/redactor.d.ts.map +1 -0
  141. package/dist/src/logging/redactor.js +48 -0
  142. package/dist/src/logging/redactor.js.map +1 -0
  143. package/dist/src/mcp/handlers.d.ts +21 -0
  144. package/dist/src/mcp/handlers.d.ts.map +1 -0
  145. package/dist/src/mcp/handlers.js +156 -0
  146. package/dist/src/mcp/handlers.js.map +1 -0
  147. package/dist/src/mcp/server.d.ts +8 -0
  148. package/dist/src/mcp/server.d.ts.map +1 -0
  149. package/dist/src/mcp/server.js +40 -0
  150. package/dist/src/mcp/server.js.map +1 -0
  151. package/dist/src/mcp/types.d.ts +20 -0
  152. package/dist/src/mcp/types.d.ts.map +1 -0
  153. package/dist/src/mcp/types.js +2 -0
  154. package/dist/src/mcp/types.js.map +1 -0
  155. package/dist/src/plans/parser.d.ts +33 -0
  156. package/dist/src/plans/parser.d.ts.map +1 -0
  157. package/dist/src/plans/parser.js +93 -0
  158. package/dist/src/plans/parser.js.map +1 -0
  159. package/dist/src/plans/propose.d.ts +26 -0
  160. package/dist/src/plans/propose.d.ts.map +1 -0
  161. package/dist/src/plans/propose.js +85 -0
  162. package/dist/src/plans/propose.js.map +1 -0
  163. package/dist/src/plans/runner.d.ts +19 -0
  164. package/dist/src/plans/runner.d.ts.map +1 -0
  165. package/dist/src/plans/runner.js +159 -0
  166. package/dist/src/plans/runner.js.map +1 -0
  167. package/dist/src/plans/triggers.d.ts +12 -0
  168. package/dist/src/plans/triggers.d.ts.map +1 -0
  169. package/dist/src/plans/triggers.js +43 -0
  170. package/dist/src/plans/triggers.js.map +1 -0
  171. package/dist/src/plans/types.d.ts +454 -0
  172. package/dist/src/plans/types.d.ts.map +1 -0
  173. package/dist/src/plans/types.js +56 -0
  174. package/dist/src/plans/types.js.map +1 -0
  175. package/dist/src/policy/audit.d.ts +35 -0
  176. package/dist/src/policy/audit.d.ts.map +1 -0
  177. package/dist/src/policy/audit.js +39 -0
  178. package/dist/src/policy/audit.js.map +1 -0
  179. package/dist/src/policy/engine.d.ts +35 -0
  180. package/dist/src/policy/engine.d.ts.map +1 -0
  181. package/dist/src/policy/engine.js +134 -0
  182. package/dist/src/policy/engine.js.map +1 -0
  183. package/dist/src/policy/scope.d.ts +27 -0
  184. package/dist/src/policy/scope.d.ts.map +1 -0
  185. package/dist/src/policy/scope.js +89 -0
  186. package/dist/src/policy/scope.js.map +1 -0
  187. package/dist/src/policy/types.d.ts +15 -0
  188. package/dist/src/policy/types.d.ts.map +1 -0
  189. package/dist/src/policy/types.js +2 -0
  190. package/dist/src/policy/types.js.map +1 -0
  191. package/dist/src/self-extend/generator.d.ts +27 -0
  192. package/dist/src/self-extend/generator.d.ts.map +1 -0
  193. package/dist/src/self-extend/generator.js +107 -0
  194. package/dist/src/self-extend/generator.js.map +1 -0
  195. package/dist/src/self-extend/publisher.d.ts +5 -0
  196. package/dist/src/self-extend/publisher.d.ts.map +1 -0
  197. package/dist/src/self-extend/publisher.js +40 -0
  198. package/dist/src/self-extend/publisher.js.map +1 -0
  199. package/dist/src/self-extend/sandbox.d.ts +10 -0
  200. package/dist/src/self-extend/sandbox.d.ts.map +1 -0
  201. package/dist/src/self-extend/sandbox.js +22 -0
  202. package/dist/src/self-extend/sandbox.js.map +1 -0
  203. package/dist/src/skills/hub/lockfile.d.ts +15 -0
  204. package/dist/src/skills/hub/lockfile.d.ts.map +1 -0
  205. package/dist/src/skills/hub/lockfile.js +13 -0
  206. package/dist/src/skills/hub/lockfile.js.map +1 -0
  207. package/dist/src/skills/hub/publisher.d.ts +7 -0
  208. package/dist/src/skills/hub/publisher.d.ts.map +1 -0
  209. package/dist/src/skills/hub/publisher.js +10 -0
  210. package/dist/src/skills/hub/publisher.js.map +1 -0
  211. package/dist/src/skills/hub/registry.d.ts +16 -0
  212. package/dist/src/skills/hub/registry.d.ts.map +1 -0
  213. package/dist/src/skills/hub/registry.js +24 -0
  214. package/dist/src/skills/hub/registry.js.map +1 -0
  215. package/dist/src/skills/index.d.ts +12 -0
  216. package/dist/src/skills/index.d.ts.map +1 -0
  217. package/dist/src/skills/index.js +82 -0
  218. package/dist/src/skills/index.js.map +1 -0
  219. package/dist/src/skills/lifecycle.d.ts +19 -0
  220. package/dist/src/skills/lifecycle.d.ts.map +1 -0
  221. package/dist/src/skills/lifecycle.js +48 -0
  222. package/dist/src/skills/lifecycle.js.map +1 -0
  223. package/dist/src/skills/loader.d.ts +43 -0
  224. package/dist/src/skills/loader.d.ts.map +1 -0
  225. package/dist/src/skills/loader.js +142 -0
  226. package/dist/src/skills/loader.js.map +1 -0
  227. package/dist/src/skills/runner.d.ts +43 -0
  228. package/dist/src/skills/runner.d.ts.map +1 -0
  229. package/dist/src/skills/runner.js +198 -0
  230. package/dist/src/skills/runner.js.map +1 -0
  231. package/dist/src/skills/types.d.ts +150 -0
  232. package/dist/src/skills/types.d.ts.map +1 -0
  233. package/dist/src/skills/types.js +31 -0
  234. package/dist/src/skills/types.js.map +1 -0
  235. package/dist/src/skills/validator.d.ts +19 -0
  236. package/dist/src/skills/validator.d.ts.map +1 -0
  237. package/dist/src/skills/validator.js +92 -0
  238. package/dist/src/skills/validator.js.map +1 -0
  239. package/dist/src/tools/core/cmd.d.ts +24 -0
  240. package/dist/src/tools/core/cmd.d.ts.map +1 -0
  241. package/dist/src/tools/core/cmd.js +55 -0
  242. package/dist/src/tools/core/cmd.js.map +1 -0
  243. package/dist/src/tools/core/fs.d.ts +76 -0
  244. package/dist/src/tools/core/fs.d.ts.map +1 -0
  245. package/dist/src/tools/core/fs.js +173 -0
  246. package/dist/src/tools/core/fs.js.map +1 -0
  247. package/dist/src/tools/core/git.d.ts +62 -0
  248. package/dist/src/tools/core/git.d.ts.map +1 -0
  249. package/dist/src/tools/core/git.js +138 -0
  250. package/dist/src/tools/core/git.js.map +1 -0
  251. package/dist/src/tools/core/project.d.ts +17 -0
  252. package/dist/src/tools/core/project.d.ts.map +1 -0
  253. package/dist/src/tools/core/project.js +104 -0
  254. package/dist/src/tools/core/project.js.map +1 -0
  255. package/dist/src/tools/plugins/loader.d.ts +13 -0
  256. package/dist/src/tools/plugins/loader.d.ts.map +1 -0
  257. package/dist/src/tools/plugins/loader.js +36 -0
  258. package/dist/src/tools/plugins/loader.js.map +1 -0
  259. package/dist/src/tools/registry.d.ts +38 -0
  260. package/dist/src/tools/registry.d.ts.map +1 -0
  261. package/dist/src/tools/registry.js +118 -0
  262. package/dist/src/tools/registry.js.map +1 -0
  263. package/dist/src/tools/types.d.ts +46 -0
  264. package/dist/src/tools/types.d.ts.map +1 -0
  265. package/dist/src/tools/types.js +10 -0
  266. package/dist/src/tools/types.js.map +1 -0
  267. package/dist/src/utils/hash.d.ts +13 -0
  268. package/dist/src/utils/hash.d.ts.map +1 -0
  269. package/dist/src/utils/hash.js +22 -0
  270. package/dist/src/utils/hash.js.map +1 -0
  271. package/dist/src/utils/paths.d.ts +45 -0
  272. package/dist/src/utils/paths.d.ts.map +1 -0
  273. package/dist/src/utils/paths.js +71 -0
  274. package/dist/src/utils/paths.js.map +1 -0
  275. package/dist/src/utils/schema.d.ts +16 -0
  276. package/dist/src/utils/schema.d.ts.map +1 -0
  277. package/dist/src/utils/schema.js +66 -0
  278. package/dist/src/utils/schema.js.map +1 -0
  279. 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":"AAGA,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,MAAM,OAAO,UAAU;IACX,MAAM,CAAc;IACpB,EAAE,GAAwB,IAAI,CAAC;IAC/B,WAAW,GAAG,KAAK,CAAC;IAE5B,YAAY,MAAmB;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAqB;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO;YAAE,OAAO;QAEnD,IAAI,CAAC;YACD,mCAAmC;YACnC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAC;gBACxG,OAAO;YACX,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC;YAC5D,kDAAkD;YAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC;YAC/D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;gBACxD,OAAO;YACX,CAAC;YAED,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;YAE/B,2DAA2D;YAC3D,MAAM;YAEN,qDAAqD;YACrD,sCAAsC;YAEtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBACnE,iBAAiB;gBACjB,sFAAsF;YAC1F,CAAC;YAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAE3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC9D,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,CAAC,GAAG,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAE7C,cAAc;QACd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAE9C,SAAS;QACT,gCAAgC;QAEhC,qDAAqD;QACrD,OAAO,EAAE,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,IAAY;QACnC,4BAA4B;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;QAC7C,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;gBAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;gBAClD,QAAQ,EAAE,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;gBACtD,UAAU,EAAE,MAAM,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB;gBACtE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;aACjE,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;gBACvC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,IAAI;aACd,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjC,CAAC;aAAM,CAAC;YACJ,iBAAiB;YACjB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACrD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;gBACvC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,IAAI;aACd,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjC,CAAC;IACL,CAAC;CACJ"}
@@ -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