@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,8 +1,10 @@
1
- import { MessageList } from './chunk-ILQXPZCD.js';
2
- import { TABLE_SCHEMAS, TABLE_SCORERS, listTracesArgsSchema, toTraceSpans, TABLE_WORKFLOW_SNAPSHOT } from './chunk-44SUGDBR.js';
3
- import { deepEqual } from './chunk-ZHFM7HCQ.js';
1
+ import { MessageList } from './chunk-AY6DBRS3.js';
2
+ import { TABLE_SCHEMAS, TABLE_SCORERS, listTracesArgsSchema, toTraceSpans, TABLE_WORKFLOW_SNAPSHOT } from './chunk-PS5ONCXY.js';
3
+ import { deepEqual } from './chunk-AXHBJ4GX.js';
4
4
  import { MastraError } from './chunk-FJEVLHJT.js';
5
5
  import { MastraBase } from './chunk-WCAFTXGK.js';
6
+ import { jsonSchemaToZod } from '@mastra/schema-compat/json-to-zod';
7
+ import { z } from 'zod';
6
8
 
7
9
  // src/storage/base.ts
8
10
  function normalizePerPage(perPageInput, defaultValue) {
@@ -59,8 +61,11 @@ var MastraCompositeStore = class extends MastraBase {
59
61
  scores: domainOverrides.scores ?? defaultStores?.scores,
60
62
  observability: domainOverrides.observability ?? defaultStores?.observability,
61
63
  agents: domainOverrides.agents ?? defaultStores?.agents,
64
+ datasets: domainOverrides.datasets ?? defaultStores?.datasets,
65
+ experiments: domainOverrides.experiments ?? defaultStores?.experiments,
62
66
  promptBlocks: domainOverrides.promptBlocks ?? defaultStores?.promptBlocks,
63
- scorerDefinitions: domainOverrides.scorerDefinitions ?? defaultStores?.scorerDefinitions
67
+ scorerDefinitions: domainOverrides.scorerDefinitions ?? defaultStores?.scorerDefinitions,
68
+ mcpClients: domainOverrides.mcpClients ?? defaultStores?.mcpClients
64
69
  };
65
70
  }
66
71
  }
@@ -105,12 +110,21 @@ var MastraCompositeStore = class extends MastraBase {
105
110
  if (this.stores?.agents) {
106
111
  initTasks.push(this.stores.agents.init());
107
112
  }
113
+ if (this.stores?.datasets) {
114
+ initTasks.push(this.stores.datasets.init());
115
+ }
116
+ if (this.stores?.experiments) {
117
+ initTasks.push(this.stores.experiments.init());
118
+ }
108
119
  if (this.stores?.promptBlocks) {
109
120
  initTasks.push(this.stores.promptBlocks.init());
110
121
  }
111
122
  if (this.stores?.scorerDefinitions) {
112
123
  initTasks.push(this.stores.scorerDefinitions.init());
113
124
  }
125
+ if (this.stores?.mcpClients) {
126
+ initTasks.push(this.stores.mcpClients.init());
127
+ }
114
128
  this.hasInitialized = Promise.all(initTasks).then(() => true);
115
129
  await this.hasInitialized;
116
130
  }
@@ -311,7 +325,9 @@ var InMemoryAgentsStorage = class extends AgentsStorage {
311
325
  "inputProcessors",
312
326
  "outputProcessors",
313
327
  "memory",
314
- "scorers"
328
+ "scorers",
329
+ "mcpClients",
330
+ "requestContextSchema"
315
331
  ];
316
332
  const hasConfigUpdate = configFieldNames.some((field) => field in configFields);
