@lleverage-ai/agent-sdk 0.0.1

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 (327) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2321 -0
  3. package/dist/agent.d.ts +52 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +2122 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/backend.d.ts +378 -0
  8. package/dist/backend.d.ts.map +1 -0
  9. package/dist/backend.js +71 -0
  10. package/dist/backend.js.map +1 -0
  11. package/dist/backends/composite.d.ts +258 -0
  12. package/dist/backends/composite.d.ts.map +1 -0
  13. package/dist/backends/composite.js +437 -0
  14. package/dist/backends/composite.js.map +1 -0
  15. package/dist/backends/filesystem.d.ts +268 -0
  16. package/dist/backends/filesystem.d.ts.map +1 -0
  17. package/dist/backends/filesystem.js +623 -0
  18. package/dist/backends/filesystem.js.map +1 -0
  19. package/dist/backends/index.d.ts +14 -0
  20. package/dist/backends/index.d.ts.map +1 -0
  21. package/dist/backends/index.js +14 -0
  22. package/dist/backends/index.js.map +1 -0
  23. package/dist/backends/persistent.d.ts +312 -0
  24. package/dist/backends/persistent.d.ts.map +1 -0
  25. package/dist/backends/persistent.js +519 -0
  26. package/dist/backends/persistent.js.map +1 -0
  27. package/dist/backends/sandbox.d.ts +315 -0
  28. package/dist/backends/sandbox.d.ts.map +1 -0
  29. package/dist/backends/sandbox.js +490 -0
  30. package/dist/backends/sandbox.js.map +1 -0
  31. package/dist/backends/state.d.ts +225 -0
  32. package/dist/backends/state.d.ts.map +1 -0
  33. package/dist/backends/state.js +396 -0
  34. package/dist/backends/state.js.map +1 -0
  35. package/dist/checkpointer/file-saver.d.ts +182 -0
  36. package/dist/checkpointer/file-saver.d.ts.map +1 -0
  37. package/dist/checkpointer/file-saver.js +298 -0
  38. package/dist/checkpointer/file-saver.js.map +1 -0
  39. package/dist/checkpointer/index.d.ts +40 -0
  40. package/dist/checkpointer/index.d.ts.map +1 -0
  41. package/dist/checkpointer/index.js +40 -0
  42. package/dist/checkpointer/index.js.map +1 -0
  43. package/dist/checkpointer/kv-saver.d.ts +142 -0
  44. package/dist/checkpointer/kv-saver.d.ts.map +1 -0
  45. package/dist/checkpointer/kv-saver.js +176 -0
  46. package/dist/checkpointer/kv-saver.js.map +1 -0
  47. package/dist/checkpointer/memory-saver.d.ts +158 -0
  48. package/dist/checkpointer/memory-saver.d.ts.map +1 -0
  49. package/dist/checkpointer/memory-saver.js +222 -0
  50. package/dist/checkpointer/memory-saver.js.map +1 -0
  51. package/dist/checkpointer/types.d.ts +353 -0
  52. package/dist/checkpointer/types.d.ts.map +1 -0
  53. package/dist/checkpointer/types.js +159 -0
  54. package/dist/checkpointer/types.js.map +1 -0
  55. package/dist/context-manager.d.ts +627 -0
  56. package/dist/context-manager.d.ts.map +1 -0
  57. package/dist/context-manager.js +1039 -0
  58. package/dist/context-manager.js.map +1 -0
  59. package/dist/context.d.ts +57 -0
  60. package/dist/context.d.ts.map +1 -0
  61. package/dist/context.js +76 -0
  62. package/dist/context.js.map +1 -0
  63. package/dist/errors/index.d.ts +611 -0
  64. package/dist/errors/index.d.ts.map +1 -0
  65. package/dist/errors/index.js +1023 -0
  66. package/dist/errors/index.js.map +1 -0
  67. package/dist/generation-helpers.d.ts +126 -0
  68. package/dist/generation-helpers.d.ts.map +1 -0
  69. package/dist/generation-helpers.js +181 -0
  70. package/dist/generation-helpers.js.map +1 -0
  71. package/dist/hooks/audit.d.ts +210 -0
  72. package/dist/hooks/audit.d.ts.map +1 -0
  73. package/dist/hooks/audit.js +305 -0
  74. package/dist/hooks/audit.js.map +1 -0
  75. package/dist/hooks/cache.d.ts +180 -0
  76. package/dist/hooks/cache.d.ts.map +1 -0
  77. package/dist/hooks/cache.js +273 -0
  78. package/dist/hooks/cache.js.map +1 -0
  79. package/dist/hooks/guardrails.d.ts +145 -0
  80. package/dist/hooks/guardrails.d.ts.map +1 -0
  81. package/dist/hooks/guardrails.js +326 -0
  82. package/dist/hooks/guardrails.js.map +1 -0
  83. package/dist/hooks/index.d.ts +18 -0
  84. package/dist/hooks/index.d.ts.map +1 -0
  85. package/dist/hooks/index.js +32 -0
  86. package/dist/hooks/index.js.map +1 -0
  87. package/dist/hooks/logging.d.ts +193 -0
  88. package/dist/hooks/logging.d.ts.map +1 -0
  89. package/dist/hooks/logging.js +345 -0
  90. package/dist/hooks/logging.js.map +1 -0
  91. package/dist/hooks/parallel-guardrails.d.ts +268 -0
  92. package/dist/hooks/parallel-guardrails.d.ts.map +1 -0
  93. package/dist/hooks/parallel-guardrails.js +416 -0
  94. package/dist/hooks/parallel-guardrails.js.map +1 -0
  95. package/dist/hooks/rate-limit.d.ts +305 -0
  96. package/dist/hooks/rate-limit.d.ts.map +1 -0
  97. package/dist/hooks/rate-limit.js +372 -0
  98. package/dist/hooks/rate-limit.js.map +1 -0
  99. package/dist/hooks/retry.d.ts +144 -0
  100. package/dist/hooks/retry.d.ts.map +1 -0
  101. package/dist/hooks/retry.js +210 -0
  102. package/dist/hooks/retry.js.map +1 -0
  103. package/dist/hooks/secrets.d.ts +174 -0
  104. package/dist/hooks/secrets.d.ts.map +1 -0
  105. package/dist/hooks/secrets.js +306 -0
  106. package/dist/hooks/secrets.js.map +1 -0
  107. package/dist/hooks.d.ts +229 -0
  108. package/dist/hooks.d.ts.map +1 -0
  109. package/dist/hooks.js +352 -0
  110. package/dist/hooks.js.map +1 -0
  111. package/dist/index.d.ts +97 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +182 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/mcp/env.d.ts +25 -0
  116. package/dist/mcp/env.d.ts.map +1 -0
  117. package/dist/mcp/env.js +18 -0
  118. package/dist/mcp/env.js.map +1 -0
  119. package/dist/mcp/index.d.ts +16 -0
  120. package/dist/mcp/index.d.ts.map +1 -0
  121. package/dist/mcp/index.js +17 -0
  122. package/dist/mcp/index.js.map +1 -0
  123. package/dist/mcp/manager.d.ts +184 -0
  124. package/dist/mcp/manager.d.ts.map +1 -0
  125. package/dist/mcp/manager.js +446 -0
  126. package/dist/mcp/manager.js.map +1 -0
  127. package/dist/mcp/types.d.ts +58 -0
  128. package/dist/mcp/types.d.ts.map +1 -0
  129. package/dist/mcp/types.js +7 -0
  130. package/dist/mcp/types.js.map +1 -0
  131. package/dist/mcp/validation.d.ts +119 -0
  132. package/dist/mcp/validation.d.ts.map +1 -0
  133. package/dist/mcp/validation.js +407 -0
  134. package/dist/mcp/validation.js.map +1 -0
  135. package/dist/mcp/virtual-server.d.ts +78 -0
  136. package/dist/mcp/virtual-server.d.ts.map +1 -0
  137. package/dist/mcp/virtual-server.js +137 -0
  138. package/dist/mcp/virtual-server.js.map +1 -0
  139. package/dist/memory/filesystem-store.d.ts +217 -0
  140. package/dist/memory/filesystem-store.d.ts.map +1 -0
  141. package/dist/memory/filesystem-store.js +343 -0
  142. package/dist/memory/filesystem-store.js.map +1 -0
  143. package/dist/memory/index.d.ts +46 -0
  144. package/dist/memory/index.d.ts.map +1 -0
  145. package/dist/memory/index.js +46 -0
  146. package/dist/memory/index.js.map +1 -0
  147. package/dist/memory/loader.d.ts +396 -0
  148. package/dist/memory/loader.d.ts.map +1 -0
  149. package/dist/memory/loader.js +419 -0
  150. package/dist/memory/loader.js.map +1 -0
  151. package/dist/memory/permissions.d.ts +282 -0
  152. package/dist/memory/permissions.d.ts.map +1 -0
  153. package/dist/memory/permissions.js +297 -0
  154. package/dist/memory/permissions.js.map +1 -0
  155. package/dist/memory/rules.d.ts +249 -0
  156. package/dist/memory/rules.d.ts.map +1 -0
  157. package/dist/memory/rules.js +362 -0
  158. package/dist/memory/rules.js.map +1 -0
  159. package/dist/memory/store.d.ts +286 -0
  160. package/dist/memory/store.d.ts.map +1 -0
  161. package/dist/memory/store.js +263 -0
  162. package/dist/memory/store.js.map +1 -0
  163. package/dist/middleware/apply.d.ts +73 -0
  164. package/dist/middleware/apply.d.ts.map +1 -0
  165. package/dist/middleware/apply.js +219 -0
  166. package/dist/middleware/apply.js.map +1 -0
  167. package/dist/middleware/context.d.ts +33 -0
  168. package/dist/middleware/context.d.ts.map +1 -0
  169. package/dist/middleware/context.js +176 -0
  170. package/dist/middleware/context.js.map +1 -0
  171. package/dist/middleware/index.d.ts +31 -0
  172. package/dist/middleware/index.d.ts.map +1 -0
  173. package/dist/middleware/index.js +32 -0
  174. package/dist/middleware/index.js.map +1 -0
  175. package/dist/middleware/logging.d.ts +137 -0
  176. package/dist/middleware/logging.d.ts.map +1 -0
  177. package/dist/middleware/logging.js +374 -0
  178. package/dist/middleware/logging.js.map +1 -0
  179. package/dist/middleware/types.d.ts +183 -0
  180. package/dist/middleware/types.d.ts.map +1 -0
  181. package/dist/middleware/types.js +11 -0
  182. package/dist/middleware/types.js.map +1 -0
  183. package/dist/observability/events.d.ts +183 -0
  184. package/dist/observability/events.d.ts.map +1 -0
  185. package/dist/observability/events.js +305 -0
  186. package/dist/observability/events.js.map +1 -0
  187. package/dist/observability/index.d.ts +55 -0
  188. package/dist/observability/index.d.ts.map +1 -0
  189. package/dist/observability/index.js +87 -0
  190. package/dist/observability/index.js.map +1 -0
  191. package/dist/observability/logger.d.ts +318 -0
  192. package/dist/observability/logger.d.ts.map +1 -0
  193. package/dist/observability/logger.js +436 -0
  194. package/dist/observability/logger.js.map +1 -0
  195. package/dist/observability/metrics.d.ts +341 -0
  196. package/dist/observability/metrics.d.ts.map +1 -0
  197. package/dist/observability/metrics.js +490 -0
  198. package/dist/observability/metrics.js.map +1 -0
  199. package/dist/observability/preset.d.ts +161 -0
  200. package/dist/observability/preset.d.ts.map +1 -0
  201. package/dist/observability/preset.js +133 -0
  202. package/dist/observability/preset.js.map +1 -0
  203. package/dist/observability/streaming.d.ts +113 -0
  204. package/dist/observability/streaming.d.ts.map +1 -0
  205. package/dist/observability/streaming.js +114 -0
  206. package/dist/observability/streaming.js.map +1 -0
  207. package/dist/observability/tracing.d.ts +378 -0
  208. package/dist/observability/tracing.d.ts.map +1 -0
  209. package/dist/observability/tracing.js +539 -0
  210. package/dist/observability/tracing.js.map +1 -0
  211. package/dist/plugins.d.ts +55 -0
  212. package/dist/plugins.d.ts.map +1 -0
  213. package/dist/plugins.js +63 -0
  214. package/dist/plugins.js.map +1 -0
  215. package/dist/presets/index.d.ts +7 -0
  216. package/dist/presets/index.d.ts.map +1 -0
  217. package/dist/presets/index.js +7 -0
  218. package/dist/presets/index.js.map +1 -0
  219. package/dist/presets/production.d.ts +262 -0
  220. package/dist/presets/production.d.ts.map +1 -0
  221. package/dist/presets/production.js +295 -0
  222. package/dist/presets/production.js.map +1 -0
  223. package/dist/security/index.d.ts +179 -0
  224. package/dist/security/index.d.ts.map +1 -0
  225. package/dist/security/index.js +323 -0
  226. package/dist/security/index.js.map +1 -0
  227. package/dist/subagents/advanced.d.ts +413 -0
  228. package/dist/subagents/advanced.d.ts.map +1 -0
  229. package/dist/subagents/advanced.js +396 -0
  230. package/dist/subagents/advanced.js.map +1 -0
  231. package/dist/subagents/index.d.ts +14 -0
  232. package/dist/subagents/index.d.ts.map +1 -0
  233. package/dist/subagents/index.js +15 -0
  234. package/dist/subagents/index.js.map +1 -0
  235. package/dist/subagents.d.ts +73 -0
  236. package/dist/subagents.d.ts.map +1 -0
  237. package/dist/subagents.js +213 -0
  238. package/dist/subagents.js.map +1 -0
  239. package/dist/task-store/file-store.d.ts +76 -0
  240. package/dist/task-store/file-store.d.ts.map +1 -0
  241. package/dist/task-store/file-store.js +190 -0
  242. package/dist/task-store/file-store.js.map +1 -0
  243. package/dist/task-store/index.d.ts +11 -0
  244. package/dist/task-store/index.d.ts.map +1 -0
  245. package/dist/task-store/index.js +10 -0
  246. package/dist/task-store/index.js.map +1 -0
  247. package/dist/task-store/kv-store.d.ts +140 -0
  248. package/dist/task-store/kv-store.d.ts.map +1 -0
  249. package/dist/task-store/kv-store.js +169 -0
  250. package/dist/task-store/kv-store.js.map +1 -0
  251. package/dist/task-store/memory-store.d.ts +66 -0
  252. package/dist/task-store/memory-store.d.ts.map +1 -0
  253. package/dist/task-store/memory-store.js +125 -0
  254. package/dist/task-store/memory-store.js.map +1 -0
  255. package/dist/task-store/types.d.ts +235 -0
  256. package/dist/task-store/types.d.ts.map +1 -0
  257. package/dist/task-store/types.js +110 -0
  258. package/dist/task-store/types.js.map +1 -0
  259. package/dist/testing/assertions.d.ts +401 -0
  260. package/dist/testing/assertions.d.ts.map +1 -0
  261. package/dist/testing/assertions.js +630 -0
  262. package/dist/testing/assertions.js.map +1 -0
  263. package/dist/testing/index.d.ts +343 -0
  264. package/dist/testing/index.d.ts.map +1 -0
  265. package/dist/testing/index.js +360 -0
  266. package/dist/testing/index.js.map +1 -0
  267. package/dist/testing/mock-agent.d.ts +214 -0
  268. package/dist/testing/mock-agent.d.ts.map +1 -0
  269. package/dist/testing/mock-agent.js +448 -0
  270. package/dist/testing/mock-agent.js.map +1 -0
  271. package/dist/testing/recorder.d.ts +288 -0
  272. package/dist/testing/recorder.d.ts.map +1 -0
  273. package/dist/testing/recorder.js +499 -0
  274. package/dist/testing/recorder.js.map +1 -0
  275. package/dist/tools/execute.d.ts +104 -0
  276. package/dist/tools/execute.d.ts.map +1 -0
  277. package/dist/tools/execute.js +191 -0
  278. package/dist/tools/execute.js.map +1 -0
  279. package/dist/tools/factory.d.ts +260 -0
  280. package/dist/tools/factory.d.ts.map +1 -0
  281. package/dist/tools/factory.js +241 -0
  282. package/dist/tools/factory.js.map +1 -0
  283. package/dist/tools/filesystem.d.ts +215 -0
  284. package/dist/tools/filesystem.d.ts.map +1 -0
  285. package/dist/tools/filesystem.js +311 -0
  286. package/dist/tools/filesystem.js.map +1 -0
  287. package/dist/tools/index.d.ts +33 -0
  288. package/dist/tools/index.d.ts.map +1 -0
  289. package/dist/tools/index.js +33 -0
  290. package/dist/tools/index.js.map +1 -0
  291. package/dist/tools/search.d.ts +59 -0
  292. package/dist/tools/search.d.ts.map +1 -0
  293. package/dist/tools/search.js +94 -0
  294. package/dist/tools/search.js.map +1 -0
  295. package/dist/tools/skills.d.ts +354 -0
  296. package/dist/tools/skills.d.ts.map +1 -0
  297. package/dist/tools/skills.js +413 -0
  298. package/dist/tools/skills.js.map +1 -0
  299. package/dist/tools/task.d.ts +272 -0
  300. package/dist/tools/task.d.ts.map +1 -0
  301. package/dist/tools/task.js +521 -0
  302. package/dist/tools/task.js.map +1 -0
  303. package/dist/tools/todos.d.ts +131 -0
  304. package/dist/tools/todos.d.ts.map +1 -0
  305. package/dist/tools/todos.js +120 -0
  306. package/dist/tools/todos.js.map +1 -0
  307. package/dist/tools/tool-registry.d.ts +424 -0
  308. package/dist/tools/tool-registry.d.ts.map +1 -0
  309. package/dist/tools/tool-registry.js +607 -0
  310. package/dist/tools/tool-registry.js.map +1 -0
  311. package/dist/tools/user-interaction.d.ts +116 -0
  312. package/dist/tools/user-interaction.d.ts.map +1 -0
  313. package/dist/tools/user-interaction.js +147 -0
  314. package/dist/tools/user-interaction.js.map +1 -0
  315. package/dist/tools/utils.d.ts +124 -0
  316. package/dist/tools/utils.d.ts.map +1 -0
  317. package/dist/tools/utils.js +189 -0
  318. package/dist/tools/utils.js.map +1 -0
  319. package/dist/tools.d.ts +74 -0
  320. package/dist/tools.d.ts.map +1 -0
  321. package/dist/tools.js +73 -0
  322. package/dist/tools.js.map +1 -0
  323. package/dist/types.d.ts +2421 -0
  324. package/dist/types.d.ts.map +1 -0
  325. package/dist/types.js +55 -0
  326. package/dist/types.js.map +1 -0
  327. package/package.json +81 -0
