@mastra/core 1.3.0 → 1.4.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 (274) hide show
  1. package/CHANGELOG.md +462 -0
  2. package/datasets.d.ts +1 -0
  3. package/dist/agent/agent.d.ts +1 -1
  4. package/dist/agent/index.cjs +13 -13
  5. package/dist/agent/index.js +2 -2
  6. package/dist/agent/message-list/adapters/AIV4Adapter.d.ts.map +1 -1
  7. package/dist/agent/message-list/adapters/AIV5Adapter.d.ts.map +1 -1
  8. package/dist/agent/message-list/conversion/output-converter.d.ts +2 -1
  9. package/dist/agent/message-list/conversion/output-converter.d.ts.map +1 -1
  10. package/dist/agent/message-list/index.cjs +18 -18
  11. package/dist/agent/message-list/index.js +1 -1
  12. package/dist/agent/workflows/prepare-stream/index.d.ts +1 -1
  13. package/dist/chunk-3JVFFAJX.cjs +1207 -0
  14. package/dist/chunk-3JVFFAJX.cjs.map +1 -0
  15. package/dist/{chunk-WL3AW3YA.js → chunk-3X3CZUXI.js} +4070 -3983
  16. package/dist/chunk-3X3CZUXI.js.map +1 -0
  17. package/dist/{chunk-2GWTJFVM.js → chunk-4EHGOATH.js} +46 -14
  18. package/dist/chunk-4EHGOATH.js.map +1 -0
  19. package/dist/{chunk-YNXIGRQE.cjs → chunk-4IJ4UDZX.cjs} +319 -83
  20. package/dist/chunk-4IJ4UDZX.cjs.map +1 -0
  21. package/dist/{chunk-CGPH7CMG.cjs → chunk-4KFEMXTV.cjs} +46 -14
  22. package/dist/chunk-4KFEMXTV.cjs.map +1 -0
  23. package/dist/{chunk-PHYJYZ32.js → chunk-4TQ4EBYX.js} +16 -8
  24. package/dist/chunk-4TQ4EBYX.js.map +1 -0
  25. package/dist/{chunk-SIZEIYNH.js → chunk-4XSAZPPS.js} +254 -18
  26. package/dist/chunk-4XSAZPPS.js.map +1 -0
  27. package/dist/{chunk-KUTU2YZF.js → chunk-5Q5Y34SS.js} +5 -5
  28. package/dist/{chunk-KUTU2YZF.js.map → chunk-5Q5Y34SS.js.map} +1 -1
  29. package/dist/{chunk-EH6SAGEO.cjs → chunk-64WGYTQK.cjs} +72 -53
  30. package/dist/{chunk-EH6SAGEO.cjs.map → chunk-64WGYTQK.cjs.map} +1 -1
  31. package/dist/{chunk-OOCEAC6U.cjs → chunk-65PHUUMF.cjs} +3 -3
  32. package/dist/{chunk-OOCEAC6U.cjs.map → chunk-65PHUUMF.cjs.map} +1 -1
  33. package/dist/{chunk-JNE2ABVB.js → chunk-7NKUSQEV.js} +1094 -10
  34. package/dist/chunk-7NKUSQEV.js.map +1 -0
  35. package/dist/{chunk-ZHFM7HCQ.js → chunk-AXHBJ4GX.js} +3 -3
  36. package/dist/{chunk-ZHFM7HCQ.js.map → chunk-AXHBJ4GX.js.map} +1 -1
  37. package/dist/{chunk-ILQXPZCD.js → chunk-AY6DBRS3.js} +37 -21
  38. package/dist/chunk-AY6DBRS3.js.map +1 -0
  39. package/dist/{chunk-TERSHTY5.cjs → chunk-BP7VYTOP.cjs} +1116 -21
  40. package/dist/chunk-BP7VYTOP.cjs.map +1 -0
  41. package/dist/{chunk-UE2G2LRP.cjs → chunk-CZ4NQANZ.cjs} +37 -21
  42. package/dist/chunk-CZ4NQANZ.cjs.map +1 -0
  43. package/dist/{chunk-NCC45KOB.cjs → chunk-DBSVT6AR.cjs} +7 -7
  44. package/dist/{chunk-NCC45KOB.cjs.map → chunk-DBSVT6AR.cjs.map} +1 -1
  45. package/dist/{chunk-BXLLXTT4.js → chunk-FLPEGTEK.js} +4 -4
  46. package/dist/{chunk-BXLLXTT4.js.map → chunk-FLPEGTEK.js.map} +1 -1
  47. package/dist/{chunk-ON2KVIUJ.cjs → chunk-HYRYTTMT.cjs} +7 -7
  48. package/dist/{chunk-ON2KVIUJ.cjs.map → chunk-HYRYTTMT.cjs.map} +1 -1
  49. package/dist/chunk-NJ7TL3LQ.js +1196 -0
  50. package/dist/chunk-NJ7TL3LQ.js.map +1 -0
  51. package/dist/{chunk-EUG4AON3.cjs → chunk-NKYWDNCI.cjs} +8 -7
  52. package/dist/{chunk-EUG4AON3.cjs.map → chunk-NKYWDNCI.cjs.map} +1 -1
  53. package/dist/{chunk-UHVG25VW.cjs → chunk-NZG2JAKS.cjs} +23 -15
  54. package/dist/chunk-NZG2JAKS.cjs.map +1 -0
  55. package/dist/{chunk-44SUGDBR.js → chunk-PS5ONCXY.js} +109 -5
  56. package/dist/chunk-PS5ONCXY.js.map +1 -0
  57. package/dist/{chunk-57QAF2ZQ.js → chunk-QTTWRCB5.js} +4 -4
  58. package/dist/{chunk-57QAF2ZQ.js.map → chunk-QTTWRCB5.js.map} +1 -1
  59. package/dist/{chunk-VM25PDSW.js → chunk-RZ4CIIZR.js} +4 -4
  60. package/dist/{chunk-VM25PDSW.js.map → chunk-RZ4CIIZR.js.map} +1 -1
  61. package/dist/{chunk-C3XU7ZDC.cjs → chunk-SU5APAM6.cjs} +123 -4
  62. package/dist/chunk-SU5APAM6.cjs.map +1 -0
  63. package/dist/{chunk-3MJCJLZS.js → chunk-U2HKJZCI.js} +24 -5
  64. package/dist/{chunk-3MJCJLZS.js.map → chunk-U2HKJZCI.js.map} +1 -1
  65. package/dist/{chunk-GCTAD6B7.cjs → chunk-VD5YA6RH.cjs} +12 -12
  66. package/dist/{chunk-GCTAD6B7.cjs.map → chunk-VD5YA6RH.cjs.map} +1 -1
  67. package/dist/{chunk-KAJNBNWP.cjs → chunk-YNNJLLFN.cjs} +4071 -3984
  68. package/dist/chunk-YNNJLLFN.cjs.map +1 -0
  69. package/dist/datasets/dataset.d.ts +153 -0
  70. package/dist/datasets/dataset.d.ts.map +1 -0
  71. package/dist/datasets/experiment/analytics/aggregate.d.ts +46 -0
  72. package/dist/datasets/experiment/analytics/aggregate.d.ts.map +1 -0
  73. package/dist/datasets/experiment/analytics/compare.d.ts +33 -0
  74. package/dist/datasets/experiment/analytics/compare.d.ts.map +1 -0
  75. package/dist/datasets/experiment/analytics/index.d.ts +9 -0
  76. package/dist/datasets/experiment/analytics/index.d.ts.map +1 -0
  77. package/dist/datasets/experiment/analytics/types.d.ts +103 -0
  78. package/dist/datasets/experiment/analytics/types.d.ts.map +1 -0
  79. package/dist/datasets/experiment/executor.d.ts +40 -0
  80. package/dist/datasets/experiment/executor.d.ts.map +1 -0
  81. package/dist/datasets/experiment/index.d.ts +31 -0
  82. package/dist/datasets/experiment/index.d.ts.map +1 -0
  83. package/dist/datasets/experiment/scorer.d.ts +21 -0
  84. package/dist/datasets/experiment/scorer.d.ts.map +1 -0
  85. package/dist/datasets/experiment/types.d.ts +140 -0
  86. package/dist/datasets/experiment/types.d.ts.map +1 -0
  87. package/dist/datasets/index.cjs +69 -0
  88. package/dist/datasets/index.cjs.map +1 -0
  89. package/dist/datasets/index.d.ts +6 -0
  90. package/dist/datasets/index.d.ts.map +1 -0
  91. package/dist/datasets/index.js +4 -0
  92. package/dist/datasets/index.js.map +1 -0
  93. package/dist/datasets/manager.d.ts +73 -0
  94. package/dist/datasets/manager.d.ts.map +1 -0
  95. package/dist/datasets/validation/errors.d.ts +44 -0
  96. package/dist/datasets/validation/errors.d.ts.map +1 -0
  97. package/dist/datasets/validation/index.d.ts +3 -0
  98. package/dist/datasets/validation/index.d.ts.map +1 -0
  99. package/dist/datasets/validation/validator.d.ts +24 -0
  100. package/dist/datasets/validation/validator.d.ts.map +1 -0
  101. package/dist/docs/SKILL.md +1 -3
  102. package/dist/docs/assets/SOURCE_MAP.json +436 -346
  103. package/dist/docs/references/docs-memory-observational-memory.md +86 -11
  104. package/dist/docs/references/docs-streaming-events.md +23 -0
  105. package/dist/docs/references/docs-workspace-filesystem.md +72 -1
  106. package/dist/docs/references/docs-workspace-overview.md +95 -12
  107. package/dist/docs/references/docs-workspace-sandbox.md +2 -0
  108. package/dist/docs/references/guides-agent-frameworks-ai-sdk.md +6 -2
  109. package/dist/docs/references/reference-ai-sdk-with-mastra.md +1 -1
  110. package/dist/docs/references/reference-memory-observational-memory.md +318 -9
  111. package/dist/docs/references/reference-streaming-workflows-stream.md +1 -0
  112. package/dist/docs/references/reference-workflows-workflow-methods-foreach.md +30 -0
  113. package/dist/docs/references/reference.md +3 -0
  114. package/dist/editor/index.d.ts +1 -1
  115. package/dist/editor/index.d.ts.map +1 -1
  116. package/dist/editor/types.d.ts +21 -3
  117. package/dist/editor/types.d.ts.map +1 -1
  118. package/dist/evals/index.cjs +20 -20
  119. package/dist/evals/index.js +3 -3
  120. package/dist/evals/scoreTraces/index.cjs +5 -5
  121. package/dist/evals/scoreTraces/index.js +2 -2
  122. package/dist/features/index.cjs +1 -1
  123. package/dist/features/index.cjs.map +1 -1
  124. package/dist/features/index.d.ts.map +1 -1
  125. package/dist/features/index.js +1 -1
  126. package/dist/features/index.js.map +1 -1
  127. package/dist/index.cjs +2 -7
  128. package/dist/index.d.ts +0 -9
  129. package/dist/index.d.ts.map +1 -1
  130. package/dist/index.js +1 -2
  131. package/dist/llm/index.cjs +10 -10
  132. package/dist/llm/index.js +2 -2
  133. package/dist/llm/model/provider-types.generated.d.ts +1694 -1659
  134. package/dist/loop/index.cjs +12 -12
  135. package/dist/loop/index.js +1 -1
  136. package/dist/loop/network/index.d.ts +1 -1
  137. package/dist/loop/workflows/agentic-execution/index.d.ts +1 -1
  138. package/dist/loop/workflows/agentic-execution/llm-execution-step.d.ts.map +1 -1
  139. package/dist/loop/workflows/agentic-execution/llm-mapping-step.d.ts.map +1 -1
  140. package/dist/loop/workflows/agentic-execution/tool-call-step.d.ts.map +1 -1
  141. package/dist/loop/workflows/agentic-loop/index.d.ts +1 -1
  142. package/dist/loop/workflows/errors.d.ts +4 -0
  143. package/dist/loop/workflows/errors.d.ts.map +1 -0
  144. package/dist/mastra/index.cjs +2 -2
  145. package/dist/mastra/index.d.ts +2 -0
  146. package/dist/mastra/index.d.ts.map +1 -1
  147. package/dist/mastra/index.js +1 -1
  148. package/dist/memory/index.cjs +14 -14
  149. package/dist/memory/index.js +1 -1
  150. package/dist/memory/memory.d.ts +5 -0
  151. package/dist/memory/memory.d.ts.map +1 -1
  152. package/dist/memory/types.d.ts +56 -0
  153. package/dist/memory/types.d.ts.map +1 -1
  154. package/dist/processors/index.cjs +41 -41
  155. package/dist/processors/index.js +1 -1
  156. package/dist/processors/processors/skills.d.ts +1 -1
  157. package/dist/processors/processors/skills.d.ts.map +1 -1
  158. package/dist/processors/runner.d.ts.map +1 -1
  159. package/dist/processors/trailing-assistant-guard.d.ts +34 -0
  160. package/dist/processors/trailing-assistant-guard.d.ts.map +1 -0
  161. package/dist/provider-registry-6LZAGQET.cjs +40 -0
  162. package/dist/{provider-registry-C6XCYX44.cjs.map → provider-registry-6LZAGQET.cjs.map} +1 -1
  163. package/dist/provider-registry-QUNT7S55.js +3 -0
  164. package/dist/{provider-registry-NWU4YFQW.js.map → provider-registry-QUNT7S55.js.map} +1 -1
  165. package/dist/provider-registry.json +4068 -3981
  166. package/dist/relevance/index.cjs +3 -3
  167. package/dist/relevance/index.js +1 -1
  168. package/dist/storage/base.d.ts +4 -1
  169. package/dist/storage/base.d.ts.map +1 -1
  170. package/dist/storage/constants.cjs +87 -27
  171. package/dist/storage/constants.d.ts +21 -2
  172. package/dist/storage/constants.d.ts.map +1 -1
  173. package/dist/storage/constants.js +1 -1
  174. package/dist/storage/domains/agents/inmemory.d.ts.map +1 -1
  175. package/dist/storage/domains/datasets/base.d.ts +83 -0
  176. package/dist/storage/domains/datasets/base.d.ts.map +1 -0
  177. package/dist/storage/domains/datasets/index.d.ts +3 -0
  178. package/dist/storage/domains/datasets/index.d.ts.map +1 -0
  179. package/dist/storage/domains/datasets/inmemory.d.ts +40 -0
  180. package/dist/storage/domains/datasets/inmemory.d.ts.map +1 -0
  181. package/dist/storage/domains/experiments/base.d.ts +28 -0
  182. package/dist/storage/domains/experiments/base.d.ts.map +1 -0
  183. package/dist/storage/domains/experiments/index.d.ts +3 -0
  184. package/dist/storage/domains/experiments/index.d.ts.map +1 -0
  185. package/dist/storage/domains/experiments/inmemory.d.ts +28 -0
  186. package/dist/storage/domains/experiments/inmemory.d.ts.map +1 -0
  187. package/dist/storage/domains/index.d.ts +3 -0
  188. package/dist/storage/domains/index.d.ts.map +1 -1
  189. package/dist/storage/domains/inmemory-db.d.ts +9 -1
  190. package/dist/storage/domains/inmemory-db.d.ts.map +1 -1
  191. package/dist/storage/domains/mcp-clients/base.d.ts +47 -0
  192. package/dist/storage/domains/mcp-clients/base.d.ts.map +1 -0
  193. package/dist/storage/domains/mcp-clients/index.d.ts +3 -0
  194. package/dist/storage/domains/mcp-clients/index.d.ts.map +1 -0
  195. package/dist/storage/domains/mcp-clients/inmemory.d.ts +31 -0
  196. package/dist/storage/domains/mcp-clients/inmemory.d.ts.map +1 -0
  197. package/dist/storage/domains/operations/inmemory.d.ts.map +1 -1
  198. package/dist/storage/index.cjs +201 -117
  199. package/dist/storage/index.js +2 -2
  200. package/dist/storage/mock.d.ts.map +1 -1
  201. package/dist/storage/types.d.ts +338 -3
  202. package/dist/storage/types.d.ts.map +1 -1
  203. package/dist/stream/base/output.d.ts.map +1 -1
  204. package/dist/stream/index.cjs +11 -11
  205. package/dist/stream/index.js +2 -2
  206. package/dist/stream/types.d.ts +15 -0
  207. package/dist/stream/types.d.ts.map +1 -1
  208. package/dist/test-utils/llm-mock.cjs +4 -4
  209. package/dist/test-utils/llm-mock.js +1 -1
  210. package/dist/tool-loop-agent/index.cjs +4 -4
  211. package/dist/tool-loop-agent/index.js +1 -1
  212. package/dist/tool-provider/index.cjs +4 -0
  213. package/dist/tool-provider/index.cjs.map +1 -0
  214. package/dist/tool-provider/index.d.ts +2 -0
  215. package/dist/tool-provider/index.d.ts.map +1 -0
  216. package/dist/tool-provider/index.js +3 -0
  217. package/dist/tool-provider/index.js.map +1 -0
  218. package/dist/tool-provider/types.d.ts +113 -0
  219. package/dist/tool-provider/types.d.ts.map +1 -0
  220. package/dist/utils.cjs +23 -23
  221. package/dist/utils.d.ts +1 -1
  222. package/dist/utils.d.ts.map +1 -1
  223. package/dist/utils.js +1 -1
  224. package/dist/vector/index.cjs +7 -7
  225. package/dist/vector/index.js +1 -1
  226. package/dist/workflows/evented/index.cjs +10 -10
  227. package/dist/workflows/evented/index.js +1 -1
  228. package/dist/workflows/evented/workflow-event-processor/index.d.ts.map +1 -1
  229. package/dist/workflows/handlers/control-flow.d.ts.map +1 -1
  230. package/dist/workflows/index.cjs +25 -25
  231. package/dist/workflows/index.js +1 -1
  232. package/dist/workflows/workflow.d.ts +2 -2
  233. package/dist/workflows/workflow.d.ts.map +1 -1
  234. package/dist/workspace/filesystem/filesystem.d.ts +5 -15
  235. package/dist/workspace/filesystem/filesystem.d.ts.map +1 -1
  236. package/dist/workspace/filesystem/local-filesystem.d.ts +18 -2
  237. package/dist/workspace/filesystem/local-filesystem.d.ts.map +1 -1
  238. package/dist/workspace/filesystem/mastra-filesystem.d.ts +21 -1
  239. package/dist/workspace/filesystem/mastra-filesystem.d.ts.map +1 -1
  240. package/dist/workspace/index.cjs +41 -41
  241. package/dist/workspace/index.d.ts +1 -1
  242. package/dist/workspace/index.d.ts.map +1 -1
  243. package/dist/workspace/index.js +1 -1
  244. package/dist/workspace/lifecycle.d.ts +49 -53
  245. package/dist/workspace/lifecycle.d.ts.map +1 -1
  246. package/dist/workspace/sandbox/local-sandbox.d.ts +1 -1
  247. package/dist/workspace/sandbox/local-sandbox.d.ts.map +1 -1
  248. package/dist/workspace/sandbox/mastra-sandbox.d.ts +3 -2
  249. package/dist/workspace/sandbox/mastra-sandbox.d.ts.map +1 -1
  250. package/dist/workspace/sandbox/sandbox.d.ts +3 -4
  251. package/dist/workspace/sandbox/sandbox.d.ts.map +1 -1
  252. package/dist/workspace/workspace.d.ts +2 -15
  253. package/dist/workspace/workspace.d.ts.map +1 -1
  254. package/package.json +7 -7
  255. package/src/llm/model/provider-types.generated.d.ts +1694 -1659
  256. package/tool-provider.d.ts +1 -0
  257. package/dist/chunk-2GWTJFVM.js.map +0 -1
  258. package/dist/chunk-44SUGDBR.js.map +0 -1
  259. package/dist/chunk-C3XU7ZDC.cjs.map +0 -1
  260. package/dist/chunk-CGPH7CMG.cjs.map +0 -1
  261. package/dist/chunk-ILQXPZCD.js.map +0 -1
  262. package/dist/chunk-JNE2ABVB.js.map +0 -1
  263. package/dist/chunk-KAJNBNWP.cjs.map +0 -1
  264. package/dist/chunk-PHYJYZ32.js.map +0 -1
  265. package/dist/chunk-SIZEIYNH.js.map +0 -1
  266. package/dist/chunk-TERSHTY5.cjs.map +0 -1
  267. package/dist/chunk-UE2G2LRP.cjs.map +0 -1
  268. package/dist/chunk-UHVG25VW.cjs.map +0 -1
  269. package/dist/chunk-WL3AW3YA.js.map +0 -1
  270. package/dist/chunk-YNXIGRQE.cjs.map +0 -1
  271. package/dist/docs/references/reference-cli-mastra.md +0 -336
  272. package/dist/docs/references/reference-deployer-cloudflare.md +0 -56
  273. package/dist/provider-registry-C6XCYX44.cjs +0 -40
  274. package/dist/provider-registry-NWU4YFQW.js +0 -3
