@mastra/mongodb 1.1.0-alpha.0 → 1.1.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 +118 -0
- package/dist/docs/README.md +1 -1
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/SOURCE_MAP.json +1 -1
- package/dist/index.cjs +83 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +83 -26
- package/dist/index.js.map +1 -1
- package/dist/storage/domains/agents/index.d.ts +12 -0
- package/dist/storage/domains/agents/index.d.ts.map +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,123 @@
|
|
|
1
1
|
# @mastra/mongodb
|
|
2
2
|
|
|
3
|
+
## 1.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Restructured stored agents to use a thin metadata record with versioned configuration snapshots. ([#12488](https://github.com/mastra-ai/mastra/pull/12488))
|
|
8
|
+
|
|
9
|
+
The agent record now only stores metadata fields (id, status, activeVersionId, authorId, metadata, timestamps). All configuration fields (name, instructions, model, tools, etc.) live exclusively in version snapshot rows, enabling full version history and rollback.
|
|
10
|
+
|
|
11
|
+
**Key changes:**
|
|
12
|
+
- Stored Agent records are now thin metadata-only (StorageAgentType)
|
|
13
|
+
- All config lives in version snapshots (StorageAgentSnapshotType)
|
|
14
|
+
- New resolved type (StorageResolvedAgentType) merges agent record + active version config
|
|
15
|
+
- Renamed `ownerId` to `authorId` for multi-tenant filtering
|
|
16
|
+
- Changed `memory` field type from `string` to `Record<string, unknown>`
|
|
17
|
+
- Added `status` field ('draft' | 'published') to agent records
|
|
18
|
+
- Flattened CreateAgent/UpdateAgent input types (config fields at top level, no nested snapshot)
|
|
19
|
+
- Version config columns are top-level in the agent_versions table (no single snapshot jsonb column)
|
|
20
|
+
- List endpoints return resolved agents (thin record + active version config)
|
|
21
|
+
- Auto-versioning on update with retention limits and race condition handling
|
|
22
|
+
|
|
23
|
+
- Added dynamic agent management with CRUD operations and version tracking ([#12038](https://github.com/mastra-ai/mastra/pull/12038))
|
|
24
|
+
|
|
25
|
+
**New Features:**
|
|
26
|
+
- Create, edit, and delete agents directly from the Mastra Studio UI
|
|
27
|
+
- Full version history for agents with compare and restore capabilities
|
|
28
|
+
- Visual diff viewer to compare agent configurations across versions
|
|
29
|
+
- Agent creation modal with comprehensive configuration options (model selection, instructions, tools, workflows, sub-agents, memory)
|
|
30
|
+
- AI-powered instruction enhancement
|
|
31
|
+
|
|
32
|
+
**Storage:**
|
|
33
|
+
- New storage interfaces for stored agents and agent versions
|
|
34
|
+
- PostgreSQL, LibSQL, and MongoDB implementations included
|
|
35
|
+
- In-memory storage for development and testing
|
|
36
|
+
|
|
37
|
+
**API:**
|
|
38
|
+
- RESTful endpoints for agent CRUD operations
|
|
39
|
+
- Version management endpoints (create, list, activate, restore, delete, compare)
|
|
40
|
+
- Automatic versioning on agent updates when enabled
|
|
41
|
+
|
|
42
|
+
**Client SDK:**
|
|
43
|
+
- JavaScript client with full support for stored agents and versions
|
|
44
|
+
- Type-safe methods for all CRUD and version operations
|
|
45
|
+
|
|
46
|
+
**Usage Example:**
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// Server-side: Configure storage
|
|
50
|
+
import { Mastra } from '@mastra/core';
|
|
51
|
+
import { PgAgentsStorage } from '@mastra/pg';
|
|
52
|
+
|
|
53
|
+
const mastra = new Mastra({
|
|
54
|
+
agents: { agentOne },
|
|
55
|
+
storage: {
|
|
56
|
+
agents: new PgAgentsStorage({
|
|
57
|
+
connectionString: process.env.DATABASE_URL,
|
|
58
|
+
}),
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Client-side: Use the SDK
|
|
63
|
+
import { MastraClient } from '@mastra/client-js';
|
|
64
|
+
|
|
65
|
+
const client = new MastraClient({ baseUrl: 'http://localhost:3000' });
|
|
66
|
+
|
|
67
|
+
// Create a stored agent
|
|
68
|
+
const agent = await client.createStoredAgent({
|
|
69
|
+
name: 'Customer Support Agent',
|
|
70
|
+
description: 'Handles customer inquiries',
|
|
71
|
+
model: { provider: 'ANTHROPIC', name: 'claude-sonnet-4-5' },
|
|
72
|
+
instructions: 'You are a helpful customer support agent...',
|
|
73
|
+
tools: ['search', 'email'],
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Create a version snapshot
|
|
77
|
+
await client.storedAgent(agent.id).createVersion({
|
|
78
|
+
name: 'v1.0 - Initial release',
|
|
79
|
+
changeMessage: 'First production version',
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// Compare versions
|
|
83
|
+
const diff = await client.storedAgent(agent.id).compareVersions('version-1', 'version-2');
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Why:**
|
|
87
|
+
This feature enables teams to manage agents dynamically without code changes, making it easier to iterate on agent configurations and maintain a complete audit trail of changes.
|
|
88
|
+
|
|
89
|
+
- Added `status` field to `listTraces` response. The status field indicates the trace state: `success` (completed without error), `error` (has error), or `running` (still in progress). This makes it easier to filter and display traces by their current state without having to derive it from the `error` and `endedAt` fields. ([#12213](https://github.com/mastra-ai/mastra/pull/12213))
|
|
90
|
+
|
|
91
|
+
### Patch Changes
|
|
92
|
+
|
|
93
|
+
- Updated dependencies [[`90fc0e5`](https://github.com/mastra-ai/mastra/commit/90fc0e5717cb280c2d4acf4f0410b510bb4c0a72), [`1cf5d2e`](https://github.com/mastra-ai/mastra/commit/1cf5d2ea1b085be23e34fb506c80c80a4e6d9c2b), [`b99ceac`](https://github.com/mastra-ai/mastra/commit/b99ceace2c830dbdef47c8692d56a91954aefea2), [`deea43e`](https://github.com/mastra-ai/mastra/commit/deea43eb1366d03a864c5e597d16a48592b9893f), [`833ae96`](https://github.com/mastra-ai/mastra/commit/833ae96c3e34370e58a1e979571c41f39a720592), [`943772b`](https://github.com/mastra-ai/mastra/commit/943772b4378f625f0f4e19ea2b7c392bd8e71786), [`b5c711b`](https://github.com/mastra-ai/mastra/commit/b5c711b281dd1fb81a399a766bc9f86c55efc13e), [`3efbe5a`](https://github.com/mastra-ai/mastra/commit/3efbe5ae20864c4f3143457f4f3ee7dc2fa5ca76), [`1e49e7a`](https://github.com/mastra-ai/mastra/commit/1e49e7ab5f173582154cb26b29d424de67d09aef), [`751eaab`](https://github.com/mastra-ai/mastra/commit/751eaab4e0d3820a94e4c3d39a2ff2663ded3d91), [`69d8156`](https://github.com/mastra-ai/mastra/commit/69d81568bcf062557c24471ce26812446bec465d), [`60d9d89`](https://github.com/mastra-ai/mastra/commit/60d9d899e44b35bc43f1bcd967a74e0ce010b1af), [`5c544c8`](https://github.com/mastra-ai/mastra/commit/5c544c8d12b08ab40d64d8f37b3c4215bee95b87), [`771ad96`](https://github.com/mastra-ai/mastra/commit/771ad962441996b5c43549391a3e6a02c6ddedc2), [`2b0936b`](https://github.com/mastra-ai/mastra/commit/2b0936b0c9a43eeed9bef63e614d7e02ee803f7e), [`3b04f30`](https://github.com/mastra-ai/mastra/commit/3b04f3010604f3cdfc8a0674731700ad66471cee), [`97e26de`](https://github.com/mastra-ai/mastra/commit/97e26deaebd9836647a67b96423281d66421ca07), [`ac9ec66`](https://github.com/mastra-ai/mastra/commit/ac9ec6672779b2e6d4344e415481d1a6a7d4911a), [`10523f4`](https://github.com/mastra-ai/mastra/commit/10523f4882d9b874b40ce6e3715f66dbcd4947d2), [`cb72d20`](https://github.com/mastra-ai/mastra/commit/cb72d2069d7339bda8a0e76d4f35615debb07b84), [`42856b1`](https://github.com/mastra-ai/mastra/commit/42856b1c8aeea6371c9ee77ae2f5f5fe34400933), [`66f33ff`](https://github.com/mastra-ai/mastra/commit/66f33ff68620018513e499c394411d1d39b3aa5c), [`ab3c190`](https://github.com/mastra-ai/mastra/commit/ab3c1901980a99910ca9b96a7090c22e24060113), [`d4f06c8`](https://github.com/mastra-ai/mastra/commit/d4f06c85ffa5bb0da38fb82ebf3b040cc6b4ec4e), [`0350626`](https://github.com/mastra-ai/mastra/commit/03506267ec41b67add80d994c0c0fcce93bbc75f), [`bc9fa00`](https://github.com/mastra-ai/mastra/commit/bc9fa00859c5c4a796d53a0a5cae46ab4a3072e4), [`f46a478`](https://github.com/mastra-ai/mastra/commit/f46a4782f595949c696569e891f81c8d26338508), [`90fc0e5`](https://github.com/mastra-ai/mastra/commit/90fc0e5717cb280c2d4acf4f0410b510bb4c0a72), [`f05a3a5`](https://github.com/mastra-ai/mastra/commit/f05a3a5cf2b9a9c2d40c09cb8c762a4b6cd5d565), [`a291da9`](https://github.com/mastra-ai/mastra/commit/a291da9363efd92dafd8775dccb4f2d0511ece7a), [`c5d71da`](https://github.com/mastra-ai/mastra/commit/c5d71da1c680ce5640b1a7f8ca0e024a4ab1cfed), [`07042f9`](https://github.com/mastra-ai/mastra/commit/07042f9f89080f38b8f72713ba1c972d5b1905b8), [`0423442`](https://github.com/mastra-ai/mastra/commit/0423442b7be2dfacba95890bea8f4a810db4d603)]:
|
|
94
|
+
- @mastra/core@1.1.0
|
|
95
|
+
|
|
96
|
+
## 1.1.0-alpha.1
|
|
97
|
+
|
|
98
|
+
### Minor Changes
|
|
99
|
+
|
|
100
|
+
- Restructured stored agents to use a thin metadata record with versioned configuration snapshots. ([#12488](https://github.com/mastra-ai/mastra/pull/12488))
|
|
101
|
+
|
|
102
|
+
The agent record now only stores metadata fields (id, status, activeVersionId, authorId, metadata, timestamps). All configuration fields (name, instructions, model, tools, etc.) live exclusively in version snapshot rows, enabling full version history and rollback.
|
|
103
|
+
|
|
104
|
+
**Key changes:**
|
|
105
|
+
- Stored Agent records are now thin metadata-only (StorageAgentType)
|
|
106
|
+
- All config lives in version snapshots (StorageAgentSnapshotType)
|
|
107
|
+
- New resolved type (StorageResolvedAgentType) merges agent record + active version config
|
|
108
|
+
- Renamed `ownerId` to `authorId` for multi-tenant filtering
|
|
109
|
+
- Changed `memory` field type from `string` to `Record<string, unknown>`
|
|
110
|
+
- Added `status` field ('draft' | 'published') to agent records
|
|
111
|
+
- Flattened CreateAgent/UpdateAgent input types (config fields at top level, no nested snapshot)
|
|
112
|
+
- Version config columns are top-level in the agent_versions table (no single snapshot jsonb column)
|
|
113
|
+
- List endpoints return resolved agents (thin record + active version config)
|
|
114
|
+
- Auto-versioning on update with retention limits and race condition handling
|
|
115
|
+
|
|
116
|
+
### Patch Changes
|
|
117
|
+
|
|
118
|
+
- Updated dependencies [[`b99ceac`](https://github.com/mastra-ai/mastra/commit/b99ceace2c830dbdef47c8692d56a91954aefea2), [`deea43e`](https://github.com/mastra-ai/mastra/commit/deea43eb1366d03a864c5e597d16a48592b9893f), [`ac9ec66`](https://github.com/mastra-ai/mastra/commit/ac9ec6672779b2e6d4344e415481d1a6a7d4911a)]:
|
|
119
|
+
- @mastra/core@1.1.0-alpha.1
|
|
120
|
+
|
|
3
121
|
## 1.1.0-alpha.0
|
|
4
122
|
|
|
5
123
|
### Minor Changes
|
package/dist/docs/README.md
CHANGED
package/dist/docs/SKILL.md
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -13,7 +13,7 @@ var evals = require('@mastra/core/evals');
|
|
|
13
13
|
|
|
14
14
|
// package.json
|
|
15
15
|
var package_default = {
|
|
16
|
-
version: "1.1.0
|
|
16
|
+
version: "1.1.0"};
|
|
17
17
|
var MongoDBFilterTranslator = class extends filter.BaseFilterTranslator {
|
|
18
18
|
getSupportedOperators() {
|
|
19
19
|
return {
|
|
@@ -894,6 +894,21 @@ function resolveMongoDBConfig(config) {
|
|
|
894
894
|
);
|
|
895
895
|
}
|
|
896
896
|
}
|
|
897
|
+
var SNAPSHOT_FIELDS = [
|
|
898
|
+
"name",
|
|
899
|
+
"description",
|
|
900
|
+
"instructions",
|
|
901
|
+
"model",
|
|
902
|
+
"tools",
|
|
903
|
+
"defaultOptions",
|
|
904
|
+
"workflows",
|
|
905
|
+
"agents",
|
|
906
|
+
"integrationTools",
|
|
907
|
+
"inputProcessors",
|
|
908
|
+
"outputProcessors",
|
|
909
|
+
"memory",
|
|
910
|
+
"scorers"
|
|
911
|
+
];
|
|
897
912
|
var MongoDBAgentsStorage = class _MongoDBAgentsStorage extends storage.AgentsStorage {
|
|
898
913
|
#connector;
|
|
899
914
|
#skipDefaultIndexes;
|
|
@@ -999,11 +1014,28 @@ var MongoDBAgentsStorage = class _MongoDBAgentsStorage extends storage.AgentsSto
|
|
|
999
1014
|
}
|
|
1000
1015
|
const now = /* @__PURE__ */ new Date();
|
|
1001
1016
|
const newAgent = {
|
|
1002
|
-
|
|
1017
|
+
id: agent.id,
|
|
1018
|
+
status: "draft",
|
|
1019
|
+
activeVersionId: void 0,
|
|
1020
|
+
authorId: agent.authorId,
|
|
1021
|
+
metadata: agent.metadata,
|
|
1003
1022
|
createdAt: now,
|
|
1004
1023
|
updatedAt: now
|
|
1005
1024
|
};
|
|
1006
1025
|
await collection.insertOne(this.serializeAgent(newAgent));
|
|
1026
|
+
const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = agent;
|
|
1027
|
+
const versionId = crypto.randomUUID();
|
|
1028
|
+
await this.createVersion({
|
|
1029
|
+
id: versionId,
|
|
1030
|
+
agentId: agent.id,
|
|
1031
|
+
versionNumber: 1,
|
|
1032
|
+
...snapshotConfig,
|
|
1033
|
+
changedFields: Object.keys(snapshotConfig),
|
|
1034
|
+
changeMessage: "Initial version"
|
|
1035
|
+
});
|
|
1036
|
+
newAgent.activeVersionId = versionId;
|
|
1037
|
+
newAgent.status = "published";
|
|
1038
|
+
await collection.updateOne({ id: agent.id }, { $set: { activeVersionId: versionId, status: "published" } });
|
|
1007
1039
|
return newAgent;
|
|
1008
1040
|
} catch (error$1) {
|
|
1009
1041
|
if (error$1 instanceof error.MastraError) {
|
|
@@ -1036,21 +1068,11 @@ var MongoDBAgentsStorage = class _MongoDBAgentsStorage extends storage.AgentsSto
|
|
|
1036
1068
|
const updateDoc = {
|
|
1037
1069
|
updatedAt: /* @__PURE__ */ new Date()
|
|
1038
1070
|
};
|
|
1039
|
-
if (updates.
|
|
1040
|
-
if (updates.
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
if (updates.defaultOptions !== void 0) updateDoc.defaultOptions = updates.defaultOptions;
|
|
1045
|
-
if (updates.workflows !== void 0) updateDoc.workflows = updates.workflows;
|
|
1046
|
-
if (updates.agents !== void 0) updateDoc.agents = updates.agents;
|
|
1047
|
-
if (updates.inputProcessors !== void 0) updateDoc.inputProcessors = updates.inputProcessors;
|
|
1048
|
-
if (updates.outputProcessors !== void 0) updateDoc.outputProcessors = updates.outputProcessors;
|
|
1049
|
-
if (updates.memory !== void 0) updateDoc.memory = updates.memory;
|
|
1050
|
-
if (updates.scorers !== void 0) updateDoc.scorers = updates.scorers;
|
|
1051
|
-
if (updates.integrationTools !== void 0) updateDoc.integrationTools = updates.integrationTools;
|
|
1052
|
-
if (updates.ownerId !== void 0) updateDoc.ownerId = updates.ownerId;
|
|
1053
|
-
if (updates.activeVersionId !== void 0) updateDoc.activeVersionId = updates.activeVersionId;
|
|
1071
|
+
if (updates.authorId !== void 0) updateDoc.authorId = updates.authorId;
|
|
1072
|
+
if (updates.activeVersionId !== void 0) {
|
|
1073
|
+
updateDoc.activeVersionId = updates.activeVersionId;
|
|
1074
|
+
updateDoc.status = "published";
|
|
1075
|
+
}
|
|
1054
1076
|
if (updates.metadata !== void 0) {
|
|
1055
1077
|
const existingMetadata = existingAgent.metadata || {};
|
|
1056
1078
|
updateDoc.metadata = { ...existingMetadata, ...updates.metadata };
|
|
@@ -1155,17 +1177,35 @@ var MongoDBAgentsStorage = class _MongoDBAgentsStorage extends storage.AgentsSto
|
|
|
1155
1177
|
);
|
|
1156
1178
|
}
|
|
1157
1179
|
}
|
|
1180
|
+
/**
|
|
1181
|
+
* Transforms a raw MongoDB document into a thin StorageAgentType record.
|
|
1182
|
+
* Only returns metadata-level fields (no config/snapshot fields).
|
|
1183
|
+
*/
|
|
1158
1184
|
transformAgent(doc) {
|
|
1159
|
-
const { _id, ...
|
|
1185
|
+
const { _id, ...rest } = doc;
|
|
1160
1186
|
return {
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1187
|
+
id: rest.id,
|
|
1188
|
+
status: rest.status,
|
|
1189
|
+
activeVersionId: rest.activeVersionId,
|
|
1190
|
+
authorId: rest.authorId,
|
|
1191
|
+
metadata: rest.metadata,
|
|
1192
|
+
createdAt: rest.createdAt instanceof Date ? rest.createdAt : new Date(rest.createdAt),
|
|
1193
|
+
updatedAt: rest.updatedAt instanceof Date ? rest.updatedAt : new Date(rest.updatedAt)
|
|
1164
1194
|
};
|
|
1165
1195
|
}
|
|
1196
|
+
/**
|
|
1197
|
+
* Serializes a thin StorageAgentType record for MongoDB insertion.
|
|
1198
|
+
* Only persists metadata-level fields.
|
|
1199
|
+
*/
|
|
1166
1200
|
serializeAgent(agent) {
|
|
1167
1201
|
return {
|
|
1168
|
-
|
|
1202
|
+
id: agent.id,
|
|
1203
|
+
status: agent.status,
|
|
1204
|
+
activeVersionId: agent.activeVersionId,
|
|
1205
|
+
authorId: agent.authorId,
|
|
1206
|
+
metadata: agent.metadata,
|
|
1207
|
+
createdAt: agent.createdAt,
|
|
1208
|
+
updatedAt: agent.updatedAt
|
|
1169
1209
|
};
|
|
1170
1210
|
}
|
|
1171
1211
|
// ==========================================================================
|
|
@@ -1179,12 +1219,15 @@ var MongoDBAgentsStorage = class _MongoDBAgentsStorage extends storage.AgentsSto
|
|
|
1179
1219
|
id: input.id,
|
|
1180
1220
|
agentId: input.agentId,
|
|
1181
1221
|
versionNumber: input.versionNumber,
|
|
1182
|
-
name: input.name ?? void 0,
|
|
1183
|
-
snapshot: input.snapshot,
|
|
1184
1222
|
changedFields: input.changedFields ?? void 0,
|
|
1185
1223
|
changeMessage: input.changeMessage ?? void 0,
|
|
1186
1224
|
createdAt: now
|
|
1187
1225
|
};
|
|
1226
|
+
for (const field of SNAPSHOT_FIELDS) {
|
|
1227
|
+
if (input[field] !== void 0) {
|
|
1228
|
+
versionDoc[field] = input[field];
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1188
1231
|
await collection.insertOne(versionDoc);
|
|
1189
1232
|
return {
|
|
1190
1233
|
...input,
|
|
@@ -1367,12 +1410,26 @@ var MongoDBAgentsStorage = class _MongoDBAgentsStorage extends storage.AgentsSto
|
|
|
1367
1410
|
// ==========================================================================
|
|
1368
1411
|
// Private Helper Methods
|
|
1369
1412
|
// ==========================================================================
|
|
1413
|
+
/**
|
|
1414
|
+
* Transforms a raw MongoDB version document into an AgentVersion.
|
|
1415
|
+
* Config fields are returned directly (no nested snapshot object).
|
|
1416
|
+
*/
|
|
1370
1417
|
transformVersion(doc) {
|
|
1371
1418
|
const { _id, ...version } = doc;
|
|
1372
|
-
|
|
1373
|
-
|
|
1419
|
+
const result = {
|
|
1420
|
+
id: version.id,
|
|
1421
|
+
agentId: version.agentId,
|
|
1422
|
+
versionNumber: version.versionNumber,
|
|
1423
|
+
changedFields: version.changedFields,
|
|
1424
|
+
changeMessage: version.changeMessage,
|
|
1374
1425
|
createdAt: version.createdAt instanceof Date ? version.createdAt : new Date(version.createdAt)
|
|
1375
1426
|
};
|
|
1427
|
+
for (const field of SNAPSHOT_FIELDS) {
|
|
1428
|
+
if (version[field] !== void 0) {
|
|
1429
|
+
result[field] = version[field];
|
|
1430
|
+
}
|
|
1431
|
+
}
|
|
1432
|
+
return result;
|
|
1376
1433
|
}
|
|
1377
1434
|
};
|
|
1378
1435
|
function formatDateForMongoDB(date) {
|