@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,407 @@
1
+ /**
2
+ * Input validation utilities for MCP tools.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ import { Ajv } from "ajv";
7
+ import { z } from "zod";
8
+ /**
9
+ * Validation error thrown when MCP tool input validation fails.
10
+ *
11
+ * @category MCP
12
+ */
13
+ export class MCPInputValidationError extends Error {
14
+ toolName;
15
+ errors;
16
+ constructor(toolName, errors) {
17
+ super(`Invalid input for MCP tool '${toolName}': ${errors.join(", ")}`);
18
+ this.toolName = toolName;
19
+ this.errors = errors;
20
+ this.name = "MCPInputValidationError";
21
+ }
22
+ }
23
+ /**
24
+ * Check if a JSON Schema is non-empty and meaningful.
25
+ * An empty schema is one that accepts anything (no properties, no required fields, etc.).
26
+ *
27
+ * @internal
28
+ */
29
+ export function isSchemaEmpty(schema) {
30
+ // Empty schema with just type: object and no properties/required/additionalProperties constraints
31
+ if (schema.type === "object") {
32
+ const hasProperties = schema.properties && Object.keys(schema.properties).length > 0;
33
+ const hasRequired = schema.required && schema.required.length > 0;
34
+ const hasAdditionalProperties = schema.additionalProperties !== undefined;
35
+ const hasPatternProperties = schema.patternProperties && Object.keys(schema.patternProperties).length > 0;
36
+ const hasConstraints = hasProperties || hasRequired || hasAdditionalProperties || hasPatternProperties;
37
+ if (!hasConstraints) {
38
+ return true;
39
+ }
40
+ }
41
+ // Schema with no type and no constraints is empty
42
+ if (!schema.type &&
43
+ !schema.properties &&
44
+ !schema.required &&
45
+ !schema.anyOf &&
46
+ !schema.oneOf &&
47
+ !schema.allOf &&
48
+ !schema.enum) {
49
+ return true;
50
+ }
51
+ return false;
52
+ }
53
+ /**
54
+ * Validator for MCP tool inputs using AJV.
55
+ *
56
+ * @category MCP
57
+ */
58
+ export class MCPInputValidator {
59
+ ajv;
60
+ validators = new Map();
61
+ constructor() {
62
+ // Create AJV instance with permissive settings for MCP schemas
63
+ this.ajv = new Ajv({
64
+ strict: false, // MCP schemas may not be strict JSON Schema
65
+ allErrors: true, // Collect all errors for better error messages
66
+ coerceTypes: false, // Don't coerce types - be strict about input types
67
+ });
68
+ }
69
+ /**
70
+ * Register a tool's input schema for validation.
71
+ *
72
+ * @param toolName - Full MCP tool name
73
+ * @param schema - JSON Schema for the tool's inputs
74
+ */
75
+ registerSchema(toolName, schema) {
76
+ try {
77
+ const validator = this.ajv.compile(schema);
78
+ this.validators.set(toolName, validator);
79
+ }
80
+ catch (err) {
81
+ throw new Error(`Failed to compile schema for MCP tool '${toolName}': ${err instanceof Error ? err.message : String(err)}`);
82
+ }
83
+ }
84
+ /**
85
+ * Validate tool input against its registered schema.
86
+ *
87
+ * @param toolName - Full MCP tool name
88
+ * @param input - Tool input to validate
89
+ * @throws {MCPInputValidationError} If validation fails
90
+ */
91
+ validate(toolName, input) {
92
+ const validator = this.validators.get(toolName);
93
+ if (!validator) {
94
+ throw new Error(`No schema registered for MCP tool '${toolName}'. Call registerSchema first.`);
95
+ }
96
+ const valid = validator(input);
97
+ if (!valid && validator.errors) {
98
+ const errors = validator.errors.map((err) => `${err.instancePath || "input"} ${err.message || "is invalid"}`);
99
+ throw new MCPInputValidationError(toolName, errors);
100
+ }
101
+ }
102
+ /**
103
+ * Check if a tool has a registered schema.
104
+ *
105
+ * @param toolName - Full MCP tool name
106
+ * @returns True if schema is registered
107
+ */
108
+ hasSchema(toolName) {
109
+ return this.validators.has(toolName);
110
+ }
111
+ /**
112
+ * Unregister a tool's schema.
113
+ *
114
+ * @param toolName - Full MCP tool name
115
+ */
116
+ unregisterSchema(toolName) {
117
+ this.validators.delete(toolName);
118
+ }
119
+ /**
120
+ * Clear all registered schemas.
121
+ */
122
+ clear() {
123
+ this.validators.clear();
124
+ }
125
+ }
126
+ /**
127
+ * Convert a JSON Schema to a Zod schema for AI SDK tool definitions.
128
+ *
129
+ * This is a best-effort conversion that handles common JSON Schema patterns.
130
+ * Falls back to a permissive schema if conversion fails.
131
+ *
132
+ * Supported JSON Schema features:
133
+ * - Primitive types: string, number, integer, boolean, null
134
+ * - Objects with properties and required fields
135
+ * - Arrays with items
136
+ * - Enums
137
+ * - anyOf/oneOf unions
138
+ * - Basic format validators (date-time, email, uri, uuid)
139
+ * - String constraints (minLength, maxLength, pattern)
140
+ * - Number constraints (minimum, maximum, exclusiveMinimum, exclusiveMaximum)
141
+ * - Array constraints (minItems, maxItems)
142
+ *
143
+ * @param jsonSchema - JSON Schema to convert
144
+ * @returns Conversion result with Zod schema
145
+ *
146
+ * @example
147
+ * ```typescript
148
+ * const result = jsonSchemaToZod({
149
+ * type: "object",
150
+ * properties: {
151
+ * name: { type: "string" },
152
+ * age: { type: "number" }
153
+ * },
154
+ * required: ["name"]
155
+ * });
156
+ *
157
+ * if (result.success) {
158
+ * // Use result.schema for AI SDK tool definition
159
+ * }
160
+ * ```
161
+ *
162
+ * @category MCP
163
+ */
164
+ export function jsonSchemaToZod(jsonSchema) {
165
+ try {
166
+ const zodSchema = convertJsonSchemaToZod(jsonSchema);
167
+ return { success: true, schema: zodSchema };
168
+ }
169
+ catch (err) {
170
+ return {
171
+ success: false,
172
+ schema: z.record(z.string(), z.unknown()),
173
+ error: err instanceof Error ? err.message : String(err),
174
+ };
175
+ }
176
+ }
177
+ /**
178
+ * Internal conversion function that may throw.
179
+ * @internal
180
+ */
181
+ function convertJsonSchemaToZod(schema, depth = 0) {
182
+ // Prevent infinite recursion
183
+ if (depth > 20) {
184
+ throw new Error("JSON Schema too deeply nested");
185
+ }
186
+ // Handle const first - a const-only schema is not empty
187
+ if (schema.const !== undefined) {
188
+ return z.literal(schema.const);
189
+ }
190
+ // Handle empty schema or schema with no constraints - accepts any value
191
+ if (isSchemaEmpty(schema)) {
192
+ return z.unknown();
193
+ }
194
+ // Handle anyOf
195
+ if (schema.anyOf && schema.anyOf.length > 0) {
196
+ const schemas = schema.anyOf.map((s) => convertJsonSchemaToZod(s, depth + 1));
197
+ if (schemas.length === 1) {
198
+ return schemas[0];
199
+ }
200
+ return z.union([schemas[0], schemas[1], ...schemas.slice(2)]);
201
+ }
202
+ // Handle oneOf (same as anyOf for our purposes)
203
+ if (schema.oneOf && schema.oneOf.length > 0) {
204
+ const schemas = schema.oneOf.map((s) => convertJsonSchemaToZod(s, depth + 1));
205
+ if (schemas.length === 1) {
206
+ return schemas[0];
207
+ }
208
+ return z.union([schemas[0], schemas[1], ...schemas.slice(2)]);
209
+ }
210
+ // Handle allOf - intersect all schemas
211
+ if (schema.allOf && schema.allOf.length > 0) {
212
+ const schemas = schema.allOf.map((s) => convertJsonSchemaToZod(s, depth + 1));
213
+ if (schemas.length === 1) {
214
+ return schemas[0];
215
+ }
216
+ // For simplicity, merge object schemas or take the first one
217
+ let result = schemas[0];
218
+ for (let i = 1; i < schemas.length; i++) {
219
+ result = z.intersection(result, schemas[i]);
220
+ }
221
+ return result;
222
+ }
223
+ // Handle enum
224
+ if (schema.enum && schema.enum.length > 0) {
225
+ const values = schema.enum;
226
+ if (values.length === 1) {
227
+ return z.literal(values[0]);
228
+ }
229
+ // z.enum() only supports string arrays, so check if all values are strings
230
+ const allStrings = values.every((v) => typeof v === "string");
231
+ if (allStrings) {
232
+ return z.enum(values);
233
+ }
234
+ // For numeric, boolean, null, or mixed enums, use z.union() with literals
235
+ const literals = values.map((v) => z.literal(v));
236
+ return z.union([literals[0], literals[1], ...literals.slice(2)]);
237
+ }
238
+ // Handle type-based conversion
239
+ const type = schema.type;
240
+ // Handle array of types
241
+ if (Array.isArray(type)) {
242
+ const schemas = type.map((t) => convertJsonSchemaToZod({ ...schema, type: t }, depth + 1));
243
+ if (schemas.length === 1) {
244
+ return schemas[0];
245
+ }
246
+ return z.union([schemas[0], schemas[1], ...schemas.slice(2)]);
247
+ }
248
+ switch (type) {
249
+ case "string":
250
+ return convertStringSchema(schema);
251
+ case "number":
252
+ case "integer":
253
+ return convertNumberSchema(schema, type === "integer");
254
+ case "boolean":
255
+ return z.boolean();
256
+ case "null":
257
+ return z.null();
258
+ case "array":
259
+ return convertArraySchema(schema, depth);
260
+ case "object":
261
+ return convertObjectSchema(schema, depth);
262
+ default:
263
+ // No type specified but has properties - treat as object
264
+ if (schema.properties) {
265
+ return convertObjectSchema(schema, depth);
266
+ }
267
+ // Fall back to permissive schema
268
+ return z.unknown();
269
+ }
270
+ }
271
+ /**
272
+ * Convert a string JSON Schema to Zod.
273
+ * @internal
274
+ */
275
+ function convertStringSchema(schema) {
276
+ let zodString = z.string();
277
+ // Apply format validators
278
+ if (schema.format) {
279
+ switch (schema.format) {
280
+ case "email":
281
+ zodString = zodString.email();
282
+ break;
283
+ case "uri":
284
+ case "url":
285
+ zodString = zodString.url();
286
+ break;
287
+ case "uuid":
288
+ zodString = zodString.uuid();
289
+ break;
290
+ case "date-time":
291
+ zodString = zodString.datetime();
292
+ break;
293
+ case "date":
294
+ zodString = zodString.date();
295
+ break;
296
+ case "time":
297
+ zodString = zodString.time();
298
+ break;
299
+ case "ipv4":
300
+ zodString = zodString.regex(/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/);
301
+ break;
302
+ case "ipv6":
303
+ zodString = zodString.regex(/^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/);
304
+ break;
305
+ // Other formats are not validated strictly
306
+ }
307
+ }
308
+ // Apply length constraints
309
+ if (typeof schema.minLength === "number") {
310
+ zodString = zodString.min(schema.minLength);
311
+ }
312
+ if (typeof schema.maxLength === "number") {
313
+ zodString = zodString.max(schema.maxLength);
314
+ }
315
+ // Apply pattern constraint
316
+ if (schema.pattern) {
317
+ zodString = zodString.regex(new RegExp(schema.pattern));
318
+ }
319
+ return zodString;
320
+ }
321
+ /**
322
+ * Convert a number JSON Schema to Zod.
323
+ * @internal
324
+ */
325
+ function convertNumberSchema(schema, isInteger) {
326
+ let zodNumber = isInteger ? z.number().int() : z.number();
327
+ // Apply range constraints
328
+ if (typeof schema.minimum === "number") {
329
+ zodNumber = zodNumber.min(schema.minimum);
330
+ }
331
+ if (typeof schema.maximum === "number") {
332
+ zodNumber = zodNumber.max(schema.maximum);
333
+ }
334
+ if (typeof schema.exclusiveMinimum === "number") {
335
+ zodNumber = zodNumber.gt(schema.exclusiveMinimum);
336
+ }
337
+ if (typeof schema.exclusiveMaximum === "number") {
338
+ zodNumber = zodNumber.lt(schema.exclusiveMaximum);
339
+ }
340
+ if (typeof schema.multipleOf === "number") {
341
+ zodNumber = zodNumber.multipleOf(schema.multipleOf);
342
+ }
343
+ return zodNumber;
344
+ }
345
+ /**
346
+ * Convert an array JSON Schema to Zod.
347
+ * @internal
348
+ */
349
+ function convertArraySchema(schema, depth) {
350
+ let itemSchema = z.unknown();
351
+ if (schema.items) {
352
+ if (Array.isArray(schema.items)) {
353
+ // Tuple type - for simplicity, use the first item's schema or union
354
+ if (schema.items.length > 0) {
355
+ const itemSchemas = schema.items.map((s) => convertJsonSchemaToZod(s, depth + 1));
356
+ if (itemSchemas.length === 1) {
357
+ itemSchema = itemSchemas[0];
358
+ }
359
+ else {
360
+ itemSchema = z.union([itemSchemas[0], itemSchemas[1], ...itemSchemas.slice(2)]);
361
+ }
362
+ }
363
+ }
364
+ else {
365
+ itemSchema = convertJsonSchemaToZod(schema.items, depth + 1);
366
+ }
367
+ }
368
+ let zodArray = z.array(itemSchema);
369
+ // Apply length constraints
370
+ if (typeof schema.minItems === "number") {
371
+ zodArray = zodArray.min(schema.minItems);
372
+ }
373
+ if (typeof schema.maxItems === "number") {
374
+ zodArray = zodArray.max(schema.maxItems);
375
+ }
376
+ return zodArray;
377
+ }
378
+ /**
379
+ * Convert an object JSON Schema to Zod.
380
+ * @internal
381
+ */
382
+ function convertObjectSchema(schema, depth) {
383
+ const shape = {};
384
+ const required = new Set(schema.required || []);
385
+ if (schema.properties) {
386
+ for (const [key, propSchema] of Object.entries(schema.properties)) {
387
+ let propZod = convertJsonSchemaToZod(propSchema, depth + 1);
388
+ if (!required.has(key)) {
389
+ propZod = propZod.optional();
390
+ }
391
+ shape[key] = propZod;
392
+ }
393
+ }
394
+ // Handle additionalProperties
395
+ if (schema.additionalProperties === false) {
396
+ return z.object(shape).strict();
397
+ }
398
+ else if (schema.additionalProperties !== undefined &&
399
+ schema.additionalProperties !== true &&
400
+ typeof schema.additionalProperties === "object") {
401
+ // Allow additional properties with specific schema
402
+ const additionalSchema = convertJsonSchemaToZod(schema.additionalProperties, depth + 1);
403
+ return z.object(shape).catchall(additionalSchema);
404
+ }
405
+ return z.object(shape);
406
+ }
407
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/mcp/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Virtual MCP server for inline plugin tools.
3
+ *
4
+ * Wraps AI SDK tools with MCP-compatible naming and metadata
5
+ * without running an actual MCP server process.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import type { ToolSet } from "ai";
10
+ import type { MCPToolMetadata } from "./types.js";
11
+ /**
12
+ * Virtual MCP server that wraps inline plugin tools.
13
+ *
14
+ * This provides a consistent interface for tools defined in code,
15
+ * making them appear the same as tools from external MCP servers.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const server = new VirtualMCPServer("my-plugin", {
20
+ * greet: tool({
21
+ * description: "Greet someone",
22
+ * inputSchema: z.object({ name: z.string() }),
23
+ * execute: async ({ name }) => `Hello, ${name}!`,
24
+ * }),
25
+ * });
26
+ *
27
+ * const metadata = server.getToolMetadata();
28
+ * // [{ name: "mcp__my-plugin__greet", ... }]
29
+ * ```
30
+ *
31
+ * @category MCP
32
+ */
33
+ export declare class VirtualMCPServer {
34
+ /** Server/plugin name */
35
+ readonly name: string;
36
+ /** Original tools keyed by original name */
37
+ private tools;
38
+ /**
39
+ * Create a virtual MCP server.
40
+ *
41
+ * @param name - Server/plugin name (used in mcp__<name>__<tool> naming)
42
+ * @param tools - AI SDK tools to wrap
43
+ */
44
+ constructor(name: string, tools: ToolSet);
45
+ /**
46
+ * Get MCP-formatted metadata for all tools.
47
+ *
48
+ * @returns Array of tool metadata with MCP naming
49
+ */
50
+ getToolMetadata(): MCPToolMetadata[];
51
+ /**
52
+ * Execute a tool by its original name.
53
+ *
54
+ * @param toolName - Original tool name (without mcp__ prefix)
55
+ * @param args - Tool arguments
56
+ * @param abortSignal - Optional abort signal for cancellation
57
+ * @returns Tool execution result
58
+ * @throws If tool not found
59
+ */
60
+ callTool(toolName: string, args: unknown, abortSignal?: AbortSignal): Promise<unknown>;
61
+ /**
62
+ * Get AI SDK compatible ToolSet with MCP naming.
63
+ *
64
+ * @returns ToolSet with mcp__<name>__<tool> keys
65
+ */
66
+ getToolSet(): ToolSet;
67
+ /**
68
+ * Check if a tool exists by original name.
69
+ *
70
+ * @param toolName - Original tool name
71
+ */
72
+ hasTool(toolName: string): boolean;
73
+ /**
74
+ * Get list of original tool names.
75
+ */
76
+ getToolNames(): string[];
77
+ }
78
+ //# sourceMappingURL=virtual-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-server.d.ts","sourceRoot":"","sources":["../../src/mcp/virtual-server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAQ,OAAO,EAAE,MAAM,IAAI,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,gBAAgB;IAC3B,yBAAyB;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,4CAA4C;IAC5C,OAAO,CAAC,KAAK,CAAgC;IAE7C;;;;;OAKG;gBACS,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAOxC;;;;OAIG;IACH,eAAe,IAAI,eAAe,EAAE;IAqCpC;;;;;;;;OAQG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB5F;;;;OAIG;IACH,UAAU,IAAI,OAAO;IAWrB;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIlC;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;CAGzB"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Virtual MCP server for inline plugin tools.
3
+ *
4
+ * Wraps AI SDK tools with MCP-compatible naming and metadata
5
+ * without running an actual MCP server process.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { asSchema } from "ai";
10
+ /**
11
+ * Virtual MCP server that wraps inline plugin tools.
12
+ *
13
+ * This provides a consistent interface for tools defined in code,
14
+ * making them appear the same as tools from external MCP servers.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const server = new VirtualMCPServer("my-plugin", {
19
+ * greet: tool({
20
+ * description: "Greet someone",
21
+ * inputSchema: z.object({ name: z.string() }),
22
+ * execute: async ({ name }) => `Hello, ${name}!`,
23
+ * }),
24
+ * });
25
+ *
26
+ * const metadata = server.getToolMetadata();
27
+ * // [{ name: "mcp__my-plugin__greet", ... }]
28
+ * ```
29
+ *
30
+ * @category MCP
31
+ */
32
+ export class VirtualMCPServer {
33
+ /** Server/plugin name */
34
+ name;
35
+ /** Original tools keyed by original name */
36
+ tools = new Map();
37
+ /**
38
+ * Create a virtual MCP server.
39
+ *
40
+ * @param name - Server/plugin name (used in mcp__<name>__<tool> naming)
41
+ * @param tools - AI SDK tools to wrap
42
+ */
43
+ constructor(name, tools) {
44
+ this.name = name;
45
+ for (const [toolName, tool] of Object.entries(tools)) {
46
+ this.tools.set(toolName, tool);
47
+ }
48
+ }
49
+ /**
50
+ * Get MCP-formatted metadata for all tools.
51
+ *
52
+ * @returns Array of tool metadata with MCP naming
53
+ */
54
+ getToolMetadata() {
55
+ const metadata = [];
56
+ for (const [toolName, tool] of this.tools) {
57
+ const mcpName = `mcp__${this.name}__${toolName}`;
58
+ // Convert FlexibleSchema to JSON Schema using AI SDK's asSchema
59
+ let inputSchema = {
60
+ type: "object",
61
+ properties: {},
62
+ };
63
+ if (tool.inputSchema) {
64
+ try {
65
+ const schema = asSchema(tool.inputSchema);
66
+ // Handle both sync and async jsonSchema (Schema type allows PromiseLike)
67
+ const jsonSchema = schema.jsonSchema;
68
+ if (jsonSchema && typeof jsonSchema === "object") {
69
+ inputSchema = jsonSchema;
70
+ }
71
+ }
72
+ catch {
73
+ // Fall back to empty schema if conversion fails
74
+ }
75
+ }
76
+ metadata.push({
77
+ name: mcpName,
78
+ description: tool.description ?? "",
79
+ inputSchema,
80
+ source: this.name,
81
+ sourceType: "inline",
82
+ });
83
+ }
84
+ return metadata;
85
+ }
86
+ /**
87
+ * Execute a tool by its original name.
88
+ *
89
+ * @param toolName - Original tool name (without mcp__ prefix)
90
+ * @param args - Tool arguments
91
+ * @param abortSignal - Optional abort signal for cancellation
92
+ * @returns Tool execution result
93
+ * @throws If tool not found
94
+ */
95
+ async callTool(toolName, args, abortSignal) {
96
+ const tool = this.tools.get(toolName);
97
+ if (!tool) {
98
+ throw new Error(`Tool '${toolName}' not found in virtual server '${this.name}'`);
99
+ }
100
+ if (!tool.execute) {
101
+ throw new Error(`Tool '${toolName}' has no execute function`);
102
+ }
103
+ return tool.execute(args, {
104
+ toolCallId: `virtual-${Date.now()}`,
105
+ messages: [],
106
+ abortSignal: abortSignal ?? new AbortController().signal,
107
+ });
108
+ }
109
+ /**
110
+ * Get AI SDK compatible ToolSet with MCP naming.
111
+ *
112
+ * @returns ToolSet with mcp__<name>__<tool> keys
113
+ */
114
+ getToolSet() {
115
+ const toolSet = {};
116
+ for (const [toolName, tool] of this.tools) {
117
+ const mcpName = `mcp__${this.name}__${toolName}`;
118
+ toolSet[mcpName] = tool;
119
+ }
120
+ return toolSet;
121
+ }
122
+ /**
123
+ * Check if a tool exists by original name.
124
+ *
125
+ * @param toolName - Original tool name
126
+ */
127
+ hasTool(toolName) {
128
+ return this.tools.has(toolName);
129
+ }
130
+ /**
131
+ * Get list of original tool names.
132
+ */
133
+ getToolNames() {
134
+ return Array.from(this.tools.keys());
135
+ }
136
+ }
137
+ //# sourceMappingURL=virtual-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-server.js","sourceRoot":"","sources":["../../src/mcp/virtual-server.ts"],"names":[],"mappings":"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"}