@@ -1,10 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var chunkUE2G2LRP_cjs = require('./chunk-UE2G2LRP.cjs');
4
- var chunkC3XU7ZDC_cjs = require('./chunk-C3XU7ZDC.cjs');
5
- var chunkOOCEAC6U_cjs = require('./chunk-OOCEAC6U.cjs');
3
+ var chunkCZ4NQANZ_cjs = require('./chunk-CZ4NQANZ.cjs');
4
+ var chunkSU5APAM6_cjs = require('./chunk-SU5APAM6.cjs');
5
+ var chunk65PHUUMF_cjs = require('./chunk-65PHUUMF.cjs');
6
6
  var chunk4U7ZLI36_cjs = require('./chunk-4U7ZLI36.cjs');
7
7
  var chunkRO47SMI7_cjs = require('./chunk-RO47SMI7.cjs');
8
+ var jsonToZod = require('@mastra/schema-compat/json-to-zod');
9
+ var zod = require('zod');
8
10
 
9
11
  // src/storage/base.ts
10
12
  function normalizePerPage(perPageInput, defaultValue) {
@@ -61,8 +63,11 @@ var MastraCompositeStore = class extends chunkRO47SMI7_cjs.MastraBase {
61
63
  scores: domainOverrides.scores ?? defaultStores?.scores,
62
64
  observability: domainOverrides.observability ?? defaultStores?.observability,
63
65
  agents: domainOverrides.agents ?? defaultStores?.agents,
66
+ datasets: domainOverrides.datasets ?? defaultStores?.datasets,
67
+ experiments: domainOverrides.experiments ?? defaultStores?.experiments,
64
68
  promptBlocks: domainOverrides.promptBlocks ?? defaultStores?.promptBlocks,
65
- scorerDefinitions: domainOverrides.scorerDefinitions ?? defaultStores?.scorerDefinitions
69
+ scorerDefinitions: domainOverrides.scorerDefinitions ?? defaultStores?.scorerDefinitions,
70
+ mcpClients: domainOverrides.mcpClients ?? defaultStores?.mcpClients
66
71
  };
67
72
  }