@@ -0,0 +1,413 @@
1
+ /**
2
+ * Skill tool for progressive disclosure of capabilities.
3
+ *
4
+ * The skill tool allows agents to load skills (tools + prompts) on-demand
5
+ * based on conversation context. This keeps the initial context small and
6
+ * focused, expanding capabilities only as needed.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import { tool } from "ai";
11
+ import { z } from "zod";
12
+ // =============================================================================
13
+ // Skill Registry
14
+ // =============================================================================
15
+ /**
16
+ * Registry for managing loadable skills.
17
+ *
18
+ * The registry tracks available skills and which ones have been loaded.
19
+ * Skills are loaded on-demand by the agent using the skill tool.
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const registry = new SkillRegistry({
24
+ * skills: [gitSkill, dockerSkill],
25
+ * });
26
+ *
27
+ * // Register more skills later
28
+ * registry.register(kubernetesSkill);
29
+ *
30
+ * // Check available skills
31
+ * const available = registry.listAvailable();
32
+ *
33
+ * // Load a skill
34
+ * const result = registry.load("git");
35
+ * ```
36
+ *
37
+ * @category Tools
38
+ */
39
+ export class SkillRegistry {
40
+ /** All registered skills */
41
+ skills = new Map();
42
+ /** Currently loaded skills */
43
+ loadedSkills = new Set();
44
+ /** Callback for skill load events */
45
+ onSkillLoaded;
46
+ /** MCP manager for loading MCP tools */
47
+ mcpManager;
48
+ /**
49
+ * Creates a new skill registry.
50
+ *
51
+ * @param options - Configuration options
52
+ */
53
+ constructor(options = {}) {
54
+ this.onSkillLoaded = options.onSkillLoaded;
55
+ this.mcpManager = options.mcpManager;
56
+ if (options.skills) {
57
+ for (const skill of options.skills) {
58
+ this.register(skill);
59
+ }
60
+ }
61
+ }
62
+ /**
63
+ * Register a skill with the registry.
64
+ *
65
+ * @param skill - The skill definition to register
66
+ * @throws Error if a skill with the same name is already registered
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * registry.register({
71
+ * name: "aws",
72
+ * description: "AWS cloud operations",
73
+ * tools: { ... },
74
+ * prompt: "You now have access to AWS tools.",
75
+ * });
76
+ * ```
77
+ */
78
+ register(skill) {
79
+ if (this.skills.has(skill.name)) {
80
+ throw new Error(`Skill '${skill.name}' is already registered`);
81
+ }
82
+ this.skills.set(skill.name, skill);
83
+ }
84
+ /**
85
+ * Unregister a skill from the registry.
86
+ *
87
+ * @param name - The name of the skill to unregister
88
+ * @returns True if the skill was found and removed
89
+ */
90
+ unregister(name) {
91
+ this.loadedSkills.delete(name);
92
+ return this.skills.delete(name);
93
+ }
94
+ /**
95
+ * Check if a skill is registered.
96
+ *
97
+ * @param name - The name of the skill to check
98
+ * @returns True if the skill is registered
99
+ */
100
+ has(name) {
101
+ return this.skills.has(name);
102
+ }
103
+ /**
104
+ * Check if a skill is currently loaded.
105
+ *
106
+ * @param name - The name of the skill to check
107
+ * @returns True if the skill is loaded
108
+ */
109
+ isLoaded(name) {
110
+ return this.loadedSkills.has(name);
111
+ }
112
+ /**
113
+ * Get a registered skill definition.
114
+ *
115
+ * @param name - The name of the skill
116
+ * @returns The skill definition or undefined if not found
117
+ */
118
+ get(name) {
119
+ return this.skills.get(name);
120
+ }
121
+ /**
122
+ * Load a skill, making its tools and prompt available.
123
+ *
124
+ * This method handles dependencies, loading them first if specified.
125
+ * Already-loaded skills are skipped (no duplicate loading).
126
+ *
127
+ * @param name - The name of the skill to load
128
+ * @param args - Optional arguments to pass to the skill's prompt function
129
+ * @returns The load result with tools, prompt, and status
130
+ *
131
+ * @example
132
+ * ```typescript
133
+ * const result = registry.load("git");
134
+ * if (result.success) {
135
+ * // Inject result.tools into agent
136
+ * // Inject result.prompt into context
137
+ * }
138
+ * ```
139
+ */
140
+ load(name, args) {
141
+ // Check if already loaded
142
+ if (this.loadedSkills.has(name)) {
143
+ return {
144
+ success: true,
145
+ tools: {},
146
+ prompt: "",
147
+ error: `Skill '${name}' is already loaded`,
148
+ };
149
+ }
150
+ // Check if skill exists
151
+ const skill = this.skills.get(name);
152
+ if (!skill) {
153
+ return {
154
+ success: false,
155
+ tools: {},
156
+ prompt: "",
157
+ error: `Skill '${name}' not found. Available: ${this.listAvailable()
158
+ .map((s) => s.name)
159
+ .join(", ")}`,
160
+ };
161
+ }
162
+ // Load dependencies first
163
+ const loadedDependencies = [];
164
+ const aggregatedTools = {};
165
+ let aggregatedPrompt = "";
166
+ if (skill.dependencies && skill.dependencies.length > 0) {
167
+ for (const depName of skill.dependencies) {
168
+ if (this.loadedSkills.has(depName)) {
169
+ continue; // Skip already loaded dependencies
170
+ }
171
+ const depResult = this.load(depName);
172
+ if (!depResult.success) {
173
+ return {
174
+ success: false,
175
+ tools: {},
176
+ prompt: "",
177
+ error: `Failed to load dependency '${depName}': ${depResult.error}`,
178
+ };
179
+ }
180
+ // Aggregate dependency tools and prompts
181
+ Object.assign(aggregatedTools, depResult.tools);
182
+ if (depResult.prompt) {
183
+ aggregatedPrompt += `${depResult.prompt}\n\n`;
184
+ }
185
+ loadedDependencies.push(depName);
186
+ }
187
+ }
188
+ // Mark as loaded
189
+ this.loadedSkills.add(name);
190
+ // Track MCP tool loading results
191
+ let loadedMcpTools;
192
+ let notFoundMcpTools;
193
+ // Load MCP tools if specified
194
+ if (skill.mcpTools && skill.mcpTools.length > 0 && this.mcpManager) {
195
+ const mcpLoadResult = this.mcpManager.loadTools(skill.mcpTools);
196
+ if (mcpLoadResult.loaded.length > 0 || mcpLoadResult.alreadyLoaded.length > 0) {
197
+ loadedMcpTools = [...mcpLoadResult.loaded, ...mcpLoadResult.alreadyLoaded];
198
+ }
199
+ if (mcpLoadResult.notFound.length > 0) {
200
+ notFoundMcpTools = mcpLoadResult.notFound;
201
+ // Log warning but continue - some MCP tools may be unavailable
202
+ console.warn(`Skill '${name}': Some MCP tools not found: ${mcpLoadResult.notFound.join(", ")}`);
203
+ }
204
+ }
205
+ // Get the prompt
206
+ const prompt = typeof skill.prompt === "function" ? skill.prompt(args) : skill.prompt;
207
+ // Build result - MCP tools are loaded via MCPManager, not returned directly
208
+ const result = {
209
+ success: true,
210
+ tools: { ...aggregatedTools, ...skill.tools },
211
+ prompt: aggregatedPrompt + prompt,
212
+ loadedDependencies: loadedDependencies.length > 0 ? loadedDependencies : undefined,
213
+ loadedMcpTools,
214
+ notFoundMcpTools,
215
+ };
216
+ // Notify callback
217
+ if (this.onSkillLoaded) {
218
+ this.onSkillLoaded(name, result);
219
+ }
220
+ return result;
221
+ }
222
+ /**
223
+ * List skills that are available but not yet loaded.
224
+ *
225
+ * @returns Array of skill summaries (name and description)
226
+ */
227
+ listAvailable() {
228
+ const available = [];
229
+ for (const [name, skill] of this.skills) {
230
+ if (!this.loadedSkills.has(name)) {
231
+ available.push({
232
+ name,
233
+ description: skill.description,
234
+ });
235
+ }
236
+ }
237
+ return available;
238
+ }
239
+ /**
240
+ * List all loaded skills.
241
+ *
242
+ * @returns Array of loaded skill names
243
+ */
244
+ listLoaded() {
245
+ return Array.from(this.loadedSkills);
246
+ }
247
+ /**
248
+ * List all registered skills (loaded and available).
249
+ *
250
+ * @returns Array of all skill summaries
251
+ */
252
+ listAll() {
253
+ const all = [];
254
+ for (const [name, skill] of this.skills) {
255
+ all.push({
256
+ name,
257
+ description: skill.description,
258
+ loaded: this.loadedSkills.has(name),
259
+ });
260
+ }
261
+ return all;
262
+ }
263
+ /**
264
+ * Reset the registry, marking all skills as unloaded.
265
+ *
266
+ * This does not unregister skills, only resets the loaded state.
267
+ */
268
+ reset() {
269
+ this.loadedSkills.clear();
270
+ }
271
+ /**
272
+ * Get the number of registered skills.
273
+ */
274
+ get size() {
275
+ return this.skills.size;
276
+ }
277
+ /**
278
+ * Get the number of loaded skills.
279
+ */
280
+ get loadedCount() {
281
+ return this.loadedSkills.size;
282
+ }
283
+ }
284
+ /**
285
+ * Creates a tool that allows agents to load skills on-demand.
286
+ *
287
+ * The tool's description dynamically lists available (not yet loaded) skills,
288
+ * so the agent can decide which skill to load based on the conversation.
289
+ *
290
+ * @param options - Configuration options
291
+ * @returns An AI SDK compatible tool for loading skills
292
+ *
293
+ * @example
294
+ * ```typescript
295
+ * import { createSkillTool, SkillRegistry } from "@lleverage-ai/agent-sdk";
296
+ *
297
+ * const registry = new SkillRegistry({
298
+ * skills: [gitSkill, dockerSkill],
299
+ * });
300
+ *
301
+ * const skillTool = createSkillTool({ registry });
302
+ *
303
+ * const agent = createAgent({
304
+ * model,
305
+ * tools: { load_skill: skillTool },
306
+ * });
307
+ *
308
+ * // Agent can now invoke load_skill to gain new capabilities
309
+ * ```
310
+ *
311
+ * @category Tools
312
+ */
313
+ export function createSkillTool(options) {
314
+ const { registry, descriptionPrefix } = options;
315
+ // Build dynamic description based on available skills
316
+ const buildDescription = () => {
317
+ const available = registry.listAvailable();
318
+ if (available.length === 0) {
319
+ return "No skills available to load.";
320
+ }
321
+ const prefix = descriptionPrefix ??
322
+ "Load a skill to gain additional capabilities. After loading, new tools and instructions become available.";
323
+ const skillList = available.map((s) => `- ${s.name}: ${s.description}`).join("\n");
324
+ return `${prefix}\n\nAvailable skills:\n${skillList}`;
325
+ };
326
+ return tool({
327
+ description: buildDescription(),
328
+ inputSchema: z.object({
329
+ skill_name: z.string().describe("Name of the skill to load"),
330
+ args: z.string().optional().describe("Optional arguments to pass to the skill"),
331
+ }),
332
+ execute: async ({ skill_name, args }) => {
333
+ const result = registry.load(skill_name, args);
334
+ if (!result.success) {
335
+ return {
336
+ success: false,
337
+ error: result.error,
338
+ };
339
+ }
340
+ // Format the response
341
+ const toolNames = Object.keys(result.tools);
342
+ const response = {
343
+ success: true,
344
+ skill: skill_name,
345
+ newTools: toolNames,
346
+ instructions: result.prompt,
347
+ };
348
+ if (result.loadedDependencies && result.loadedDependencies.length > 0) {
349
+ response.dependencies = result.loadedDependencies;
350
+ }
351
+ if (toolNames.length === 0) {
352
+ response.message = `Loaded skill '${skill_name}' (provides instructions only, no new tools)`;
353
+ }
354
+ else {
355
+ response.message = `Loaded skill '${skill_name}'. New tools available: ${toolNames.join(", ")}`;
356
+ }
357
+ return response;
358
+ },
359
+ });
360
+ }
361
+ // =============================================================================
362
+ // Factory Functions
363
+ // =============================================================================
364
+ /**
365
+ * Creates a new skill registry with the given skills.
366
+ *
367
+ * This is a convenience function for creating a SkillRegistry instance.
368
+ *
369
+ * @param skills - Initial skills to register
370
+ * @param options - Additional options
371
+ * @returns A new SkillRegistry instance
372
+ *
373
+ * @example
374
+ * ```typescript
375
+ * const registry = createSkillRegistry([gitSkill, dockerSkill]);
376
+ * ```
377
+ *
378
+ * @category Tools
379
+ */
380
+ export function createSkillRegistry(skills, options) {
381
+ return new SkillRegistry({
382
+ ...options,
383
+ skills,
384
+ });
385
+ }
386
+ /**
387
+ * Creates a skill definition.
388
+ *
389
+ * This is a helper function for creating LoadableSkillDefinition objects
390
+ * with proper typing.
391
+ *
392
+ * @param options - Skill configuration
393
+ * @returns A LoadableSkillDefinition object
394
+ *
395
+ * @example
396
+ * ```typescript
397
+ * const gitSkill = defineLoadableSkill({
398
+ * name: "git",
399
+ * description: "Git version control operations",
400
+ * tools: {
401
+ * git_status: tool({ ... }),
402
+ * git_commit: tool({ ... }),
403
+ * },
404
+ * prompt: "You now have access to Git tools.",
405
+ * });
406
+ * ```
407
+ *
408
+ * @category Tools
409
+ */
410
+ export function defineLoadableSkill(options) {
411
+ return options;
412
+ }
413
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/tools/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Task tool for delegating work to specialized subagents.
3
+ *
4
+ * Provides a single `task` tool for spawning subagents, similar to Claude Code's
5
+ * Task tool. Supports both foreground and background execution, as well as
6
+ * streaming subagents that can write to the parent's data stream.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import type { LanguageModel, Tool } from "ai";
11
+ import type { BackgroundTask, BaseTaskStore } from "../task-store/index.js";
12
+ import type { Agent, StreamingContext, SubagentDefinition } from "../types.js";
13
+ /**
14
+ * Status of a background task.
15
+ *
16
+ * @category Subagents
17
+ */
18
+ export type TaskStatus = "pending" | "running" | "completed" | "failed";
19
+ /**
20
+ * Options for creating the task tool.
21
+ *
22
+ * @category Subagents
23
+ */
24
+ export interface TaskToolOptions {
25
+ /** Available subagent definitions */
26
+ subagents: SubagentDefinition[];
27
+ /** Default model for subagents that don't specify one */
28
+ defaultModel: LanguageModel;
29
+ /** Parent agent for creating subagents */
30
+ parentAgent: Agent;
31
+ /** Custom tool description */
32
+ description?: string;
33
+ /** Default max turns for subagents */
34
+ defaultMaxTurns?: number;
35
+ /** Include a general-purpose subagent automatically */
36
+ includeGeneralPurpose?: boolean;
37
+ /** Model to use for general-purpose subagent */
38
+ generalPurposeModel?: LanguageModel;
39
+ /** System prompt for general-purpose subagent */
40
+ generalPurposePrompt?: string;
41
+ /**
42
+ * Streaming context from the parent agent.
43
+ *
44
+ * When provided, streaming subagents (those with `streaming: true`) can
45
+ * write custom data directly to the parent's data stream. This enables
46
+ * progressive rendering, real-time updates, and structured data streaming.
47
+ *
48
+ * Typically set when the parent agent is using `streamDataResponse()`.
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * // In agent.ts streamDataResponse
53
+ * const streamingContext: StreamingContext = { writer };
54
+ * const task = createTaskTool({
55
+ * subagents,
56
+ * defaultModel,
57
+ * parentAgent,
58
+ * streamingContext, // Pass to enable streaming subagents
59
+ * });
60
+ * ```
61
+ */
62
+ streamingContext?: StreamingContext;
63
+ /**
64
+ * Task store for persisting background task state.
65
+ *
66
+ * When provided, background tasks will be persisted and can be recovered
67
+ * across process restarts. Without a task store, tasks are kept in memory
68
+ * only and lost when the process exits.
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * import { FileTaskStore } from "@lleverage-ai/agent-sdk/task-store";
73
+ *
74
+ * const taskStore = new FileTaskStore({
75
+ * directory: "./task-data",
76
+ * expirationMs: 86400000, // 24 hours
77
+ * });
78
+ *
79
+ * const task = createTaskTool({
80
+ * subagents,
81
+ * defaultModel,
82
+ * parentAgent,
83
+ * taskStore, // Tasks now persist across restarts
84
+ * });
85
+ * ```
86
+ */
87
+ taskStore?: BaseTaskStore;
88
+ /**
89
+ * Parent span context for distributed tracing.
90
+ *
91
+ * When provided, subagents will create child spans linked to this parent
92
+ * span, enabling cross-agent trace correlation. This allows full request
93
+ * tracing across parent and child agents in distributed tracing systems.
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * import { createTracer } from "@lleverage-ai/agent-sdk";
98
+ *
99
+ * const tracer = createTracer({ name: "parent-agent" });
100
+ * const span = tracer.startSpan("handle-request");
101
+ *
102
+ * const task = createTaskTool({
103
+ * subagents,
104
+ * defaultModel,
105
+ * parentAgent,
106
+ * parentSpanContext: {
107
+ * traceId: span.traceId,
108
+ * spanId: span.spanId,
109
+ * },
110
+ * });
111
+ * ```
112
+ */
113
+ parentSpanContext?: import("../observability/tracing.js").SpanContext;
114
+ }
115
+ /**
116
+ * Get a background task by ID.
117
+ *
118
+ * @param taskId - The task ID
119
+ * @returns The tracked task or undefined
120
+ *
121
+ * @category Subagents
122
+ */
123
+ export declare function getBackgroundTask(taskId: string): Promise<BackgroundTask | undefined>;
124
+ /**
125
+ * List all background tasks.
126
+ *
127
+ * @param filter - Optional filter by status
128
+ * @returns Array of all tracked tasks
129
+ *
130
+ * @category Subagents
131
+ */
132
+ export declare function listBackgroundTasks(filter?: {
133
+ status?: TaskStatus | TaskStatus[];
134
+ }): Promise<BackgroundTask[]>;
135
+ /**
136
+ * Clear completed/failed background tasks.
137
+ *
138
+ * Removes tasks older than the expiration time (if using task store)
139
+ * or all completed/failed tasks (if using in-memory storage).
140
+ *
141
+ * @returns Number of tasks cleared
142
+ *
143
+ * @category Subagents
144
+ */
145
+ export declare function clearCompletedTasks(): Promise<number>;
146
+ /**
147
+ * Recover running tasks on agent restart.
148
+ *
149
+ * When using a task store, this function loads all "running" tasks
150
+ * and marks them as "failed" since they were interrupted by the restart.
151
+ *
152
+ * Call this function when initializing your agent to handle crashed tasks.
153
+ *
154
+ * @param store - Optional task store to use. If not provided, uses the global task store.
155
+ * @returns Number of tasks recovered
156
+ *
157
+ * @category Subagents
158
+ * @example
159
+ * ```typescript
160
+ * // On agent startup
161
+ * const recovered = await recoverRunningTasks();
162
+ * console.log(`Recovered ${recovered} interrupted tasks`);
163
+ * ```
164
+ */
165
+ export declare function recoverRunningTasks(store?: BaseTaskStore): Promise<number>;
166
+ /**
167
+ * Recover failed tasks for retry.
168
+ *
169
+ * Loads all "failed" tasks from the store and returns them for inspection
170
+ * or automatic retry. Applications can decide which tasks to retry based
171
+ * on error type, retry count, or other criteria.
172
+ *
173
+ * To retry a task, update its status back to "pending" and process it
174
+ * through your task execution logic.
175
+ *
176
+ * @param store - The task store to query
177
+ * @param options - Optional filter options
178
+ * @returns Array of failed tasks
179
+ *
180
+ * @category Subagents
181
+ * @example
182
+ * ```typescript
183
+ * // Load failed tasks and retry those with transient errors
184
+ * const failedTasks = await recoverFailedTasks(taskStore);
185
+ *
186
+ * for (const task of failedTasks) {
187
+ * // Check if error is retryable
188
+ * if (task.error?.includes("timeout") || task.error?.includes("network")) {
189
+ * // Mark for retry
190
+ * const retryTask = updateBackgroundTask(task, {
191
+ * status: "pending",
192
+ * error: undefined,
193
+ * });
194
+ * await taskStore.save(retryTask);
195
+ * }
196
+ * }
197
+ * ```
198
+ */
199
+ export declare function recoverFailedTasks(store: BaseTaskStore, options?: {
200
+ /** Only return tasks with errors matching this pattern */
201
+ errorPattern?: RegExp;
202
+ /** Only return tasks newer than this timestamp */
203
+ minCreatedAt?: Date;
204
+ /** Only return tasks older than this timestamp */
205
+ maxCreatedAt?: Date;
206
+ }): Promise<BackgroundTask[]>;
207
+ /**
208
+ * Clean up stale tasks from the task store.
209
+ *
210
+ * Removes tasks that have been in a terminal state (completed or failed)
211
+ * for longer than the specified age. This prevents unbounded storage growth
212
+ * and maintains system health.
213
+ *
214
+ * @param store - The task store to clean
215
+ * @param maxAge - Maximum age in milliseconds for terminal tasks
216
+ * @returns Number of tasks cleaned up
217
+ *
218
+ * @category Subagents
219
+ * @example
220
+ * ```typescript
221
+ * // Clean up tasks older than 7 days
222
+ * const sevenDays = 7 * 24 * 60 * 60 * 1000;
223
+ * const cleaned = await cleanupStaleTasks(taskStore, sevenDays);
224
+ * console.log(`Cleaned up ${cleaned} stale tasks`);
225
+ *
226
+ * // Or use a shorter retention for testing
227
+ * const oneHour = 60 * 60 * 1000;
228
+ * await cleanupStaleTasks(taskStore, oneHour);
229
+ * ```
230
+ */
231
+ export declare function cleanupStaleTasks(store: BaseTaskStore, maxAge: number): Promise<number>;
232
+ /**
233
+ * Creates the task tool for delegating work to specialized subagents.
234
+ *
235
+ * This tool delegates tasks to subagents with isolated context. It supports
236
+ * both foreground (blocking) and background execution.
237
+ *
238
+ * @param options - Configuration options
239
+ * @returns An AI SDK tool for task delegation
240
+ *
241
+ * @example
242
+ * ```typescript
243
+ * import { createTaskTool } from "@lleverage-ai/agent-sdk";
244
+ *
245
+ * const task = createTaskTool({
246
+ * subagents: [
247
+ * {
248
+ * type: "researcher",
249
+ * description: "Searches for information",
250
+ * create: () => createSubagent(parentAgent, { ... }),
251
+ * },
252
+ * {
253
+ * type: "coder",
254
+ * description: "Writes and modifies code",
255
+ * create: () => createSubagent(parentAgent, { ... }),
256
+ * },
257
+ * ],
258
+ * defaultModel: anthropic("claude-sonnet-4-20250514"),
259
+ * parentAgent,
260
+ * includeGeneralPurpose: true,
261
+ * });
262
+ *
263
+ * const agent = createAgent({
264
+ * model,
265
+ * tools: { task },
266
+ * });
267
+ * ```
268
+ *
269
+ * @category Subagents
270
+ */
271
+ export declare function createTaskTool(options: TaskToolOptions): Tool;
272
+ //# sourceMappingURL=task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/tools/task.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAI9C,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5E,OAAO,KAAK,EACV,KAAK,EACL,gBAAgB,EAGhB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAMrB;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAExE;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,yDAAyD;IACzD,YAAY,EAAE,aAAa,CAAC;IAC5B,0CAA0C;IAC1C,WAAW,EAAE,KAAK,CAAC;IACnB,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gDAAgD;IAChD,mBAAmB,CAAC,EAAE,aAAa,CAAC;IACpC,iDAAiD;IACjD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAEpC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC;IAE1B;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,iBAAiB,CAAC,EAAE,OAAO,6BAA6B,EAAE,WAAW,CAAC;CACvE;AAyBD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAK3F;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,CAAC,EAAE;IACjD,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;CACpC,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAa5B;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAc3D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBhF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE;IACR,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,kDAAkD;IAClD,YAAY,CAAC,EAAE,IAAI,CAAC;CACrB,GACA,OAAO,CAAC,cAAc,EAAE,CAAC,CAsB3B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB7F;AAoCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CA0R7D"}