@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.
- package/CHANGELOG.md +462 -0
- package/datasets.d.ts +1 -0
- package/dist/agent/agent.d.ts +1 -1
- package/dist/agent/index.cjs +13 -13
- package/dist/agent/index.js +2 -2
- package/dist/agent/message-list/adapters/AIV4Adapter.d.ts.map +1 -1
- package/dist/agent/message-list/adapters/AIV5Adapter.d.ts.map +1 -1
- package/dist/agent/message-list/conversion/output-converter.d.ts +2 -1
- package/dist/agent/message-list/conversion/output-converter.d.ts.map +1 -1
- package/dist/agent/message-list/index.cjs +18 -18
- package/dist/agent/message-list/index.js +1 -1
- package/dist/agent/workflows/prepare-stream/index.d.ts +1 -1
- package/dist/chunk-3JVFFAJX.cjs +1207 -0
- package/dist/chunk-3JVFFAJX.cjs.map +1 -0
- package/dist/{chunk-WL3AW3YA.js → chunk-3X3CZUXI.js} +4070 -3983
- package/dist/chunk-3X3CZUXI.js.map +1 -0
- package/dist/{chunk-2GWTJFVM.js → chunk-4EHGOATH.js} +46 -14
- package/dist/chunk-4EHGOATH.js.map +1 -0
- package/dist/{chunk-YNXIGRQE.cjs → chunk-4IJ4UDZX.cjs} +319 -83
- package/dist/chunk-4IJ4UDZX.cjs.map +1 -0
- package/dist/{chunk-CGPH7CMG.cjs → chunk-4KFEMXTV.cjs} +46 -14
- package/dist/chunk-4KFEMXTV.cjs.map +1 -0
- package/dist/{chunk-PHYJYZ32.js → chunk-4TQ4EBYX.js} +16 -8
- package/dist/chunk-4TQ4EBYX.js.map +1 -0
- package/dist/{chunk-SIZEIYNH.js → chunk-4XSAZPPS.js} +254 -18
- package/dist/chunk-4XSAZPPS.js.map +1 -0
- package/dist/{chunk-KUTU2YZF.js → chunk-5Q5Y34SS.js} +5 -5
- package/dist/{chunk-KUTU2YZF.js.map → chunk-5Q5Y34SS.js.map} +1 -1
- package/dist/{chunk-EH6SAGEO.cjs → chunk-64WGYTQK.cjs} +72 -53
- package/dist/{chunk-EH6SAGEO.cjs.map → chunk-64WGYTQK.cjs.map} +1 -1
- package/dist/{chunk-OOCEAC6U.cjs → chunk-65PHUUMF.cjs} +3 -3
- package/dist/{chunk-OOCEAC6U.cjs.map → chunk-65PHUUMF.cjs.map} +1 -1
- package/dist/{chunk-JNE2ABVB.js → chunk-7NKUSQEV.js} +1094 -10
- package/dist/chunk-7NKUSQEV.js.map +1 -0
- package/dist/{chunk-ZHFM7HCQ.js → chunk-AXHBJ4GX.js} +3 -3
- package/dist/{chunk-ZHFM7HCQ.js.map → chunk-AXHBJ4GX.js.map} +1 -1
- package/dist/{chunk-ILQXPZCD.js → chunk-AY6DBRS3.js} +37 -21
- package/dist/chunk-AY6DBRS3.js.map +1 -0
- package/dist/{chunk-TERSHTY5.cjs → chunk-BP7VYTOP.cjs} +1116 -21
- package/dist/chunk-BP7VYTOP.cjs.map +1 -0
- package/dist/{chunk-UE2G2LRP.cjs → chunk-CZ4NQANZ.cjs} +37 -21
- package/dist/chunk-CZ4NQANZ.cjs.map +1 -0
- package/dist/{chunk-NCC45KOB.cjs → chunk-DBSVT6AR.cjs} +7 -7
- package/dist/{chunk-NCC45KOB.cjs.map → chunk-DBSVT6AR.cjs.map} +1 -1
- package/dist/{chunk-BXLLXTT4.js → chunk-FLPEGTEK.js} +4 -4
- package/dist/{chunk-BXLLXTT4.js.map → chunk-FLPEGTEK.js.map} +1 -1
- package/dist/{chunk-ON2KVIUJ.cjs → chunk-HYRYTTMT.cjs} +7 -7
- package/dist/{chunk-ON2KVIUJ.cjs.map → chunk-HYRYTTMT.cjs.map} +1 -1
- package/dist/chunk-NJ7TL3LQ.js +1196 -0
- package/dist/chunk-NJ7TL3LQ.js.map +1 -0
- package/dist/{chunk-EUG4AON3.cjs → chunk-NKYWDNCI.cjs} +8 -7
- package/dist/{chunk-EUG4AON3.cjs.map → chunk-NKYWDNCI.cjs.map} +1 -1
- package/dist/{chunk-UHVG25VW.cjs → chunk-NZG2JAKS.cjs} +23 -15
- package/dist/chunk-NZG2JAKS.cjs.map +1 -0
- package/dist/{chunk-44SUGDBR.js → chunk-PS5ONCXY.js} +109 -5
- package/dist/chunk-PS5ONCXY.js.map +1 -0
- package/dist/{chunk-57QAF2ZQ.js → chunk-QTTWRCB5.js} +4 -4
- package/dist/{chunk-57QAF2ZQ.js.map → chunk-QTTWRCB5.js.map} +1 -1
- package/dist/{chunk-VM25PDSW.js → chunk-RZ4CIIZR.js} +4 -4
- package/dist/{chunk-VM25PDSW.js.map → chunk-RZ4CIIZR.js.map} +1 -1
- package/dist/{chunk-C3XU7ZDC.cjs → chunk-SU5APAM6.cjs} +123 -4
- package/dist/chunk-SU5APAM6.cjs.map +1 -0
- package/dist/{chunk-3MJCJLZS.js → chunk-U2HKJZCI.js} +24 -5
- package/dist/{chunk-3MJCJLZS.js.map → chunk-U2HKJZCI.js.map} +1 -1
- package/dist/{chunk-GCTAD6B7.cjs → chunk-VD5YA6RH.cjs} +12 -12
- package/dist/{chunk-GCTAD6B7.cjs.map → chunk-VD5YA6RH.cjs.map} +1 -1
- package/dist/{chunk-KAJNBNWP.cjs → chunk-YNNJLLFN.cjs} +4071 -3984
- package/dist/chunk-YNNJLLFN.cjs.map +1 -0
- package/dist/datasets/dataset.d.ts +153 -0
- package/dist/datasets/dataset.d.ts.map +1 -0
- package/dist/datasets/experiment/analytics/aggregate.d.ts +46 -0
- package/dist/datasets/experiment/analytics/aggregate.d.ts.map +1 -0
- package/dist/datasets/experiment/analytics/compare.d.ts +33 -0
- package/dist/datasets/experiment/analytics/compare.d.ts.map +1 -0
- package/dist/datasets/experiment/analytics/index.d.ts +9 -0
- package/dist/datasets/experiment/analytics/index.d.ts.map +1 -0
- package/dist/datasets/experiment/analytics/types.d.ts +103 -0
- package/dist/datasets/experiment/analytics/types.d.ts.map +1 -0
- package/dist/datasets/experiment/executor.d.ts +40 -0
- package/dist/datasets/experiment/executor.d.ts.map +1 -0
- package/dist/datasets/experiment/index.d.ts +31 -0
- package/dist/datasets/experiment/index.d.ts.map +1 -0
- package/dist/datasets/experiment/scorer.d.ts +21 -0
- package/dist/datasets/experiment/scorer.d.ts.map +1 -0
- package/dist/datasets/experiment/types.d.ts +140 -0
- package/dist/datasets/experiment/types.d.ts.map +1 -0
- package/dist/datasets/index.cjs +69 -0
- package/dist/datasets/index.cjs.map +1 -0
- package/dist/datasets/index.d.ts +6 -0
- package/dist/datasets/index.d.ts.map +1 -0
- package/dist/datasets/index.js +4 -0
- package/dist/datasets/index.js.map +1 -0
- package/dist/datasets/manager.d.ts +73 -0
- package/dist/datasets/manager.d.ts.map +1 -0
- package/dist/datasets/validation/errors.d.ts +44 -0
- package/dist/datasets/validation/errors.d.ts.map +1 -0
- package/dist/datasets/validation/index.d.ts +3 -0
- package/dist/datasets/validation/index.d.ts.map +1 -0
- package/dist/datasets/validation/validator.d.ts +24 -0
- package/dist/datasets/validation/validator.d.ts.map +1 -0
- package/dist/docs/SKILL.md +1 -3
- package/dist/docs/assets/SOURCE_MAP.json +436 -346
- package/dist/docs/references/docs-memory-observational-memory.md +86 -11
- package/dist/docs/references/docs-streaming-events.md +23 -0
- package/dist/docs/references/docs-workspace-filesystem.md +72 -1
- package/dist/docs/references/docs-workspace-overview.md +95 -12
- package/dist/docs/references/docs-workspace-sandbox.md +2 -0
- package/dist/docs/references/guides-agent-frameworks-ai-sdk.md +6 -2
- package/dist/docs/references/reference-ai-sdk-with-mastra.md +1 -1
- package/dist/docs/references/reference-memory-observational-memory.md +318 -9
- package/dist/docs/references/reference-streaming-workflows-stream.md +1 -0
- package/dist/docs/references/reference-workflows-workflow-methods-foreach.md +30 -0
- package/dist/docs/references/reference.md +3 -0
- package/dist/editor/index.d.ts +1 -1
- package/dist/editor/index.d.ts.map +1 -1
- package/dist/editor/types.d.ts +21 -3
- package/dist/editor/types.d.ts.map +1 -1
- package/dist/evals/index.cjs +20 -20
- package/dist/evals/index.js +3 -3
- package/dist/evals/scoreTraces/index.cjs +5 -5
- package/dist/evals/scoreTraces/index.js +2 -2
- package/dist/features/index.cjs +1 -1
- package/dist/features/index.cjs.map +1 -1
- package/dist/features/index.d.ts.map +1 -1
- package/dist/features/index.js +1 -1
- package/dist/features/index.js.map +1 -1
- package/dist/index.cjs +2 -7
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/llm/index.cjs +10 -10
- package/dist/llm/index.js +2 -2
- package/dist/llm/model/provider-types.generated.d.ts +1694 -1659
- package/dist/loop/index.cjs +12 -12
- package/dist/loop/index.js +1 -1
- package/dist/loop/network/index.d.ts +1 -1
- package/dist/loop/workflows/agentic-execution/index.d.ts +1 -1
- package/dist/loop/workflows/agentic-execution/llm-execution-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/llm-mapping-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/tool-call-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-loop/index.d.ts +1 -1
- package/dist/loop/workflows/errors.d.ts +4 -0
- package/dist/loop/workflows/errors.d.ts.map +1 -0
- package/dist/mastra/index.cjs +2 -2
- package/dist/mastra/index.d.ts +2 -0
- package/dist/mastra/index.d.ts.map +1 -1
- package/dist/mastra/index.js +1 -1
- package/dist/memory/index.cjs +14 -14
- package/dist/memory/index.js +1 -1
- package/dist/memory/memory.d.ts +5 -0
- package/dist/memory/memory.d.ts.map +1 -1
- package/dist/memory/types.d.ts +56 -0
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/processors/index.cjs +41 -41
- package/dist/processors/index.js +1 -1
- package/dist/processors/processors/skills.d.ts +1 -1
- package/dist/processors/processors/skills.d.ts.map +1 -1
- package/dist/processors/runner.d.ts.map +1 -1
- package/dist/processors/trailing-assistant-guard.d.ts +34 -0
- package/dist/processors/trailing-assistant-guard.d.ts.map +1 -0
- package/dist/provider-registry-6LZAGQET.cjs +40 -0
- package/dist/{provider-registry-C6XCYX44.cjs.map → provider-registry-6LZAGQET.cjs.map} +1 -1
- package/dist/provider-registry-QUNT7S55.js +3 -0
- package/dist/{provider-registry-NWU4YFQW.js.map → provider-registry-QUNT7S55.js.map} +1 -1
- package/dist/provider-registry.json +4068 -3981
- package/dist/relevance/index.cjs +3 -3
- package/dist/relevance/index.js +1 -1
- package/dist/storage/base.d.ts +4 -1
- package/dist/storage/base.d.ts.map +1 -1
- package/dist/storage/constants.cjs +87 -27
- package/dist/storage/constants.d.ts +21 -2
- package/dist/storage/constants.d.ts.map +1 -1
- package/dist/storage/constants.js +1 -1
- package/dist/storage/domains/agents/inmemory.d.ts.map +1 -1
- package/dist/storage/domains/datasets/base.d.ts +83 -0
- package/dist/storage/domains/datasets/base.d.ts.map +1 -0
- package/dist/storage/domains/datasets/index.d.ts +3 -0
- package/dist/storage/domains/datasets/index.d.ts.map +1 -0
- package/dist/storage/domains/datasets/inmemory.d.ts +40 -0
- package/dist/storage/domains/datasets/inmemory.d.ts.map +1 -0
- package/dist/storage/domains/experiments/base.d.ts +28 -0
- package/dist/storage/domains/experiments/base.d.ts.map +1 -0
- package/dist/storage/domains/experiments/index.d.ts +3 -0
- package/dist/storage/domains/experiments/index.d.ts.map +1 -0
- package/dist/storage/domains/experiments/inmemory.d.ts +28 -0
- package/dist/storage/domains/experiments/inmemory.d.ts.map +1 -0
- package/dist/storage/domains/index.d.ts +3 -0
- package/dist/storage/domains/index.d.ts.map +1 -1
- package/dist/storage/domains/inmemory-db.d.ts +9 -1
- package/dist/storage/domains/inmemory-db.d.ts.map +1 -1
- package/dist/storage/domains/mcp-clients/base.d.ts +47 -0
- package/dist/storage/domains/mcp-clients/base.d.ts.map +1 -0
- package/dist/storage/domains/mcp-clients/index.d.ts +3 -0
- package/dist/storage/domains/mcp-clients/index.d.ts.map +1 -0
- package/dist/storage/domains/mcp-clients/inmemory.d.ts +31 -0
- package/dist/storage/domains/mcp-clients/inmemory.d.ts.map +1 -0
- package/dist/storage/domains/operations/inmemory.d.ts.map +1 -1
- package/dist/storage/index.cjs +201 -117
- package/dist/storage/index.js +2 -2
- package/dist/storage/mock.d.ts.map +1 -1
- package/dist/storage/types.d.ts +338 -3
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/stream/base/output.d.ts.map +1 -1
- package/dist/stream/index.cjs +11 -11
- package/dist/stream/index.js +2 -2
- package/dist/stream/types.d.ts +15 -0
- package/dist/stream/types.d.ts.map +1 -1
- package/dist/test-utils/llm-mock.cjs +4 -4
- package/dist/test-utils/llm-mock.js +1 -1
- package/dist/tool-loop-agent/index.cjs +4 -4
- package/dist/tool-loop-agent/index.js +1 -1
- package/dist/tool-provider/index.cjs +4 -0
- package/dist/tool-provider/index.cjs.map +1 -0
- package/dist/tool-provider/index.d.ts +2 -0
- package/dist/tool-provider/index.d.ts.map +1 -0
- package/dist/tool-provider/index.js +3 -0
- package/dist/tool-provider/index.js.map +1 -0
- package/dist/tool-provider/types.d.ts +113 -0
- package/dist/tool-provider/types.d.ts.map +1 -0
- package/dist/utils.cjs +23 -23
- package/dist/utils.d.ts +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +1 -1
- package/dist/vector/index.cjs +7 -7
- package/dist/vector/index.js +1 -1
- package/dist/workflows/evented/index.cjs +10 -10
- package/dist/workflows/evented/index.js +1 -1
- package/dist/workflows/evented/workflow-event-processor/index.d.ts.map +1 -1
- package/dist/workflows/handlers/control-flow.d.ts.map +1 -1
- package/dist/workflows/index.cjs +25 -25
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/workflow.d.ts +2 -2
- package/dist/workflows/workflow.d.ts.map +1 -1
- package/dist/workspace/filesystem/filesystem.d.ts +5 -15
- package/dist/workspace/filesystem/filesystem.d.ts.map +1 -1
- package/dist/workspace/filesystem/local-filesystem.d.ts +18 -2
- package/dist/workspace/filesystem/local-filesystem.d.ts.map +1 -1
- package/dist/workspace/filesystem/mastra-filesystem.d.ts +21 -1
- package/dist/workspace/filesystem/mastra-filesystem.d.ts.map +1 -1
- package/dist/workspace/index.cjs +41 -41
- package/dist/workspace/index.d.ts +1 -1
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +1 -1
- package/dist/workspace/lifecycle.d.ts +49 -53
- package/dist/workspace/lifecycle.d.ts.map +1 -1
- package/dist/workspace/sandbox/local-sandbox.d.ts +1 -1
- package/dist/workspace/sandbox/local-sandbox.d.ts.map +1 -1
- package/dist/workspace/sandbox/mastra-sandbox.d.ts +3 -2
- package/dist/workspace/sandbox/mastra-sandbox.d.ts.map +1 -1
- package/dist/workspace/sandbox/sandbox.d.ts +3 -4
- package/dist/workspace/sandbox/sandbox.d.ts.map +1 -1
- package/dist/workspace/workspace.d.ts +2 -15
- package/dist/workspace/workspace.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/llm/model/provider-types.generated.d.ts +1694 -1659
- package/tool-provider.d.ts +1 -0
- package/dist/chunk-2GWTJFVM.js.map +0 -1
- package/dist/chunk-44SUGDBR.js.map +0 -1
- package/dist/chunk-C3XU7ZDC.cjs.map +0 -1
- package/dist/chunk-CGPH7CMG.cjs.map +0 -1
- package/dist/chunk-ILQXPZCD.js.map +0 -1
- package/dist/chunk-JNE2ABVB.js.map +0 -1
- package/dist/chunk-KAJNBNWP.cjs.map +0 -1
- package/dist/chunk-PHYJYZ32.js.map +0 -1
- package/dist/chunk-SIZEIYNH.js.map +0 -1
- package/dist/chunk-TERSHTY5.cjs.map +0 -1
- package/dist/chunk-UE2G2LRP.cjs.map +0 -1
- package/dist/chunk-UHVG25VW.cjs.map +0 -1
- package/dist/chunk-WL3AW3YA.js.map +0 -1
- package/dist/chunk-YNXIGRQE.cjs.map +0 -1
- package/dist/docs/references/reference-cli-mastra.md +0 -336
- package/dist/docs/references/reference-deployer-cloudflare.md +0 -56
- package/dist/provider-registry-C6XCYX44.cjs +0 -40
- package/dist/provider-registry-NWU4YFQW.js +0 -3
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { MessageList } from './chunk-
|
|
2
|
-
import { TABLE_SCHEMAS, TABLE_SCORERS, listTracesArgsSchema, toTraceSpans, TABLE_WORKFLOW_SNAPSHOT } from './chunk-
|
|
3
|
-
import { deepEqual } from './chunk-
|
|
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
|
-
|
|
3599
|
-
|
|
3600
|
-
|
|
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
|