@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 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
@@ -31,4 +31,4 @@ docs/
31
31
  ## Version
32
32
 
33
33
  Package: @mastra/mongodb
34
- Version: 1.1.0-alpha.0
34
+ Version: 1.1.0
@@ -5,7 +5,7 @@ description: Documentation for @mastra/mongodb. Includes links to type definitio
5
5
 
6
6
  # @mastra/mongodb Documentation
7
7
 
8
- > **Version**: 1.1.0-alpha.0
8
+ > **Version**: 1.1.0
9
9
  > **Package**: @mastra/mongodb
10
10
 
11
11
  ## Quick Navigation
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.0-alpha.0",
2
+ "version": "1.1.0",
3
3
  "package": "@mastra/mongodb",
4
4
  "exports": {},
5
5
  "modules": {}
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-alpha.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
- ...agent,
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.name !== void 0) updateDoc.name = updates.name;
1040
- if (updates.description !== void 0) updateDoc.description = updates.description;
1041
- if (updates.instructions !== void 0) updateDoc.instructions = updates.instructions;
1042
- if (updates.model !== void 0) updateDoc.model = updates.model;
1043
- if (updates.tools !== void 0) updateDoc.tools = updates.tools;
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, ...agent } = doc;
1185
+ const { _id, ...rest } = doc;
1160
1186
  return {
1161
- ...agent,
1162
- createdAt: agent.createdAt instanceof Date ? agent.createdAt : new Date(agent.createdAt),
1163
- updatedAt: agent.updatedAt instanceof Date ? agent.updatedAt : new Date(agent.updatedAt)
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
- ...agent
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
- return {
1373
- ...version,
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) {