317
333
  const updatedAgent = {
@@ -557,8 +573,17 @@ var InMemoryDB = class {
557
573
  promptBlockVersions = /* @__PURE__ */ new Map();
558
574
  scorerDefinitions = /* @__PURE__ */ new Map();
559
575
  scorerDefinitionVersions = /* @__PURE__ */ new Map();
576
+ mcpClients = /* @__PURE__ */ new Map();
577
+ mcpClientVersions = /* @__PURE__ */ new Map();
560
578
  /** Observational memory records, keyed by resourceId, each holding array of records (generations) */
561
579
  observationalMemory = /* @__PURE__ */ new Map();
580
+ // Dataset domain maps
581
+ datasets = /* @__PURE__ */ new Map();
582
+ datasetItems = /* @__PURE__ */ new Map();
583
+ datasetVersions = /* @__PURE__ */ new Map();
584
+ // Experiment domain maps
585
+ experiments = /* @__PURE__ */ new Map();
586
+ experimentResults = /* @__PURE__ */ new Map();
562
587
  /**
563
588
  * Clears all data from all collections.
564
589
  * Useful for testing.
@@ -576,7 +601,318 @@ var InMemoryDB = class {
576
601
  this.promptBlockVersions.clear();
577
602
  this.scorerDefinitions.clear();
578
603
  this.scorerDefinitionVersions.clear();
604
+ this.mcpClients.clear();
605
+ this.mcpClientVersions.clear();
579
606
  this.observationalMemory.clear();
607
+ this.datasets.clear();
608
+ this.datasetItems.clear();
609
+ this.datasetVersions.clear();
610
+ this.experiments.clear();
611
+ this.experimentResults.clear();
612
+ }
613
+ };
614
+
615
+ // src/storage/domains/mcp-clients/base.ts
616
+ var MCPClientsStorage = class extends VersionedStorageDomain {
617
+ listKey = "mcpClients";
618
+ versionMetadataFields = [
619
+ "id",
620
+ "mcpClientId",
621
+ "versionNumber",
622
+ "changedFields",
623
+ "changeMessage",
624
+ "createdAt"
625
+ ];
626
+ constructor() {
627
+ super({
628
+ component: "STORAGE",
629
+ name: "MCP_CLIENTS"
630
+ });
631
+ }
632
+ };
633
+
634
+ // src/storage/domains/mcp-clients/inmemory.ts
635
+ var InMemoryMCPClientsStorage = class extends MCPClientsStorage {
636
+ db;
637
+ constructor({ db }) {
638
+ super();
639
+ this.db = db;
640
+ }
641
+ async dangerouslyClearAll() {
642
+ this.db.mcpClients.clear();
643
+ this.db.mcpClientVersions.clear();
644
+ }
645
+ // ==========================================================================
646
+ // MCP Client CRUD Methods
647
+ // ==========================================================================
648
+ async getById(id) {
649
+ this.logger.debug(`InMemoryMCPClientsStorage: getById called for ${id}`);
650
+ const config = this.db.mcpClients.get(id);
651
+ return config ? this.deepCopyConfig(config) : null;
652
+ }
653
+ async create(input) {
654
+ const { mcpClient } = input;
655
+ this.logger.debug(`InMemoryMCPClientsStorage: create called for ${mcpClient.id}`);
656
+ if (this.db.mcpClients.has(mcpClient.id)) {
657
+ throw new Error(`MCP client with id ${mcpClient.id} already exists`);
658
+ }
659
+ const now = /* @__PURE__ */ new Date();
660
+ const newConfig = {
661
+ id: mcpClient.id,
662
+ status: "draft",
663
+ activeVersionId: void 0,
664
+ authorId: mcpClient.authorId,
665
+ metadata: mcpClient.metadata,
666
+ createdAt: now,
667
+ updatedAt: now
668
+ };
669
+ this.db.mcpClients.set(mcpClient.id, newConfig);
670
+ const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = mcpClient;
671
+ const versionId = crypto.randomUUID();
672
+ await this.createVersion({
673
+ id: versionId,
674
+ mcpClientId: mcpClient.id,
675
+ versionNumber: 1,
676
+ ...snapshotConfig,
677
+ changedFields: Object.keys(snapshotConfig),
678
+ changeMessage: "Initial version"
679
+ });
680
+ return this.deepCopyConfig(newConfig);
681
+ }
682
+ async update(input) {
683
+ const { id, ...updates } = input;
684
+ this.logger.debug(`InMemoryMCPClientsStorage: update called for ${id}`);
685
+ const existingConfig = this.db.mcpClients.get(id);
686
+ if (!existingConfig) {
687
+ throw new Error(`MCP client with id ${id} not found`);
688
+ }
689
+ const { authorId, activeVersionId, metadata, status, ...configFields } = updates;
690
+ const configFieldNames = ["name", "description", "servers"];
691
+ const hasConfigUpdate = configFieldNames.some((field) => field in configFields);
692
+ const updatedConfig = {
693
+ ...existingConfig,
694
+ ...authorId !== void 0 && { authorId },
695
+ ...activeVersionId !== void 0 && { activeVersionId },
696
+ ...status !== void 0 && { status },
697
+ ...metadata !== void 0 && {
698
+ metadata: { ...existingConfig.metadata, ...metadata }
699
+ },
700
+ updatedAt: /* @__PURE__ */ new Date()
701
+ };
702
+ if (activeVersionId !== void 0 && status === void 0) {
703
+ updatedConfig.status = "published";
704
+ }
705
+ if (hasConfigUpdate) {
706
+ const latestVersion = await this.getLatestVersion(id);
707
+ if (!latestVersion) {
708
+ throw new Error(`No versions found for MCP client ${id}`);
709
+ }
710
+ const {
711
+ id: _versionId,
712
+ mcpClientId: _mcpClientId,
713
+ versionNumber: _versionNumber,
714
+ changedFields: _changedFields,
715
+ changeMessage: _changeMessage,
716
+ createdAt: _createdAt,
717
+ ...latestConfig
718
+ } = latestVersion;
719
+ const newConfig = {
720
+ ...latestConfig,
721
+ ...configFields
722
+ };
723
+ const changedFields = configFieldNames.filter(
724
+ (field) => field in configFields && JSON.stringify(configFields[field]) !== JSON.stringify(latestConfig[field])
725
+ );
726
+ if (changedFields.length > 0) {
727
+ const newVersionId = crypto.randomUUID();
728
+ const newVersionNumber = latestVersion.versionNumber + 1;
729
+ await this.createVersion({
730
+ id: newVersionId,
731
+ mcpClientId: id,
732
+ versionNumber: newVersionNumber,
733
+ ...newConfig,
734
+ changedFields,
735
+ changeMessage: `Updated ${changedFields.join(", ")}`
736
+ });
737
+ }
738
+ }
739
+ this.db.mcpClients.set(id, updatedConfig);
740
+ return this.deepCopyConfig(updatedConfig);
741
+ }
742
+ async delete(id) {
743
+ this.logger.debug(`InMemoryMCPClientsStorage: delete called for ${id}`);
744
+ this.db.mcpClients.delete(id);
745
+ await this.deleteVersionsByParentId(id);
746
+ }
747
+ async list(args) {
748
+ const { page = 0, perPage: perPageInput, orderBy, authorId, metadata } = args || {};
749
+ const { field, direction } = this.parseOrderBy(orderBy);
750
+ this.logger.debug(`InMemoryMCPClientsStorage: list called`);
751
+ const perPage = normalizePerPage(perPageInput, 100);
752
+ if (page < 0) {
753
+ throw new Error("page must be >= 0");
754
+ }
755
+ const maxOffset = Number.MAX_SAFE_INTEGER / 2;
756
+ if (page * perPage > maxOffset) {
757
+ throw new Error("page value too large");
758
+ }
759
+ let configs = Array.from(this.db.mcpClients.values());
760
+ if (authorId !== void 0) {
761
+ configs = configs.filter((config) => config.authorId === authorId);
762
+ }
763
+ if (metadata && Object.keys(metadata).length > 0) {
764
+ configs = configs.filter((config) => {
765
+ if (!config.metadata) return false;
766
+ return Object.entries(metadata).every(([key, value]) => deepEqual(config.metadata[key], value));
767
+ });
768
+ }
769
+ const sortedConfigs = this.sortConfigs(configs, field, direction);
770
+ const clonedConfigs = sortedConfigs.map((config) => this.deepCopyConfig(config));
771
+ const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
772
+ return {
773
+ mcpClients: clonedConfigs.slice(offset, offset + perPage),
774
+ total: clonedConfigs.length,
775
+ page,
776
+ perPage: perPageForResponse,
777
+ hasMore: offset + perPage < clonedConfigs.length
778
+ };
779
+ }
780
+ // ==========================================================================
781
+ // MCP Client Version Methods
782
+ // ==========================================================================
783
+ async createVersion(input) {
784
+ this.logger.debug(`InMemoryMCPClientsStorage: createVersion called for MCP client ${input.mcpClientId}`);
785
+ if (this.db.mcpClientVersions.has(input.id)) {
786
+ throw new Error(`Version with id ${input.id} already exists`);
787
+ }
788
+ for (const version2 of this.db.mcpClientVersions.values()) {
789
+ if (version2.mcpClientId === input.mcpClientId && version2.versionNumber === input.versionNumber) {
790
+ throw new Error(`Version number ${input.versionNumber} already exists for MCP client ${input.mcpClientId}`);
791
+ }
792
+ }
793
+ const version = {
794
+ ...input,
795
+ createdAt: /* @__PURE__ */ new Date()
796
+ };
797
+ this.db.mcpClientVersions.set(input.id, this.deepCopyVersion(version));
798
+ return this.deepCopyVersion(version);
799
+ }
800
+ async getVersion(id) {
801
+ this.logger.debug(`InMemoryMCPClientsStorage: getVersion called for ${id}`);
802
+ const version = this.db.mcpClientVersions.get(id);
803
+ return version ? this.deepCopyVersion(version) : null;
804
+ }
805
+ async getVersionByNumber(mcpClientId, versionNumber) {
806
+ this.logger.debug(
807
+ `InMemoryMCPClientsStorage: getVersionByNumber called for MCP client ${mcpClientId}, v${versionNumber}`
808
+ );
809
+ for (const version of this.db.mcpClientVersions.values()) {
810
+ if (version.mcpClientId === mcpClientId && version.versionNumber === versionNumber) {
811
+ return this.deepCopyVersion(version);
812
+ }
813
+ }
814
+ return null;
815
+ }
816
+ async getLatestVersion(mcpClientId) {
817
+ this.logger.debug(`InMemoryMCPClientsStorage: getLatestVersion called for MCP client ${mcpClientId}`);
818
+ let latest = null;
819
+ for (const version of this.db.mcpClientVersions.values()) {
820
+ if (version.mcpClientId === mcpClientId) {
821
+ if (!latest || version.versionNumber > latest.versionNumber) {
822
+ latest = version;
823
+ }
824
+ }
825
+ }
826
+ return latest ? this.deepCopyVersion(latest) : null;
827
+ }
828
+ async listVersions(input) {
829
+ const { mcpClientId, page = 0, perPage: perPageInput, orderBy } = input;
830
+ const { field, direction } = this.parseVersionOrderBy(orderBy);
831
+ this.logger.debug(`InMemoryMCPClientsStorage: listVersions called for MCP client ${mcpClientId}`);
832
+ const perPage = normalizePerPage(perPageInput, 20);
833
+ if (page < 0) {
834
+ throw new Error("page must be >= 0");
835
+ }
836
+ const maxOffset = Number.MAX_SAFE_INTEGER / 2;
837
+ if (page * perPage > maxOffset) {
838
+ throw new Error("page value too large");
839
+ }
840
+ let versions = Array.from(this.db.mcpClientVersions.values()).filter((v) => v.mcpClientId === mcpClientId);
841
+ versions = this.sortVersions(versions, field, direction);
842
+ const clonedVersions = versions.map((v) => this.deepCopyVersion(v));
843
+ const total = clonedVersions.length;
844
+ const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
845
+ const paginatedVersions = clonedVersions.slice(offset, offset + perPage);
846
+ return {
847
+ versions: paginatedVersions,
848
+ total,
849
+ page,
850
+ perPage: perPageForResponse,
851
+ hasMore: offset + perPage < total
852
+ };
853
+ }
854
+ async deleteVersion(id) {
855
+ this.logger.debug(`InMemoryMCPClientsStorage: deleteVersion called for ${id}`);
856
+ this.db.mcpClientVersions.delete(id);
857
+ }
858
+ async deleteVersionsByParentId(entityId) {
859
+ this.logger.debug(`InMemoryMCPClientsStorage: deleteVersionsByParentId called for MCP client ${entityId}`);
860
+ const idsToDelete = [];
861
+ for (const [id, version] of this.db.mcpClientVersions.entries()) {
862
+ if (version.mcpClientId === entityId) {
863
+ idsToDelete.push(id);
864
+ }
865
+ }
866
+ for (const id of idsToDelete) {
867
+ this.db.mcpClientVersions.delete(id);
868
+ }
869
+ }
870
+ async countVersions(mcpClientId) {
871
+ this.logger.debug(`InMemoryMCPClientsStorage: countVersions called for MCP client ${mcpClientId}`);
872
+ let count = 0;
873
+ for (const version of this.db.mcpClientVersions.values()) {
874
+ if (version.mcpClientId === mcpClientId) {
875
+ count++;
876
+ }
877
+ }
878
+ return count;
879
+ }
880
+ // ==========================================================================
881
+ // Private Helper Methods
882
+ // ==========================================================================
883
+ deepCopyConfig(config) {
884
+ return {
885
+ ...config,
886
+ metadata: config.metadata ? { ...config.metadata } : config.metadata
887
+ };
888
+ }
889
+ deepCopyVersion(version) {
890
+ return {
891
+ ...version,
892
+ servers: version.servers ? JSON.parse(JSON.stringify(version.servers)) : version.servers,
893
+ changedFields: version.changedFields ? [...version.changedFields] : version.changedFields
894
+ };
895
+ }
896
+ sortConfigs(configs, field, direction) {
897
+ return configs.sort((a, b) => {
898
+ const aValue = a[field].getTime();
899
+ const bValue = b[field].getTime();
900
+ return direction === "ASC" ? aValue - bValue : bValue - aValue;
901
+ });
902
+ }
903
+ sortVersions(versions, field, direction) {
904
+ return versions.sort((a, b) => {
905
+ let aVal;
906
+ let bVal;
907
+ if (field === "createdAt") {
908
+ aVal = a.createdAt.getTime();
909
+ bVal = b.createdAt.getTime();
910
+ } else {
911
+ aVal = a.versionNumber;
912
+ bVal = b.versionNumber;
913
+ }
914
+ return direction === "ASC" ? aVal - bVal : bVal - aVal;
915
+ });
580
916
  }
581
917
  };