68
73
  }
@@ -107,12 +112,21 @@ var MastraCompositeStore = class extends chunkRO47SMI7_cjs.MastraBase {
107
112
  if (this.stores?.agents) {
108
113
  initTasks.push(this.stores.agents.init());
109
114
  }
115
+ if (this.stores?.datasets) {
116
+ initTasks.push(this.stores.datasets.init());
117
+ }
118
+ if (this.stores?.experiments) {
119
+ initTasks.push(this.stores.experiments.init());
120
+ }
110
121
  if (this.stores?.promptBlocks) {
111
122
  initTasks.push(this.stores.promptBlocks.init());
112
123
  }
113
124
  if (this.stores?.scorerDefinitions) {
114
125
  initTasks.push(this.stores.scorerDefinitions.init());
115
126
  }
127
+ if (this.stores?.mcpClients) {
128
+ initTasks.push(this.stores.mcpClients.init());
129
+ }
116
130
  this.hasInitialized = Promise.all(initTasks).then(() => true);
117
131
  await this.hasInitialized;
118
132
  }
@@ -313,7 +327,9 @@ var InMemoryAgentsStorage = class extends AgentsStorage {
313
327
  "inputProcessors",
314
328
  "outputProcessors",
315
329
  "memory",
316
- "scorers"
330
+ "scorers",
331
+ "mcpClients",
332
+ "requestContextSchema"
317
333
  ];
318
334
  const hasConfigUpdate = configFieldNames.some((field) => field in configFields);
319
335
  const updatedAgent = {
@@ -392,7 +408,7 @@ var InMemoryAgentsStorage = class extends AgentsStorage {
392
408
  if (metadata && Object.keys(metadata).length > 0) {
393
409
  agents = agents.filter((agent) => {
394
410
  if (!agent.metadata) return false;
395
- return Object.entries(metadata).every(([key, value]) => chunkOOCEAC6U_cjs.deepEqual(agent.metadata[key], value));
411
+ return Object.entries(metadata).every(([key, value]) => chunk65PHUUMF_cjs.deepEqual(agent.metadata[key], value));
396
412
  });
397
413
  }
398
414
  const sortedAgents = this.sortAgents(agents, field, direction);
@@ -559,8 +575,17 @@ var InMemoryDB = class {
559
575
  promptBlockVersions = /* @__PURE__ */ new Map();
560
576
  scorerDefinitions = /* @__PURE__ */ new Map();
561
577
  scorerDefinitionVersions = /* @__PURE__ */ new Map();
578
+ mcpClients = /* @__PURE__ */ new Map();
579
+ mcpClientVersions = /* @__PURE__ */ new Map();
562
580
  /** Observational memory records, keyed by resourceId, each holding array of records (generations) */
563
581
  observationalMemory = /* @__PURE__ */ new Map();
582
+ // Dataset domain maps
583
+ datasets = /* @__PURE__ */ new Map();
584
+ datasetItems = /* @__PURE__ */ new Map();
585
+ datasetVersions = /* @__PURE__ */ new Map();
586
+ // Experiment domain maps
587
+ experiments = /* @__PURE__ */ new Map();
588
+ experimentResults = /* @__PURE__ */ new Map();
564
589
  /**
565
590
  * Clears all data from all collections.
566
591
  * Useful for testing.
@@ -578,7 +603,318 @@ var InMemoryDB = class {
578
603
  this.promptBlockVersions.clear();
579
604
  this.scorerDefinitions.clear();
580
605
  this.scorerDefinitionVersions.clear();
606
+ this.mcpClients.clear();
607
+ this.mcpClientVersions.clear();
581
608
  this.observationalMemory.clear();
609
+ this.datasets.clear();
610
+ this.datasetItems.clear();
611
+ this.datasetVersions.clear();
612
+ this.experiments.clear();
613
+ this.experimentResults.clear();
614
+ }
615
+ };
616
+
617
+ // src/storage/domains/mcp-clients/base.ts
618
+ var MCPClientsStorage = class extends VersionedStorageDomain {
619
+ listKey = "mcpClients";
620
+ versionMetadataFields = [
621
+ "id",
622
+ "mcpClientId",
623
+ "versionNumber",
624
+ "changedFields",
625
+ "changeMessage",
626
+ "createdAt"
627
+ ];
628
+ constructor() {
629
+ super({
630
+ component: "STORAGE",
631
+ name: "MCP_CLIENTS"
632
+ });
633
+ }
634
+ };
635
+
636
+ // src/storage/domains/mcp-clients/inmemory.ts
637
+ var InMemoryMCPClientsStorage = class extends MCPClientsStorage {
638
+ db;
639
+ constructor({ db }) {
640
+ super();
641
+ this.db = db;
642
+ }
643
+ async dangerouslyClearAll() {
644
+ this.db.mcpClients.clear();
645
+ this.db.mcpClientVersions.clear();
646
+ }
647
+ // ==========================================================================
648
+ // MCP Client CRUD Methods
649
+ // ==========================================================================
650
+ async getById(id) {
651
+ this.logger.debug(`InMemoryMCPClientsStorage: getById called for ${id}`);
652
+ const config = this.db.mcpClients.get(id);
653
+ return config ? this.deepCopyConfig(config) : null;
654
+ }
655
+ async create(input) {
656
+ const { mcpClient } = input;
657
+ this.logger.debug(`InMemoryMCPClientsStorage: create called for ${mcpClient.id}`);
658
+ if (this.db.mcpClients.has(mcpClient.id)) {
659
+ throw new Error(`MCP client with id ${mcpClient.id} already exists`);
660
+ }
661
+ const now = /* @__PURE__ */ new Date();
662
+ const newConfig = {
663
+ id: mcpClient.id,
664
+ status: "draft",
665
+ activeVersionId: void 0,
666
+ authorId: mcpClient.authorId,
667
+ metadata: mcpClient.metadata,
668
+ createdAt: now,
669
+ updatedAt: now
670
+ };
671
+ this.db.mcpClients.set(mcpClient.id, newConfig);
672
+ const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = mcpClient;
673
+ const versionId = crypto.randomUUID();
674
+ await this.createVersion({
675
+ id: versionId,
676
+ mcpClientId: mcpClient.id,
677
+ versionNumber: 1,
678
+ ...snapshotConfig,
679
+ changedFields: Object.keys(snapshotConfig),
680
+ changeMessage: "Initial version"
681
+ });
682
+ return this.deepCopyConfig(newConfig);
683
+ }
684
+ async update(input) {
685
+ const { id, ...updates } = input;
686
+ this.logger.debug(`InMemoryMCPClientsStorage: update called for ${id}`);
687
+ const existingConfig = this.db.mcpClients.get(id);
688
+ if (!existingConfig) {
689
+ throw new Error(`MCP client with id ${id} not found`);
690
+ }
691
+ const { authorId, activeVersionId, metadata, status, ...configFields } = updates;
692
+ const configFieldNames = ["name", "description", "servers"];
693
+ const hasConfigUpdate = configFieldNames.some((field) => field in configFields);
694
+ const updatedConfig = {
695
+ ...existingConfig,
696
+ ...authorId !== void 0 && { authorId },
697
+ ...activeVersionId !== void 0 && { activeVersionId },
698
+ ...status !== void 0 && { status },
699
+ ...metadata !== void 0 && {
700
+ metadata: { ...existingConfig.metadata, ...metadata }
701
+ },
702
+ updatedAt: /* @__PURE__ */ new Date()
703
+ };
704
+ if (activeVersionId !== void 0 && status === void 0) {
705
+ updatedConfig.status = "published";
706
+ }
707
+ if (hasConfigUpdate) {
708
+ const latestVersion = await this.getLatestVersion(id);
709
+ if (!latestVersion) {
710
+ throw new Error(`No versions found for MCP client ${id}`);
711
+ }
712
+ const {
713
+ id: _versionId,
714
+ mcpClientId: _mcpClientId,
715
+ versionNumber: _versionNumber,
716
+ changedFields: _changedFields,
717
+ changeMessage: _changeMessage,
718
+ createdAt: _createdAt,
719
+ ...latestConfig
720
+ } = latestVersion;
721
+ const newConfig = {
722
+ ...latestConfig,
723
+ ...configFields
724
+ };
725
+ const changedFields = configFieldNames.filter(
726
+ (field) => field in configFields && JSON.stringify(configFields[field]) !== JSON.stringify(latestConfig[field])
727
+ );
728
+ if (changedFields.length > 0) {
729
+ const newVersionId = crypto.randomUUID();
730
+ const newVersionNumber = latestVersion.versionNumber + 1;
731
+ await this.createVersion({
732
+ id: newVersionId,
733
+ mcpClientId: id,
734
+ versionNumber: newVersionNumber,
735
+ ...newConfig,
736
+ changedFields,
737
+ changeMessage: `Updated ${changedFields.join(", ")}`
738
+ });
739
+ }
740
+ }
741
+ this.db.mcpClients.set(id, updatedConfig);
742
+ return this.deepCopyConfig(updatedConfig);
743
+ }
744
+ async delete(id) {
745
+ this.logger.debug(`InMemoryMCPClientsStorage: delete called for ${id}`);
746
+ this.db.mcpClients.delete(id);
747
+ await this.deleteVersionsByParentId(id);
748
+ }
749
+ async list(args) {
750
+ const { page = 0, perPage: perPageInput, orderBy, authorId, metadata } = args || {};
751
+ const { field, direction } = this.parseOrderBy(orderBy);
752
+ this.logger.debug(`InMemoryMCPClientsStorage: list called`);
753
+ const perPage = normalizePerPage(perPageInput, 100);
754
+ if (page < 0) {
755
+ throw new Error("page must be >= 0");
756
+ }
757
+ const maxOffset = Number.MAX_SAFE_INTEGER / 2;
758
+ if (page * perPage > maxOffset) {
759
+ throw new Error("page value too large");
760
+ }
761
+ let configs = Array.from(this.db.mcpClients.values());
762
+ if (authorId !== void 0) {
763
+ configs = configs.filter((config) => config.authorId === authorId);
764
+ }
765
+ if (metadata && Object.keys(metadata).length > 0) {
766
+ configs = configs.filter((config) => {
767
+ if (!config.metadata) return false;
768
+ return Object.entries(metadata).every(([key, value]) => chunk65PHUUMF_cjs.deepEqual(config.metadata[key], value));
769
+ });
770
+ }
771
+ const sortedConfigs = this.sortConfigs(configs, field, direction);
772
+ const clonedConfigs = sortedConfigs.map((config) => this.deepCopyConfig(config));
773
+ const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
774
+ return {
775
+ mcpClients: clonedConfigs.slice(offset, offset + perPage),
776
+ total: clonedConfigs.length,
777
+ page,
778
+ perPage: perPageForResponse,
779
+ hasMore: offset + perPage < clonedConfigs.length
780
+ };
781
+ }
782
+ // ==========================================================================
783
+ // MCP Client Version Methods
784
+ // ==========================================================================
785
+ async createVersion(input) {
786
+ this.logger.debug(`InMemoryMCPClientsStorage: createVersion called for MCP client ${input.mcpClientId}`);
787
+ if (this.db.mcpClientVersions.has(input.id)) {
788
+ throw new Error(`Version with id ${input.id} already exists`);
789
+ }
790
+ for (const version2 of this.db.mcpClientVersions.values()) {
791
+ if (version2.mcpClientId === input.mcpClientId && version2.versionNumber === input.versionNumber) {
792
+ throw new Error(`Version number ${input.versionNumber} already exists for MCP client ${input.mcpClientId}`);
793
+ }
794
+ }
795
+ const version = {
796
+ ...input,
797
+ createdAt: /* @__PURE__ */ new Date()
798
+ };
799
+ this.db.mcpClientVersions.set(input.id, this.deepCopyVersion(version));
800
+ return this.deepCopyVersion(version);
801
+ }
802
+ async getVersion(id) {
803
+ this.logger.debug(`InMemoryMCPClientsStorage: getVersion called for ${id}`);
804
+ const version = this.db.mcpClientVersions.get(id);
805
+ return version ? this.deepCopyVersion(version) : null;
806
+ }
807
+ async getVersionByNumber(mcpClientId, versionNumber) {
808
+ this.logger.debug(
809
+ `InMemoryMCPClientsStorage: getVersionByNumber called for MCP client ${mcpClientId}, v${versionNumber}`
810
+ );
811
+ for (const version of this.db.mcpClientVersions.values()) {
812
+ if (version.mcpClientId === mcpClientId && version.versionNumber === versionNumber) {
813
+ return this.deepCopyVersion(version);
814
+ }
815
+ }
816
+ return null;
817
+ }
818
+ async getLatestVersion(mcpClientId) {
819
+ this.logger.debug(`InMemoryMCPClientsStorage: getLatestVersion called for MCP client ${mcpClientId}`);
820
+ let latest = null;
821
+ for (const version of this.db.mcpClientVersions.values()) {
822
+ if (version.mcpClientId === mcpClientId) {
823
+ if (!latest || version.versionNumber > latest.versionNumber) {
824
+ latest = version;
825
+ }
826
+ }
827
+ }
828
+ return latest ? this.deepCopyVersion(latest) : null;
829
+ }
830
+ async listVersions(input) {
831
+ const { mcpClientId, page = 0, perPage: perPageInput, orderBy } = input;
832
+ const { field, direction } = this.parseVersionOrderBy(orderBy);
833
+ this.logger.debug(`InMemoryMCPClientsStorage: listVersions called for MCP client ${mcpClientId}`);
834
+ const perPage = normalizePerPage(perPageInput, 20);
835
+ if (page < 0) {
836
+ throw new Error("page must be >= 0");
837
+ }
838
+ const maxOffset = Number.MAX_SAFE_INTEGER / 2;
839
+ if (page * perPage > maxOffset) {
840
+ throw new Error("page value too large");
841
+ }
842
+ let versions = Array.from(this.db.mcpClientVersions.values()).filter((v) => v.mcpClientId === mcpClientId);
843
+ versions = this.sortVersions(versions, field, direction);
844
+ const clonedVersions = versions.map((v) => this.deepCopyVersion(v));
845
+ const total = clonedVersions.length;
846
+ const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
847
+ const paginatedVersions = clonedVersions.slice(offset, offset + perPage);
848
+ return {
849
+ versions: paginatedVersions,
850
+ total,
851
+ page,
852
+ perPage: perPageForResponse,
853
+ hasMore: offset + perPage < total
854
+ };
855
+ }
856
+ async deleteVersion(id) {
857
+ this.logger.debug(`InMemoryMCPClientsStorage: deleteVersion called for ${id}`);
858
+ this.db.mcpClientVersions.delete(id);
859
+ }
860
+ async deleteVersionsByParentId(entityId) {
861
+ this.logger.debug(`InMemoryMCPClientsStorage: deleteVersionsByParentId called for MCP client ${entityId}`);
862
+ const idsToDelete = [];
863
+ for (const [id, version] of this.db.mcpClientVersions.entries()) {
864
+ if (version.mcpClientId === entityId) {
865
+ idsToDelete.push(id);
866
+ }
867
+ }
868
+ for (const id of idsToDelete) {
869
+ this.db.mcpClientVersions.delete(id);
870
+ }
871
+ }
872
+ async countVersions(mcpClientId) {
873
+ this.logger.debug(`InMemoryMCPClientsStorage: countVersions called for MCP client ${mcpClientId}`);
874
+ let count = 0;
875
+ for (const version of this.db.mcpClientVersions.values()) {
876
+ if (version.mcpClientId === mcpClientId) {
877
+ count++;
878
+ }
879
+ }
880
+ return count;
881
+ }
882
+ // ==========================================================================
883
+ // Private Helper Methods
884
+ // ==========================================================================
885
+ deepCopyConfig(config) {
886
+ return {
887
+ ...config,
888
+ metadata: config.metadata ? { ...config.metadata } : config.metadata
889
+ };
890
+ }
891
+ deepCopyVersion(version) {
892
+ return {
893
+ ...version,
894
+ servers: version.servers ? JSON.parse(JSON.stringify(version.servers)) : version.servers,
895
+ changedFields: version.changedFields ? [...version.changedFields] : version.changedFields
896
+ };
897
+ }
898
+ sortConfigs(configs, field, direction) {
899
+ return configs.sort((a, b) => {
900
+ const aValue = a[field].getTime();
901
+ const bValue = b[field].getTime();
902
+ return direction === "ASC" ? aValue - bValue : bValue - aValue;
903
+ });
904
+ }
905
+ sortVersions(versions, field, direction) {
906
+ return versions.sort((a, b) => {
907
+ let aVal;
908
+ let bVal;
909
+ if (field === "createdAt") {
910
+ aVal = a.createdAt.getTime();
911
+ bVal = b.createdAt.getTime();
912
+ } else {
913
+ aVal = a.versionNumber;
914
+ bVal = b.versionNumber;
915
+ }
916
+ return direction === "ASC" ? aVal - bVal : bVal - aVal;
917
+ });
582
918
  }
583
919
  };
584
920
 
@@ -597,7 +933,7 @@ function safelyParseJSON(input) {
597
933
  }
598
934
  function transformRow(row, tableName, options = {}) {
599
935
  const { preferredTimestampFields = {}, convertTimestamps = false, nullValuePattern, fieldMappings = {} } = options;
600
- const tableSchema = chunkC3XU7ZDC_cjs.TABLE_SCHEMAS[tableName];
936
+ const tableSchema = chunkSU5APAM6_cjs.TABLE_SCHEMAS[tableName];
601
937
  const result = {};
602
938
  for (const [key, columnSchema] of Object.entries(tableSchema)) {
603
939
  const sourceKey = fieldMappings[key] ?? key;
@@ -628,7 +964,7 @@ function transformRow(row, tableName, options = {}) {
628
964
  return result;
629
965
  }
630
966
  function transformScoreRow(row, options = {}) {
631
- return transformRow(row, chunkC3XU7ZDC_cjs.TABLE_SCORERS, options);
967
+ return transformRow(row, chunkSU5APAM6_cjs.TABLE_SCORERS, options);
632
968
  }
633
969
  function toUpperSnakeCase(str) {
634
970
  return str.replace(/([a-z])([A-Z])/g, "$1_$2").replace(/([A-Z])([A-Z][a-z])/g, "$1_$2").toUpperCase().replace(/[^A-Z0-9]+/g, "_").replace(/^_+|_+$/g, "");
@@ -1250,7 +1586,7 @@ var InMemoryMemory = class extends MemoryStorage {
1250
1586
  });
1251
1587
  const total = messages.length;
1252
1588
  const paginatedMessages = messages.slice(offset, offset + perPage);
1253
- const list = new chunkUE2G2LRP_cjs.MessageList().add(
1589
+ const list = new chunkCZ4NQANZ_cjs.MessageList().add(
1254
1590
  paginatedMessages.map((m) => this.parseStoredMessage(m)),
1255
1591
  "memory"
1256
1592
  );
@@ -1284,7 +1620,7 @@ var InMemoryMemory = class extends MemoryStorage {
1284
1620
  async listMessagesById({ messageIds }) {
1285
1621
  this.logger.debug(`InMemoryMemory: listMessagesById called`);
1286
1622
  const rawMessages = messageIds.map((id) => this.db.messages.get(id)).filter((message) => !!message);
1287
- const list = new chunkUE2G2LRP_cjs.MessageList().add(
1623
+ const list = new chunkCZ4NQANZ_cjs.MessageList().add(
1288
1624
  rawMessages.map((m) => this.parseStoredMessage(m)),
1289
1625
  "memory"
1290
1626
  );
@@ -1316,7 +1652,7 @@ var InMemoryMemory = class extends MemoryStorage {
1316
1652
  };
1317
1653
  this.db.messages.set(key, storageMessage);
1318
1654
  }
1319
- const list = new chunkUE2G2LRP_cjs.MessageList().add(messages, "memory");
1655
+ const list = new chunkCZ4NQANZ_cjs.MessageList().add(messages, "memory");
1320
1656
  return { messages: list.get.all.db() };
1321
1657
  }
1322
1658
  async updateMessages(args) {
@@ -2157,7 +2493,7 @@ var ObservabilityInMemory = class extends ObservabilityStorage {
2157
2493
  };
2158
2494
  }
2159
2495
  async listTraces(args) {
2160
- const { filters, pagination, orderBy } = chunkC3XU7ZDC_cjs.listTracesArgsSchema.parse(args);
2496
+ const { filters, pagination, orderBy } = chunkSU5APAM6_cjs.listTracesArgsSchema.parse(args);
2161
2497
  const matchingRootSpans = [];
2162
2498
  for (const [, traceEntry] of this.db.traces) {
2163
2499
  if (!traceEntry.rootSpan) continue;
@@ -2186,7 +2522,7 @@ var ObservabilityInMemory = class extends ObservabilityStorage {
2186
2522
  const end = start + perPage;
2187
2523
  const paged = matchingRootSpans.slice(start, end);
2188
2524
  return {
2189
- spans: chunkC3XU7ZDC_cjs.toTraceSpans(paged),
2525
+ spans: chunkSU5APAM6_cjs.toTraceSpans(paged),
2190
2526
  pagination: { total, page, perPage, hasMore: end < total }
2191
2527
  };
2192
2528
  }
@@ -2488,7 +2824,7 @@ var InMemoryPromptBlocksStorage = class extends PromptBlocksStorage {
2488
2824
  if (metadata && Object.keys(metadata).length > 0) {
2489
2825
  blocks = blocks.filter((block) => {
2490
2826
  if (!block.metadata) return false;
2491
- return Object.entries(metadata).every(([key, value]) => chunkOOCEAC6U_cjs.deepEqual(block.metadata[key], value));
2827
+ return Object.entries(metadata).every(([key, value]) => chunk65PHUUMF_cjs.deepEqual(block.metadata[key], value));
2492
2828
  });
2493
2829
  }
2494
2830
  const sortedBlocks = this.sortBlocks(blocks, field, direction);
@@ -2799,7 +3135,7 @@ var InMemoryScorerDefinitionsStorage = class extends ScorerDefinitionsStorage {
2799
3135
  if (metadata && Object.keys(metadata).length > 0) {
2800
3136
  scorers = scorers.filter((scorer) => {
2801
3137
  if (!scorer.metadata) return false;
2802
- return Object.entries(metadata).every(([key, value]) => chunkOOCEAC6U_cjs.deepEqual(scorer.metadata[key], value));
3138
+ return Object.entries(metadata).every(([key, value]) => chunk65PHUUMF_cjs.deepEqual(scorer.metadata[key], value));
2803
3139
  });
2804
3140
  }
2805
3141
  const sortedScorers = this.sortScorers(scorers, field, direction);
@@ -3393,7 +3729,8 @@ var InMemoryStore = class extends MastraCompositeStore {
3393
3729
  observability: new ObservabilityInMemory({ db: this.#db }),
3394
3730
  agents: new InMemoryAgentsStorage({ db: this.#db }),
3395
3731
  promptBlocks: new InMemoryPromptBlocksStorage({ db: this.#db }),
3396
- scorerDefinitions: new InMemoryScorerDefinitionsStorage({ db: this.#db })
3732
+ scorerDefinitions: new InMemoryScorerDefinitionsStorage({ db: this.#db }),
3733
+ mcpClients: new InMemoryMCPClientsStorage({ db: this.#db })
3397
3734
  };
3398
3735
  }
3399
3736
  /**
@@ -3532,7 +3869,14 @@ var StoreOperationsInMemory = class extends StoreOperations {
3532
3869
  mastra_prompt_blocks: /* @__PURE__ */ new Map(),
3533
3870
  mastra_prompt_block_versions: /* @__PURE__ */ new Map(),
3534
3871
  mastra_scorer_definitions: /* @__PURE__ */ new Map(),
3535
- mastra_scorer_definition_versions: /* @__PURE__ */ new Map()
3872
+ mastra_scorer_definition_versions: /* @__PURE__ */ new Map(),
3873
+ mastra_mcp_clients: /* @__PURE__ */ new Map(),
3874
+ mastra_mcp_client_versions: /* @__PURE__ */ new Map(),
3875
+ mastra_datasets: /* @__PURE__ */ new Map(),
3876
+ mastra_dataset_items: /* @__PURE__ */ new Map(),
3877
+ mastra_dataset_versions: /* @__PURE__ */ new Map(),
3878
+ mastra_experiments: /* @__PURE__ */ new Map(),
3879
+ mastra_experiment_results: /* @__PURE__ */ new Map()
3536
3880
  };
3537
3881
  }
3538
3882
  getDatabase() {
@@ -3541,7 +3885,7 @@ var StoreOperationsInMemory = class extends StoreOperations {
3541
3885
  async insert({ tableName, record }) {
3542
3886
  const table = this.data[tableName];
3543
3887
  let key = record.id;
3544
- if ([chunkC3XU7ZDC_cjs.TABLE_WORKFLOW_SNAPSHOT].includes(tableName) && !record.id && record.run_id) {
3888
+ if ([chunkSU5APAM6_cjs.TABLE_WORKFLOW_SNAPSHOT].includes(tableName) && !record.id && record.run_id) {
3545
3889
  key = record.workflow_name ? `${record.workflow_name}-${record.run_id}` : record.run_id;
3546
3890
  record.id = key;
3547
3891
  } else if (!record.id) {
@@ -3554,7 +3898,7 @@ var StoreOperationsInMemory = class extends StoreOperations {
3554
3898
  const table = this.data[tableName];
3555
3899
  for (const record of records) {
3556
3900
  let key = record.id;
3557
- if ([chunkC3XU7ZDC_cjs.TABLE_WORKFLOW_SNAPSHOT].includes(tableName) && !record.id && record.run_id) {
3901
+ if ([chunkSU5APAM6_cjs.TABLE_WORKFLOW_SNAPSHOT].includes(tableName) && !record.id && record.run_id) {
3558
3902
  key = record.run_id;
3559
3903
  record.id = key;
3560
3904
  } else if (!record.id) {
@@ -3597,13 +3941,759 @@ var StoreOperationsInMemory = class extends StoreOperations {
3597
3941
  }
3598
3942
  };
3599
3943
 
3944
+ // src/datasets/validation/errors.ts
3945
+ var SchemaValidationError = class extends Error {
3946
+ constructor(field, errors) {
3947
+ const summary = errors.slice(0, 3).map((e) => e.message).join("; ");
3948
+ super(`Validation failed for ${field}: ${summary}`);
3949
+ this.field = field;
3950
+ this.errors = errors;
3951
+ this.name = "SchemaValidationError";
3952
+ }
3953
+ };
3954
+ var SchemaUpdateValidationError = class extends Error {
3955
+ constructor(failingItems) {
3956
+ const count = failingItems.length;
3957
+ super(`Cannot update schema: ${count} existing item(s) would fail validation`);
3958
+ this.failingItems = failingItems;
3959
+ this.name = "SchemaUpdateValidationError";
3960
+ }
3961
+ };
3962
+
3963
+ // src/datasets/validation/validator.ts
3964
+ function resolveZodSchema(zodString) {
3965
+ return Function("z", `"use strict";return (${zodString});`)(zod.z);
3966
+ }
3967
+ var SchemaValidator = class {
3968
+ cache = /* @__PURE__ */ new Map();
3969
+ /** Get or compile validator for schema */
3970
+ getValidator(schema, cacheKey) {
3971
+ let zodSchema = this.cache.get(cacheKey);
3972
+ if (!zodSchema) {
3973
+ const zodString = jsonToZod.jsonSchemaToZod(schema);
3974
+ zodSchema = resolveZodSchema(zodString);
3975
+ this.cache.set(cacheKey, zodSchema);
3976
+ }
3977
+ return zodSchema;
3978
+ }
3979
+ /** Clear cached validator (call when schema changes) */
3980
+ clearCache(cacheKey) {
3981
+ this.cache.delete(cacheKey);
3982
+ }
3983
+ /** Validate data against schema */
3984
+ validate(data, schema, field, cacheKey) {
3985
+ const zodSchema = this.getValidator(schema, cacheKey);
3986
+ const result = zodSchema.safeParse(data);
3987
+ if (!result.success) {
3988
+ throw new SchemaValidationError(field, this.formatErrors(result.error));
3989
+ }
3990
+ }
3991
+ /** Validate multiple items, returning valid/invalid split */
3992
+ validateBatch(items, inputSchema, outputSchema, cacheKeyPrefix, maxErrors = 10) {
3993
+ const result = { valid: [], invalid: [] };
3994
+ const inputValidator = inputSchema ? this.getValidator(inputSchema, `${cacheKeyPrefix}:input`) : null;
3995
+ const outputValidator = outputSchema ? this.getValidator(outputSchema, `${cacheKeyPrefix}:output`) : null;
3996
+ for (const [i, item] of items.entries()) {
3997
+ let hasError = false;
3998
+ if (inputValidator) {
3999
+ const inputResult = inputValidator.safeParse(item.input);
4000
+ if (!inputResult.success) {
4001
+ result.invalid.push({
4002
+ index: i,
4003
+ data: item,
4004
+ field: "input",
4005
+ errors: this.formatErrors(inputResult.error)
4006
+ });
4007
+ hasError = true;
4008
+ if (result.invalid.length >= maxErrors) break;
4009
+ }
4010
+ }
4011
+ if (!hasError && outputValidator && item.groundTruth !== void 0) {
4012
+ const outputResult = outputValidator.safeParse(item.groundTruth);
4013
+ if (!outputResult.success) {
4014
+ result.invalid.push({
4015
+ index: i,
4016
+ data: item,
4017
+ field: "groundTruth",
4018
+ errors: this.formatErrors(outputResult.error)
4019
+ });
4020
+ hasError = true;
4021
+ if (result.invalid.length >= maxErrors) break;
4022
+ }
4023
+ }
4024
+ if (!hasError) {
4025
+ result.valid.push({ index: i, data: item });
4026
+ }
4027
+ }
4028
+ return result;
4029
+ }
4030
+ /** Format Zod errors to FieldError array */
4031
+ formatErrors(error) {
4032
+ return error.issues.slice(0, 5).map((issue) => ({
4033
+ // Convert Zod path array to JSON Pointer string
4034
+ path: issue.path.length > 0 ? "/" + issue.path.join("/") : "/",
4035
+ code: issue.code,
4036
+ message: issue.message
4037
+ }));
4038
+ }
4039
+ };
4040
+ var validatorInstance = null;
4041
+ function getSchemaValidator() {
4042
+ if (!validatorInstance) {
4043
+ validatorInstance = new SchemaValidator();
4044
+ }
4045
+ return validatorInstance;
4046
+ }
4047
+ function createValidator() {
4048
+ return new SchemaValidator();
4049
+ }
4050
+
4051
+ // src/storage/domains/datasets/base.ts
4052
+ var DatasetsStorage = class extends StorageDomain {
4053
+ constructor() {
4054
+ super({
4055
+ component: "STORAGE",
4056
+ name: "DATASETS"
4057
+ });
4058
+ }
4059
+ async dangerouslyClearAll() {
4060
+ }
4061
+ /**
4062
+ * Update a dataset. Validates existing items against new schemas if schemas are changing.
4063
+ * Subclasses implement _doUpdateDataset for actual storage operation.
4064
+ */
4065
+ async updateDataset(args) {
4066
+ const existing = await this.getDatasetById({ id: args.id });
4067
+ if (!existing) {
4068
+ throw new Error(`Dataset not found: ${args.id}`);
4069
+ }
4070
+ const inputSchemaChanging = args.inputSchema !== void 0 && JSON.stringify(args.inputSchema) !== JSON.stringify(existing.inputSchema);
4071
+ const groundTruthSchemaChanging = args.groundTruthSchema !== void 0 && JSON.stringify(args.groundTruthSchema) !== JSON.stringify(existing.groundTruthSchema);
4072
+ if (inputSchemaChanging || groundTruthSchemaChanging) {
4073
+ const itemsResult = await this.listItems({
4074
+ datasetId: args.id,
4075
+ pagination: { page: 0, perPage: false }
4076
+ // Get all items
4077
+ });
4078
+ const items = itemsResult.items;
4079
+ if (items.length > 0) {
4080
+ const validator = getSchemaValidator();
4081
+ const newInputSchema = args.inputSchema !== void 0 ? args.inputSchema : existing.inputSchema;
4082
+ const newOutputSchema = args.groundTruthSchema !== void 0 ? args.groundTruthSchema : existing.groundTruthSchema;
4083
+ const result = validator.validateBatch(
4084
+ items.map((i) => ({ input: i.input, groundTruth: i.groundTruth })),
4085
+ newInputSchema,
4086
+ newOutputSchema,
4087
+ `dataset:${args.id}:schema-update`,
4088
+ 10
4089
+ // Max 10 errors to report
4090
+ );
4091
+ if (result.invalid.length > 0) {
4092
+ throw new SchemaUpdateValidationError(result.invalid);
4093
+ }
4094
+ validator.clearCache(`dataset:${args.id}:input`);
4095
+ validator.clearCache(`dataset:${args.id}:output`);
4096
+ }
4097
+ }
4098
+ return this._doUpdateDataset(args);
4099
+ }
4100
+ /**
4101
+ * Add an item to a dataset. Validates input/groundTruth against dataset schemas.
4102
+ * Subclasses implement _doAddItem which handles SCD-2 versioning internally.
4103
+ */
4104
+ async addItem(args) {
4105
+ const dataset = await this.getDatasetById({ id: args.datasetId });
4106
+ if (!dataset) {
4107
+ throw new Error(`Dataset not found: ${args.datasetId}`);
4108
+ }
4109
+ const validator = getSchemaValidator();
4110
+ const cacheKey = `dataset:${args.datasetId}`;
4111
+ if (dataset.inputSchema) {
4112
+ validator.validate(args.input, dataset.inputSchema, "input", `${cacheKey}:input`);
4113
+ }
4114
+ if (dataset.groundTruthSchema && args.groundTruth !== void 0) {
4115
+ validator.validate(args.groundTruth, dataset.groundTruthSchema, "groundTruth", `${cacheKey}:output`);
4116
+ }
4117
+ return this._doAddItem(args);
4118
+ }
4119
+ /**
4120
+ * Update an item in a dataset. Validates changed fields against dataset schemas.
4121
+ * Subclasses implement _doUpdateItem which handles SCD-2 versioning internally.
4122
+ */
4123
+ async updateItem(args) {
4124
+ const dataset = await this.getDatasetById({ id: args.datasetId });
4125
+ if (!dataset) {
4126
+ throw new Error(`Dataset not found: ${args.datasetId}`);
4127
+ }
4128
+ const validator = getSchemaValidator();
4129
+ const cacheKey = `dataset:${args.datasetId}`;
4130
+ if (args.input !== void 0 && dataset.inputSchema) {
4131
+ validator.validate(args.input, dataset.inputSchema, "input", `${cacheKey}:input`);
4132
+ }
4133
+ if (args.groundTruth !== void 0 && dataset.groundTruthSchema) {
4134
+ validator.validate(args.groundTruth, dataset.groundTruthSchema, "groundTruth", `${cacheKey}:output`);
4135
+ }
4136
+ return this._doUpdateItem(args);
4137
+ }
4138
+ /**
4139
+ * Delete an item from a dataset. Creates a tombstone row via SCD-2.
4140
+ * Subclasses implement _doDeleteItem which handles SCD-2 versioning internally.
4141
+ */
4142
+ async deleteItem(args) {
4143
+ return this._doDeleteItem(args);
4144
+ }
4145
+ /**
4146
+ * Batch insert items to a dataset. Validates all items against dataset schemas,
4147
+ * then delegates to subclass which handles SCD-2 versioning internally.
4148
+ */
4149
+ async batchInsertItems(input) {
4150
+ const dataset = await this.getDatasetById({ id: input.datasetId });
4151
+ if (!dataset) {
4152
+ throw new Error(`Dataset not found: ${input.datasetId}`);
4153
+ }
4154
+ const validator = getSchemaValidator();
4155
+ const cacheKey = `dataset:${input.datasetId}`;
4156
+ for (const itemData of input.items) {
4157
+ if (dataset.inputSchema) {
4158
+ validator.validate(itemData.input, dataset.inputSchema, "input", `${cacheKey}:input`);
4159
+ }
4160
+ if (dataset.groundTruthSchema && itemData.groundTruth !== void 0) {
4161
+ validator.validate(itemData.groundTruth, dataset.groundTruthSchema, "groundTruth", `${cacheKey}:output`);
4162
+ }
4163
+ }
4164
+ return this._doBatchInsertItems(input);
4165
+ }
4166
+ /**
4167
+ * Batch delete items from a dataset. Creates tombstone rows via SCD-2.
4168
+ * Subclasses implement _doBatchDeleteItems which handles SCD-2 versioning internally.
4169
+ */
4170
+ async batchDeleteItems(input) {
4171
+ const dataset = await this.getDatasetById({ id: input.datasetId });
4172
+ if (!dataset) {
4173
+ throw new Error(`Dataset not found: ${input.datasetId}`);
4174
+ }
4175
+ return this._doBatchDeleteItems(input);
4176
+ }
4177
+ };
4178
+
4179
+ // src/storage/domains/datasets/inmemory.ts
4180
+ function toDatasetItem(row) {
4181
+ return {
4182
+ id: row.id,
4183
+ datasetId: row.datasetId,
4184
+ datasetVersion: row.datasetVersion,
4185
+ input: row.input,
4186
+ groundTruth: row.groundTruth,
4187
+ metadata: row.metadata,
4188
+ createdAt: row.createdAt,
4189
+ updatedAt: row.updatedAt
4190
+ };
4191
+ }
4192
+ var DatasetsInMemory = class extends DatasetsStorage {
4193
+ db;
4194
+ constructor({ db }) {
4195
+ super();
4196
+ this.db = db;
4197
+ }
4198
+ async dangerouslyClearAll() {
4199
+ this.db.datasets.clear();
4200
+ this.db.datasetItems.clear();
4201
+ this.db.datasetVersions.clear();
4202
+ }
4203
+ // Dataset CRUD
4204
+ async createDataset(input) {
4205
+ const id = crypto.randomUUID();
4206
+ const now = /* @__PURE__ */ new Date();
4207
+ const dataset = {
4208
+ id,
4209
+ name: input.name,
4210
+ description: input.description,
4211
+ metadata: input.metadata,
4212
+ inputSchema: input.inputSchema,
4213
+ groundTruthSchema: input.groundTruthSchema,
4214
+ version: 0,
4215
+ createdAt: now,
4216
+ updatedAt: now
4217
+ };
4218
+ this.db.datasets.set(id, dataset);
4219
+ return dataset;
4220
+ }
4221
+ async getDatasetById({ id }) {
4222
+ return this.db.datasets.get(id) ?? null;
4223
+ }
4224
+ async _doUpdateDataset(args) {
4225
+ const existing = this.db.datasets.get(args.id);
4226
+ if (!existing) {
4227
+ throw new Error(`Dataset not found: ${args.id}`);
4228
+ }
4229
+ const updated = {
4230
+ ...existing,
4231
+ name: args.name ?? existing.name,
4232
+ description: args.description ?? existing.description,
4233
+ metadata: args.metadata ?? existing.metadata,
4234
+ inputSchema: args.inputSchema !== void 0 ? args.inputSchema : existing.inputSchema,
4235
+ groundTruthSchema: args.groundTruthSchema !== void 0 ? args.groundTruthSchema : existing.groundTruthSchema,
4236
+ updatedAt: /* @__PURE__ */ new Date()
4237
+ };
4238
+ this.db.datasets.set(args.id, updated);
4239
+ return updated;
4240
+ }
4241
+ async deleteDataset({ id }) {
4242
+ for (const [itemId, rows] of this.db.datasetItems) {
4243
+ if (rows.length > 0 && rows[0].datasetId === id) {
4244
+ this.db.datasetItems.delete(itemId);
4245
+ }
4246
+ }
4247
+ for (const [vId, v] of this.db.datasetVersions) {
4248
+ if (v.datasetId === id) {
4249
+ this.db.datasetVersions.delete(vId);
4250
+ }
4251
+ }
4252
+ for (const [expId, exp] of this.db.experiments) {
4253
+ if (exp.datasetId === id) {
4254
+ this.db.experiments.set(expId, { ...exp, datasetId: null, datasetVersion: null });
4255
+ }
4256
+ }
4257
+ this.db.datasets.delete(id);
4258
+ }
4259
+ async listDatasets(args) {
4260
+ const datasets = Array.from(this.db.datasets.values());
4261
+ datasets.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
4262
+ const { page, perPage: perPageInput } = args.pagination;
4263
+ const perPage = normalizePerPage(perPageInput, 100);
4264
+ const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
4265
+ const end = perPageInput === false ? datasets.length : start + perPage;
4266
+ return {
4267
+ datasets: datasets.slice(start, end),
4268
+ pagination: {
4269
+ total: datasets.length,
4270
+ page,
4271
+ perPage: perPageForResponse,
4272
+ hasMore: perPageInput === false ? false : datasets.length > end
4273
+ }
4274
+ };
4275
+ }
4276
+ // --- SCD-2 item mutations ---
4277
+ async _doAddItem(args) {
4278
+ const dataset = this.db.datasets.get(args.datasetId);
4279
+ if (!dataset) {
4280
+ throw new Error(`Dataset not found: ${args.datasetId}`);
4281
+ }
4282
+ const newVersion = dataset.version + 1;
4283
+ this.db.datasets.set(args.datasetId, { ...dataset, version: newVersion });
4284
+ const now = /* @__PURE__ */ new Date();
4285
+ const id = crypto.randomUUID();
4286
+ const row = {
4287
+ id,
4288
+ datasetId: args.datasetId,
4289
+ datasetVersion: newVersion,
4290
+ validTo: null,
4291
+ isDeleted: false,
4292
+ input: args.input,
4293
+ groundTruth: args.groundTruth,
4294
+ metadata: args.metadata,
4295
+ createdAt: now,
4296
+ updatedAt: now
4297
+ };
4298
+ this.db.datasetItems.set(id, [row]);
4299
+ await this.createDatasetVersion(args.datasetId, newVersion);
4300
+ return toDatasetItem(row);
4301
+ }
4302
+ async _doUpdateItem(args) {
4303
+ const rows = this.db.datasetItems.get(args.id);
4304
+ if (!rows || rows.length === 0) {
4305
+ throw new Error(`Item not found: ${args.id}`);
4306
+ }
4307
+ const currentRow = rows.find((r) => r.validTo === null && !r.isDeleted);
4308
+ if (!currentRow) {
4309
+ throw new Error(`Item not found: ${args.id}`);
4310
+ }
4311
+ if (currentRow.datasetId !== args.datasetId) {
4312
+ throw new Error(`Item ${args.id} does not belong to dataset ${args.datasetId}`);
4313
+ }
4314
+ const dataset = this.db.datasets.get(args.datasetId);
4315
+ if (!dataset) {
4316
+ throw new Error(`Dataset not found: ${args.datasetId}`);
4317
+ }
4318
+ const newVersion = dataset.version + 1;
4319
+ this.db.datasets.set(args.datasetId, { ...dataset, version: newVersion });
4320
+ currentRow.validTo = newVersion;
4321
+ const now = /* @__PURE__ */ new Date();
4322
+ const newRow = {
4323
+ id: args.id,
4324
+ datasetId: args.datasetId,
4325
+ datasetVersion: newVersion,
4326
+ validTo: null,
4327
+ isDeleted: false,
4328
+ input: args.input ?? currentRow.input,
4329
+ groundTruth: args.groundTruth ?? currentRow.groundTruth,
4330
+ metadata: args.metadata ?? currentRow.metadata,
4331
+ createdAt: currentRow.createdAt,
4332
+ updatedAt: now
4333
+ };
4334
+ rows.push(newRow);
4335
+ await this.createDatasetVersion(args.datasetId, newVersion);
4336
+ return toDatasetItem(newRow);
4337
+ }
4338
+ async _doDeleteItem({ id, datasetId }) {
4339
+ const rows = this.db.datasetItems.get(id);
4340
+ if (!rows || rows.length === 0) {
4341
+ return;
4342
+ }
4343
+ const currentRow = rows.find((r) => r.validTo === null && !r.isDeleted);
4344
+ if (!currentRow) {
4345
+ return;
4346
+ }
4347
+ if (currentRow.datasetId !== datasetId) {
4348
+ throw new Error(`Item ${id} does not belong to dataset ${datasetId}`);
4349
+ }
4350
+ const dataset = this.db.datasets.get(datasetId);
4351
+ if (!dataset) {
4352
+ throw new Error(`Dataset not found: ${datasetId}`);
4353
+ }
4354
+ const newVersion = dataset.version + 1;
4355
+ this.db.datasets.set(datasetId, { ...dataset, version: newVersion });
4356
+ currentRow.validTo = newVersion;
4357
+ const now = /* @__PURE__ */ new Date();
4358
+ rows.push({
4359
+ id,
4360
+ datasetId,
4361
+ datasetVersion: newVersion,
4362
+ validTo: null,
4363
+ isDeleted: true,
4364
+ input: currentRow.input,
4365
+ groundTruth: currentRow.groundTruth,
4366
+ metadata: currentRow.metadata,
4367
+ createdAt: currentRow.createdAt,
4368
+ updatedAt: now
4369
+ });
4370
+ await this.createDatasetVersion(datasetId, newVersion);
4371
+ }
4372
+ // --- SCD-2 queries ---
4373
+ async getItemById(args) {
4374
+ const rows = this.db.datasetItems.get(args.id);
4375
+ if (!rows || rows.length === 0) return null;
4376
+ if (args.datasetVersion !== void 0) {
4377
+ const row = rows.find((r) => r.datasetVersion === args.datasetVersion && !r.isDeleted);
4378
+ return row ? toDatasetItem(row) : null;
4379
+ }
4380
+ const current = rows.find((r) => r.validTo === null && !r.isDeleted);
4381
+ return current ? toDatasetItem(current) : null;
4382
+ }
4383
+ async getItemsByVersion({ datasetId, version }) {
4384
+ const items = [];
4385
+ for (const rows of this.db.datasetItems.values()) {
4386
+ if (rows.length === 0 || rows[0].datasetId !== datasetId) continue;
4387
+ const visible = rows.find(
4388
+ (r) => r.datasetVersion <= version && (r.validTo === null || r.validTo > version) && !r.isDeleted
4389
+ );
4390
+ if (visible) {
4391
+ items.push(toDatasetItem(visible));
4392
+ }
4393
+ }
4394
+ items.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime() || b.id.localeCompare(a.id));
4395
+ return items;
4396
+ }
4397
+ async getItemHistory(itemId) {
4398
+ const rows = this.db.datasetItems.get(itemId);
4399
+ if (!rows) return [];
4400
+ return [...rows].sort((a, b) => b.datasetVersion - a.datasetVersion);
4401
+ }
4402
+ async listItems(args) {
4403
+ let items;
4404
+ if (args.version !== void 0) {
4405
+ items = await this.getItemsByVersion({ datasetId: args.datasetId, version: args.version });
4406
+ } else {
4407
+ items = [];
4408
+ for (const rows of this.db.datasetItems.values()) {
4409
+ if (rows.length === 0 || rows[0].datasetId !== args.datasetId) continue;
4410
+ const current = rows.find((r) => r.validTo === null && !r.isDeleted);
4411
+ if (current) {
4412
+ items.push(toDatasetItem(current));
4413
+ }
4414
+ }
4415
+ }
4416
+ if (args.search) {
4417
+ const searchLower = args.search.toLowerCase();
4418
+ items = items.filter((item) => {
4419
+ const inputStr = typeof item.input === "string" ? item.input : JSON.stringify(item.input);
4420
+ const outputStr = item.groundTruth ? typeof item.groundTruth === "string" ? item.groundTruth : JSON.stringify(item.groundTruth) : "";
4421
+ return inputStr.toLowerCase().includes(searchLower) || outputStr.toLowerCase().includes(searchLower);
4422
+ });
4423
+ }
4424
+ items.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime() || b.id.localeCompare(a.id));
4425
+ const { page, perPage: perPageInput } = args.pagination;
4426
+ const perPage = normalizePerPage(perPageInput, 100);
4427
+ const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
4428
+ const end = perPageInput === false ? items.length : start + perPage;
4429
+ return {
4430
+ items: items.slice(start, end),
4431
+ pagination: {
4432
+ total: items.length,
4433
+ page,
4434
+ perPage: perPageForResponse,
4435
+ hasMore: perPageInput === false ? false : items.length > end
4436
+ }
4437
+ };
4438
+ }
4439
+ // --- Dataset version methods ---
4440
+ async createDatasetVersion(datasetId, version) {
4441
+ const id = crypto.randomUUID();
4442
+ const dsVersion = {
4443
+ id,
4444
+ datasetId,
4445
+ version,
4446
+ createdAt: /* @__PURE__ */ new Date()
4447
+ };
4448
+ this.db.datasetVersions.set(id, dsVersion);
4449
+ return dsVersion;
4450
+ }
4451
+ async listDatasetVersions(input) {
4452
+ const versions = [];
4453
+ for (const v of this.db.datasetVersions.values()) {
4454
+ if (v.datasetId === input.datasetId) {
4455
+ versions.push(v);
4456
+ }
4457
+ }
4458
+ versions.sort((a, b) => b.version - a.version);
4459
+ const { page, perPage: perPageInput } = input.pagination;
4460
+ const perPage = normalizePerPage(perPageInput, 100);
4461
+ const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
4462
+ const end = perPageInput === false ? versions.length : start + perPage;
4463
+ return {
4464
+ versions: versions.slice(start, end),
4465
+ pagination: {
4466
+ total: versions.length,
4467
+ page,
4468
+ perPage: perPageForResponse,
4469
+ hasMore: perPageInput === false ? false : versions.length > end
4470
+ }
4471
+ };
4472
+ }
4473
+ // --- Bulk operations (SCD-2 internally) ---
4474
+ async _doBatchInsertItems(input) {
4475
+ const dataset = this.db.datasets.get(input.datasetId);
4476
+ if (!dataset) {
4477
+ throw new Error(`Dataset not found: ${input.datasetId}`);
4478
+ }
4479
+ const newVersion = dataset.version + 1;
4480
+ this.db.datasets.set(input.datasetId, { ...dataset, version: newVersion });
4481
+ const now = /* @__PURE__ */ new Date();
4482
+ const items = [];
4483
+ for (const itemInput of input.items) {
4484
+ const id = crypto.randomUUID();
4485
+ const row = {
4486
+ id,
4487
+ datasetId: input.datasetId,
4488
+ datasetVersion: newVersion,
4489
+ validTo: null,
4490
+ isDeleted: false,
4491
+ input: itemInput.input,
4492
+ groundTruth: itemInput.groundTruth,
4493
+ metadata: itemInput.metadata,
4494
+ createdAt: now,
4495
+ updatedAt: now
4496
+ };
4497
+ this.db.datasetItems.set(id, [row]);
4498
+ items.push(toDatasetItem(row));
4499
+ }
4500
+ await this.createDatasetVersion(input.datasetId, newVersion);
4501
+ return items;
4502
+ }
4503
+ async _doBatchDeleteItems(input) {
4504
+ const dataset = this.db.datasets.get(input.datasetId);
4505
+ if (!dataset) {
4506
+ throw new Error(`Dataset not found: ${input.datasetId}`);
4507
+ }
4508
+ const newVersion = dataset.version + 1;
4509
+ this.db.datasets.set(input.datasetId, { ...dataset, version: newVersion });
4510
+ const now = /* @__PURE__ */ new Date();
4511
+ for (const itemId of input.itemIds) {
4512
+ const rows = this.db.datasetItems.get(itemId);
4513
+ if (!rows) continue;
4514
+ const currentRow = rows.find((r) => r.validTo === null && !r.isDeleted);
4515
+ if (!currentRow || currentRow.datasetId !== input.datasetId) continue;
4516
+ currentRow.validTo = newVersion;
4517
+ rows.push({
4518
+ id: itemId,
4519
+ datasetId: input.datasetId,
4520
+ datasetVersion: newVersion,
4521
+ validTo: null,
4522
+ isDeleted: true,
4523
+ input: currentRow.input,
4524
+ groundTruth: currentRow.groundTruth,
4525
+ metadata: currentRow.metadata,
4526
+ createdAt: currentRow.createdAt,
4527
+ updatedAt: now
4528
+ });
4529
+ }
4530
+ await this.createDatasetVersion(input.datasetId, newVersion);
4531
+ }
4532
+ };
4533
+
4534
+ // src/storage/domains/experiments/base.ts
4535
+ var ExperimentsStorage = class extends StorageDomain {
4536
+ constructor() {
4537
+ super({
4538
+ component: "STORAGE",
4539
+ name: "EXPERIMENTS"
4540
+ });
4541
+ }
4542
+ async dangerouslyClearAll() {
4543
+ }
4544
+ };
4545
+
4546
+ // src/storage/domains/experiments/inmemory.ts
4547
+ var ExperimentsInMemory = class extends ExperimentsStorage {
4548
+ db;
4549
+ constructor({ db }) {
4550
+ super();
4551
+ this.db = db;
4552
+ }
4553
+ async dangerouslyClearAll() {
4554
+ this.db.experiments.clear();
4555
+ this.db.experimentResults.clear();
4556
+ }
4557
+ // Experiment lifecycle
4558
+ async createExperiment(input) {
4559
+ const now = /* @__PURE__ */ new Date();
4560
+ const experiment = {
4561
+ id: input.id ?? crypto.randomUUID(),
4562
+ datasetId: input.datasetId,
4563
+ datasetVersion: input.datasetVersion,
4564
+ targetType: input.targetType,
4565
+ targetId: input.targetId,
4566
+ name: input.name,
4567
+ description: input.description,
4568
+ metadata: input.metadata,
4569
+ status: "pending",
4570
+ totalItems: input.totalItems,
4571
+ succeededCount: 0,
4572
+ failedCount: 0,
4573
+ skippedCount: 0,
4574
+ startedAt: null,
4575
+ completedAt: null,
4576
+ createdAt: now,
4577
+ updatedAt: now
4578
+ };
4579
+ this.db.experiments.set(experiment.id, experiment);
4580
+ return experiment;
4581
+ }
4582
+ async updateExperiment(input) {
4583
+ const existing = this.db.experiments.get(input.id);
4584
+ if (!existing) {
4585
+ throw new Error(`Experiment not found: ${input.id}`);
4586
+ }
4587
+ const updated = {
4588
+ ...existing,
4589
+ status: input.status ?? existing.status,
4590
+ succeededCount: input.succeededCount ?? existing.succeededCount,
4591
+ failedCount: input.failedCount ?? existing.failedCount,
4592
+ skippedCount: input.skippedCount ?? existing.skippedCount,
4593
+ startedAt: input.startedAt ?? existing.startedAt,
4594
+ completedAt: input.completedAt ?? existing.completedAt,
4595
+ name: input.name ?? existing.name,
4596
+ description: input.description ?? existing.description,
4597
+ metadata: input.metadata ?? existing.metadata,
4598
+ updatedAt: /* @__PURE__ */ new Date()
4599
+ };
4600
+ this.db.experiments.set(input.id, updated);
4601
+ return updated;
4602
+ }
4603
+ async getExperimentById(args) {
4604
+ return this.db.experiments.get(args.id) ?? null;
4605
+ }
4606
+ async listExperiments(args) {
4607
+ let experiments = Array.from(this.db.experiments.values());
4608
+ if (args.datasetId) {
4609
+ experiments = experiments.filter((r) => r.datasetId === args.datasetId);
4610
+ }
4611
+ experiments.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
4612
+ const { page, perPage: perPageInput } = args.pagination;
4613
+ const perPage = normalizePerPage(perPageInput, 100);
4614
+ const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
4615
+ const end = perPageInput === false ? experiments.length : start + perPage;
4616
+ return {
4617
+ experiments: experiments.slice(start, end),
4618
+ pagination: {
4619
+ total: experiments.length,
4620
+ page,
4621
+ perPage: perPageForResponse,
4622
+ hasMore: perPageInput === false ? false : experiments.length > end
4623
+ }
4624
+ };
4625
+ }
4626
+ async deleteExperiment(args) {
4627
+ this.db.experiments.delete(args.id);
4628
+ for (const [resultId, result] of this.db.experimentResults) {
4629
+ if (result.experimentId === args.id) {
4630
+ this.db.experimentResults.delete(resultId);
4631
+ }
4632
+ }
4633
+ }
4634
+ // Results (per-item)
4635
+ async addExperimentResult(input) {
4636
+ const now = /* @__PURE__ */ new Date();
4637
+ const result = {
4638
+ id: input.id ?? crypto.randomUUID(),
4639
+ experimentId: input.experimentId,
4640
+ itemId: input.itemId,
4641
+ itemDatasetVersion: input.itemDatasetVersion,
4642
+ input: input.input,
4643
+ output: input.output,
4644
+ groundTruth: input.groundTruth,
4645
+ error: input.error,
4646
+ startedAt: input.startedAt,
4647
+ completedAt: input.completedAt,
4648
+ retryCount: input.retryCount,
4649
+ traceId: input.traceId ?? null,
4650
+ createdAt: now
4651
+ };
4652
+ this.db.experimentResults.set(result.id, result);
4653
+ return result;
4654
+ }
4655
+ async getExperimentResultById(args) {
4656
+ return this.db.experimentResults.get(args.id) ?? null;
4657
+ }
4658
+ async listExperimentResults(args) {
4659
+ let results = Array.from(this.db.experimentResults.values()).filter((r) => r.experimentId === args.experimentId);
4660
+ results.sort((a, b) => a.startedAt.getTime() - b.startedAt.getTime());
4661
+ const { page, perPage: perPageInput } = args.pagination;
4662
+ const perPage = normalizePerPage(perPageInput, 100);
4663
+ const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
4664
+ const end = perPageInput === false ? results.length : start + perPage;
4665
+ return {
4666
+ results: results.slice(start, end),
4667
+ pagination: {
4668
+ total: results.length,
4669
+ page,
4670
+ perPage: perPageForResponse,
4671
+ hasMore: perPageInput === false ? false : results.length > end
4672
+ }
4673
+ };
4674
+ }
4675
+ async deleteExperimentResults(args) {
4676
+ for (const [resultId, result] of this.db.experimentResults) {
4677
+ if (result.experimentId === args.experimentId) {
4678
+ this.db.experimentResults.delete(resultId);
4679
+ }
4680
+ }
4681
+ }
4682
+ };
4683
+
3600
4684
  exports.AgentsStorage = AgentsStorage;
4685
+ exports.DatasetsInMemory = DatasetsInMemory;
4686
+ exports.DatasetsStorage = DatasetsStorage;
4687
+ exports.ExperimentsInMemory = ExperimentsInMemory;
4688
+ exports.ExperimentsStorage = ExperimentsStorage;
3601
4689
  exports.InMemoryAgentsStorage = InMemoryAgentsStorage;
3602
4690
  exports.InMemoryDB = InMemoryDB;
4691
+ exports.InMemoryMCPClientsStorage = InMemoryMCPClientsStorage;
3603
4692
  exports.InMemoryMemory = InMemoryMemory;
3604
4693
  exports.InMemoryPromptBlocksStorage = InMemoryPromptBlocksStorage;
3605
4694
  exports.InMemoryScorerDefinitionsStorage = InMemoryScorerDefinitionsStorage;
3606
4695
  exports.InMemoryStore = InMemoryStore;
4696
+ exports.MCPClientsStorage = MCPClientsStorage;
3607
4697
  exports.MastraCompositeStore = MastraCompositeStore;
3608
4698
  exports.MastraStorage = MastraStorage;
3609
4699
  exports.MemoryStorage = MemoryStorage;
@@ -3611,6 +4701,9 @@ exports.MockStore = MockStore;
3611
4701
  exports.ObservabilityInMemory = ObservabilityInMemory;
3612
4702
  exports.ObservabilityStorage = ObservabilityStorage;
3613
4703
  exports.PromptBlocksStorage = PromptBlocksStorage;
4704
+ exports.SchemaUpdateValidationError = SchemaUpdateValidationError;
4705
+ exports.SchemaValidationError = SchemaValidationError;
4706
+ exports.SchemaValidator = SchemaValidator;
3614
4707
  exports.ScorerDefinitionsStorage = ScorerDefinitionsStorage;
3615
4708
  exports.ScoresInMemory = ScoresInMemory;
3616
4709
  exports.ScoresStorage = ScoresStorage;
@@ -3624,10 +4717,12 @@ exports.calculatePagination = calculatePagination;
3624
4717
  exports.createPendingMarker = createPendingMarker;
3625
4718
  exports.createStorageErrorId = createStorageErrorId;
3626
4719
  exports.createStoreErrorId = createStoreErrorId;
4720
+ exports.createValidator = createValidator;
3627
4721
  exports.createVectorErrorId = createVectorErrorId;
3628
4722
  exports.ensureDate = ensureDate;
3629
4723
  exports.filterByDateRange = filterByDateRange;
3630
4724
  exports.getDefaultValue = getDefaultValue;
4725
+ exports.getSchemaValidator = getSchemaValidator;
3631
4726
  exports.getSqlType = getSqlType;
3632
4727
  exports.jsonValueEquals = jsonValueEquals;
3633
4728
  exports.normalizePerPage = normalizePerPage;
@@ -3635,5 +4730,5 @@ exports.safelyParseJSON = safelyParseJSON;
3635
4730
  exports.serializeDate = serializeDate;
3636
4731
  exports.transformRow = transformRow;
3637
4732
  exports.transformScoreRow = transformScoreRow;
3638
- //# sourceMappingURL=chunk-TERSHTY5.cjs.map
3639
- //# sourceMappingURL=chunk-TERSHTY5.cjs.map
4733
+ //# sourceMappingURL=chunk-BP7VYTOP.cjs.map
4734
+ //# sourceMappingURL=chunk-BP7VYTOP.cjs.map