582
918
 
@@ -3391,7 +3727,8 @@ var InMemoryStore = class extends MastraCompositeStore {
3391
3727
  observability: new ObservabilityInMemory({ db: this.#db }),
3392
3728
  agents: new InMemoryAgentsStorage({ db: this.#db }),
3393
3729
  promptBlocks: new InMemoryPromptBlocksStorage({ db: this.#db }),
3394
- scorerDefinitions: new InMemoryScorerDefinitionsStorage({ db: this.#db })
3730
+ scorerDefinitions: new InMemoryScorerDefinitionsStorage({ db: this.#db }),
3731
+ mcpClients: new InMemoryMCPClientsStorage({ db: this.#db })
3395
3732
  };
3396
3733
  }
3397
3734
  /**
@@ -3530,7 +3867,14 @@ var StoreOperationsInMemory = class extends StoreOperations {
3530
3867
  mastra_prompt_blocks: /* @__PURE__ */ new Map(),
3531
3868
  mastra_prompt_block_versions: /* @__PURE__ */ new Map(),
3532
3869
  mastra_scorer_definitions: /* @__PURE__ */ new Map(),
3533
- mastra_scorer_definition_versions: /* @__PURE__ */ new Map()
3870
+ mastra_scorer_definition_versions: /* @__PURE__ */ new Map(),
3871
+ mastra_mcp_clients: /* @__PURE__ */ new Map(),
3872
+ mastra_mcp_client_versions: /* @__PURE__ */ new Map(),
3873
+ mastra_datasets: /* @__PURE__ */ new Map(),
3874
+ mastra_dataset_items: /* @__PURE__ */ new Map(),
3875
+ mastra_dataset_versions: /* @__PURE__ */ new Map(),
3876
+ mastra_experiments: /* @__PURE__ */ new Map(),
3877
+ mastra_experiment_results: /* @__PURE__ */ new Map()
3534
3878
  };
3535
3879
  }
3536
3880
  getDatabase() {
@@ -3595,6 +3939,746 @@ var StoreOperationsInMemory = class extends StoreOperations {
3595
3939
  }
3596
3940
  };
3597
3941
 
3598
- export { AgentsStorage, InMemoryAgentsStorage, InMemoryDB, InMemoryMemory, InMemoryPromptBlocksStorage, InMemoryScorerDefinitionsStorage, InMemoryStore, MastraCompositeStore, MastraStorage, MemoryStorage, MockStore, ObservabilityInMemory, ObservabilityStorage, PromptBlocksStorage, ScorerDefinitionsStorage, ScoresInMemory, ScoresStorage, StorageDomain, StoreOperations, StoreOperationsInMemory, VersionedStorageDomain, WorkflowsInMemory, WorkflowsStorage, calculatePagination, createPendingMarker, createStorageErrorId, createStoreErrorId, createVectorErrorId, ensureDate, filterByDateRange, getDefaultValue, getSqlType, jsonValueEquals, normalizePerPage, safelyParseJSON, serializeDate, transformRow, transformScoreRow };
3599
- //# sourceMappingURL=chunk-JNE2ABVB.js.map
3600
- //# sourceMappingURL=chunk-JNE2ABVB.js.map
3942
+ // src/datasets/validation/errors.ts
3943
+ var SchemaValidationError = class extends Error {
3944
+ constructor(field, errors) {
3945
+ const summary = errors.slice(0, 3).map((e) => e.message).join("; ");
3946
+ super(`Validation failed for ${field}: ${summary}`);
3947
+ this.field = field;
3948
+ this.errors = errors;
3949
+ this.name = "SchemaValidationError";
3950
+ }
3951
+ };
3952
+ var SchemaUpdateValidationError = class extends Error {
3953
+ constructor(failingItems) {
3954
+ const count = failingItems.length;
3955
+ super(`Cannot update schema: ${count} existing item(s) would fail validation`);
3956
+ this.failingItems = failingItems;
3957
+ this.name = "SchemaUpdateValidationError";
3958
+ }
3959
+ };
3960
+
3961
+ // src/datasets/validation/validator.ts
3962
+ function resolveZodSchema(zodString) {
3963
+ return Function("z", `"use strict";return (${zodString});`)(z);
3964
+ }
3965
+ var SchemaValidator = class {
3966
+ cache = /* @__PURE__ */ new Map();
3967
+ /** Get or compile validator for schema */
3968
+ getValidator(schema, cacheKey) {
3969
+ let zodSchema = this.cache.get(cacheKey);
3970
+ if (!zodSchema) {
3971
+ const zodString = jsonSchemaToZod(schema);
3972
+ zodSchema = resolveZodSchema(zodString);
3973
+ this.cache.set(cacheKey, zodSchema);
3974
+ }
3975
+ return zodSchema;
3976
+ }
3977
+ /** Clear cached validator (call when schema changes) */
3978
+ clearCache(cacheKey) {
3979
+ this.cache.delete(cacheKey);
3980
+ }
3981
+ /** Validate data against schema */
3982
+ validate(data, schema, field, cacheKey) {
3983
+ const zodSchema = this.getValidator(schema, cacheKey);
3984
+ const result = zodSchema.safeParse(data);
3985
+ if (!result.success) {
3986
+ throw new SchemaValidationError(field, this.formatErrors(result.error));
3987
+ }
3988
+ }
3989
+ /** Validate multiple items, returning valid/invalid split */
3990
+ validateBatch(items, inputSchema, outputSchema, cacheKeyPrefix, maxErrors = 10) {
3991
+ const result = { valid: [], invalid: [] };
3992
+ const inputValidator = inputSchema ? this.getValidator(inputSchema, `${cacheKeyPrefix}:input`) : null;
3993
+ const outputValidator = outputSchema ? this.getValidator(outputSchema, `${cacheKeyPrefix}:output`) : null;
3994
+ for (const [i, item] of items.entries()) {
3995
+ let hasError = false;
3996
+ if (inputValidator) {
3997
+ const inputResult = inputValidator.safeParse(item.input);
3998
+ if (!inputResult.success) {
3999
+ result.invalid.push({
4000
+ index: i,
4001
+ data: item,
4002
+ field: "input",
4003
+ errors: this.formatErrors(inputResult.error)
4004
+ });
4005
+ hasError = true;
4006
+ if (result.invalid.length >= maxErrors) break;
4007
+ }
4008
+ }
4009
+ if (!hasError && outputValidator && item.groundTruth !== void 0) {
4010
+ const outputResult = outputValidator.safeParse(item.groundTruth);
4011
+ if (!outputResult.success) {
4012
+ result.invalid.push({
4013
+ index: i,
4014
+ data: item,
4015
+ field: "groundTruth",
4016
+ errors: this.formatErrors(outputResult.error)
4017
+ });
4018
+ hasError = true;
4019
+ if (result.invalid.length >= maxErrors) break;
4020
+ }
4021
+ }
4022
+ if (!hasError) {
4023
+ result.valid.push({ index: i, data: item });
4024
+ }
4025
+ }
4026
+ return result;
4027
+ }
4028
+ /** Format Zod errors to FieldError array */
4029
+ formatErrors(error) {
4030
+ return error.issues.slice(0, 5).map((issue) => ({
4031
+ // Convert Zod path array to JSON Pointer string
4032
+ path: issue.path.length > 0 ? "/" + issue.path.join("/") : "/",
4033
+ code: issue.code,
4034
+ message: issue.message
4035
+ }));
4036
+ }
4037
+ };
4038
+ var validatorInstance = null;
4039
+ function getSchemaValidator() {
4040
+ if (!validatorInstance) {
4041
+ validatorInstance = new SchemaValidator();
4042
+ }
4043
+ return validatorInstance;
4044
+ }
4045
+ function createValidator() {
4046
+ return new SchemaValidator();
4047
+ }
4048
+
4049
+ // src/storage/domains/datasets/base.ts
4050
+ var DatasetsStorage = class extends StorageDomain {
4051
+ constructor() {
4052
+ super({
4053
+ component: "STORAGE",
4054
+ name: "DATASETS"
4055
+ });
4056
+ }
4057
+ async dangerouslyClearAll() {
4058
+ }
4059
+ /**
4060
+ * Update a dataset. Validates existing items against new schemas if schemas are changing.
4061
+ * Subclasses implement _doUpdateDataset for actual storage operation.
4062
+ */
4063
+ async updateDataset(args) {
4064
+ const existing = await this.getDatasetById({ id: args.id });
4065
+ if (!existing) {
4066
+ throw new Error(`Dataset not found: ${args.id}`);
4067
+ }
4068
+ const inputSchemaChanging = args.inputSchema !== void 0 && JSON.stringify(args.inputSchema) !== JSON.stringify(existing.inputSchema);
4069
+ const groundTruthSchemaChanging = args.groundTruthSchema !== void 0 && JSON.stringify(args.groundTruthSchema) !== JSON.stringify(existing.groundTruthSchema);
4070
+ if (inputSchemaChanging || groundTruthSchemaChanging) {
4071
+ const itemsResult = await this.listItems({
4072
+ datasetId: args.id,
4073
+ pagination: { page: 0, perPage: false }
4074
+ // Get all items
4075
+ });
4076
+ const items = itemsResult.items;
4077
+ if (items.length > 0) {
4078
+ const validator = getSchemaValidator();
4079
+ const newInputSchema = args.inputSchema !== void 0 ? args.inputSchema : existing.inputSchema;
4080
+ const newOutputSchema = args.groundTruthSchema !== void 0 ? args.groundTruthSchema : existing.groundTruthSchema;
4081
+ const result = validator.validateBatch(
4082
+ items.map((i) => ({ input: i.input, groundTruth: i.groundTruth })),
4083
+ newInputSchema,
4084
+ newOutputSchema,
4085
+ `dataset:${args.id}:schema-update`,
4086
+ 10
4087
+ // Max 10 errors to report
4088
+ );
4089
+ if (result.invalid.length > 0) {
4090
+ throw new SchemaUpdateValidationError(result.invalid);
4091
+ }
4092
+ validator.clearCache(`dataset:${args.id}:input`);
4093
+ validator.clearCache(`dataset:${args.id}:output`);
4094
+ }
4095
+ }
4096
+ return this._doUpdateDataset(args);
4097
+ }
4098
+ /**
4099
+ * Add an item to a dataset. Validates input/groundTruth against dataset schemas.
4100
+ * Subclasses implement _doAddItem which handles SCD-2 versioning internally.
4101
+ */
4102
+ async addItem(args) {
4103
+ const dataset = await this.getDatasetById({ id: args.datasetId });
4104
+ if (!dataset) {
4105
+ throw new Error(`Dataset not found: ${args.datasetId}`);
4106
+ }
4107
+ const validator = getSchemaValidator();
4108
+ const cacheKey = `dataset:${args.datasetId}`;
4109
+ if (dataset.inputSchema) {
4110
+ validator.validate(args.input, dataset.inputSchema, "input", `${cacheKey}:input`);
4111
+ }
4112
+ if (dataset.groundTruthSchema && args.groundTruth !== void 0) {
4113
+ validator.validate(args.groundTruth, dataset.groundTruthSchema, "groundTruth", `${cacheKey}:output`);
4114
+ }
4115
+ return this._doAddItem(args);
4116
+ }
4117
+ /**
4118
+ * Update an item in a dataset. Validates changed fields against dataset schemas.
4119
+ * Subclasses implement _doUpdateItem which handles SCD-2 versioning internally.
4120
+ */
4121
+ async updateItem(args) {
4122
+ const dataset = await this.getDatasetById({ id: args.datasetId });
4123
+ if (!dataset) {
4124
+ throw new Error(`Dataset not found: ${args.datasetId}`);
4125
+ }
4126
+ const validator = getSchemaValidator();
4127
+ const cacheKey = `dataset:${args.datasetId}`;
4128
+ if (args.input !== void 0 && dataset.inputSchema) {
4129
+ validator.validate(args.input, dataset.inputSchema, "input", `${cacheKey}:input`);
4130
+ }
4131
+ if (args.groundTruth !== void 0 && dataset.groundTruthSchema) {
4132
+ validator.validate(args.groundTruth, dataset.groundTruthSchema, "groundTruth", `${cacheKey}:output`);
4133
+ }
4134
+ return this._doUpdateItem(args);
4135
+ }
4136
+ /**
4137
+ * Delete an item from a dataset. Creates a tombstone row via SCD-2.
4138
+ * Subclasses implement _doDeleteItem which handles SCD-2 versioning internally.
4139
+ */
4140
+ async deleteItem(args) {
4141
+ return this._doDeleteItem(args);
4142
+ }
4143
+ /**
4144
+ * Batch insert items to a dataset. Validates all items against dataset schemas,
4145
+ * then delegates to subclass which handles SCD-2 versioning internally.
4146
+ */
4147
+ async batchInsertItems(input) {
4148
+ const dataset = await this.getDatasetById({ id: input.datasetId });
4149
+ if (!dataset) {
4150
+ throw new Error(`Dataset not found: ${input.datasetId}`);
4151
+ }
4152
+ const validator = getSchemaValidator();
4153
+ const cacheKey = `dataset:${input.datasetId}`;
4154
+ for (const itemData of input.items) {
4155
+ if (dataset.inputSchema) {
4156
+ validator.validate(itemData.input, dataset.inputSchema, "input", `${cacheKey}:input`);
4157
+ }
4158
+ if (dataset.groundTruthSchema && itemData.groundTruth !== void 0) {
4159
+ validator.validate(itemData.groundTruth, dataset.groundTruthSchema, "groundTruth", `${cacheKey}:output`);
4160
+ }
4161
+ }
4162
+ return this._doBatchInsertItems(input);
4163
+ }
4164
+ /**
4165
+ * Batch delete items from a dataset. Creates tombstone rows via SCD-2.
4166
+ * Subclasses implement _doBatchDeleteItems which handles SCD-2 versioning internally.
4167
+ */
4168
+ async batchDeleteItems(input) {
4169
+ const dataset = await this.getDatasetById({ id: input.datasetId });
4170
+ if (!dataset) {
4171
+ throw new Error(`Dataset not found: ${input.datasetId}`);
4172
+ }
4173
+ return this._doBatchDeleteItems(input);
4174
+ }
4175
+ };
4176
+
4177
+ // src/storage/domains/datasets/inmemory.ts
4178
+ function toDatasetItem(row) {
4179
+ return {
4180
+ id: row.id,
4181
+ datasetId: row.datasetId,
4182
+ datasetVersion: row.datasetVersion,
4183
+ input: row.input,
4184
+ groundTruth: row.groundTruth,
4185
+ metadata: row.metadata,
4186
+ createdAt: row.createdAt,
4187
+ updatedAt: row.updatedAt
4188
+ };
4189
+ }
4190
+ var DatasetsInMemory = class extends DatasetsStorage {
4191
+ db;
4192
+ constructor({ db }) {
4193
+ super();
4194
+ this.db = db;
4195
+ }
4196
+ async dangerouslyClearAll() {
4197
+ this.db.datasets.clear();
4198
+ this.db.datasetItems.clear();
4199
+ this.db.datasetVersions.clear();
4200
+ }
4201
+ // Dataset CRUD
4202
+ async createDataset(input) {
4203
+ const id = crypto.randomUUID();
4204
+ const now = /* @__PURE__ */ new Date();
4205
+ const dataset = {
4206
+ id,
4207
+ name: input.name,
4208
+ description: input.description,
4209
+ metadata: input.metadata,
4210
+ inputSchema: input.inputSchema,
4211
+ groundTruthSchema: input.groundTruthSchema,
4212
+ version: 0,
4213
+ createdAt: now,
4214
+ updatedAt: now
4215
+ };
4216
+ this.db.datasets.set(id, dataset);
4217
+ return dataset;
4218
+ }
4219
+ async getDatasetById({ id }) {
4220
+ return this.db.datasets.get(id) ?? null;
4221
+ }
4222
+ async _doUpdateDataset(args) {
4223
+ const existing = this.db.datasets.get(args.id);
4224
+ if (!existing) {
4225
+ throw new Error(`Dataset not found: ${args.id}`);
4226
+ }
4227
+ const updated = {
4228
+ ...existing,
4229
+ name: args.name ?? existing.name,
4230
+ description: args.description ?? existing.description,
4231
+ metadata: args.metadata ?? existing.metadata,
4232
+ inputSchema: args.inputSchema !== void 0 ? args.inputSchema : existing.inputSchema,
4233
+ groundTruthSchema: args.groundTruthSchema !== void 0 ? args.groundTruthSchema : existing.groundTruthSchema,
4234
+ updatedAt: /* @__PURE__ */ new Date()
4235
+ };
4236
+ this.db.datasets.set(args.id, updated);
4237
+ return updated;
4238
+ }
4239
+ async deleteDataset({ id }) {
4240
+ for (const [itemId, rows] of this.db.datasetItems) {
4241
+ if (rows.length > 0 && rows[0].datasetId === id) {
4242
+ this.db.datasetItems.delete(itemId);
4243
+ }
4244
+ }
4245
+ for (const [vId, v] of this.db.datasetVersions) {
4246
+ if (v.datasetId === id) {
4247
+ this.db.datasetVersions.delete(vId);
4248
+ }
4249
+ }
4250
+ for (const [expId, exp] of this.db.experiments) {
4251
+ if (exp.datasetId === id) {
4252
+ this.db.experiments.set(expId, { ...exp, datasetId: null, datasetVersion: null });
4253
+ }
4254
+ }
4255
+ this.db.datasets.delete(id);
4256
+ }
4257
+ async listDatasets(args) {
4258
+ const datasets = Array.from(this.db.datasets.values());
4259
+ datasets.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
4260
+ const { page, perPage: perPageInput } = args.pagination;
4261
+ const perPage = normalizePerPage(perPageInput, 100);
4262
+ const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
4263
+ const end = perPageInput === false ? datasets.length : start + perPage;
4264
+ return {
4265
+ datasets: datasets.slice(start, end),
4266
+ pagination: {
4267
+ total: datasets.length,
4268
+ page,
4269
+ perPage: perPageForResponse,
4270
+ hasMore: perPageInput === false ? false : datasets.length > end
4271
+ }
4272
+ };
4273
+ }
4274
+ // --- SCD-2 item mutations ---
4275
+ async _doAddItem(args) {
4276
+ const dataset = this.db.datasets.get(args.datasetId);
4277
+ if (!dataset) {
4278
+ throw new Error(`Dataset not found: ${args.datasetId}`);
4279
+ }
4280
+ const newVersion = dataset.version + 1;
4281
+ this.db.datasets.set(args.datasetId, { ...dataset, version: newVersion });
4282
+ const now = /* @__PURE__ */ new Date();
4283
+ const id = crypto.randomUUID();
4284
+ const row = {
4285
+ id,
4286
+ datasetId: args.datasetId,
4287
+ datasetVersion: newVersion,
4288
+ validTo: null,
4289
+ isDeleted: false,
4290
+ input: args.input,
4291
+ groundTruth: args.groundTruth,
4292
+ metadata: args.metadata,
4293
+ createdAt: now,
4294
+ updatedAt: now
4295
+ };
4296
+ this.db.datasetItems.set(id, [row]);
4297
+ await this.createDatasetVersion(args.datasetId, newVersion);
4298
+ return toDatasetItem(row);
4299
+ }
4300
+ async _doUpdateItem(args) {
4301
+ const rows = this.db.datasetItems.get(args.id);
4302
+ if (!rows || rows.length === 0) {
4303
+ throw new Error(`Item not found: ${args.id}`);
4304
+ }
4305
+ const currentRow = rows.find((r) => r.validTo === null && !r.isDeleted);
4306
+ if (!currentRow) {
4307
+ throw new Error(`Item not found: ${args.id}`);
4308
+ }
4309
+ if (currentRow.datasetId !== args.datasetId) {
4310
+ throw new Error(`Item ${args.id} does not belong to dataset ${args.datasetId}`);
4311
+ }
4312
+ const dataset = this.db.datasets.get(args.datasetId);
4313
+ if (!dataset) {
4314
+ throw new Error(`Dataset not found: ${args.datasetId}`);
4315
+ }
4316
+ const newVersion = dataset.version + 1;
4317
+ this.db.datasets.set(args.datasetId, { ...dataset, version: newVersion });
4318
+ currentRow.validTo = newVersion;
4319
+ const now = /* @__PURE__ */ new Date();
4320
+ const newRow = {
4321
+ id: args.id,
4322
+ datasetId: args.datasetId,
4323
+ datasetVersion: newVersion,
4324
+ validTo: null,
4325
+ isDeleted: false,
4326
+ input: args.input ?? currentRow.input,
4327
+ groundTruth: args.groundTruth ?? currentRow.groundTruth,
4328
+ metadata: args.metadata ?? currentRow.metadata,
4329
+ createdAt: currentRow.createdAt,
4330
+ updatedAt: now
4331
+ };
4332
+ rows.push(newRow);
4333
+ await this.createDatasetVersion(args.datasetId, newVersion);
4334
+ return toDatasetItem(newRow);
4335
+ }
4336
+ async _doDeleteItem({ id, datasetId }) {
4337
+ const rows = this.db.datasetItems.get(id);
4338
+ if (!rows || rows.length === 0) {
4339
+ return;
4340
+ }
4341
+ const currentRow = rows.find((r) => r.validTo === null && !r.isDeleted);
4342
+ if (!currentRow) {
4343
+ return;
4344
+ }
4345
+ if (currentRow.datasetId !== datasetId) {
4346
+ throw new Error(`Item ${id} does not belong to dataset ${datasetId}`);
4347
+ }
4348
+ const dataset = this.db.datasets.get(datasetId);
4349
+ if (!dataset) {
4350
+ throw new Error(`Dataset not found: ${datasetId}`);
4351
+ }
4352
+ const newVersion = dataset.version + 1;
4353
+ this.db.datasets.set(datasetId, { ...dataset, version: newVersion });
4354
+ currentRow.validTo = newVersion;
4355
+ const now = /* @__PURE__ */ new Date();
4356
+ rows.push({
4357
+ id,
4358
+ datasetId,
4359
+ datasetVersion: newVersion,
4360
+ validTo: null,
4361
+ isDeleted: true,
4362
+ input: currentRow.input,
4363
+ groundTruth: currentRow.groundTruth,
4364
+ metadata: currentRow.metadata,
4365
+ createdAt: currentRow.createdAt,
4366
+ updatedAt: now
4367
+ });
4368
+ await this.createDatasetVersion(datasetId, newVersion);
4369
+ }
4370
+ // --- SCD-2 queries ---
4371
+ async getItemById(args) {
4372
+ const rows = this.db.datasetItems.get(args.id);
4373
+ if (!rows || rows.length === 0) return null;
4374
+ if (args.datasetVersion !== void 0) {
4375
+ const row = rows.find((r) => r.datasetVersion === args.datasetVersion && !r.isDeleted);
4376
+ return row ? toDatasetItem(row) : null;
4377
+ }
4378
+ const current = rows.find((r) => r.validTo === null && !r.isDeleted);
4379
+ return current ? toDatasetItem(current) : null;
4380
+ }
4381
+ async getItemsByVersion({ datasetId, version }) {
4382
+ const items = [];
4383
+ for (const rows of this.db.datasetItems.values()) {
4384
+ if (rows.length === 0 || rows[0].datasetId !== datasetId) continue;
4385
+ const visible = rows.find(
4386
+ (r) => r.datasetVersion <= version && (r.validTo === null || r.validTo > version) && !r.isDeleted
4387
+ );
4388
+ if (visible) {
4389
+ items.push(toDatasetItem(visible));
4390
+ }
4391
+ }
4392
+ items.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime() || b.id.localeCompare(a.id));
4393
+ return items;
4394
+ }
4395
+ async getItemHistory(itemId) {
4396
+ const rows = this.db.datasetItems.get(itemId);
4397
+ if (!rows) return [];
4398
+ return [...rows].sort((a, b) => b.datasetVersion - a.datasetVersion);
4399
+ }
4400
+ async listItems(args) {
4401
+ let items;
4402
+ if (args.version !== void 0) {
4403
+ items = await this.getItemsByVersion({ datasetId: args.datasetId, version: args.version });
4404
+ } else {
4405
+ items = [];
4406
+ for (const rows of this.db.datasetItems.values()) {
4407
+ if (rows.length === 0 || rows[0].datasetId !== args.datasetId) continue;
4408
+ const current = rows.find((r) => r.validTo === null && !r.isDeleted);
4409
+ if (current) {
4410
+ items.push(toDatasetItem(current));
4411
+ }
4412
+ }
4413
+ }
4414
+ if (args.search) {
4415
+ const searchLower = args.search.toLowerCase();
4416
+ items = items.filter((item) => {
4417
+ const inputStr = typeof item.input === "string" ? item.input : JSON.stringify(item.input);
4418
+ const outputStr = item.groundTruth ? typeof item.groundTruth === "string" ? item.groundTruth : JSON.stringify(item.groundTruth) : "";
4419
+ return inputStr.toLowerCase().includes(searchLower) || outputStr.toLowerCase().includes(searchLower);
4420
+ });
4421
+ }
4422
+ items.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime() || b.id.localeCompare(a.id));
4423
+ const { page, perPage: perPageInput } = args.pagination;
4424
+ const perPage = normalizePerPage(perPageInput, 100);
4425
+ const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
4426
+ const end = perPageInput === false ? items.length : start + perPage;
4427
+ return {
4428
+ items: items.slice(start, end),
4429
+ pagination: {
4430
+ total: items.length,
4431
+ page,
4432
+ perPage: perPageForResponse,
4433
+ hasMore: perPageInput === false ? false : items.length > end
4434
+ }
4435
+ };
4436
+ }
4437
+ // --- Dataset version methods ---
4438
+ async createDatasetVersion(datasetId, version) {
4439
+ const id = crypto.randomUUID();
4440
+ const dsVersion = {
4441
+ id,
4442
+ datasetId,
4443
+ version,
4444
+ createdAt: /* @__PURE__ */ new Date()
4445
+ };
4446
+ this.db.datasetVersions.set(id, dsVersion);
4447
+ return dsVersion;
4448
+ }
4449
+ async listDatasetVersions(input) {
4450
+ const versions = [];
4451
+ for (const v of this.db.datasetVersions.values()) {
4452
+ if (v.datasetId === input.datasetId) {
4453
+ versions.push(v);
4454
+ }
4455
+ }
4456
+ versions.sort((a, b) => b.version - a.version);
4457
+ const { page, perPage: perPageInput } = input.pagination;
4458
+ const perPage = normalizePerPage(perPageInput, 100);
4459
+ const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
4460
+ const end = perPageInput === false ? versions.length : start + perPage;
4461
+ return {
4462
+ versions: versions.slice(start, end),
4463
+ pagination: {
4464
+ total: versions.length,
4465
+ page,
4466
+ perPage: perPageForResponse,
4467
+ hasMore: perPageInput === false ? false : versions.length > end
4468
+ }
4469
+ };
4470
+ }
4471
+ // --- Bulk operations (SCD-2 internally) ---
4472
+ async _doBatchInsertItems(input) {
4473
+ const dataset = this.db.datasets.get(input.datasetId);
4474
+ if (!dataset) {
4475
+ throw new Error(`Dataset not found: ${input.datasetId}`);
4476
+ }
4477
+ const newVersion = dataset.version + 1;
4478
+ this.db.datasets.set(input.datasetId, { ...dataset, version: newVersion });
4479
+ const now = /* @__PURE__ */ new Date();
4480
+ const items = [];
4481
+ for (const itemInput of input.items) {
4482
+ const id = crypto.randomUUID();
4483
+ const row = {
4484
+ id,
4485
+ datasetId: input.datasetId,
4486
+ datasetVersion: newVersion,
4487
+ validTo: null,
4488
+ isDeleted: false,
4489
+ input: itemInput.input,
4490
+ groundTruth: itemInput.groundTruth,
4491
+ metadata: itemInput.metadata,
4492
+ createdAt: now,
4493
+ updatedAt: now
4494
+ };
4495
+ this.db.datasetItems.set(id, [row]);
4496
+ items.push(toDatasetItem(row));
4497
+ }
4498
+ await this.createDatasetVersion(input.datasetId, newVersion);
4499
+ return items;
4500
+ }
4501
+ async _doBatchDeleteItems(input) {
4502
+ const dataset = this.db.datasets.get(input.datasetId);
4503
+ if (!dataset) {
4504
+ throw new Error(`Dataset not found: ${input.datasetId}`);
4505
+ }
4506
+ const newVersion = dataset.version + 1;
4507
+ this.db.datasets.set(input.datasetId, { ...dataset, version: newVersion });
4508
+ const now = /* @__PURE__ */ new Date();
4509
+ for (const itemId of input.itemIds) {
4510
+ const rows = this.db.datasetItems.get(itemId);
4511
+ if (!rows) continue;
4512
+ const currentRow = rows.find((r) => r.validTo === null && !r.isDeleted);
4513
+ if (!currentRow || currentRow.datasetId !== input.datasetId) continue;
4514
+ currentRow.validTo = newVersion;
4515
+ rows.push({
4516
+ id: itemId,
4517
+ datasetId: input.datasetId,
4518
+ datasetVersion: newVersion,
4519
+ validTo: null,
4520
+ isDeleted: true,
4521
+ input: currentRow.input,
4522
+ groundTruth: currentRow.groundTruth,
4523
+ metadata: currentRow.metadata,
4524
+ createdAt: currentRow.createdAt,
4525
+ updatedAt: now
4526
+ });
4527
+ }
4528
+ await this.createDatasetVersion(input.datasetId, newVersion);
4529
+ }
4530
+ };
4531
+
4532
+ // src/storage/domains/experiments/base.ts
4533
+ var ExperimentsStorage = class extends StorageDomain {
4534
+ constructor() {
4535
+ super({
4536
+ component: "STORAGE",
4537
+ name: "EXPERIMENTS"
4538
+ });
4539
+ }
4540
+ async dangerouslyClearAll() {
4541
+ }
4542
+ };
4543
+
4544
+ // src/storage/domains/experiments/inmemory.ts
4545
+ var ExperimentsInMemory = class extends ExperimentsStorage {
4546
+ db;
4547
+ constructor({ db }) {
4548
+ super();
4549
+ this.db = db;
4550
+ }
4551
+ async dangerouslyClearAll() {
4552
+ this.db.experiments.clear();
4553
+ this.db.experimentResults.clear();
4554
+ }
4555
+ // Experiment lifecycle
4556
+ async createExperiment(input) {
4557
+ const now = /* @__PURE__ */ new Date();
4558
+ const experiment = {
4559
+ id: input.id ?? crypto.randomUUID(),
4560
+ datasetId: input.datasetId,
4561
+ datasetVersion: input.datasetVersion,
4562
+ targetType: input.targetType,
4563
+ targetId: input.targetId,
4564
+ name: input.name,
4565
+ description: input.description,
4566
+ metadata: input.metadata,
4567
+ status: "pending",
4568
+ totalItems: input.totalItems,
4569
+ succeededCount: 0,
4570
+ failedCount: 0,
4571
+ skippedCount: 0,
4572
+ startedAt: null,
4573
+ completedAt: null,
4574
+ createdAt: now,
4575
+ updatedAt: now
4576
+ };
4577
+ this.db.experiments.set(experiment.id, experiment);
4578
+ return experiment;
4579
+ }
4580
+ async updateExperiment(input) {
4581
+ const existing = this.db.experiments.get(input.id);
4582
+ if (!existing) {
4583
+ throw new Error(`Experiment not found: ${input.id}`);
4584
+ }
4585
+ const updated = {
4586
+ ...existing,
4587
+ status: input.status ?? existing.status,
4588
+ succeededCount: input.succeededCount ?? existing.succeededCount,
4589
+ failedCount: input.failedCount ?? existing.failedCount,
4590
+ skippedCount: input.skippedCount ?? existing.skippedCount,
4591
+ startedAt: input.startedAt ?? existing.startedAt,
4592
+ completedAt: input.completedAt ?? existing.completedAt,
4593
+ name: input.name ?? existing.name,
4594
+ description: input.description ?? existing.description,
4595
+ metadata: input.metadata ?? existing.metadata,
4596
+ updatedAt: /* @__PURE__ */ new Date()
4597
+ };
4598
+ this.db.experiments.set(input.id, updated);
4599
+ return updated;
4600
+ }
4601
+ async getExperimentById(args) {
4602
+ return this.db.experiments.get(args.id) ?? null;
4603
+ }
4604
+ async listExperiments(args) {
4605
+ let experiments = Array.from(this.db.experiments.values());
4606
+ if (args.datasetId) {
4607
+ experiments = experiments.filter((r) => r.datasetId === args.datasetId);
4608
+ }
4609
+ experiments.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
4610
+ const { page, perPage: perPageInput } = args.pagination;
4611
+ const perPage = normalizePerPage(perPageInput, 100);
4612
+ const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
4613
+ const end = perPageInput === false ? experiments.length : start + perPage;
4614
+ return {
4615
+ experiments: experiments.slice(start, end),
4616
+ pagination: {
4617
+ total: experiments.length,
4618
+ page,
4619
+ perPage: perPageForResponse,
4620
+ hasMore: perPageInput === false ? false : experiments.length > end
4621
+ }
4622
+ };
4623
+ }
4624
+ async deleteExperiment(args) {
4625
+ this.db.experiments.delete(args.id);
4626
+ for (const [resultId, result] of this.db.experimentResults) {
4627
+ if (result.experimentId === args.id) {
4628
+ this.db.experimentResults.delete(resultId);
4629
+ }
4630
+ }
4631
+ }
4632
+ // Results (per-item)
4633
+ async addExperimentResult(input) {
4634
+ const now = /* @__PURE__ */ new Date();
4635
+ const result = {
4636
+ id: input.id ?? crypto.randomUUID(),
4637
+ experimentId: input.experimentId,
4638
+ itemId: input.itemId,
4639
+ itemDatasetVersion: input.itemDatasetVersion,
4640
+ input: input.input,
4641
+ output: input.output,
4642
+ groundTruth: input.groundTruth,
4643
+ error: input.error,
4644
+ startedAt: input.startedAt,
4645
+ completedAt: input.completedAt,
4646
+ retryCount: input.retryCount,
4647
+ traceId: input.traceId ?? null,
4648
+ createdAt: now
4649
+ };
4650
+ this.db.experimentResults.set(result.id, result);
4651
+ return result;
4652
+ }
4653
+ async getExperimentResultById(args) {
4654
+ return this.db.experimentResults.get(args.id) ?? null;
4655
+ }
4656
+ async listExperimentResults(args) {
4657
+ let results = Array.from(this.db.experimentResults.values()).filter((r) => r.experimentId === args.experimentId);
4658
+ results.sort((a, b) => a.startedAt.getTime() - b.startedAt.getTime());
4659
+ const { page, perPage: perPageInput } = args.pagination;
4660
+ const perPage = normalizePerPage(perPageInput, 100);
4661
+ const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
4662
+ const end = perPageInput === false ? results.length : start + perPage;
4663
+ return {
4664
+ results: results.slice(start, end),
4665
+ pagination: {
4666
+ total: results.length,
4667
+ page,
4668
+ perPage: perPageForResponse,
4669
+ hasMore: perPageInput === false ? false : results.length > end
4670
+ }
4671
+ };
4672
+ }
4673
+ async deleteExperimentResults(args) {
4674
+ for (const [resultId, result] of this.db.experimentResults) {
4675
+ if (result.experimentId === args.experimentId) {
4676
+ this.db.experimentResults.delete(resultId);
4677
+ }
4678
+ }
4679
+ }
4680
+ };
4681
+
4682
+ export { AgentsStorage, DatasetsInMemory, DatasetsStorage, ExperimentsInMemory, ExperimentsStorage, InMemoryAgentsStorage, InMemoryDB, InMemoryMCPClientsStorage, InMemoryMemory, InMemoryPromptBlocksStorage, InMemoryScorerDefinitionsStorage, InMemoryStore, MCPClientsStorage, MastraCompositeStore, MastraStorage, MemoryStorage, MockStore, ObservabilityInMemory, ObservabilityStorage, PromptBlocksStorage, SchemaUpdateValidationError, SchemaValidationError, SchemaValidator, ScorerDefinitionsStorage, ScoresInMemory, ScoresStorage, StorageDomain, StoreOperations, StoreOperationsInMemory, VersionedStorageDomain, WorkflowsInMemory, WorkflowsStorage, calculatePagination, createPendingMarker, createStorageErrorId, createStoreErrorId, createValidator, createVectorErrorId, ensureDate, filterByDateRange, getDefaultValue, getSchemaValidator, getSqlType, jsonValueEquals, normalizePerPage, safelyParseJSON, serializeDate, transformRow, transformScoreRow };
4683
+ //# sourceMappingURL=chunk-7NKUSQEV.js.map
4684
+ //# sourceMappingURL=chunk-7NKUSQEV.js.map