@mastra/mongodb 0.14.9 → 1.0.0-beta.1
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 +228 -22
- package/README.md +26 -20
- package/dist/index.cjs +282 -546
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +282 -546
- package/dist/index.js.map +1 -1
- package/dist/storage/domains/memory/index.d.ts +14 -42
- package/dist/storage/domains/memory/index.d.ts.map +1 -1
- package/dist/storage/domains/observability/index.d.ts +17 -17
- package/dist/storage/domains/observability/index.d.ts.map +1 -1
- package/dist/storage/domains/scores/index.d.ts +5 -5
- package/dist/storage/domains/scores/index.d.ts.map +1 -1
- package/dist/storage/domains/workflows/index.d.ts +3 -10
- package/dist/storage/domains/workflows/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +34 -81
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/types.d.ts +2 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/vector/index.d.ts +2 -1
- package/dist/vector/index.d.ts.map +1 -1
- package/package.json +12 -14
- package/dist/storage/domains/legacy-evals/index.d.ts +0 -18
- package/dist/storage/domains/legacy-evals/index.d.ts.map +0 -1
- package/dist/storage/domains/traces/index.d.ts +0 -18
- package/dist/storage/domains/traces/index.d.ts.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/vector/filter.ts","../src/vector/index.ts","../src/storage/connectors/MongoDBConnector.ts","../src/storage/domains/legacy-evals/index.ts","../src/storage/domains/utils.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/operations/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/traces/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts","../src/vector/prompt.ts"],"names":["BaseFilterTranslator","MastraVector","MongoClient","error","MastraError","ErrorDomain","ErrorCategory","uuidv4","safelyParseJSON","LegacyEvalsStorage","TABLE_EVALS","MemoryStorage","TABLE_MESSAGES","resolveMessageLimit","MessageList","TABLE_THREADS","TABLE_RESOURCES","ObservabilityStorage","TABLE_AI_SPANS","StoreOperations","TABLE_SCHEMAS","ScoresStorage","TABLE_SCORERS","saveScorePayloadSchema","TracesStorage","TABLE_TRACES","WorkflowsStorage","TABLE_WORKFLOW_SNAPSHOT","MastraStorage"],"mappings":"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","file":"index.cjs","sourcesContent":["{\n \"name\": \"@mastra/mongodb\",\n \"version\": \"0.14.9\",\n \"description\": \"MongoDB provider for Mastra - includes vector store capabilities\",\n \"type\": \"module\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"build\": \"tsup --silent --config tsup.config.ts\",\n \"build:watch\": \"tsup --watch --silent --config tsup.config.ts\",\n \"pretest\": \"docker compose up -d --wait\",\n \"test\": \"vitest run\",\n \"posttest\": \"docker compose down -v\",\n \"pretest:watch\": \"docker compose up -d\",\n \"test:watch\": \"vitest watch\",\n \"posttest:watch\": \"docker compose down -v\",\n \"lint\": \"eslint .\"\n },\n \"dependencies\": {\n \"@types/mongodb\": \"^4.0.7\",\n \"cloudflare\": \"^4.5.0\",\n \"mongodb\": \"^6.17.0\",\n \"uuid\": \"^11.1.0\"\n },\n \"devDependencies\": {\n \"@internal/lint\": \"workspace:*\",\n \"@internal/storage-test-utils\": \"workspace:*\",\n \"@mastra/core\": \"workspace:*\",\n \"@microsoft/api-extractor\": \"^7.52.8\",\n \"@types/node\": \"^20.19.0\",\n \"eslint\": \"^9.37.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\",\n \"@internal/types-builder\": \"workspace:*\"\n },\n \"peerDependencies\": {\n \"@mastra/core\": \">=0.18.1-0 <0.25.0-0\"\n },\n \"files\": [\n \"dist\",\n \"CHANGELOG.md\"\n ],\n \"homepage\": \"https://mastra.ai\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/mastra-ai/mastra.git\",\n \"directory\": \"stores/mongodb\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/mastra-ai/mastra/issues\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"publish-branch\": [\n \"main\",\n \"0.x\"\n ]\n }\n}\n","import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type {\n VectorFilter,\n OperatorSupport,\n QueryOperator,\n OperatorValueMap,\n LogicalOperatorValueMap,\n BlacklistedRootOperators,\n VectorFieldValue,\n} from '@mastra/core/vector/filter';\n\ntype MongoDBOperatorValueMap = Omit<OperatorValueMap, '$options'> & {\n $size: number;\n};\ntype MongoDBBlacklisted = BlacklistedRootOperators | '$size';\n\nexport type MongoDBVectorFilter = VectorFilter<\n keyof MongoDBOperatorValueMap,\n MongoDBOperatorValueMap,\n LogicalOperatorValueMap,\n MongoDBBlacklisted,\n VectorFieldValue | RegExp\n>;\n\n/**\n * Translator for MongoDB filter queries.\n * Maintains MongoDB-compatible syntax while ensuring proper validation\n * and normalization of values.\n */\nexport class MongoDBFilterTranslator extends BaseFilterTranslator<MongoDBVectorFilter> {\n protected override getSupportedOperators(): OperatorSupport {\n return {\n ...BaseFilterTranslator.DEFAULT_OPERATORS,\n regex: ['$regex'],\n custom: ['$size'],\n };\n }\n\n translate(filter?: MongoDBVectorFilter): any {\n if (this.isEmpty(filter)) return filter;\n this.validateFilter(filter);\n\n return this.translateNode(filter);\n }\n\n private translateNode(node: MongoDBVectorFilter): any {\n // Handle primitive values and arrays\n if (this.isRegex(node)) {\n return node; // Return regex values as-is\n }\n if (this.isPrimitive(node)) return node;\n if (Array.isArray(node)) return node;\n\n const entries = Object.entries(node as Record<string, any>);\n const translatedEntries = entries.map(([key, value]) => {\n // Handle operators\n if (this.isOperator(key)) {\n return [key, this.translateOperatorValue(key, value)];\n }\n\n // Handle nested paths and objects\n return [key, this.translateNode(value)];\n });\n\n return Object.fromEntries(translatedEntries);\n }\n\n private translateOperatorValue(operator: QueryOperator, value: any): any {\n // Handle logical operators\n if (this.isLogicalOperator(operator)) {\n if (operator === '$not') {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error('$not operator requires an object');\n }\n if (this.isEmpty(value)) {\n throw new Error('$not operator cannot be empty');\n }\n return this.translateNode(value);\n } else {\n if (!Array.isArray(value)) {\n throw new Error(`Value for logical operator ${operator} must be an array`);\n }\n return value.map(item => this.translateNode(item));\n }\n }\n\n // Handle basic and numeric operators\n if (this.isBasicOperator(operator) || this.isNumericOperator(operator)) {\n // Convert Date to ISO string\n if (value instanceof Date) {\n return value.toISOString();\n }\n return this.normalizeComparisonValue(value);\n }\n\n // Handle $elemMatch operator - place this before array operators check\n if (operator === '$elemMatch') {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(`Value for $elemMatch operator must be an object`);\n }\n return this.translateNode(value);\n }\n\n // Handle array operators\n if (this.isArrayOperator(operator)) {\n if (!Array.isArray(value)) {\n throw new Error(`Value for array operator ${operator} must be an array`);\n }\n return this.normalizeArrayValues(value);\n }\n\n // Handle element operators\n if (this.isElementOperator(operator)) {\n if (operator === '$exists' && typeof value !== 'boolean') {\n throw new Error(`Value for $exists operator must be a boolean`);\n }\n return value;\n }\n\n // Handle regex operators\n if (this.isRegexOperator(operator)) {\n if (!(value instanceof RegExp) && typeof value !== 'string') {\n throw new Error(`Value for ${operator} operator must be a RegExp or string`);\n }\n return value;\n }\n\n // Handle $size operator\n if (operator === '$size') {\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {\n throw new Error(`Value for $size operator must be a non-negative integer`);\n }\n return value;\n }\n\n // If we get here, the operator is not supported\n throw new Error(`Unsupported operator: ${operator}`);\n }\n\n isEmpty(filter: any): boolean {\n return filter === undefined || filter === null || (typeof filter === 'object' && Object.keys(filter).length === 0);\n }\n}\n","import { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n QueryResult,\n IndexStats,\n CreateIndexParams,\n UpsertVectorParams,\n QueryVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n UpdateVectorParams,\n} from '@mastra/core/vector';\nimport { MongoClient } from 'mongodb';\nimport type { MongoClientOptions, Document, Db, Collection } from 'mongodb';\nimport { v4 as uuidv4 } from 'uuid';\nimport packageJson from '../../package.json';\n\nimport { MongoDBFilterTranslator } from './filter';\nimport type { MongoDBVectorFilter } from './filter';\n\n// Define necessary types and interfaces\nexport interface MongoDBUpsertVectorParams extends UpsertVectorParams {\n documents?: string[];\n}\n\ninterface MongoDBQueryVectorParams extends QueryVectorParams<MongoDBVectorFilter> {\n documentFilter?: MongoDBVectorFilter;\n}\n\nexport interface MongoDBIndexReadyParams {\n indexName: string;\n timeoutMs?: number;\n checkIntervalMs?: number;\n}\n\n// Define the document interface\ninterface MongoDBDocument extends Document {\n _id: string; // Explicitly declare '_id' as string\n embedding?: number[];\n metadata?: Record<string, any>;\n document?: string;\n [key: string]: any; // Index signature for additional properties\n}\n// The MongoDBVector class\nexport class MongoDBVector extends MastraVector<MongoDBVectorFilter> {\n private client: MongoClient;\n private db: Db;\n private collections: Map<string, Collection<MongoDBDocument>>;\n private readonly embeddingFieldName = 'embedding';\n private readonly metadataFieldName = 'metadata';\n private readonly documentFieldName = 'document';\n private collectionForValidation: Collection<MongoDBDocument> | null = null;\n private mongoMetricMap: { [key: string]: string } = {\n cosine: 'cosine',\n euclidean: 'euclidean',\n dotproduct: 'dotProduct',\n };\n\n constructor({ uri, dbName, options }: { uri: string; dbName: string; options?: MongoClientOptions }) {\n super();\n const client = new MongoClient(uri, {\n ...options,\n driverInfo: {\n name: 'mastra-vector',\n version: packageJson.version || '0.0.0',\n },\n });\n this.client = client;\n this.db = this.client.db(dbName);\n this.collections = new Map();\n }\n\n // Public methods\n async connect(): Promise<void> {\n try {\n await this.client.connect();\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_CONNECT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n await this.client.close();\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_DISCONNECT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async createIndex({ indexName, dimension, metric = 'cosine' }: CreateIndexParams): Promise<void> {\n let mongoMetric;\n try {\n if (!Number.isInteger(dimension) || dimension <= 0) {\n throw new Error('Dimension must be a positive integer');\n }\n\n mongoMetric = this.mongoMetricMap[metric];\n if (!mongoMetric) {\n throw new Error(`Invalid metric: \"${metric}\". Must be one of: cosine, euclidean, dotproduct`);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_CREATE_INDEX_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n indexName,\n dimension,\n metric,\n },\n },\n error,\n );\n }\n\n let collection;\n try {\n // Check if collection exists\n const collectionExists = await this.db.listCollections({ name: indexName }).hasNext();\n if (!collectionExists) {\n await this.db.createCollection(indexName);\n }\n collection = await this.getCollection(indexName);\n\n const indexNameInternal = `${indexName}_vector_index`;\n\n const embeddingField = this.embeddingFieldName;\n const numDimensions = dimension;\n\n // Create search indexes\n await collection.createSearchIndex({\n definition: {\n fields: [\n {\n type: 'vector',\n path: embeddingField,\n numDimensions: numDimensions,\n similarity: mongoMetric,\n },\n {\n type: 'filter',\n path: '_id',\n },\n ],\n },\n name: indexNameInternal,\n type: 'vectorSearch',\n });\n await collection.createSearchIndex({\n definition: {\n mappings: {\n dynamic: true,\n },\n },\n name: `${indexName}_search_index`,\n type: 'search',\n });\n } catch (error: any) {\n if (error.codeName !== 'IndexAlreadyExists') {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_CREATE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n try {\n // Store the dimension and metric in a special metadata document\n await collection?.updateOne({ _id: '__index_metadata__' }, { $set: { dimension, metric } }, { upsert: true });\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_CREATE_INDEX_FAILED_STORE_METADATA',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Waits for the index to be ready.\n *\n * @param {string} indexName - The name of the index to wait for\n * @param {number} timeoutMs - The maximum time in milliseconds to wait for the index to be ready (default: 60000)\n * @param {number} checkIntervalMs - The interval in milliseconds at which to check if the index is ready (default: 2000)\n * @returns A promise that resolves when the index is ready\n */\n async waitForIndexReady({\n indexName,\n timeoutMs = 60000,\n checkIntervalMs = 2000,\n }: MongoDBIndexReadyParams): Promise<void> {\n const collection = await this.getCollection(indexName, true);\n const indexNameInternal = `${indexName}_vector_index`;\n\n const startTime = Date.now();\n while (Date.now() - startTime < timeoutMs) {\n const indexInfo: any[] = await (collection as any).listSearchIndexes().toArray();\n const indexData = indexInfo.find((idx: any) => idx.name === indexNameInternal);\n const status = indexData?.status;\n if (status === 'READY') {\n return;\n }\n await new Promise(resolve => setTimeout(resolve, checkIntervalMs));\n }\n throw new Error(`Index \"${indexNameInternal}\" did not become ready within timeout`);\n }\n\n async upsert({ indexName, vectors, metadata, ids, documents }: MongoDBUpsertVectorParams): Promise<string[]> {\n try {\n const collection = await this.getCollection(indexName);\n\n this.collectionForValidation = collection;\n\n // Get index stats to check dimension\n const stats = await this.describeIndex({ indexName });\n\n // Validate vector dimensions\n await this.validateVectorDimensions(vectors, stats.dimension);\n\n // Generate IDs if not provided\n const generatedIds = ids || vectors.map(() => uuidv4());\n\n const operations = vectors.map((vector, idx) => {\n const id = generatedIds[idx];\n const meta = metadata?.[idx] || {};\n const doc = documents?.[idx];\n\n // Normalize metadata - convert Date objects to ISO strings\n const normalizedMeta = Object.keys(meta).reduce(\n (acc, key) => {\n acc[key] = meta[key] instanceof Date ? meta[key].toISOString() : meta[key];\n return acc;\n },\n {} as Record<string, any>,\n );\n\n const updateDoc: Partial<MongoDBDocument> = {\n [this.embeddingFieldName]: vector,\n [this.metadataFieldName]: normalizedMeta,\n };\n if (doc !== undefined) {\n updateDoc[this.documentFieldName] = doc;\n }\n\n return {\n updateOne: {\n filter: { _id: id }, // '_id' is a string as per MongoDBDocument interface\n update: { $set: updateDoc },\n upsert: true,\n },\n };\n });\n\n await collection.bulkWrite(operations);\n\n return generatedIds;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_UPSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n async query({\n indexName,\n queryVector,\n topK = 10,\n filter,\n includeVector = false,\n documentFilter,\n }: MongoDBQueryVectorParams): Promise<QueryResult[]> {\n try {\n const collection = await this.getCollection(indexName, true);\n const indexNameInternal = `${indexName}_vector_index`;\n\n // Transform the filters using MongoDBFilterTranslator\n const mongoFilter = this.transformFilter(filter);\n const documentMongoFilter = documentFilter ? { [this.documentFieldName]: documentFilter } : {};\n\n // Transform metadata field filters to use dot notation\n const transformedMongoFilter = this.transformMetadataFilter(mongoFilter);\n\n // Combine the filters\n let combinedFilter: any = {};\n if (Object.keys(transformedMongoFilter).length > 0 && Object.keys(documentMongoFilter).length > 0) {\n combinedFilter = { $and: [transformedMongoFilter, documentMongoFilter] };\n } else if (Object.keys(transformedMongoFilter).length > 0) {\n combinedFilter = transformedMongoFilter;\n } else if (Object.keys(documentMongoFilter).length > 0) {\n combinedFilter = documentMongoFilter;\n }\n\n const vectorSearch: Document = {\n index: indexNameInternal,\n queryVector: queryVector,\n path: this.embeddingFieldName,\n numCandidates: 100,\n limit: topK,\n };\n\n if (Object.keys(combinedFilter).length > 0) {\n // pre-filter for candidate document IDs\n const candidateIds = await collection\n .aggregate([{ $match: combinedFilter }, { $project: { _id: 1 } }])\n .map(doc => doc._id)\n .toArray();\n\n if (candidateIds.length > 0) {\n vectorSearch.filter = { _id: { $in: candidateIds } };\n } else {\n // No documents match the filter, return empty results\n return [];\n }\n }\n\n // Build the aggregation pipeline\n const pipeline = [\n {\n $vectorSearch: vectorSearch,\n },\n {\n $set: { score: { $meta: 'vectorSearchScore' } },\n },\n {\n $project: {\n _id: 1,\n score: 1,\n metadata: `$${this.metadataFieldName}`,\n document: `$${this.documentFieldName}`,\n ...(includeVector && { vector: `$${this.embeddingFieldName}` }),\n },\n },\n ];\n\n const results = await collection.aggregate(pipeline).toArray();\n\n return results.map((result: any) => ({\n id: result._id,\n score: result.score,\n metadata: result.metadata,\n vector: includeVector ? result.vector : undefined,\n document: result.document,\n }));\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_QUERY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n\n async listIndexes(): Promise<string[]> {\n try {\n const collections = await this.db.listCollections().toArray();\n return collections.map(col => col.name);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_LIST_INDEXES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Retrieves statistics about a vector index.\n *\n * @param {string} indexName - The name of the index to describe\n * @returns A promise that resolves to the index statistics including dimension, count and metric\n */\n async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n try {\n const collection = await this.getCollection(indexName, true);\n\n // Get the count of documents, excluding the metadata document\n const count = await collection.countDocuments({ _id: { $ne: '__index_metadata__' } });\n\n // Retrieve the dimension and metric from the metadata document\n const metadataDoc = await collection.findOne({ _id: '__index_metadata__' });\n const dimension = metadataDoc?.dimension || 0;\n const metric = metadataDoc?.metric || 'cosine';\n\n return {\n dimension,\n count,\n metric: metric as 'cosine' | 'euclidean' | 'dotproduct',\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_DESCRIBE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n const collection = await this.getCollection(indexName, false); // Do not throw error if collection doesn't exist\n try {\n if (collection) {\n await collection.drop();\n this.collections.delete(indexName);\n } else {\n // Optionally, you can log or handle the case where the collection doesn't exist\n throw new Error(`Index (Collection) \"${indexName}\" does not exist`);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_DELETE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Updates a vector by its ID with the provided vector and/or metadata.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to update.\n * @param update - An object containing the vector and/or metadata to update.\n * @param update.vector - An optional array of numbers representing the new vector.\n * @param update.metadata - An optional record containing the new metadata.\n * @returns A promise that resolves when the update is complete.\n * @throws Will throw an error if no updates are provided or if the update operation fails.\n */\n async updateVector({ indexName, id, update }: UpdateVectorParams): Promise<void> {\n try {\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n\n const collection = await this.getCollection(indexName, true);\n const updateDoc: Record<string, any> = {};\n\n if (update.vector) {\n const stats = await this.describeIndex({ indexName });\n await this.validateVectorDimensions([update.vector], stats.dimension);\n updateDoc[this.embeddingFieldName] = update.vector;\n }\n\n if (update.metadata) {\n // Normalize metadata in updates too\n const normalizedMeta = Object.keys(update.metadata).reduce(\n (acc, key) => {\n acc[key] =\n update.metadata![key] instanceof Date ? update.metadata![key].toISOString() : update.metadata![key];\n return acc;\n },\n {} as Record<string, any>,\n );\n\n updateDoc[this.metadataFieldName] = normalizedMeta;\n }\n\n await collection.findOneAndUpdate({ _id: id }, { $set: updateDoc });\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n id,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a vector by its ID.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to delete.\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if the deletion operation fails.\n */\n async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n try {\n const collection = await this.getCollection(indexName, true);\n await collection.deleteOne({ _id: id });\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_DELETE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n id,\n },\n },\n error,\n );\n }\n }\n\n // Private methods\n private async getCollection(\n indexName: string,\n throwIfNotExists: boolean = true,\n ): Promise<Collection<MongoDBDocument>> {\n if (this.collections.has(indexName)) {\n return this.collections.get(indexName)!;\n }\n\n const collection = this.db.collection<MongoDBDocument>(indexName);\n\n // Check if collection exists\n const collectionExists = await this.db.listCollections({ name: indexName }).hasNext();\n if (!collectionExists && throwIfNotExists) {\n throw new Error(`Index (Collection) \"${indexName}\" does not exist`);\n }\n\n this.collections.set(indexName, collection);\n return collection;\n }\n\n private async validateVectorDimensions(vectors: number[][], dimension: number): Promise<void> {\n if (vectors.length === 0) {\n throw new Error('No vectors provided for validation');\n }\n\n if (dimension === 0) {\n // If dimension is not set, retrieve and set it from the vectors\n dimension = vectors[0] ? vectors[0].length : 0;\n await this.setIndexDimension(dimension);\n }\n\n for (let i = 0; i < vectors.length; i++) {\n let v = vectors[i]?.length;\n if (v !== dimension) {\n throw new Error(`Vector at index ${i} has invalid dimension ${v}. Expected ${dimension} dimensions.`);\n }\n }\n }\n\n private async setIndexDimension(dimension: number): Promise<void> {\n // Store the dimension in a special metadata document\n const collection = this.collectionForValidation!; // 'collectionForValidation' is set in 'upsert' method\n await collection.updateOne({ _id: '__index_metadata__' }, { $set: { dimension } }, { upsert: true });\n }\n\n private transformFilter(filter?: MongoDBVectorFilter) {\n const translator = new MongoDBFilterTranslator();\n if (!filter) return {};\n return translator.translate(filter);\n }\n\n /**\n * Transform metadata field filters to use MongoDB dot notation.\n * Fields that are stored in the metadata subdocument need to be prefixed with 'metadata.'\n * This handles filters from the Memory system which expects direct field access.\n *\n * @param filter - The filter object to transform\n * @returns Transformed filter with metadata fields properly prefixed\n */\n private transformMetadataFilter(filter: any): any {\n if (!filter || typeof filter !== 'object') return filter;\n\n const transformed: any = {};\n\n for (const [key, value] of Object.entries(filter)) {\n // Check if this is a MongoDB operator (starts with $)\n if (key.startsWith('$')) {\n // For logical operators like $and, $or, recursively transform their contents\n if (Array.isArray(value)) {\n transformed[key] = value.map(item => this.transformMetadataFilter(item));\n } else {\n transformed[key] = this.transformMetadataFilter(value);\n }\n }\n // Check if the key already has 'metadata.' prefix\n else if (key.startsWith('metadata.')) {\n // Already prefixed, keep as is\n transformed[key] = value;\n }\n // Check if this is a known metadata field that needs prefixing\n else if (this.isMetadataField(key)) {\n // Add metadata. prefix for fields stored in metadata subdocument\n transformed[`metadata.${key}`] = value;\n } else {\n // Keep other fields as is\n transformed[key] = value;\n }\n }\n\n return transformed;\n }\n\n /**\n * Determine if a field should be treated as a metadata field.\n * Common metadata fields include thread_id, resource_id, message_id, and any field\n * that doesn't start with underscore (MongoDB system fields).\n */\n private isMetadataField(key: string): boolean {\n // MongoDB system fields start with underscore\n if (key.startsWith('_')) return false;\n\n // Document-level fields that are NOT in metadata\n const documentFields = ['_id', this.embeddingFieldName, this.documentFieldName];\n if (documentFields.includes(key)) return false;\n\n // Everything else is assumed to be in metadata\n // This includes thread_id, resource_id, message_id, and any custom fields\n return true;\n }\n}\n","import { MongoClient } from 'mongodb';\nimport type { Db } from 'mongodb';\nimport packageJson from '../../../package.json';\nimport type { DatabaseConfig } from '../types';\nimport type { ConnectorHandler } from './base';\n\ntype MongoDBConnectorOptions =\n | {\n client: MongoClient;\n dbName: string;\n handler: undefined;\n }\n | {\n client: undefined;\n dbName: undefined;\n handler: ConnectorHandler;\n };\n\nexport class MongoDBConnector {\n readonly #client?: MongoClient;\n readonly #dbName?: string;\n readonly #handler?: ConnectorHandler;\n #isConnected: boolean;\n #db?: Db;\n\n constructor(options: MongoDBConnectorOptions) {\n this.#client = options.client;\n this.#dbName = options.dbName;\n this.#handler = options.handler;\n this.#isConnected = false;\n }\n\n static fromDatabaseConfig(config: DatabaseConfig): MongoDBConnector {\n if (!config.url?.trim().length) {\n throw new Error(\n 'MongoDBStore: url must be provided and cannot be empty. Passing an empty string may cause fallback to local MongoDB defaults.',\n );\n }\n\n if (!config.dbName?.trim().length) {\n throw new Error(\n 'MongoDBStore: dbName must be provided and cannot be empty. Passing an empty string may cause fallback to local MongoDB defaults.',\n );\n }\n\n const client = new MongoClient(config.url, {\n ...config.options,\n driverInfo: {\n name: 'mastra-storage',\n version: packageJson.version || '0.0.0',\n },\n });\n return new MongoDBConnector({\n client,\n dbName: config.dbName,\n handler: undefined,\n });\n }\n\n static fromConnectionHandler(handler: ConnectorHandler): MongoDBConnector {\n return new MongoDBConnector({\n client: undefined,\n dbName: undefined,\n handler,\n });\n }\n\n private async getConnection(): Promise<Db> {\n if (this.#client) {\n if (this.#isConnected && this.#db) {\n return this.#db;\n }\n await this.#client.connect();\n this.#db = this.#client.db(this.#dbName);\n this.#isConnected = true;\n return this.#db;\n }\n\n throw new Error('MongoDBStore: client cannot be empty. Check your MongoDBConnector configuration.');\n }\n\n async getCollection(collectionName: string) {\n if (this.#handler) {\n return this.#handler.getCollection(collectionName);\n }\n const db = await this.getConnection();\n return db.collection(collectionName);\n }\n\n async close() {\n if (this.#client) {\n await this.#client.close();\n this.#isConnected = false;\n return;\n }\n\n if (this.#handler) {\n await this.#handler.close();\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MetricResult } from '@mastra/core/eval';\nimport { LegacyEvalsStorage, TABLE_EVALS, safelyParseJSON } from '@mastra/core/storage';\nimport type { PaginationArgs, PaginationInfo, EvalRow } from '@mastra/core/storage';\nimport type { StoreOperationsMongoDB } from '../operations';\n\nfunction transformEvalRow(row: Record<string, any>): EvalRow {\n let testInfoValue = null;\n if (row.test_info) {\n try {\n testInfoValue = typeof row.test_info === 'string' ? safelyParseJSON(row.test_info) : row.test_info;\n } catch (e) {\n console.warn('Failed to parse test_info:', e);\n }\n }\n\n let resultValue: MetricResult;\n try {\n resultValue = typeof row.result === 'string' ? safelyParseJSON(row.result) : row.result;\n } catch (e) {\n console.warn('Failed to parse result:', e);\n throw new Error('Invalid result format');\n }\n\n return {\n agentName: row.agent_name as string,\n input: row.input as string,\n output: row.output as string,\n result: resultValue,\n metricName: row.metric_name as string,\n instructions: row.instructions as string,\n testInfo: testInfoValue,\n globalRunId: row.global_run_id as string,\n runId: row.run_id as string,\n createdAt: row.createdAt as string,\n };\n}\n\nexport class LegacyEvalsMongoDB extends LegacyEvalsStorage {\n private operations: StoreOperationsMongoDB;\n\n constructor({ operations }: { operations: StoreOperationsMongoDB }) {\n super();\n this.operations = operations;\n }\n\n /** @deprecated use getEvals instead */\n async getEvalsByAgentName(agentName: string, type?: 'test' | 'live'): Promise<EvalRow[]> {\n try {\n const query: any = {\n agent_name: agentName,\n };\n\n if (type === 'test') {\n query['test_info'] = { $ne: null };\n // is not possible to filter by test_info.testPath because it is not a json field\n // query['test_info.testPath'] = { $ne: null };\n }\n\n if (type === 'live') {\n // is not possible to filter by test_info.testPath because it is not a json field\n query['test_info'] = null;\n }\n\n const collection = await this.operations.getCollection(TABLE_EVALS);\n const documents = await collection.find(query).sort({ created_at: 'desc' }).toArray();\n const result = documents.map((row: any) => transformEvalRow(row));\n // Post filter to remove if test_info.testPath is null\n return result.filter((row: any) => {\n if (type === 'live') {\n return !Boolean(row.testInfo?.testPath);\n }\n\n if (type === 'test') {\n return row.testInfo?.testPath !== null;\n }\n return true;\n });\n } catch (error) {\n // Handle case where table doesn't exist yet\n if (error instanceof Error && error.message.includes('no such table')) {\n return [];\n }\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_EVALS_BY_AGENT_NAME_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentName },\n },\n error,\n );\n }\n }\n\n async getEvals(\n options: {\n agentName?: string;\n type?: 'test' | 'live';\n } & PaginationArgs = {},\n ): Promise<PaginationInfo & { evals: EvalRow[] }> {\n const { agentName, type, page = 0, perPage = 100, dateRange } = options;\n const fromDate = dateRange?.start;\n const toDate = dateRange?.end;\n const currentOffset = page * perPage;\n\n const query: any = {};\n if (agentName) {\n query['agent_name'] = agentName;\n }\n\n if (type === 'test') {\n query['test_info'] = { $ne: null };\n } else if (type === 'live') {\n query['test_info'] = null;\n }\n\n if (fromDate || toDate) {\n query['createdAt'] = {};\n if (fromDate) {\n query['createdAt']['$gte'] = fromDate;\n }\n if (toDate) {\n query['createdAt']['$lte'] = toDate;\n }\n }\n\n try {\n const collection = await this.operations.getCollection(TABLE_EVALS);\n let total = 0;\n // Only get total count when using pagination\n if (page === 0 || perPage < 1000) {\n total = await collection.countDocuments(query);\n }\n\n if (total === 0) {\n return {\n evals: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n const documents = await collection\n .find(query)\n .sort({ created_at: 'desc' })\n .skip(currentOffset)\n .limit(perPage)\n .toArray();\n\n const evals = documents.map((row: any) => transformEvalRow(row));\n\n // Post filter to remove if test_info.testPath is null\n const filteredEvals = evals.filter((row: any) => {\n if (type === 'live') {\n return !Boolean(row.testInfo?.testPath);\n }\n\n if (type === 'test') {\n return row.testInfo?.testPath !== null;\n }\n return true;\n });\n\n const hasMore = currentOffset + filteredEvals.length < total;\n\n return {\n evals: filteredEvals,\n total,\n page,\n perPage,\n hasMore,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_EVALS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n agentName: agentName || 'all',\n type: type || 'all',\n page,\n perPage,\n },\n },\n error,\n );\n }\n }\n}\n","import type { IMastraLogger } from '@mastra/core/logger';\n\nexport function formatDateForMongoDB(date: Date | string): Date {\n return typeof date === 'string' ? new Date(date) : date;\n}\n\nexport function createExecuteOperationWithRetry({\n logger,\n maxRetries = 3,\n initialBackoffMs = 100,\n}: {\n logger: IMastraLogger;\n maxRetries?: number;\n initialBackoffMs?: number;\n}) {\n return async function executeOperationWithRetry<T>(\n operationFn: () => Promise<T>,\n operationDescription: string,\n ): Promise<T> {\n let retries = 0;\n\n while (true) {\n try {\n return await operationFn();\n } catch (error: any) {\n if (\n ((error.message && error.message.includes('connection')) || error.code === 'ECONNRESET') &&\n retries < maxRetries\n ) {\n retries++;\n const backoffTime = initialBackoffMs * Math.pow(2, retries - 1);\n logger.warn(\n `MongoDBStore: Encountered connection error during ${operationDescription}. Retrying (${retries}/${maxRetries}) in ${backoffTime}ms...`,\n );\n await new Promise(resolve => setTimeout(resolve, backoffTime));\n } else {\n logger.error(`MongoDBStore: Error during ${operationDescription} after ${retries} retries: ${error}`);\n throw error;\n }\n }\n }\n };\n}\n","import { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraMessageV2, StorageThreadType } from '@mastra/core/memory';\nimport {\n MemoryStorage,\n resolveMessageLimit,\n safelyParseJSON,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n} from '@mastra/core/storage';\nimport type { PaginationInfo, StorageGetMessagesArg, StorageResourceType } from '@mastra/core/storage';\nimport type { StoreOperationsMongoDB } from '../operations';\nimport { formatDateForMongoDB } from '../utils';\n\nexport class MemoryStorageMongoDB extends MemoryStorage {\n private operations: StoreOperationsMongoDB;\n\n constructor({ operations }: { operations: StoreOperationsMongoDB }) {\n super();\n this.operations = operations;\n }\n\n private parseRow(row: any): MastraMessageV2 {\n let content = row.content;\n if (typeof content === 'string') {\n try {\n content = JSON.parse(content);\n } catch {\n // use content as is if it's not JSON\n }\n }\n\n const result = {\n id: row.id,\n content,\n role: row.role,\n createdAt: formatDateForMongoDB(row.createdAt),\n threadId: row.thread_id,\n resourceId: row.resourceId,\n } as MastraMessageV2;\n\n if (row.type && row.type !== 'v2') result.type = row.type;\n return result;\n }\n\n private async _getIncludedMessages({\n threadId,\n selectBy,\n }: {\n threadId: string;\n selectBy: StorageGetMessagesArg['selectBy'];\n }) {\n if (!threadId.trim()) throw new Error('threadId must be a non-empty string');\n\n const include = selectBy?.include;\n if (!include) return null;\n\n const collection = await this.operations.getCollection(TABLE_MESSAGES);\n\n const includedMessages: any[] = [];\n\n for (const inc of include) {\n const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n const searchThreadId = inc.threadId || threadId;\n\n // Get all messages for the search thread ordered by creation date\n const allMessages = await collection.find({ thread_id: searchThreadId }).sort({ createdAt: 1 }).toArray();\n\n // Find the target message\n const targetIndex = allMessages.findIndex((msg: any) => msg.id === id);\n\n if (targetIndex === -1) continue;\n\n // Get previous messages\n const startIndex = Math.max(0, targetIndex - withPreviousMessages);\n // Get next messages\n const endIndex = Math.min(allMessages.length - 1, targetIndex + withNextMessages);\n\n // Add messages in range\n for (let i = startIndex; i <= endIndex; i++) {\n includedMessages.push(allMessages[i]);\n }\n }\n\n // Remove duplicates\n const seen = new Set<string>();\n const dedupedMessages = includedMessages.filter(msg => {\n if (seen.has(msg.id)) return false;\n seen.add(msg.id);\n return true;\n });\n\n return dedupedMessages.map(row => this.parseRow(row));\n }\n\n /**\n * @deprecated use getMessagesPaginated instead for paginated results.\n */\n public async getMessages(args: StorageGetMessagesArg & { format?: 'v1' }): Promise<MastraMessageV1[]>;\n public async getMessages(args: StorageGetMessagesArg & { format: 'v2' }): Promise<MastraMessageV2[]>;\n public async getMessages({\n threadId,\n resourceId,\n selectBy,\n format,\n }: StorageGetMessagesArg & {\n format?: 'v1' | 'v2';\n }): Promise<MastraMessageV1[] | MastraMessageV2[]> {\n try {\n if (!threadId.trim()) throw new Error('threadId must be a non-empty string');\n\n const messages: MastraMessageV2[] = [];\n const limit = resolveMessageLimit({ last: selectBy?.last, defaultLimit: 40 });\n\n if (selectBy?.include?.length) {\n const includeMessages = await this._getIncludedMessages({ threadId, selectBy });\n if (includeMessages) {\n messages.push(...includeMessages);\n }\n }\n\n const excludeIds = messages.map(m => m.id);\n const collection = await this.operations.getCollection(TABLE_MESSAGES);\n\n const query: any = { thread_id: threadId };\n if (excludeIds.length > 0) {\n query.id = { $nin: excludeIds };\n }\n\n // Only fetch remaining messages if limit > 0\n if (limit > 0) {\n const remainingMessages = await collection.find(query).sort({ createdAt: -1 }).limit(limit).toArray();\n\n messages.push(...remainingMessages.map((row: any) => this.parseRow(row)));\n }\n\n // Sort all messages by creation date ascending\n messages.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n\n const list = new MessageList().add(messages, 'memory');\n if (format === 'v2') return list.get.all.v2();\n return list.get.all.v1();\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_GET_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId: resourceId ?? '' },\n },\n error,\n );\n }\n }\n\n public async getMessagesById({\n messageIds,\n format,\n }: {\n messageIds: string[];\n format: 'v1';\n }): Promise<MastraMessageV1[]>;\n public async getMessagesById({\n messageIds,\n format,\n }: {\n messageIds: string[];\n format?: 'v2';\n }): Promise<MastraMessageV2[]>;\n public async getMessagesById({\n messageIds,\n format,\n }: {\n messageIds: string[];\n format?: 'v1' | 'v2';\n }): Promise<MastraMessageV1[] | MastraMessageV2[]> {\n if (messageIds.length === 0) return [];\n try {\n const collection = await this.operations.getCollection(TABLE_MESSAGES);\n const rawMessages = await collection\n .find({ id: { $in: messageIds } })\n .sort({ createdAt: -1 })\n .toArray();\n\n const list = new MessageList().add(rawMessages.map(this.parseRow), 'memory');\n if (format === `v1`) return list.get.all.v1();\n return list.get.all.v2();\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_GET_MESSAGES_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: JSON.stringify(messageIds) },\n },\n error,\n );\n }\n }\n\n public async getMessagesPaginated(\n args: StorageGetMessagesArg & {\n format?: 'v1' | 'v2';\n },\n ): Promise<PaginationInfo & { messages: MastraMessageV1[] | MastraMessageV2[] }> {\n const { threadId, resourceId, format, selectBy } = args;\n const { page = 0, perPage: perPageInput, dateRange } = selectBy?.pagination || {};\n const perPage =\n perPageInput !== undefined ? perPageInput : resolveMessageLimit({ last: selectBy?.last, defaultLimit: 40 });\n const fromDate = dateRange?.start;\n const toDate = dateRange?.end;\n\n const messages: MastraMessageV2[] = [];\n\n if (selectBy?.include?.length) {\n try {\n const includeMessages = await this._getIncludedMessages({ threadId, selectBy });\n if (includeMessages) {\n messages.push(...includeMessages);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_GET_MESSAGES_PAGINATED_GET_INCLUDE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId: resourceId ?? '' },\n },\n error,\n );\n }\n }\n\n try {\n if (!threadId.trim()) throw new Error('threadId must be a non-empty string');\n\n const currentOffset = page * perPage;\n const collection = await this.operations.getCollection(TABLE_MESSAGES);\n\n const query: any = { thread_id: threadId };\n\n if (fromDate) {\n query.createdAt = { ...query.createdAt, $gte: fromDate };\n }\n if (toDate) {\n query.createdAt = { ...query.createdAt, $lte: toDate };\n }\n\n const total = await collection.countDocuments(query);\n\n if (total === 0 && messages.length === 0) {\n return {\n messages: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n const excludeIds = messages.map(m => m.id);\n if (excludeIds.length > 0) {\n query.id = { $nin: excludeIds };\n }\n\n const dataResult = await collection\n .find(query)\n .sort({ createdAt: -1 })\n .skip(currentOffset)\n .limit(perPage)\n .toArray();\n\n messages.push(...dataResult.map((row: any) => this.parseRow(row)));\n\n const messagesToReturn =\n format === 'v1'\n ? new MessageList().add(messages, 'memory').get.all.v1()\n : new MessageList().add(messages, 'memory').get.all.v2();\n\n return {\n messages: messagesToReturn,\n total,\n page,\n perPage,\n hasMore: (page + 1) * perPage < total,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'MONGODB_STORE_GET_MESSAGES_PAGINATED_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId: resourceId ?? '' },\n },\n error,\n );\n this.logger?.trackException?.(mastraError);\n this.logger?.error?.(mastraError.toString());\n return { messages: [], total: 0, page, perPage, hasMore: false };\n }\n }\n\n async saveMessages(args: { messages: MastraMessageV1[]; format?: undefined | 'v1' }): Promise<MastraMessageV1[]>;\n async saveMessages(args: { messages: MastraMessageV2[]; format: 'v2' }): Promise<MastraMessageV2[]>;\n async saveMessages({\n messages,\n format,\n }:\n | { messages: MastraMessageV1[]; format?: undefined | 'v1' }\n | { messages: MastraMessageV2[]; format: 'v2' }): Promise<MastraMessageV2[] | MastraMessageV1[]> {\n if (messages.length === 0) return messages;\n\n try {\n const threadId = messages[0]?.threadId;\n if (!threadId) {\n throw new Error('Thread ID is required');\n }\n\n const collection = await this.operations.getCollection(TABLE_MESSAGES);\n const threadsCollection = await this.operations.getCollection(TABLE_THREADS);\n\n // Prepare messages for insertion\n const messagesToInsert = messages.map(message => {\n const time = message.createdAt || new Date();\n if (!message.threadId) {\n throw new Error(\n \"Expected to find a threadId for message, but couldn't find one. An unexpected error has occurred.\",\n );\n }\n if (!message.resourceId) {\n throw new Error(\n \"Expected to find a resourceId for message, but couldn't find one. An unexpected error has occurred.\",\n );\n }\n\n return {\n updateOne: {\n filter: { id: message.id },\n update: {\n $set: {\n id: message.id,\n thread_id: message.threadId!,\n content: typeof message.content === 'object' ? JSON.stringify(message.content) : message.content,\n role: message.role,\n type: message.type || 'v2',\n createdAt: formatDateForMongoDB(time),\n resourceId: message.resourceId,\n },\n },\n upsert: true,\n },\n };\n });\n\n // Execute message inserts and thread update in parallel\n await Promise.all([\n collection.bulkWrite(messagesToInsert),\n threadsCollection.updateOne({ id: threadId }, { $set: { updatedAt: new Date() } }),\n ]);\n\n const list = new MessageList().add(messages, 'memory');\n if (format === 'v2') return list.get.all.v2();\n return list.get.all.v1();\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_SAVE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async updateMessages({\n messages,\n }: {\n messages: (Partial<Omit<MastraMessageV2, 'createdAt'>> & {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraMessageV2[]> {\n if (messages.length === 0) {\n return [];\n }\n\n const messageIds = messages.map(m => m.id);\n const collection = await this.operations.getCollection(TABLE_MESSAGES);\n\n const existingMessages = await collection.find({ id: { $in: messageIds } }).toArray();\n\n const existingMessagesParsed: MastraMessageV2[] = existingMessages.map((msg: any) => this.parseRow(msg));\n\n if (existingMessagesParsed.length === 0) {\n return [];\n }\n\n const threadIdsToUpdate = new Set<string>();\n const bulkOps = [];\n\n for (const existingMessage of existingMessagesParsed) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n\n const updateDoc: any = {};\n const updatableFields = { ...fieldsToUpdate };\n\n // Special handling for content field to merge instead of overwrite\n if (updatableFields.content) {\n const newContent = {\n ...existingMessage.content,\n ...updatableFields.content,\n // Deep merge metadata if it exists on both\n ...(existingMessage.content?.metadata && updatableFields.content.metadata\n ? {\n metadata: {\n ...existingMessage.content.metadata,\n ...updatableFields.content.metadata,\n },\n }\n : {}),\n };\n updateDoc.content = JSON.stringify(newContent);\n delete updatableFields.content;\n }\n\n // Handle other fields\n for (const key in updatableFields) {\n if (Object.prototype.hasOwnProperty.call(updatableFields, key)) {\n const dbKey = key === 'threadId' ? 'thread_id' : key;\n let value = updatableFields[key as keyof typeof updatableFields];\n\n if (typeof value === 'object' && value !== null) {\n value = JSON.stringify(value);\n }\n updateDoc[dbKey] = value;\n }\n }\n\n if (Object.keys(updateDoc).length > 0) {\n bulkOps.push({\n updateOne: {\n filter: { id },\n update: { $set: updateDoc },\n },\n });\n }\n }\n\n if (bulkOps.length > 0) {\n await collection.bulkWrite(bulkOps);\n }\n\n // Update thread timestamps\n if (threadIdsToUpdate.size > 0) {\n const threadsCollection = await this.operations.getCollection(TABLE_THREADS);\n await threadsCollection.updateMany(\n { id: { $in: Array.from(threadIdsToUpdate) } },\n { $set: { updatedAt: new Date() } },\n );\n }\n\n // Re-fetch updated messages\n const updatedMessages = await collection.find({ id: { $in: messageIds } }).toArray();\n\n return updatedMessages.map((row: any) => this.parseRow(row));\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const collection = await this.operations.getCollection(TABLE_RESOURCES);\n const result = await collection.findOne<any>({ id: resourceId });\n\n if (!result) {\n return null;\n }\n\n return {\n id: result.id,\n workingMemory: result.workingMemory || '',\n metadata: typeof result.metadata === 'string' ? safelyParseJSON(result.metadata) : result.metadata,\n createdAt: formatDateForMongoDB(result.createdAt),\n updatedAt: formatDateForMongoDB(result.updatedAt),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_RESOURCE_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n try {\n const collection = await this.operations.getCollection(TABLE_RESOURCES);\n await collection.updateOne(\n { id: resource.id },\n {\n $set: {\n ...resource,\n metadata: JSON.stringify(resource.metadata),\n },\n },\n { upsert: true },\n );\n\n return resource;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_SAVE_RESOURCE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId: resource.id },\n },\n error,\n );\n }\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n try {\n const existingResource = await this.getResourceById({ resourceId });\n\n if (!existingResource) {\n // Create new resource if it doesn't exist\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory: workingMemory || '',\n metadata: metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n return this.saveResource({ resource: newResource });\n }\n\n const updatedResource = {\n ...existingResource,\n workingMemory: workingMemory !== undefined ? workingMemory : existingResource.workingMemory,\n metadata: metadata ? { ...existingResource.metadata, ...metadata } : existingResource.metadata,\n updatedAt: new Date(),\n };\n\n const collection = await this.operations.getCollection(TABLE_RESOURCES);\n const updateDoc: any = { updatedAt: updatedResource.updatedAt };\n\n if (workingMemory !== undefined) {\n updateDoc.workingMemory = workingMemory;\n }\n\n if (metadata) {\n updateDoc.metadata = JSON.stringify(updatedResource.metadata);\n }\n\n await collection.updateOne({ id: resourceId }, { $set: updateDoc });\n\n return updatedResource;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_UPDATE_RESOURCE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const collection = await this.operations.getCollection(TABLE_THREADS);\n const result = await collection.findOne<any>({ id: threadId });\n if (!result) {\n return null;\n }\n\n return {\n ...result,\n metadata: typeof result.metadata === 'string' ? safelyParseJSON(result.metadata) : result.metadata,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_THREAD_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n async getThreadsByResourceId({ resourceId }: { resourceId: string }): Promise<StorageThreadType[]> {\n try {\n const collection = await this.operations.getCollection(TABLE_THREADS);\n const results = await collection.find<any>({ resourceId }).sort({ updatedAt: -1 }).toArray();\n if (!results.length) {\n return [];\n }\n\n return results.map((result: any) => ({\n ...result,\n metadata: typeof result.metadata === 'string' ? safelyParseJSON(result.metadata) : result.metadata,\n }));\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_THREADS_BY_RESOURCE_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n public async getThreadsByResourceIdPaginated(args: {\n resourceId: string;\n page: number;\n perPage: number;\n }): Promise<PaginationInfo & { threads: StorageThreadType[] }> {\n try {\n const { resourceId, page, perPage } = args;\n const collection = await this.operations.getCollection(TABLE_THREADS);\n\n const query = { resourceId };\n const total = await collection.countDocuments(query);\n\n const threads = await collection\n .find(query)\n .sort({ updatedAt: -1 })\n .skip(page * perPage)\n .limit(perPage)\n .toArray();\n\n return {\n threads: threads.map((thread: any) => ({\n id: thread.id,\n title: thread.title,\n resourceId: thread.resourceId,\n createdAt: formatDateForMongoDB(thread.createdAt),\n updatedAt: formatDateForMongoDB(thread.updatedAt),\n metadata: thread.metadata || {},\n })),\n total,\n page,\n perPage,\n hasMore: (page + 1) * perPage < total,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_GET_THREADS_BY_RESOURCE_ID_PAGINATED_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId: args.resourceId },\n },\n error,\n );\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n const collection = await this.operations.getCollection(TABLE_THREADS);\n await collection.updateOne(\n { id: thread.id },\n {\n $set: {\n ...thread,\n metadata: thread.metadata,\n },\n },\n { upsert: true },\n );\n return thread;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_SAVE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: thread.id },\n },\n error,\n );\n }\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n const thread = await this.getThreadById({ threadId: id });\n if (!thread) {\n throw new MastraError({\n id: 'STORAGE_MONGODB_STORE_UPDATE_THREAD_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: id, status: 404 },\n text: `Thread ${id} not found`,\n });\n }\n\n const updatedThread = {\n ...thread,\n title,\n metadata: {\n ...thread.metadata,\n ...metadata,\n },\n };\n\n try {\n const collection = await this.operations.getCollection(TABLE_THREADS);\n await collection.updateOne(\n { id },\n {\n $set: {\n title,\n metadata: updatedThread.metadata,\n },\n },\n );\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_UPDATE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: id },\n },\n error,\n );\n }\n\n return updatedThread;\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n try {\n // First, delete all messages associated with the thread\n const collectionMessages = await this.operations.getCollection(TABLE_MESSAGES);\n await collectionMessages.deleteMany({ thread_id: threadId });\n // Then delete the thread itself\n const collectionThreads = await this.operations.getCollection(TABLE_THREADS);\n await collectionThreads.deleteOne({ id: threadId });\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_DELETE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n}\n","import type { TracingStrategy } from '@mastra/core/ai-tracing';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { ObservabilityStorage, TABLE_AI_SPANS } from '@mastra/core/storage';\nimport type {\n AISpanRecord,\n AITraceRecord,\n AITracesPaginatedArg,\n CreateAISpanRecord,\n PaginationInfo,\n UpdateAISpanRecord,\n} from '@mastra/core/storage';\nimport type { StoreOperationsMongoDB } from '../operations';\n\nexport class ObservabilityMongoDB extends ObservabilityStorage {\n private operations: StoreOperationsMongoDB;\n\n constructor({ operations }: { operations: StoreOperationsMongoDB }) {\n super();\n this.operations = operations;\n }\n\n public get aiTracingStrategy(): {\n preferred: TracingStrategy;\n supported: TracingStrategy[];\n } {\n return {\n preferred: 'batch-with-updates',\n supported: ['batch-with-updates', 'insert-only'],\n };\n }\n\n async createAISpan(span: CreateAISpanRecord): Promise<void> {\n try {\n const startedAt = span.startedAt instanceof Date ? span.startedAt.toISOString() : span.startedAt;\n const endedAt = span.endedAt instanceof Date ? span.endedAt.toISOString() : span.endedAt;\n\n const record = {\n ...span,\n startedAt,\n endedAt,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n return this.operations.insert({ tableName: TABLE_AI_SPANS, record });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_CREATE_AI_SPAN_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n spanId: span.spanId,\n traceId: span.traceId,\n spanType: span.spanType,\n spanName: span.name,\n },\n },\n error,\n );\n }\n }\n\n async getAITrace(traceId: string): Promise<AITraceRecord | null> {\n try {\n const collection = await this.operations.getCollection(TABLE_AI_SPANS);\n\n const spans = await collection.find({ traceId }).sort({ startedAt: -1 }).toArray();\n\n if (!spans || spans.length === 0) {\n return null;\n }\n\n return {\n traceId,\n spans: spans.map((span: any) => this.transformSpanFromMongo(span)),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_GET_AI_TRACE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n traceId,\n },\n },\n error,\n );\n }\n }\n\n async updateAISpan({\n spanId,\n traceId,\n updates,\n }: {\n spanId: string;\n traceId: string;\n updates: Partial<UpdateAISpanRecord>;\n }): Promise<void> {\n try {\n const data = { ...updates };\n if (data.endedAt instanceof Date) {\n data.endedAt = data.endedAt.toISOString() as any;\n }\n if (data.startedAt instanceof Date) {\n data.startedAt = data.startedAt.toISOString() as any;\n }\n\n // Add updatedAt timestamp\n const updateData = {\n ...data,\n updatedAt: new Date().toISOString(),\n };\n\n await this.operations.update({\n tableName: TABLE_AI_SPANS,\n keys: { spanId, traceId },\n data: updateData,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_UPDATE_AI_SPAN_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n spanId,\n traceId,\n },\n },\n error,\n );\n }\n }\n\n async getAITracesPaginated({\n filters,\n pagination,\n }: AITracesPaginatedArg): Promise<{ pagination: PaginationInfo; spans: AISpanRecord[] }> {\n const page = pagination?.page ?? 0;\n const perPage = pagination?.perPage ?? 10;\n const { entityId, entityType, ...actualFilters } = filters || {};\n\n try {\n const collection = await this.operations.getCollection(TABLE_AI_SPANS);\n\n // Build MongoDB query filter\n const mongoFilter: Record<string, any> = {\n parentSpanId: null, // Only get root spans for traces\n ...actualFilters,\n };\n\n // Handle date range filtering\n if (pagination?.dateRange) {\n const dateFilter: Record<string, any> = {};\n if (pagination.dateRange.start) {\n dateFilter.$gte =\n pagination.dateRange.start instanceof Date\n ? pagination.dateRange.start.toISOString()\n : pagination.dateRange.start;\n }\n if (pagination.dateRange.end) {\n dateFilter.$lte =\n pagination.dateRange.end instanceof Date\n ? pagination.dateRange.end.toISOString()\n : pagination.dateRange.end;\n }\n if (Object.keys(dateFilter).length > 0) {\n mongoFilter.startedAt = dateFilter;\n }\n }\n\n // Handle entity filtering\n if (entityId && entityType) {\n let name = '';\n if (entityType === 'workflow') {\n name = `workflow run: '${entityId}'`;\n } else if (entityType === 'agent') {\n name = `agent run: '${entityId}'`;\n } else {\n const error = new MastraError({\n id: 'MONGODB_STORE_GET_AI_TRACES_PAGINATED_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n entityType,\n },\n text: `Cannot filter by entity type: ${entityType}`,\n });\n throw error;\n }\n mongoFilter.name = name;\n }\n\n // Get total count\n const count = await collection.countDocuments(mongoFilter);\n\n if (count === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage,\n hasMore: false,\n },\n spans: [],\n };\n }\n\n // Get paginated spans\n const spans = await collection\n .find(mongoFilter)\n .sort({ startedAt: -1 })\n .skip(page * perPage)\n .limit(perPage)\n .toArray();\n\n return {\n pagination: {\n total: count,\n page,\n perPage,\n hasMore: spans.length === perPage,\n },\n spans: spans.map((span: any) => this.transformSpanFromMongo(span)),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_GET_AI_TRACES_PAGINATED_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchCreateAISpans(args: { records: CreateAISpanRecord[] }): Promise<void> {\n try {\n const records = args.records.map(record => {\n const startedAt = record.startedAt instanceof Date ? record.startedAt.toISOString() : record.startedAt;\n const endedAt = record.endedAt instanceof Date ? record.endedAt.toISOString() : record.endedAt;\n\n return {\n ...record,\n startedAt,\n endedAt,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n });\n\n return this.operations.batchInsert({\n tableName: TABLE_AI_SPANS,\n records,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_BATCH_CREATE_AI_SPANS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchUpdateAISpans(args: {\n records: {\n traceId: string;\n spanId: string;\n updates: Partial<UpdateAISpanRecord>;\n }[];\n }): Promise<void> {\n try {\n return this.operations.batchUpdate({\n tableName: TABLE_AI_SPANS,\n updates: args.records.map(record => {\n const data: Partial<UpdateAISpanRecord> = { ...record.updates };\n\n if (data.endedAt instanceof Date) {\n data.endedAt = data.endedAt.toISOString() as any;\n }\n if (data.startedAt instanceof Date) {\n data.startedAt = data.startedAt.toISOString() as any;\n }\n\n // Add updatedAt timestamp\n const updateData = {\n ...data,\n updatedAt: new Date().toISOString(),\n };\n\n return {\n keys: { spanId: record.spanId, traceId: record.traceId },\n data: updateData,\n };\n }),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_BATCH_UPDATE_AI_SPANS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchDeleteAITraces(args: { traceIds: string[] }): Promise<void> {\n try {\n const collection = await this.operations.getCollection(TABLE_AI_SPANS);\n\n await collection.deleteMany({\n traceId: { $in: args.traceIds },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_BATCH_DELETE_AI_TRACES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n /**\n * Transform MongoDB document to AISpanRecord format\n */\n private transformSpanFromMongo(doc: any): AISpanRecord {\n // Remove MongoDB's _id field and return clean span record\n const { _id, ...span } = doc;\n\n // Ensure dates are properly formatted\n if (span.startedAt && typeof span.startedAt === 'string') {\n span.startedAt = span.startedAt;\n }\n if (span.endedAt && typeof span.endedAt === 'string') {\n span.endedAt = span.endedAt;\n }\n if (span.createdAt && typeof span.createdAt === 'string') {\n span.createdAt = new Date(span.createdAt);\n }\n if (span.updatedAt && typeof span.updatedAt === 'string') {\n span.updatedAt = new Date(span.updatedAt);\n }\n\n return span as AISpanRecord;\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { safelyParseJSON, StoreOperations, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport type { ConnectorHandler } from '../../connectors/base';\n\nexport interface MongoDBOperationsConfig {\n connector: ConnectorHandler;\n}\nexport class StoreOperationsMongoDB extends StoreOperations {\n readonly #connector: ConnectorHandler;\n\n constructor(config: MongoDBOperationsConfig) {\n super();\n this.#connector = config.connector;\n }\n\n async getCollection(collectionName: string) {\n return this.#connector.getCollection(collectionName);\n }\n\n async hasColumn(_table: string, _column: string): Promise<boolean> {\n // MongoDB is schemaless, so we can assume any column exists\n // We could check a sample document, but for now return true\n return true;\n }\n\n async createTable(): Promise<void> {\n // Nothing to do here, MongoDB is schemaless\n }\n\n async alterTable(_args: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n // Nothing to do here, MongoDB is schemaless\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n const collection = await this.getCollection(tableName);\n await collection.deleteMany({});\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_CLEAR_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n this.logger.error(mastraError.message);\n this.logger?.trackException(mastraError);\n throw mastraError;\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n const collection = await this.getCollection(tableName);\n await collection.drop();\n } catch (error) {\n // Collection might not exist, which is fine\n if (error instanceof Error && error.message.includes('ns not found')) {\n return;\n }\n throw new MastraError(\n {\n id: 'MONGODB_STORE_DROP_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n private processJsonbFields(tableName: TABLE_NAMES, record: Record<string, any>): Record<string, any> {\n const schema = TABLE_SCHEMAS[tableName];\n\n // If no schema is found, return the record as-is (MongoDB can handle dynamic schemas)\n if (!schema) {\n return record;\n }\n\n return Object.fromEntries(\n Object.entries(schema).map(([key, value]) => {\n if (value.type === 'jsonb' && record[key] && typeof record[key] === 'string') {\n return [key, safelyParseJSON(record[key])];\n }\n return [key, record[key]];\n }),\n );\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n try {\n const collection = await this.getCollection(tableName);\n const recordToInsert = this.processJsonbFields(tableName, record);\n await collection.insertOne(recordToInsert);\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n this.logger.error(mastraError.message);\n this.logger?.trackException(mastraError);\n throw mastraError;\n }\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n if (!records.length) {\n return;\n }\n\n try {\n const collection = await this.getCollection(tableName);\n const processedRecords = records.map(record => this.processJsonbFields(tableName, record));\n await collection.insertMany(processedRecords);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_BATCH_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n this.logger.info(`Loading ${tableName} with keys ${JSON.stringify(keys)}`);\n try {\n const collection = await this.getCollection(tableName);\n return (await collection.find(keys).toArray()) as R;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_LOAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async update({\n tableName,\n keys,\n data,\n }: {\n tableName: TABLE_NAMES;\n keys: Record<string, any>;\n data: Record<string, any>;\n }): Promise<void> {\n try {\n const collection = await this.getCollection(tableName);\n const processedData = this.processJsonbFields(tableName, data);\n\n // Filter out undefined values to prevent MongoDB from removing fields\n const cleanData = Object.fromEntries(Object.entries(processedData).filter(([_, value]) => value !== undefined));\n\n await collection.updateOne(keys, { $set: cleanData });\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_UPDATE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async batchUpdate({\n tableName,\n updates,\n }: {\n tableName: TABLE_NAMES;\n updates: Array<{\n keys: Record<string, any>;\n data: Record<string, any>;\n }>;\n }): Promise<void> {\n if (!updates.length) {\n return;\n }\n\n try {\n const collection = await this.getCollection(tableName);\n const bulkOps = updates.map(({ keys, data }) => {\n const processedData = this.processJsonbFields(tableName, data);\n\n // Filter out undefined values to prevent MongoDB from removing fields\n const cleanData = Object.fromEntries(Object.entries(processedData).filter(([_, value]) => value !== undefined));\n\n return {\n updateOne: {\n filter: keys,\n update: { $set: cleanData },\n },\n };\n });\n\n await collection.bulkWrite(bulkOps);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_BATCH_UPDATE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { ScoreRowData, ScoringEntityType, ScoringSource, ValidatedSaveScorePayload } from '@mastra/core/scores';\nimport { saveScorePayloadSchema } from '@mastra/core/scores';\nimport { ScoresStorage, TABLE_SCORERS, safelyParseJSON } from '@mastra/core/storage';\nimport type { PaginationInfo, StoragePagination } from '@mastra/core/storage';\nimport type { StoreOperationsMongoDB } from '../operations';\n\nfunction transformScoreRow(row: Record<string, any>): ScoreRowData {\n let scorerValue: any = null;\n if (row.scorer) {\n try {\n scorerValue = typeof row.scorer === 'string' ? safelyParseJSON(row.scorer) : row.scorer;\n } catch (e) {\n console.warn('Failed to parse scorer:', e);\n }\n }\n\n let preprocessStepResultValue: any = null;\n if (row.preprocessStepResult) {\n try {\n preprocessStepResultValue =\n typeof row.preprocessStepResult === 'string'\n ? safelyParseJSON(row.preprocessStepResult)\n : row.preprocessStepResult;\n } catch (e) {\n console.warn('Failed to parse preprocessStepResult:', e);\n }\n }\n\n let analyzeStepResultValue: any = null;\n if (row.analyzeStepResult) {\n try {\n analyzeStepResultValue =\n typeof row.analyzeStepResult === 'string' ? safelyParseJSON(row.analyzeStepResult) : row.analyzeStepResult;\n } catch (e) {\n console.warn('Failed to parse analyzeStepResult:', e);\n }\n }\n\n let inputValue: any = null;\n if (row.input) {\n try {\n inputValue = typeof row.input === 'string' ? safelyParseJSON(row.input) : row.input;\n } catch (e) {\n console.warn('Failed to parse input:', e);\n }\n }\n\n let outputValue: any = null;\n if (row.output) {\n try {\n outputValue = typeof row.output === 'string' ? safelyParseJSON(row.output) : row.output;\n } catch (e) {\n console.warn('Failed to parse output:', e);\n }\n }\n\n let entityValue: any = null;\n if (row.entity) {\n try {\n entityValue = typeof row.entity === 'string' ? safelyParseJSON(row.entity) : row.entity;\n } catch (e) {\n console.warn('Failed to parse entity:', e);\n }\n }\n\n let runtimeContextValue: any = null;\n if (row.runtimeContext) {\n try {\n runtimeContextValue =\n typeof row.runtimeContext === 'string' ? safelyParseJSON(row.runtimeContext) : row.runtimeContext;\n } catch (e) {\n console.warn('Failed to parse runtimeContext:', e);\n }\n }\n\n let metadataValue: any = null;\n if (row.metadata) {\n try {\n metadataValue = typeof row.metadata === 'string' ? safelyParseJSON(row.metadata) : row.metadata;\n } catch (e) {\n console.warn('Failed to parse metadata:', e);\n }\n }\n\n return {\n id: row.id as string,\n entityId: row.entityId as string,\n entityType: row.entityType as ScoringEntityType,\n scorerId: row.scorerId as string,\n traceId: row.traceId as string,\n spanId: row.spanId as string,\n runId: row.runId as string,\n scorer: scorerValue,\n preprocessStepResult: preprocessStepResultValue,\n preprocessPrompt: row.preprocessPrompt as string,\n analyzeStepResult: analyzeStepResultValue,\n generateScorePrompt: row.generateScorePrompt as string,\n score: row.score as number,\n analyzePrompt: row.analyzePrompt as string,\n reasonPrompt: row.reasonPrompt as string,\n metadata: metadataValue,\n input: inputValue,\n output: outputValue,\n additionalContext: row.additionalContext,\n runtimeContext: runtimeContextValue,\n entity: entityValue,\n source: row.source as ScoringSource,\n resourceId: row.resourceId as string,\n threadId: row.threadId as string,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n };\n}\n\nexport class ScoresStorageMongoDB extends ScoresStorage {\n private operations: StoreOperationsMongoDB;\n\n constructor({ operations }: { operations: StoreOperationsMongoDB }) {\n super();\n this.operations = operations;\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const collection = await this.operations.getCollection(TABLE_SCORERS);\n const document = await collection.findOne({ id });\n\n if (!document) {\n return null;\n }\n\n return transformScoreRow(document);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_SCORE_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async saveScore(score: Omit<ScoreRowData, 'id' | 'createdAt' | 'updatedAt'>): Promise<{ score: ScoreRowData }> {\n let validatedScore: ValidatedSaveScorePayload;\n try {\n validatedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_SAVE_SCORE_VALIDATION_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n try {\n const now = new Date();\n const scoreId = `score-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n const scoreData = {\n id: scoreId,\n entityId: validatedScore.entityId,\n entityType: validatedScore.entityType,\n scorerId: validatedScore.scorerId,\n traceId: validatedScore.traceId || '',\n spanId: validatedScore.spanId || '',\n runId: validatedScore.runId,\n scorer:\n typeof validatedScore.scorer === 'string' ? safelyParseJSON(validatedScore.scorer) : validatedScore.scorer,\n preprocessStepResult:\n typeof validatedScore.preprocessStepResult === 'string'\n ? safelyParseJSON(validatedScore.preprocessStepResult)\n : validatedScore.preprocessStepResult,\n analyzeStepResult:\n typeof validatedScore.analyzeStepResult === 'string'\n ? safelyParseJSON(validatedScore.analyzeStepResult)\n : validatedScore.analyzeStepResult,\n score: validatedScore.score,\n reason: validatedScore.reason,\n preprocessPrompt: validatedScore.preprocessPrompt,\n generateScorePrompt: validatedScore.generateScorePrompt,\n generateReasonPrompt: validatedScore.generateReasonPrompt,\n analyzePrompt: validatedScore.analyzePrompt,\n input: typeof validatedScore.input === 'string' ? safelyParseJSON(validatedScore.input) : validatedScore.input,\n output:\n typeof validatedScore.output === 'string' ? safelyParseJSON(validatedScore.output) : validatedScore.output,\n additionalContext: validatedScore.additionalContext,\n runtimeContext:\n typeof validatedScore.runtimeContext === 'string'\n ? safelyParseJSON(validatedScore.runtimeContext)\n : validatedScore.runtimeContext,\n entity:\n typeof validatedScore.entity === 'string' ? safelyParseJSON(validatedScore.entity) : validatedScore.entity,\n source: validatedScore.source,\n resourceId: validatedScore.resourceId || '',\n threadId: validatedScore.threadId || '',\n createdAt: now,\n updatedAt: now,\n };\n\n const collection = await this.operations.getCollection(TABLE_SCORERS);\n await collection.insertOne(scoreData);\n\n const savedScore: ScoreRowData = {\n ...score,\n id: scoreId,\n createdAt: now,\n updatedAt: now,\n };\n\n return { score: savedScore };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_SAVE_SCORE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerId: score.scorerId, runId: score.runId },\n },\n error,\n );\n }\n }\n\n async getScoresByScorerId({\n scorerId,\n pagination,\n entityId,\n entityType,\n source,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const query: any = { scorerId };\n\n if (entityId) {\n query.entityId = entityId;\n }\n\n if (entityType) {\n query.entityType = entityType;\n }\n\n if (source) {\n query.source = source;\n }\n\n const collection = await this.operations.getCollection(TABLE_SCORERS);\n const total = await collection.countDocuments(query);\n const currentOffset = pagination.page * pagination.perPage;\n\n if (total === 0) {\n return {\n scores: [],\n pagination: {\n total: 0,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: false,\n },\n };\n }\n\n const documents = await collection\n .find(query)\n .sort({ createdAt: 'desc' })\n .skip(currentOffset)\n .limit(pagination.perPage)\n .toArray();\n\n const scores = documents.map(row => transformScoreRow(row));\n const hasMore = currentOffset + scores.length < total;\n\n return {\n scores,\n pagination: {\n total,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_SCORES_BY_SCORER_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerId, page: pagination.page, perPage: pagination.perPage },\n },\n error,\n );\n }\n }\n\n async getScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const collection = await this.operations.getCollection(TABLE_SCORERS);\n const total = await collection.countDocuments({ runId });\n const currentOffset = pagination.page * pagination.perPage;\n\n if (total === 0) {\n return {\n scores: [],\n pagination: {\n total: 0,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: false,\n },\n };\n }\n\n const documents = await collection\n .find({ runId })\n .sort({ createdAt: 'desc' })\n .skip(currentOffset)\n .limit(pagination.perPage)\n .toArray();\n\n const scores = documents.map(row => transformScoreRow(row));\n const hasMore = currentOffset + scores.length < total;\n\n return {\n scores,\n pagination: {\n total,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_SCORES_BY_RUN_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, page: pagination.page, perPage: pagination.perPage },\n },\n error,\n );\n }\n }\n\n async getScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const collection = await this.operations.getCollection(TABLE_SCORERS);\n const total = await collection.countDocuments({ entityId, entityType });\n const currentOffset = pagination.page * pagination.perPage;\n\n if (total === 0) {\n return {\n scores: [],\n pagination: {\n total: 0,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: false,\n },\n };\n }\n\n const documents = await collection\n .find({ entityId, entityType })\n .sort({ createdAt: 'desc' })\n .skip(currentOffset)\n .limit(pagination.perPage)\n .toArray();\n\n const scores = documents.map(row => transformScoreRow(row));\n const hasMore = currentOffset + scores.length < total;\n\n return {\n scores,\n pagination: {\n total,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_SCORES_BY_ENTITY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityId, entityType, page: pagination.page, perPage: pagination.perPage },\n },\n error,\n );\n }\n }\n\n async getScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const query = { traceId, spanId };\n const collection = await this.operations.getCollection(TABLE_SCORERS);\n const total = await collection.countDocuments(query);\n const currentOffset = pagination.page * pagination.perPage;\n\n if (total === 0) {\n return {\n scores: [],\n pagination: {\n total: 0,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: false,\n },\n };\n }\n\n const documents = await collection\n .find(query)\n .sort({ createdAt: 'desc' })\n .skip(currentOffset)\n .limit(pagination.perPage)\n .toArray();\n\n const scores = documents.map(row => transformScoreRow(row));\n const hasMore = currentOffset + scores.length < total;\n\n return {\n scores,\n pagination: {\n total,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_SCORES_BY_SPAN_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId, spanId, page: pagination.page, perPage: pagination.perPage },\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { PaginationInfo, StorageGetTracesArg, StorageGetTracesPaginatedArg } from '@mastra/core/storage';\nimport { TABLE_TRACES, TracesStorage, safelyParseJSON } from '@mastra/core/storage';\nimport type { Trace } from '@mastra/core/telemetry';\nimport type { StoreOperationsMongoDB } from '../operations';\n\nexport class TracesStorageMongoDB extends TracesStorage {\n private operations: StoreOperationsMongoDB;\n\n constructor({ operations }: { operations: StoreOperationsMongoDB }) {\n super();\n this.operations = operations;\n }\n\n async getTraces(args: StorageGetTracesArg): Promise<Trace[]> {\n if (args.fromDate || args.toDate) {\n (args as any).dateRange = {\n start: args.fromDate,\n end: args.toDate,\n };\n }\n try {\n const result = await this.getTracesPaginated(args);\n return result.traces;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_TRACES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getTracesPaginated(args: StorageGetTracesPaginatedArg): Promise<PaginationInfo & { traces: Trace[] }> {\n const { name, scope, page = 0, perPage = 100, attributes, filters, dateRange } = args;\n const fromDate = dateRange?.start;\n const toDate = dateRange?.end;\n const currentOffset = page * perPage;\n\n const query: any = {};\n if (name) {\n query['name'] = new RegExp(name);\n }\n\n if (scope) {\n query['scope'] = scope;\n }\n\n if (attributes) {\n query['$and'] = Object.entries(attributes).map(([key, value]) => ({\n [`attributes.${key}`]: value,\n }));\n }\n\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n query[key] = value;\n });\n }\n\n if (fromDate || toDate) {\n query['createdAt'] = {};\n if (fromDate) {\n query['createdAt']['$gte'] = fromDate;\n }\n if (toDate) {\n query['createdAt']['$lte'] = toDate;\n }\n }\n\n try {\n const collection = await this.operations.getCollection(TABLE_TRACES);\n\n // Get total count\n const total = await collection.countDocuments(query);\n\n if (total === 0) {\n return {\n traces: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n // Get results with pagination\n const result = await collection\n .find(query, {\n sort: { startTime: -1 },\n })\n .limit(perPage)\n .skip(currentOffset)\n .toArray();\n\n const traces = result.map(row => ({\n id: row.id,\n parentSpanId: row.parentSpanId,\n traceId: row.traceId,\n name: row.name,\n scope: row.scope,\n kind: row.kind,\n status: safelyParseJSON(row.status),\n events: safelyParseJSON(row.events),\n links: safelyParseJSON(row.links),\n attributes: safelyParseJSON(row.attributes),\n startTime: row.startTime,\n endTime: row.endTime,\n other: safelyParseJSON(row.other),\n createdAt: row.createdAt,\n })) as Trace[];\n\n return {\n traces,\n total,\n page,\n perPage,\n hasMore: currentOffset + traces.length < total,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_TRACES_PAGINATED_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async batchTraceInsert({ records }: { records: Record<string, any>[] }): Promise<void> {\n this.logger.debug('Batch inserting traces', { count: records.length });\n await this.operations.batchInsert({\n tableName: TABLE_TRACES,\n records,\n });\n }\n}\n","import { ErrorDomain, ErrorCategory, MastraError } from '@mastra/core/error';\nimport { WorkflowsStorage, TABLE_WORKFLOW_SNAPSHOT, safelyParseJSON } from '@mastra/core/storage';\nimport type { WorkflowRun, WorkflowRuns } from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport type { StoreOperationsMongoDB } from '../operations';\n\nexport class WorkflowsStorageMongoDB extends WorkflowsStorage {\n private operations: StoreOperationsMongoDB;\n\n constructor({ operations }: { operations: StoreOperationsMongoDB }) {\n super();\n this.operations = operations;\n }\n\n updateWorkflowResults(\n {\n // workflowName,\n // runId,\n // stepId,\n // result,\n // runtimeContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n runtimeContext: Record<string, any>;\n },\n ): Promise<Record<string, StepResult<any, any, any, any>>> {\n throw new Error('Method not implemented.');\n }\n updateWorkflowState(\n {\n // workflowName,\n // runId,\n // opts,\n }: {\n workflowName: string;\n runId: string;\n opts: {\n status: string;\n result?: StepResult<any, any, any, any>;\n error?: string;\n suspendedPaths?: Record<string, number[]>;\n waitingPaths?: Record<string, number[]>;\n };\n },\n ): Promise<WorkflowRunState | undefined> {\n throw new Error('Method not implemented.');\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n try {\n const collection = await this.operations.getCollection(TABLE_WORKFLOW_SNAPSHOT);\n await collection.updateOne(\n { workflow_name: workflowName, run_id: runId },\n {\n $set: {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot,\n createdAt: new Date(),\n updatedAt: new Date(),\n },\n },\n { upsert: true },\n );\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_PERSIST_WORKFLOW_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n try {\n const result = await this.operations.load<any[]>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: {\n workflow_name: workflowName,\n run_id: runId,\n },\n });\n\n if (!result?.length) {\n return null;\n }\n\n return typeof result[0].snapshot === 'string' ? safelyParseJSON(result[0].snapshot) : result[0].snapshot;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_LOAD_WORKFLOW_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async getWorkflowRuns(args?: {\n workflowName?: string;\n fromDate?: Date;\n toDate?: Date;\n limit?: number;\n offset?: number;\n resourceId?: string;\n }): Promise<WorkflowRuns> {\n const options = args || {};\n try {\n const query: any = {};\n if (options.workflowName) {\n query['workflow_name'] = options.workflowName;\n }\n if (options.fromDate) {\n query['createdAt'] = { $gte: options.fromDate };\n }\n if (options.toDate) {\n if (query['createdAt']) {\n query['createdAt'].$lte = options.toDate;\n } else {\n query['createdAt'] = { $lte: options.toDate };\n }\n }\n if (options.resourceId) {\n query['resourceId'] = options.resourceId;\n }\n\n const collection = await this.operations.getCollection(TABLE_WORKFLOW_SNAPSHOT);\n const total = await collection.countDocuments(query);\n\n let cursor = collection.find(query).sort({ createdAt: -1 });\n if (options.offset) {\n cursor = cursor.skip(options.offset);\n }\n if (options.limit) {\n cursor = cursor.limit(options.limit);\n }\n\n const results = await cursor.toArray();\n\n const runs = results.map(row => this.parseWorkflowRun(row));\n\n return {\n runs,\n total,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_WORKFLOW_RUNS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName: options.workflowName || 'unknown' },\n },\n error,\n );\n }\n }\n\n async getWorkflowRunById(args: { runId: string; workflowName?: string }): Promise<WorkflowRun | null> {\n try {\n const query: any = {};\n if (args.runId) {\n query['run_id'] = args.runId;\n }\n if (args.workflowName) {\n query['workflow_name'] = args.workflowName;\n }\n\n const collection = await this.operations.getCollection(TABLE_WORKFLOW_SNAPSHOT);\n const result = await collection.findOne(query);\n if (!result) {\n return null;\n }\n\n return this.parseWorkflowRun(result);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_WORKFLOW_RUN_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId: args.runId },\n },\n error,\n );\n }\n }\n\n private parseWorkflowRun(row: any): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\n if (typeof parsedSnapshot === 'string') {\n try {\n parsedSnapshot = typeof row.snapshot === 'string' ? safelyParseJSON(row.snapshot as string) : row.snapshot;\n } catch (e) {\n // If parsing fails, return the raw snapshot string\n console.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n }\n }\n\n return {\n workflowName: row.workflow_name as string,\n runId: row.run_id as string,\n snapshot: parsedSnapshot,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n resourceId: row.resourceId,\n };\n }\n}\n","import type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraMessageV2, StorageThreadType } from '@mastra/core/memory';\nimport type { ScoreRowData, ScoringSource } from '@mastra/core/scores';\nimport type {\n EvalRow,\n PaginationArgs,\n PaginationInfo,\n StorageColumn,\n StorageDomains,\n StorageGetMessagesArg,\n StorageGetTracesArg,\n StorageGetTracesPaginatedArg,\n StoragePagination,\n StorageResourceType,\n TABLE_NAMES,\n WorkflowRun,\n WorkflowRuns,\n AISpanRecord,\n AITraceRecord,\n AITracesPaginatedArg,\n CreateAISpanRecord,\n UpdateAISpanRecord,\n} from '@mastra/core/storage';\nimport { MastraStorage } from '@mastra/core/storage';\nimport type { Trace } from '@mastra/core/telemetry';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { MongoDBConnector } from './connectors/MongoDBConnector';\nimport { LegacyEvalsMongoDB } from './domains/legacy-evals';\nimport { MemoryStorageMongoDB } from './domains/memory';\nimport { ObservabilityMongoDB } from './domains/observability';\nimport { StoreOperationsMongoDB } from './domains/operations';\nimport { ScoresStorageMongoDB } from './domains/scores';\nimport { TracesStorageMongoDB } from './domains/traces';\nimport { WorkflowsStorageMongoDB } from './domains/workflows';\nimport type { MongoDBConfig } from './types';\n\nconst loadConnector = (config: MongoDBConfig): MongoDBConnector => {\n try {\n if ('connectorHandler' in config) {\n return MongoDBConnector.fromConnectionHandler(config.connectorHandler);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_CONSTRUCTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { connectionHandler: true },\n },\n error,\n );\n }\n\n try {\n return MongoDBConnector.fromDatabaseConfig({\n options: config.options,\n url: config.url,\n dbName: config.dbName,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_CONSTRUCTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { url: config?.url, dbName: config?.dbName },\n },\n error,\n );\n }\n};\n\nexport class MongoDBStore extends MastraStorage {\n #connector: MongoDBConnector;\n\n stores: StorageDomains;\n\n public get supports(): {\n selectByIncludeResourceScope: boolean;\n resourceWorkingMemory: boolean;\n hasColumn: boolean;\n createTable: boolean;\n deleteMessages: boolean;\n getScoresBySpan: boolean;\n } {\n return {\n selectByIncludeResourceScope: true,\n resourceWorkingMemory: true,\n hasColumn: false,\n createTable: false,\n deleteMessages: false,\n getScoresBySpan: true,\n };\n }\n\n constructor(config: MongoDBConfig) {\n super({ name: 'MongoDBStore' });\n\n this.stores = {} as StorageDomains;\n\n this.#connector = loadConnector(config);\n\n const operations = new StoreOperationsMongoDB({\n connector: this.#connector,\n });\n\n const memory = new MemoryStorageMongoDB({\n operations,\n });\n\n const traces = new TracesStorageMongoDB({\n operations,\n });\n\n const legacyEvals = new LegacyEvalsMongoDB({\n operations,\n });\n\n const scores = new ScoresStorageMongoDB({\n operations,\n });\n\n const workflows = new WorkflowsStorageMongoDB({\n operations,\n });\n\n const observability = new ObservabilityMongoDB({\n operations,\n });\n\n this.stores = {\n operations,\n memory,\n traces,\n legacyEvals,\n scores,\n workflows,\n observability,\n };\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n return this.stores.operations.createTable({ tableName, schema });\n }\n\n async alterTable(_args: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n return this.stores.operations.alterTable(_args);\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.dropTable({ tableName });\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.clearTable({ tableName });\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n return this.stores.operations.insert({ tableName, record });\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n return this.stores.operations.batchInsert({ tableName, records });\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n return this.stores.operations.load({ tableName, keys });\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n return this.stores.memory.getThreadById({ threadId });\n }\n\n async getThreadsByResourceId({ resourceId }: { resourceId: string }): Promise<StorageThreadType[]> {\n return this.stores.memory.getThreadsByResourceId({ resourceId });\n }\n\n async getThreadsByResourceIdPaginated(_args: {\n resourceId: string;\n page: number;\n perPage: number;\n }): Promise<PaginationInfo & { threads: StorageThreadType[] }> {\n return this.stores.memory.getThreadsByResourceIdPaginated(_args);\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n return this.stores.memory.saveThread({ thread });\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n return this.stores.memory.updateThread({ id, title, metadata });\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n return this.stores.memory.deleteThread({ threadId });\n }\n\n public async getMessages(args: StorageGetMessagesArg & { format?: 'v1' }): Promise<MastraMessageV1[]>;\n public async getMessages(args: StorageGetMessagesArg & { format: 'v2' }): Promise<MastraMessageV2[]>;\n public async getMessages({\n threadId,\n selectBy,\n format,\n }: StorageGetMessagesArg & {\n format?: 'v1' | 'v2';\n }): Promise<MastraMessageV1[] | MastraMessageV2[]> {\n return this.stores.memory.getMessages({ threadId, selectBy, format });\n }\n\n async getMessagesPaginated(\n _args: StorageGetMessagesArg,\n ): Promise<PaginationInfo & { messages: MastraMessageV1[] | MastraMessageV2[] }> {\n return this.stores.memory.getMessagesPaginated(_args);\n }\n\n async getMessagesById({ messageIds, format }: { messageIds: string[]; format: 'v1' }): Promise<MastraMessageV1[]>;\n async getMessagesById({ messageIds, format }: { messageIds: string[]; format?: 'v2' }): Promise<MastraMessageV2[]>;\n async getMessagesById({\n messageIds,\n format,\n }: {\n messageIds: string[];\n format?: 'v1' | 'v2';\n }): Promise<MastraMessageV1[] | MastraMessageV2[]> {\n return this.stores.memory.getMessagesById({ messageIds, format });\n }\n\n async saveMessages(args: { messages: MastraMessageV1[]; format?: undefined | 'v1' }): Promise<MastraMessageV1[]>;\n async saveMessages(args: { messages: MastraMessageV2[]; format: 'v2' }): Promise<MastraMessageV2[]>;\n async saveMessages(\n args: { messages: MastraMessageV1[]; format?: undefined | 'v1' } | { messages: MastraMessageV2[]; format: 'v2' },\n ): Promise<MastraMessageV2[] | MastraMessageV1[]> {\n return this.stores.memory.saveMessages(args);\n }\n\n async updateMessages(_args: {\n messages: Partial<Omit<MastraMessageV2, 'createdAt'>> &\n {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n }[];\n }): Promise<MastraMessageV2[]> {\n return this.stores.memory.updateMessages(_args);\n }\n\n async getTraces(args: StorageGetTracesArg): Promise<Trace[]> {\n return this.stores.traces.getTraces(args);\n }\n\n async getTracesPaginated(args: StorageGetTracesPaginatedArg): Promise<PaginationInfo & { traces: Trace[] }> {\n return this.stores.traces.getTracesPaginated(args);\n }\n\n async batchTraceInsert({ records }: { records: Record<string, any>[] }): Promise<void> {\n return this.stores.traces.batchTraceInsert({ records });\n }\n\n async getWorkflowRuns(args?: {\n workflowName?: string;\n fromDate?: Date;\n toDate?: Date;\n limit?: number;\n offset?: number;\n resourceId?: string;\n }): Promise<WorkflowRuns> {\n return this.stores.workflows.getWorkflowRuns(args);\n }\n\n async getEvals(\n options: {\n agentName?: string;\n type?: 'test' | 'live';\n } & PaginationArgs = {},\n ): Promise<PaginationInfo & { evals: EvalRow[] }> {\n return this.stores.legacyEvals.getEvals(options);\n }\n\n async getEvalsByAgentName(agentName: string, type?: 'test' | 'live'): Promise<EvalRow[]> {\n return this.stores.legacyEvals.getEvalsByAgentName(agentName, type);\n }\n\n async updateWorkflowResults({\n workflowName,\n runId,\n stepId,\n result,\n runtimeContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n runtimeContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n return this.stores.workflows.updateWorkflowResults({ workflowName, runId, stepId, result, runtimeContext });\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: {\n status: string;\n result?: StepResult<any, any, any, any>;\n error?: string;\n suspendedPaths?: Record<string, number[]>;\n waitingPaths?: Record<string, number[]>;\n };\n }): Promise<WorkflowRunState | undefined> {\n return this.stores.workflows.updateWorkflowState({ workflowName, runId, opts });\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n return this.stores.workflows.persistWorkflowSnapshot({ workflowName, runId, resourceId, snapshot });\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n return this.stores.workflows.loadWorkflowSnapshot({ workflowName, runId });\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n return this.stores.workflows.getWorkflowRunById({ runId, workflowName });\n }\n\n async close(): Promise<void> {\n try {\n await this.#connector.close();\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_CLOSE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n /**\n * SCORERS\n */\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n return this.stores.scores.getScoreById({ id });\n }\n\n async saveScore(score: Omit<ScoreRowData, 'id' | 'createdAt' | 'updatedAt'>): Promise<{ score: ScoreRowData }> {\n return this.stores.scores.saveScore(score);\n }\n\n async getScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.getScoresByRunId({ runId, pagination });\n }\n\n async getScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.getScoresByEntityId({ entityId, entityType, pagination });\n }\n\n async getScoresByScorerId({\n scorerId,\n pagination,\n entityId,\n entityType,\n source,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.getScoresByScorerId({ scorerId, pagination, entityId, entityType, source });\n }\n\n async getScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.getScoresBySpan({ traceId, spanId, pagination });\n }\n\n /**\n * RESOURCES\n */\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n return this.stores.memory.getResourceById({ resourceId });\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n return this.stores.memory.saveResource({ resource });\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n return this.stores.memory.updateResource({\n resourceId,\n workingMemory,\n metadata,\n });\n }\n\n /**\n * AI Tracing/Observability\n */\n async createAISpan(span: CreateAISpanRecord): Promise<void> {\n if (!this.stores.observability) {\n throw new MastraError({\n id: 'MONGODB_STORE_OBSERVABILITY_NOT_INITIALIZED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Observability storage is not initialized',\n });\n }\n return this.stores.observability.createAISpan(span);\n }\n\n async updateAISpan({\n spanId,\n traceId,\n updates,\n }: {\n spanId: string;\n traceId: string;\n updates: Partial<UpdateAISpanRecord>;\n }): Promise<void> {\n if (!this.stores.observability) {\n throw new MastraError({\n id: 'MONGODB_STORE_OBSERVABILITY_NOT_INITIALIZED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Observability storage is not initialized',\n });\n }\n return this.stores.observability.updateAISpan({ spanId, traceId, updates });\n }\n\n async getAITrace(traceId: string): Promise<AITraceRecord | null> {\n if (!this.stores.observability) {\n throw new MastraError({\n id: 'MONGODB_STORE_OBSERVABILITY_NOT_INITIALIZED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Observability storage is not initialized',\n });\n }\n return this.stores.observability.getAITrace(traceId);\n }\n\n async getAITracesPaginated(\n args: AITracesPaginatedArg,\n ): Promise<{ pagination: PaginationInfo; spans: AISpanRecord[] }> {\n if (!this.stores.observability) {\n throw new MastraError({\n id: 'MONGODB_STORE_OBSERVABILITY_NOT_INITIALIZED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Observability storage is not initialized',\n });\n }\n return this.stores.observability.getAITracesPaginated(args);\n }\n\n async batchCreateAISpans(args: { records: CreateAISpanRecord[] }): Promise<void> {\n if (!this.stores.observability) {\n throw new MastraError({\n id: 'MONGODB_STORE_OBSERVABILITY_NOT_INITIALIZED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Observability storage is not initialized',\n });\n }\n return this.stores.observability.batchCreateAISpans(args);\n }\n\n async batchUpdateAISpans(args: {\n records: {\n traceId: string;\n spanId: string;\n updates: Partial<UpdateAISpanRecord>;\n }[];\n }): Promise<void> {\n if (!this.stores.observability) {\n throw new MastraError({\n id: 'MONGODB_STORE_OBSERVABILITY_NOT_INITIALIZED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Observability storage is not initialized',\n });\n }\n return this.stores.observability.batchUpdateAISpans(args);\n }\n\n async batchDeleteAITraces(args: { traceIds: string[] }): Promise<void> {\n if (!this.stores.observability) {\n throw new MastraError({\n id: 'MONGODB_STORE_OBSERVABILITY_NOT_INITIALIZED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Observability storage is not initialized',\n });\n }\n return this.stores.observability.batchDeleteAITraces(args);\n }\n}\n","/**\n * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for MongoDB Vector.\n */\nexport const MONGODB_PROMPT = `When querying MongoDB Vector, you can ONLY use the operators listed below. Any other operators will be rejected.\nImportant: Don't explain how to construct the filter - use the specified operators and fields to search the content and return relevant results.\nIf a user tries to give an explicit operator that is not supported, reject the filter entirely and let them know that the operator is not supported.\n\nBasic Comparison Operators:\n- $eq: Exact match (default when using field: value)\n Example: { \"category\": \"electronics\" }\n- $ne: Not equal\n Example: { \"category\": { \"$ne\": \"electronics\" } }\n- $gt: Greater than\n Example: { \"price\": { \"$gt\": 100 } }\n- $gte: Greater than or equal\n Example: { \"price\": { \"$gte\": 100 } }\n- $lt: Less than\n Example: { \"price\": { \"$lt\": 100 } }\n- $lte: Less than or equal\n Example: { \"price\": { \"$lte\": 100 } }\n\nArray Operators:\n- $in: Match any value in array\n Example: { \"category\": { \"$in\": [\"electronics\", \"books\"] } }\n- $nin: Does not match any value in array\n Example: { \"category\": { \"$nin\": [\"electronics\", \"books\"] } }\n- $all: Match all values in array\n Example: { \"tags\": { \"$all\": [\"premium\", \"sale\"] } }\n- $elemMatch: Match array elements that meet all specified conditions\n Example: { \"items\": { \"$elemMatch\": { \"price\": { \"$gt\": 100 } } } }\n- $size: Match arrays with specific length\n Example: { \"tags\": { \"$size\": 3 } }\n\nLogical Operators:\n- $and: Logical AND (can be implicit or explicit)\n Implicit Example: { \"price\": { \"$gt\": 100 }, \"category\": \"electronics\" }\n Explicit Example: { \"$and\": [{ \"price\": { \"$gt\": 100 } }, { \"category\": \"electronics\" }] }\n- $or: Logical OR\n Example: { \"$or\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n- $not: Logical NOT\n Example: { \"$not\": { \"category\": \"electronics\" } }\n- $nor: Logical NOR\n Example: { \"$nor\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n- $type: Check field type\n Example: { \"price\": { \"$type\": \"number\" } }\n\nText Search Operators:\n- $text: Full text search\n Example: { \"$text\": { \"$search\": \"gaming laptop\" } }\n- $regex: Regular expression match\n Example: { \"name\": { \"$regex\": \"^Gaming\" } }\n\nRestrictions:\n- Only logical operators ($and, $or, $not, $nor) can be used at the top level\n- Empty arrays in array operators will return no results\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported\n- At least one key-value pair is required in filter object\n- Empty objects and undefined values are treated as no filter\n- Invalid types in comparison operators will throw errors\n- All non-logical operators must be used within a field condition\n Valid: { \"field\": { \"$gt\": 100 } }\n Valid: { \"$and\": [...] }\n Invalid: { \"$gt\": 100 }\n- Logical operators must contain field conditions, not direct operators\n Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n Invalid: { \"$and\": [{ \"$gt\": 100 }] }\n- Logical operators ($and, $or, $not, $nor):\n - Can only be used at top level or nested within other logical operators\n - Can not be used on a field level, or be nested inside a field\n - Can not be used inside an operator\n - Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n - Valid: { \"$or\": [{ \"$and\": [{ \"field\": { \"$gt\": 100 } }] }] }\n - Invalid: { \"field\": { \"$and\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$or\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$gt\": { \"$and\": [{...}] } } }\n\nExample Complex Query:\n{\n \"$and\": [\n { \"category\": { \"$in\": [\"electronics\", \"computers\"] } },\n { \"price\": { \"$gte\": 100, \"$lte\": 1000 } },\n { \"tags\": { \"$all\": [\"premium\", \"sale\"] } },\n { \"items\": { \"$elemMatch\": { \"price\": { \"$gt\": 50 }, \"inStock\": true } } },\n { \"$text\": { \"$search\": \"gaming laptop\" } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": true }\n ]},\n { \"$not\": { \"status\": \"discontinued\" } }\n ]\n}`;\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/vector/filter.ts","../src/vector/index.ts","../src/storage/connectors/MongoDBConnector.ts","../src/storage/domains/utils.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/operations/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts","../src/vector/prompt.ts"],"names":["BaseFilterTranslator","MastraVector","MongoClient","error","MastraError","ErrorDomain","ErrorCategory","uuidv4","MemoryStorage","TABLE_MESSAGES","MessageList","normalizePerPage","calculatePagination","TABLE_THREADS","TABLE_RESOURCES","safelyParseJSON","ObservabilityStorage","TABLE_SPANS","StoreOperations","TABLE_SCHEMAS","ScoresStorage","TABLE_SCORERS","saveScorePayloadSchema","WorkflowsStorage","TABLE_WORKFLOW_SNAPSHOT","MastraStorage"],"mappings":"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","file":"index.cjs","sourcesContent":["{\n \"name\": \"@mastra/mongodb\",\n \"version\": \"1.0.0-beta.1\",\n \"description\": \"MongoDB provider for Mastra - includes vector store capabilities\",\n \"type\": \"module\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"build\": \"tsup --silent --config tsup.config.ts\",\n \"build:watch\": \"tsup --watch --silent --config tsup.config.ts\",\n \"pretest\": \"docker compose up -d --wait\",\n \"test\": \"vitest run\",\n \"posttest\": \"docker compose down -v\",\n \"pretest:watch\": \"docker compose up -d\",\n \"test:watch\": \"vitest watch\",\n \"posttest:watch\": \"docker compose down -v\",\n \"lint\": \"eslint .\"\n },\n \"dependencies\": {\n \"@types/mongodb\": \"^4.0.7\",\n \"cloudflare\": \"^4.5.0\",\n \"mongodb\": \"^6.17.0\",\n \"uuid\": \"^11.1.0\"\n },\n \"devDependencies\": {\n \"@internal/lint\": \"workspace:*\",\n \"@internal/storage-test-utils\": \"workspace:*\",\n \"@internal/types-builder\": \"workspace:*\",\n \"@mastra/core\": \"workspace:*\",\n \"@microsoft/api-extractor\": \"^7.52.8\",\n \"@types/node\": \"22.13.17\",\n \"@vitest/coverage-v8\": \"catalog:\",\n \"@vitest/ui\": \"catalog:\",\n \"eslint\": \"^9.37.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"catalog:\"\n },\n \"peerDependencies\": {\n \"@mastra/core\": \">=1.0.0-0 <2.0.0-0\"\n },\n \"files\": [\n \"dist\",\n \"CHANGELOG.md\"\n ],\n \"homepage\": \"https://mastra.ai\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/mastra-ai/mastra.git\",\n \"directory\": \"stores/mongodb\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/mastra-ai/mastra/issues\"\n },\n \"engines\": {\n \"node\": \">=22.13.0\"\n }\n}\n","import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type {\n VectorFilter,\n OperatorSupport,\n QueryOperator,\n OperatorValueMap,\n LogicalOperatorValueMap,\n BlacklistedRootOperators,\n VectorFieldValue,\n} from '@mastra/core/vector/filter';\n\ntype MongoDBOperatorValueMap = Omit<OperatorValueMap, '$options'> & {\n $size: number;\n};\ntype MongoDBBlacklisted = BlacklistedRootOperators | '$size';\n\nexport type MongoDBVectorFilter = VectorFilter<\n keyof MongoDBOperatorValueMap,\n MongoDBOperatorValueMap,\n LogicalOperatorValueMap,\n MongoDBBlacklisted,\n VectorFieldValue | RegExp\n>;\n\n/**\n * Translator for MongoDB filter queries.\n * Maintains MongoDB-compatible syntax while ensuring proper validation\n * and normalization of values.\n */\nexport class MongoDBFilterTranslator extends BaseFilterTranslator<MongoDBVectorFilter> {\n protected override getSupportedOperators(): OperatorSupport {\n return {\n ...BaseFilterTranslator.DEFAULT_OPERATORS,\n regex: ['$regex'],\n custom: ['$size'],\n };\n }\n\n translate(filter?: MongoDBVectorFilter): any {\n if (this.isEmpty(filter)) return filter;\n this.validateFilter(filter);\n\n return this.translateNode(filter);\n }\n\n private translateNode(node: MongoDBVectorFilter): any {\n // Handle primitive values and arrays\n if (this.isRegex(node)) {\n return node; // Return regex values as-is\n }\n if (this.isPrimitive(node)) return node;\n if (Array.isArray(node)) return node;\n\n const entries = Object.entries(node as Record<string, any>);\n const translatedEntries = entries.map(([key, value]) => {\n // Handle operators\n if (this.isOperator(key)) {\n return [key, this.translateOperatorValue(key, value)];\n }\n\n // Handle nested paths and objects\n return [key, this.translateNode(value)];\n });\n\n return Object.fromEntries(translatedEntries);\n }\n\n private translateOperatorValue(operator: QueryOperator, value: any): any {\n // Handle logical operators\n if (this.isLogicalOperator(operator)) {\n if (operator === '$not') {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error('$not operator requires an object');\n }\n if (this.isEmpty(value)) {\n throw new Error('$not operator cannot be empty');\n }\n return this.translateNode(value);\n } else {\n if (!Array.isArray(value)) {\n throw new Error(`Value for logical operator ${operator} must be an array`);\n }\n return value.map(item => this.translateNode(item));\n }\n }\n\n // Handle basic and numeric operators\n if (this.isBasicOperator(operator) || this.isNumericOperator(operator)) {\n // Convert Date to ISO string\n if (value instanceof Date) {\n return value.toISOString();\n }\n return this.normalizeComparisonValue(value);\n }\n\n // Handle $elemMatch operator - place this before array operators check\n if (operator === '$elemMatch') {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(`Value for $elemMatch operator must be an object`);\n }\n return this.translateNode(value);\n }\n\n // Handle array operators\n if (this.isArrayOperator(operator)) {\n if (!Array.isArray(value)) {\n throw new Error(`Value for array operator ${operator} must be an array`);\n }\n return this.normalizeArrayValues(value);\n }\n\n // Handle element operators\n if (this.isElementOperator(operator)) {\n if (operator === '$exists' && typeof value !== 'boolean') {\n throw new Error(`Value for $exists operator must be a boolean`);\n }\n return value;\n }\n\n // Handle regex operators\n if (this.isRegexOperator(operator)) {\n if (!(value instanceof RegExp) && typeof value !== 'string') {\n throw new Error(`Value for ${operator} operator must be a RegExp or string`);\n }\n return value;\n }\n\n // Handle $size operator\n if (operator === '$size') {\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {\n throw new Error(`Value for $size operator must be a non-negative integer`);\n }\n return value;\n }\n\n // If we get here, the operator is not supported\n throw new Error(`Unsupported operator: ${operator}`);\n }\n\n isEmpty(filter: any): boolean {\n return filter === undefined || filter === null || (typeof filter === 'object' && Object.keys(filter).length === 0);\n }\n}\n","import { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n QueryResult,\n IndexStats,\n CreateIndexParams,\n UpsertVectorParams,\n QueryVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n UpdateVectorParams,\n} from '@mastra/core/vector';\nimport { MongoClient } from 'mongodb';\nimport type { MongoClientOptions, Document, Db, Collection } from 'mongodb';\nimport { v4 as uuidv4 } from 'uuid';\nimport packageJson from '../../package.json';\n\nimport { MongoDBFilterTranslator } from './filter';\nimport type { MongoDBVectorFilter } from './filter';\n\n// Define necessary types and interfaces\nexport interface MongoDBUpsertVectorParams extends UpsertVectorParams {\n documents?: string[];\n}\n\ninterface MongoDBQueryVectorParams extends QueryVectorParams<MongoDBVectorFilter> {\n documentFilter?: MongoDBVectorFilter;\n}\n\nexport interface MongoDBIndexReadyParams {\n indexName: string;\n timeoutMs?: number;\n checkIntervalMs?: number;\n}\n\n// Define the document interface\ninterface MongoDBDocument extends Document {\n _id: string; // Explicitly declare '_id' as string\n embedding?: number[];\n metadata?: Record<string, any>;\n document?: string;\n [key: string]: any; // Index signature for additional properties\n}\n// The MongoDBVector class\nexport class MongoDBVector extends MastraVector<MongoDBVectorFilter> {\n private client: MongoClient;\n private db: Db;\n private collections: Map<string, Collection<MongoDBDocument>>;\n private readonly embeddingFieldName = 'embedding';\n private readonly metadataFieldName = 'metadata';\n private readonly documentFieldName = 'document';\n private collectionForValidation: Collection<MongoDBDocument> | null = null;\n private mongoMetricMap: { [key: string]: string } = {\n cosine: 'cosine',\n euclidean: 'euclidean',\n dotproduct: 'dotProduct',\n };\n\n constructor({ id, uri, dbName, options }: { id: string; uri: string; dbName: string; options?: MongoClientOptions }) {\n super({ id });\n const client = new MongoClient(uri, {\n ...options,\n driverInfo: {\n name: 'mastra-vector',\n version: packageJson.version || '0.0.0',\n },\n });\n this.client = client;\n this.db = this.client.db(dbName);\n this.collections = new Map();\n }\n\n // Public methods\n async connect(): Promise<void> {\n try {\n await this.client.connect();\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_CONNECT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n await this.client.close();\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_DISCONNECT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async createIndex({ indexName, dimension, metric = 'cosine' }: CreateIndexParams): Promise<void> {\n let mongoMetric;\n try {\n if (!Number.isInteger(dimension) || dimension <= 0) {\n throw new Error('Dimension must be a positive integer');\n }\n\n mongoMetric = this.mongoMetricMap[metric];\n if (!mongoMetric) {\n throw new Error(`Invalid metric: \"${metric}\". Must be one of: cosine, euclidean, dotproduct`);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_CREATE_INDEX_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n indexName,\n dimension,\n metric,\n },\n },\n error,\n );\n }\n\n let collection;\n try {\n // Check if collection exists\n const collectionExists = await this.db.listCollections({ name: indexName }).hasNext();\n if (!collectionExists) {\n await this.db.createCollection(indexName);\n }\n collection = await this.getCollection(indexName);\n\n const indexNameInternal = `${indexName}_vector_index`;\n\n const embeddingField = this.embeddingFieldName;\n const numDimensions = dimension;\n\n // Create search indexes\n await collection.createSearchIndex({\n definition: {\n fields: [\n {\n type: 'vector',\n path: embeddingField,\n numDimensions: numDimensions,\n similarity: mongoMetric,\n },\n {\n type: 'filter',\n path: '_id',\n },\n ],\n },\n name: indexNameInternal,\n type: 'vectorSearch',\n });\n await collection.createSearchIndex({\n definition: {\n mappings: {\n dynamic: true,\n },\n },\n name: `${indexName}_search_index`,\n type: 'search',\n });\n } catch (error: any) {\n if (error.codeName !== 'IndexAlreadyExists') {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_CREATE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n try {\n // Store the dimension and metric in a special metadata document\n await collection?.updateOne({ _id: '__index_metadata__' }, { $set: { dimension, metric } }, { upsert: true });\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_CREATE_INDEX_FAILED_STORE_METADATA',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Waits for the index to be ready.\n *\n * @param {string} indexName - The name of the index to wait for\n * @param {number} timeoutMs - The maximum time in milliseconds to wait for the index to be ready (default: 60000)\n * @param {number} checkIntervalMs - The interval in milliseconds at which to check if the index is ready (default: 2000)\n * @returns A promise that resolves when the index is ready\n */\n async waitForIndexReady({\n indexName,\n timeoutMs = 60000,\n checkIntervalMs = 2000,\n }: MongoDBIndexReadyParams): Promise<void> {\n const collection = await this.getCollection(indexName, true);\n const indexNameInternal = `${indexName}_vector_index`;\n\n const startTime = Date.now();\n while (Date.now() - startTime < timeoutMs) {\n const indexInfo: any[] = await (collection as any).listSearchIndexes().toArray();\n const indexData = indexInfo.find((idx: any) => idx.name === indexNameInternal);\n const status = indexData?.status;\n if (status === 'READY') {\n return;\n }\n await new Promise(resolve => setTimeout(resolve, checkIntervalMs));\n }\n throw new Error(`Index \"${indexNameInternal}\" did not become ready within timeout`);\n }\n\n async upsert({ indexName, vectors, metadata, ids, documents }: MongoDBUpsertVectorParams): Promise<string[]> {\n try {\n const collection = await this.getCollection(indexName);\n\n this.collectionForValidation = collection;\n\n // Get index stats to check dimension\n const stats = await this.describeIndex({ indexName });\n\n // Validate vector dimensions\n await this.validateVectorDimensions(vectors, stats.dimension);\n\n // Generate IDs if not provided\n const generatedIds = ids || vectors.map(() => uuidv4());\n\n const operations = vectors.map((vector, idx) => {\n const id = generatedIds[idx];\n const meta = metadata?.[idx] || {};\n const doc = documents?.[idx];\n\n // Normalize metadata - convert Date objects to ISO strings\n const normalizedMeta = Object.keys(meta).reduce(\n (acc, key) => {\n acc[key] = meta[key] instanceof Date ? meta[key].toISOString() : meta[key];\n return acc;\n },\n {} as Record<string, any>,\n );\n\n const updateDoc: Partial<MongoDBDocument> = {\n [this.embeddingFieldName]: vector,\n [this.metadataFieldName]: normalizedMeta,\n };\n if (doc !== undefined) {\n updateDoc[this.documentFieldName] = doc;\n }\n\n return {\n updateOne: {\n filter: { _id: id }, // '_id' is a string as per MongoDBDocument interface\n update: { $set: updateDoc },\n upsert: true,\n },\n };\n });\n\n await collection.bulkWrite(operations);\n\n return generatedIds;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_UPSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n async query({\n indexName,\n queryVector,\n topK = 10,\n filter,\n includeVector = false,\n documentFilter,\n }: MongoDBQueryVectorParams): Promise<QueryResult[]> {\n try {\n const collection = await this.getCollection(indexName, true);\n const indexNameInternal = `${indexName}_vector_index`;\n\n // Transform the filters using MongoDBFilterTranslator\n const mongoFilter = this.transformFilter(filter);\n const documentMongoFilter = documentFilter ? { [this.documentFieldName]: documentFilter } : {};\n\n // Transform metadata field filters to use dot notation\n const transformedMongoFilter = this.transformMetadataFilter(mongoFilter);\n\n // Combine the filters\n let combinedFilter: any = {};\n if (Object.keys(transformedMongoFilter).length > 0 && Object.keys(documentMongoFilter).length > 0) {\n combinedFilter = { $and: [transformedMongoFilter, documentMongoFilter] };\n } else if (Object.keys(transformedMongoFilter).length > 0) {\n combinedFilter = transformedMongoFilter;\n } else if (Object.keys(documentMongoFilter).length > 0) {\n combinedFilter = documentMongoFilter;\n }\n\n const vectorSearch: Document = {\n index: indexNameInternal,\n queryVector: queryVector,\n path: this.embeddingFieldName,\n numCandidates: 100,\n limit: topK,\n };\n\n if (Object.keys(combinedFilter).length > 0) {\n // pre-filter for candidate document IDs\n const candidateIds = await collection\n .aggregate([{ $match: combinedFilter }, { $project: { _id: 1 } }])\n .map(doc => doc._id)\n .toArray();\n\n if (candidateIds.length > 0) {\n vectorSearch.filter = { _id: { $in: candidateIds } };\n } else {\n // No documents match the filter, return empty results\n return [];\n }\n }\n\n // Build the aggregation pipeline\n const pipeline = [\n {\n $vectorSearch: vectorSearch,\n },\n {\n $set: { score: { $meta: 'vectorSearchScore' } },\n },\n {\n $project: {\n _id: 1,\n score: 1,\n metadata: `$${this.metadataFieldName}`,\n document: `$${this.documentFieldName}`,\n ...(includeVector && { vector: `$${this.embeddingFieldName}` }),\n },\n },\n ];\n\n const results = await collection.aggregate(pipeline).toArray();\n\n return results.map((result: any) => ({\n id: result._id,\n score: result.score,\n metadata: result.metadata,\n vector: includeVector ? result.vector : undefined,\n document: result.document,\n }));\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_QUERY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n\n async listIndexes(): Promise<string[]> {\n try {\n const collections = await this.db.listCollections().toArray();\n return collections.map(col => col.name);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_LIST_INDEXES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Retrieves statistics about a vector index.\n *\n * @param {string} indexName - The name of the index to describe\n * @returns A promise that resolves to the index statistics including dimension, count and metric\n */\n async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n try {\n const collection = await this.getCollection(indexName, true);\n\n // Get the count of documents, excluding the metadata document\n const count = await collection.countDocuments({ _id: { $ne: '__index_metadata__' } });\n\n // Retrieve the dimension and metric from the metadata document\n const metadataDoc = await collection.findOne({ _id: '__index_metadata__' });\n const dimension = metadataDoc?.dimension || 0;\n const metric = metadataDoc?.metric || 'cosine';\n\n return {\n dimension,\n count,\n metric: metric as 'cosine' | 'euclidean' | 'dotproduct',\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_DESCRIBE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n const collection = await this.getCollection(indexName, false); // Do not throw error if collection doesn't exist\n try {\n if (collection) {\n await collection.drop();\n this.collections.delete(indexName);\n } else {\n // Optionally, you can log or handle the case where the collection doesn't exist\n throw new Error(`Index (Collection) \"${indexName}\" does not exist`);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_DELETE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Updates a vector by its ID with the provided vector and/or metadata.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to update.\n * @param update - An object containing the vector and/or metadata to update.\n * @param update.vector - An optional array of numbers representing the new vector.\n * @param update.metadata - An optional record containing the new metadata.\n * @returns A promise that resolves when the update is complete.\n * @throws Will throw an error if no updates are provided or if the update operation fails.\n */\n async updateVector({ indexName, id, update }: UpdateVectorParams): Promise<void> {\n try {\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n\n const collection = await this.getCollection(indexName, true);\n const updateDoc: Record<string, any> = {};\n\n if (update.vector) {\n const stats = await this.describeIndex({ indexName });\n await this.validateVectorDimensions([update.vector], stats.dimension);\n updateDoc[this.embeddingFieldName] = update.vector;\n }\n\n if (update.metadata) {\n // Normalize metadata in updates too\n const normalizedMeta = Object.keys(update.metadata).reduce(\n (acc, key) => {\n acc[key] =\n update.metadata![key] instanceof Date ? update.metadata![key].toISOString() : update.metadata![key];\n return acc;\n },\n {} as Record<string, any>,\n );\n\n updateDoc[this.metadataFieldName] = normalizedMeta;\n }\n\n await collection.findOneAndUpdate({ _id: id }, { $set: updateDoc });\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n id,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a vector by its ID.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to delete.\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if the deletion operation fails.\n */\n async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n try {\n const collection = await this.getCollection(indexName, true);\n await collection.deleteOne({ _id: id });\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_VECTOR_DELETE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n id,\n },\n },\n error,\n );\n }\n }\n\n // Private methods\n private async getCollection(\n indexName: string,\n throwIfNotExists: boolean = true,\n ): Promise<Collection<MongoDBDocument>> {\n if (this.collections.has(indexName)) {\n return this.collections.get(indexName)!;\n }\n\n const collection = this.db.collection<MongoDBDocument>(indexName);\n\n // Check if collection exists\n const collectionExists = await this.db.listCollections({ name: indexName }).hasNext();\n if (!collectionExists && throwIfNotExists) {\n throw new Error(`Index (Collection) \"${indexName}\" does not exist`);\n }\n\n this.collections.set(indexName, collection);\n return collection;\n }\n\n private async validateVectorDimensions(vectors: number[][], dimension: number): Promise<void> {\n if (vectors.length === 0) {\n throw new Error('No vectors provided for validation');\n }\n\n if (dimension === 0) {\n // If dimension is not set, retrieve and set it from the vectors\n dimension = vectors[0] ? vectors[0].length : 0;\n await this.setIndexDimension(dimension);\n }\n\n for (let i = 0; i < vectors.length; i++) {\n let v = vectors[i]?.length;\n if (v !== dimension) {\n throw new Error(`Vector at index ${i} has invalid dimension ${v}. Expected ${dimension} dimensions.`);\n }\n }\n }\n\n private async setIndexDimension(dimension: number): Promise<void> {\n // Store the dimension in a special metadata document\n const collection = this.collectionForValidation!; // 'collectionForValidation' is set in 'upsert' method\n await collection.updateOne({ _id: '__index_metadata__' }, { $set: { dimension } }, { upsert: true });\n }\n\n private transformFilter(filter?: MongoDBVectorFilter) {\n const translator = new MongoDBFilterTranslator();\n if (!filter) return {};\n return translator.translate(filter);\n }\n\n /**\n * Transform metadata field filters to use MongoDB dot notation.\n * Fields that are stored in the metadata subdocument need to be prefixed with 'metadata.'\n * This handles filters from the Memory system which expects direct field access.\n *\n * @param filter - The filter object to transform\n * @returns Transformed filter with metadata fields properly prefixed\n */\n private transformMetadataFilter(filter: any): any {\n if (!filter || typeof filter !== 'object') return filter;\n\n const transformed: any = {};\n\n for (const [key, value] of Object.entries(filter)) {\n // Check if this is a MongoDB operator (starts with $)\n if (key.startsWith('$')) {\n // For logical operators like $and, $or, recursively transform their contents\n if (Array.isArray(value)) {\n transformed[key] = value.map(item => this.transformMetadataFilter(item));\n } else {\n transformed[key] = this.transformMetadataFilter(value);\n }\n }\n // Check if the key already has 'metadata.' prefix\n else if (key.startsWith('metadata.')) {\n // Already prefixed, keep as is\n transformed[key] = value;\n }\n // Check if this is a known metadata field that needs prefixing\n else if (this.isMetadataField(key)) {\n // Add metadata. prefix for fields stored in metadata subdocument\n transformed[`metadata.${key}`] = value;\n } else {\n // Keep other fields as is\n transformed[key] = value;\n }\n }\n\n return transformed;\n }\n\n /**\n * Determine if a field should be treated as a metadata field.\n * Common metadata fields include thread_id, resource_id, message_id, and any field\n * that doesn't start with underscore (MongoDB system fields).\n */\n private isMetadataField(key: string): boolean {\n // MongoDB system fields start with underscore\n if (key.startsWith('_')) return false;\n\n // Document-level fields that are NOT in metadata\n const documentFields = ['_id', this.embeddingFieldName, this.documentFieldName];\n if (documentFields.includes(key)) return false;\n\n // Everything else is assumed to be in metadata\n // This includes thread_id, resource_id, message_id, and any custom fields\n return true;\n }\n}\n","import { MongoClient } from 'mongodb';\nimport type { Db } from 'mongodb';\nimport packageJson from '../../../package.json';\nimport type { DatabaseConfig } from '../types';\nimport type { ConnectorHandler } from './base';\n\ntype MongoDBConnectorOptions =\n | {\n client: MongoClient;\n dbName: string;\n handler: undefined;\n }\n | {\n client: undefined;\n dbName: undefined;\n handler: ConnectorHandler;\n };\n\nexport class MongoDBConnector {\n readonly #client?: MongoClient;\n readonly #dbName?: string;\n readonly #handler?: ConnectorHandler;\n #isConnected: boolean;\n #db?: Db;\n\n constructor(options: MongoDBConnectorOptions) {\n this.#client = options.client;\n this.#dbName = options.dbName;\n this.#handler = options.handler;\n this.#isConnected = false;\n }\n\n static fromDatabaseConfig(config: DatabaseConfig): MongoDBConnector {\n if (!config.url?.trim().length) {\n throw new Error(\n 'MongoDBStore: url must be provided and cannot be empty. Passing an empty string may cause fallback to local MongoDB defaults.',\n );\n }\n\n if (!config.dbName?.trim().length) {\n throw new Error(\n 'MongoDBStore: dbName must be provided and cannot be empty. Passing an empty string may cause fallback to local MongoDB defaults.',\n );\n }\n\n const client = new MongoClient(config.url, {\n ...config.options,\n driverInfo: {\n name: 'mastra-storage',\n version: packageJson.version || '0.0.0',\n },\n });\n return new MongoDBConnector({\n client,\n dbName: config.dbName,\n handler: undefined,\n });\n }\n\n static fromConnectionHandler(handler: ConnectorHandler): MongoDBConnector {\n return new MongoDBConnector({\n client: undefined,\n dbName: undefined,\n handler,\n });\n }\n\n private async getConnection(): Promise<Db> {\n if (this.#client) {\n if (this.#isConnected && this.#db) {\n return this.#db;\n }\n await this.#client.connect();\n this.#db = this.#client.db(this.#dbName);\n this.#isConnected = true;\n return this.#db;\n }\n\n throw new Error('MongoDBStore: client cannot be empty. Check your MongoDBConnector configuration.');\n }\n\n async getCollection(collectionName: string) {\n if (this.#handler) {\n return this.#handler.getCollection(collectionName);\n }\n const db = await this.getConnection();\n return db.collection(collectionName);\n }\n\n async close() {\n if (this.#client) {\n await this.#client.close();\n this.#isConnected = false;\n return;\n }\n\n if (this.#handler) {\n await this.#handler.close();\n }\n }\n}\n","import type { IMastraLogger } from '@mastra/core/logger';\n\nexport function formatDateForMongoDB(date: Date | string): Date {\n return typeof date === 'string' ? new Date(date) : date;\n}\n\nexport function createExecuteOperationWithRetry({\n logger,\n maxRetries = 3,\n initialBackoffMs = 100,\n}: {\n logger: IMastraLogger;\n maxRetries?: number;\n initialBackoffMs?: number;\n}) {\n return async function executeOperationWithRetry<T>(\n operationFn: () => Promise<T>,\n operationDescription: string,\n ): Promise<T> {\n let retries = 0;\n\n while (true) {\n try {\n return await operationFn();\n } catch (error: any) {\n if (\n ((error.message && error.message.includes('connection')) || error.code === 'ECONNRESET') &&\n retries < maxRetries\n ) {\n retries++;\n const backoffTime = initialBackoffMs * Math.pow(2, retries - 1);\n logger.warn(\n `MongoDBStore: Encountered connection error during ${operationDescription}. Retrying (${retries}/${maxRetries}) in ${backoffTime}ms...`,\n );\n await new Promise(resolve => setTimeout(resolve, backoffTime));\n } else {\n logger.error(`MongoDBStore: Error during ${operationDescription} after ${retries} retries: ${error}`);\n throw error;\n }\n }\n }\n };\n}\n","import { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport {\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n safelyParseJSON,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n} from '@mastra/core/storage';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsByResourceIdInput,\n StorageListThreadsByResourceIdOutput,\n} from '@mastra/core/storage';\nimport type { StoreOperationsMongoDB } from '../operations';\nimport { formatDateForMongoDB } from '../utils';\n\nexport class MemoryStorageMongoDB extends MemoryStorage {\n private operations: StoreOperationsMongoDB;\n\n constructor({ operations }: { operations: StoreOperationsMongoDB }) {\n super();\n this.operations = operations;\n }\n\n private parseRow(row: any): MastraDBMessage {\n let content = row.content;\n if (typeof content === 'string') {\n try {\n content = JSON.parse(content);\n } catch {\n // use content as is if it's not JSON\n }\n }\n\n const result = {\n id: row.id,\n content,\n role: row.role,\n createdAt: formatDateForMongoDB(row.createdAt),\n threadId: row.thread_id,\n resourceId: row.resourceId,\n } as MastraDBMessage;\n\n if (row.type && row.type !== 'v2') result.type = row.type;\n return result;\n }\n\n private async _getIncludedMessages({\n threadId,\n include,\n }: {\n threadId: string;\n include: StorageListMessagesInput['include'];\n }) {\n if (!threadId.trim()) throw new Error('threadId must be a non-empty string');\n\n if (!include) return null;\n\n const collection = await this.operations.getCollection(TABLE_MESSAGES);\n\n const includedMessages: any[] = [];\n\n for (const inc of include) {\n const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n const searchThreadId = inc.threadId || threadId;\n\n // Get all messages for the search thread ordered by creation date\n const allMessages = await collection.find({ thread_id: searchThreadId }).sort({ createdAt: 1 }).toArray();\n\n // Find the target message\n const targetIndex = allMessages.findIndex((msg: any) => msg.id === id);\n\n if (targetIndex === -1) continue;\n\n // Get previous messages\n const startIndex = Math.max(0, targetIndex - withPreviousMessages);\n // Get next messages\n const endIndex = Math.min(allMessages.length - 1, targetIndex + withNextMessages);\n\n // Add messages in range\n for (let i = startIndex; i <= endIndex; i++) {\n includedMessages.push(allMessages[i]);\n }\n }\n\n // Remove duplicates\n const seen = new Set<string>();\n const dedupedMessages = includedMessages.filter(msg => {\n if (seen.has(msg.id)) return false;\n seen.add(msg.id);\n return true;\n });\n\n return dedupedMessages.map(row => this.parseRow(row));\n }\n\n public async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n try {\n const collection = await this.operations.getCollection(TABLE_MESSAGES);\n const rawMessages = await collection\n .find({ id: { $in: messageIds } })\n .sort({ createdAt: -1 })\n .toArray();\n\n const list = new MessageList().add(\n rawMessages.map(this.parseRow) as (MastraMessageV1 | MastraDBMessage)[],\n 'memory',\n );\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_LIST_MESSAGES_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: JSON.stringify(messageIds) },\n },\n error,\n );\n }\n }\n\n public async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n if (!threadId.trim()) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_LIST_MESSAGES_INVALID_THREAD_ID',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n new Error('threadId must be a non-empty string'),\n );\n }\n\n if (page < 0) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_LIST_MESSAGES_INVALID_PAGE',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 40);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n // Determine sort field and direction\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n const sortOrder = direction === 'ASC' ? 1 : -1;\n\n const collection = await this.operations.getCollection(TABLE_MESSAGES);\n\n // Build query conditions\n const query: any = { thread_id: threadId };\n\n if (resourceId) {\n query.resourceId = resourceId;\n }\n\n if (filter?.dateRange?.start) {\n query.createdAt = { ...query.createdAt, $gte: filter.dateRange.start };\n }\n\n if (filter?.dateRange?.end) {\n query.createdAt = { ...query.createdAt, $lte: filter.dateRange.end };\n }\n\n // Get total count\n const total = await collection.countDocuments(query);\n\n const messages: any[] = [];\n\n // Step 1: Get paginated messages from the thread first (without excluding included ones)\n if (perPage !== 0) {\n const sortObj: any = { [field]: sortOrder };\n let cursor = collection.find(query).sort(sortObj).skip(offset);\n\n // Only apply limit if not unlimited\n // MongoDB's .limit(0) means \"no limit\" (returns all), not \"return 0 documents\"\n if (perPageInput !== false) {\n cursor = cursor.limit(perPage);\n }\n\n const dataResult = await cursor.toArray();\n messages.push(...dataResult.map((row: any) => this.parseRow(row)));\n }\n\n // Only return early if there are no messages AND no includes to process\n if (total === 0 && messages.length === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Step 2: Add included messages with context (if any), excluding duplicates\n const messageIds = new Set(messages.map(m => m.id));\n if (include && include.length > 0) {\n const includeMessages = await this._getIncludedMessages({ threadId, include });\n if (includeMessages) {\n // Deduplicate: only add messages that aren't already in the paginated results\n for (const includeMsg of includeMessages) {\n if (!messageIds.has(includeMsg.id)) {\n messages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\n }\n }\n }\n\n // Use MessageList for proper deduplication and format conversion to V2\n const list = new MessageList().add(messages, 'memory');\n let finalMessages = list.get.all.db();\n\n // Sort all messages (paginated + included) for final output\n finalMessages = finalMessages.sort((a, b) => {\n const isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date((a as any)[field]).getTime() : (a as any)[field];\n const bValue = isDateField ? new Date((b as any)[field]).getTime() : (b as any)[field];\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n // Fallback to string comparison for non-numeric fields\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n // Calculate hasMore based on pagination window\n // If all thread messages have been returned (through pagination or include), hasMore = false\n // Otherwise, check if there are more pages in the pagination window\n const returnedThreadMessageIds = new Set(finalMessages.filter(m => m.threadId === threadId).map(m => m.id));\n const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;\n const hasMore = perPageInput !== false && !allThreadMessagesReturned && offset + perPage < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'MONGODB_STORE_LIST_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async saveMessages({ messages }: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messages.length === 0) return { messages: [] };\n\n try {\n const threadId = messages[0]?.threadId;\n if (!threadId) {\n throw new Error('Thread ID is required');\n }\n\n const collection = await this.operations.getCollection(TABLE_MESSAGES);\n const threadsCollection = await this.operations.getCollection(TABLE_THREADS);\n\n // Prepare messages for insertion\n const messagesToInsert = messages.map(message => {\n const time = message.createdAt || new Date();\n if (!message.threadId) {\n throw new Error(\n \"Expected to find a threadId for message, but couldn't find one. An unexpected error has occurred.\",\n );\n }\n if (!message.resourceId) {\n throw new Error(\n \"Expected to find a resourceId for message, but couldn't find one. An unexpected error has occurred.\",\n );\n }\n\n return {\n updateOne: {\n filter: { id: message.id },\n update: {\n $set: {\n id: message.id,\n thread_id: message.threadId!,\n content: typeof message.content === 'object' ? JSON.stringify(message.content) : message.content,\n role: message.role,\n type: message.type || 'v2',\n createdAt: formatDateForMongoDB(time),\n resourceId: message.resourceId,\n },\n },\n upsert: true,\n },\n };\n });\n\n // Execute message inserts and thread update in parallel\n await Promise.all([\n collection.bulkWrite(messagesToInsert),\n threadsCollection.updateOne({ id: threadId }, { $set: { updatedAt: new Date() } }),\n ]);\n\n const list = new MessageList().add(messages as (MastraMessageV1 | MastraDBMessage)[], 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_SAVE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async updateMessages({\n messages,\n }: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraDBMessage[]> {\n if (messages.length === 0) {\n return [];\n }\n\n const messageIds = messages.map(m => m.id);\n const collection = await this.operations.getCollection(TABLE_MESSAGES);\n\n const existingMessages = await collection.find({ id: { $in: messageIds } }).toArray();\n\n const existingMessagesParsed: MastraDBMessage[] = existingMessages.map((msg: any) => this.parseRow(msg));\n\n if (existingMessagesParsed.length === 0) {\n return [];\n }\n\n const threadIdsToUpdate = new Set<string>();\n const bulkOps = [];\n\n for (const existingMessage of existingMessagesParsed) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n\n const updateDoc: any = {};\n const updatableFields = { ...fieldsToUpdate };\n\n // Special handling for content field to merge instead of overwrite\n if (updatableFields.content) {\n const newContent = {\n ...existingMessage.content,\n ...updatableFields.content,\n // Deep merge metadata if it exists on both\n ...(existingMessage.content?.metadata && updatableFields.content.metadata\n ? {\n metadata: {\n ...existingMessage.content.metadata,\n ...updatableFields.content.metadata,\n },\n }\n : {}),\n };\n updateDoc.content = JSON.stringify(newContent);\n delete updatableFields.content;\n }\n\n // Handle other fields\n for (const key in updatableFields) {\n if (Object.prototype.hasOwnProperty.call(updatableFields, key)) {\n const dbKey = key === 'threadId' ? 'thread_id' : key;\n let value = updatableFields[key as keyof typeof updatableFields];\n\n if (typeof value === 'object' && value !== null) {\n value = JSON.stringify(value);\n }\n updateDoc[dbKey] = value;\n }\n }\n\n if (Object.keys(updateDoc).length > 0) {\n bulkOps.push({\n updateOne: {\n filter: { id },\n update: { $set: updateDoc },\n },\n });\n }\n }\n\n if (bulkOps.length > 0) {\n await collection.bulkWrite(bulkOps);\n }\n\n // Update thread timestamps\n if (threadIdsToUpdate.size > 0) {\n const threadsCollection = await this.operations.getCollection(TABLE_THREADS);\n await threadsCollection.updateMany(\n { id: { $in: Array.from(threadIdsToUpdate) } },\n { $set: { updatedAt: new Date() } },\n );\n }\n\n // Re-fetch updated messages\n const updatedMessages = await collection.find({ id: { $in: messageIds } }).toArray();\n\n return updatedMessages.map((row: any) => this.parseRow(row));\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const collection = await this.operations.getCollection(TABLE_RESOURCES);\n const result = await collection.findOne<any>({ id: resourceId });\n\n if (!result) {\n return null;\n }\n\n return {\n id: result.id,\n workingMemory: result.workingMemory || '',\n metadata: typeof result.metadata === 'string' ? safelyParseJSON(result.metadata) : result.metadata,\n createdAt: formatDateForMongoDB(result.createdAt),\n updatedAt: formatDateForMongoDB(result.updatedAt),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_RESOURCE_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n try {\n const collection = await this.operations.getCollection(TABLE_RESOURCES);\n await collection.updateOne(\n { id: resource.id },\n {\n $set: {\n ...resource,\n metadata: JSON.stringify(resource.metadata),\n },\n },\n { upsert: true },\n );\n\n return resource;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_SAVE_RESOURCE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId: resource.id },\n },\n error,\n );\n }\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n try {\n const existingResource = await this.getResourceById({ resourceId });\n\n if (!existingResource) {\n // Create new resource if it doesn't exist\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory: workingMemory || '',\n metadata: metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n return this.saveResource({ resource: newResource });\n }\n\n const updatedResource = {\n ...existingResource,\n workingMemory: workingMemory !== undefined ? workingMemory : existingResource.workingMemory,\n metadata: metadata ? { ...existingResource.metadata, ...metadata } : existingResource.metadata,\n updatedAt: new Date(),\n };\n\n const collection = await this.operations.getCollection(TABLE_RESOURCES);\n const updateDoc: any = { updatedAt: updatedResource.updatedAt };\n\n if (workingMemory !== undefined) {\n updateDoc.workingMemory = workingMemory;\n }\n\n if (metadata) {\n updateDoc.metadata = JSON.stringify(updatedResource.metadata);\n }\n\n await collection.updateOne({ id: resourceId }, { $set: updateDoc });\n\n return updatedResource;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_UPDATE_RESOURCE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const collection = await this.operations.getCollection(TABLE_THREADS);\n const result = await collection.findOne<any>({ id: threadId });\n if (!result) {\n return null;\n }\n\n return {\n ...result,\n metadata: typeof result.metadata === 'string' ? safelyParseJSON(result.metadata) : result.metadata,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_THREAD_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n public async listThreadsByResourceId(\n args: StorageListThreadsByResourceIdInput,\n ): Promise<StorageListThreadsByResourceIdOutput> {\n try {\n const { resourceId, page = 0, perPage: perPageInput, orderBy } = args;\n\n if (page < 0) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_LIST_THREADS_BY_RESOURCE_ID_INVALID_PAGE',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n const collection = await this.operations.getCollection(TABLE_THREADS);\n\n const query = { resourceId };\n const total = await collection.countDocuments(query);\n\n if (perPage === 0) {\n return {\n threads: [],\n total,\n page,\n perPage: perPageForResponse,\n hasMore: offset < total,\n };\n }\n\n // MongoDB sort: 1 = ASC, -1 = DESC\n const sortOrder = direction === 'ASC' ? 1 : -1;\n\n let cursor = collection\n .find(query)\n .sort({ [field]: sortOrder })\n .skip(offset);\n if (perPageInput !== false) {\n cursor = cursor.limit(perPage);\n }\n const threads = await cursor.toArray();\n\n return {\n threads: threads.map((thread: any) => ({\n id: thread.id,\n title: thread.title,\n resourceId: thread.resourceId,\n createdAt: formatDateForMongoDB(thread.createdAt),\n updatedAt: formatDateForMongoDB(thread.updatedAt),\n metadata: thread.metadata || {},\n })),\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_LIST_THREADS_BY_RESOURCE_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId: args.resourceId },\n },\n error,\n );\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n const collection = await this.operations.getCollection(TABLE_THREADS);\n await collection.updateOne(\n { id: thread.id },\n {\n $set: {\n ...thread,\n metadata: thread.metadata,\n },\n },\n { upsert: true },\n );\n return thread;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_SAVE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: thread.id },\n },\n error,\n );\n }\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n const thread = await this.getThreadById({ threadId: id });\n if (!thread) {\n throw new MastraError({\n id: 'STORAGE_MONGODB_STORE_UPDATE_THREAD_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: id, status: 404 },\n text: `Thread ${id} not found`,\n });\n }\n\n const updatedThread = {\n ...thread,\n title,\n metadata: {\n ...thread.metadata,\n ...metadata,\n },\n };\n\n try {\n const collection = await this.operations.getCollection(TABLE_THREADS);\n await collection.updateOne(\n { id },\n {\n $set: {\n title,\n metadata: updatedThread.metadata,\n },\n },\n );\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_UPDATE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: id },\n },\n error,\n );\n }\n\n return updatedThread;\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n try {\n // First, delete all messages associated with the thread\n const collectionMessages = await this.operations.getCollection(TABLE_MESSAGES);\n await collectionMessages.deleteMany({ thread_id: threadId });\n // Then delete the thread itself\n const collectionThreads = await this.operations.getCollection(TABLE_THREADS);\n await collectionThreads.deleteOne({ id: threadId });\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_DELETE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { TracingStorageStrategy } from '@mastra/core/observability';\nimport { ObservabilityStorage, TABLE_SPANS } from '@mastra/core/storage';\nimport type {\n SpanRecord,\n TraceRecord,\n TracesPaginatedArg,\n CreateSpanRecord,\n PaginationInfo,\n UpdateSpanRecord,\n} from '@mastra/core/storage';\nimport type { StoreOperationsMongoDB } from '../operations';\n\nexport class ObservabilityMongoDB extends ObservabilityStorage {\n private operations: StoreOperationsMongoDB;\n\n constructor({ operations }: { operations: StoreOperationsMongoDB }) {\n super();\n this.operations = operations;\n }\n\n public get tracingStrategy(): {\n preferred: TracingStorageStrategy;\n supported: TracingStorageStrategy[];\n } {\n return {\n preferred: 'batch-with-updates',\n supported: ['batch-with-updates', 'insert-only'],\n };\n }\n\n async createSpan(span: CreateSpanRecord): Promise<void> {\n try {\n const startedAt = span.startedAt instanceof Date ? span.startedAt.toISOString() : span.startedAt;\n const endedAt = span.endedAt instanceof Date ? span.endedAt.toISOString() : span.endedAt;\n\n const record = {\n ...span,\n startedAt,\n endedAt,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n return this.operations.insert({ tableName: TABLE_SPANS, record });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_CREATE_SPAN_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n spanId: span.spanId,\n traceId: span.traceId,\n spanType: span.spanType,\n spanName: span.name,\n },\n },\n error,\n );\n }\n }\n\n async getTrace(traceId: string): Promise<TraceRecord | null> {\n try {\n const collection = await this.operations.getCollection(TABLE_SPANS);\n\n const spans = await collection.find({ traceId }).sort({ startedAt: -1 }).toArray();\n\n if (!spans || spans.length === 0) {\n return null;\n }\n\n return {\n traceId,\n spans: spans.map((span: any) => this.transformSpanFromMongo(span)),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_GET_TRACE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n traceId,\n },\n },\n error,\n );\n }\n }\n\n async updateSpan({\n spanId,\n traceId,\n updates,\n }: {\n spanId: string;\n traceId: string;\n updates: Partial<UpdateSpanRecord>;\n }): Promise<void> {\n try {\n const data = { ...updates };\n if (data.endedAt instanceof Date) {\n data.endedAt = data.endedAt.toISOString() as any;\n }\n if (data.startedAt instanceof Date) {\n data.startedAt = data.startedAt.toISOString() as any;\n }\n\n // Add updatedAt timestamp\n const updateData = {\n ...data,\n updatedAt: new Date().toISOString(),\n };\n\n await this.operations.update({\n tableName: TABLE_SPANS,\n keys: { spanId, traceId },\n data: updateData,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_UPDATE_SPAN_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n spanId,\n traceId,\n },\n },\n error,\n );\n }\n }\n\n async getTracesPaginated({\n filters,\n pagination,\n }: TracesPaginatedArg): Promise<{ pagination: PaginationInfo; spans: SpanRecord[] }> {\n const page = pagination?.page ?? 0;\n const perPage = pagination?.perPage ?? 10;\n const { entityId, entityType, ...actualFilters } = filters || {};\n\n try {\n const collection = await this.operations.getCollection(TABLE_SPANS);\n\n // Build MongoDB query filter\n const mongoFilter: Record<string, any> = {\n parentSpanId: null, // Only get root spans for traces\n ...actualFilters,\n };\n\n // Handle date range filtering\n if (pagination?.dateRange) {\n const dateFilter: Record<string, any> = {};\n if (pagination.dateRange.start) {\n dateFilter.$gte =\n pagination.dateRange.start instanceof Date\n ? pagination.dateRange.start.toISOString()\n : pagination.dateRange.start;\n }\n if (pagination.dateRange.end) {\n dateFilter.$lte =\n pagination.dateRange.end instanceof Date\n ? pagination.dateRange.end.toISOString()\n : pagination.dateRange.end;\n }\n if (Object.keys(dateFilter).length > 0) {\n mongoFilter.startedAt = dateFilter;\n }\n }\n\n // Handle entity filtering\n if (entityId && entityType) {\n let name = '';\n if (entityType === 'workflow') {\n name = `workflow run: '${entityId}'`;\n } else if (entityType === 'agent') {\n name = `agent run: '${entityId}'`;\n } else {\n const error = new MastraError({\n id: 'MONGODB_STORE_GET_TRACES_PAGINATED_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n entityType,\n },\n text: `Cannot filter by entity type: ${entityType}`,\n });\n throw error;\n }\n mongoFilter.name = name;\n }\n\n // Get total count\n const count = await collection.countDocuments(mongoFilter);\n\n if (count === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage,\n hasMore: false,\n },\n spans: [],\n };\n }\n\n // Get paginated spans\n const spans = await collection\n .find(mongoFilter)\n .sort({ startedAt: -1 })\n .skip(page * perPage)\n .limit(perPage)\n .toArray();\n\n return {\n pagination: {\n total: count,\n page,\n perPage,\n hasMore: spans.length === perPage,\n },\n spans: spans.map((span: any) => this.transformSpanFromMongo(span)),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_GET_TRACES_PAGINATED_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchCreateSpans(args: { records: CreateSpanRecord[] }): Promise<void> {\n try {\n const records = args.records.map(record => {\n const startedAt = record.startedAt instanceof Date ? record.startedAt.toISOString() : record.startedAt;\n const endedAt = record.endedAt instanceof Date ? record.endedAt.toISOString() : record.endedAt;\n\n return {\n ...record,\n startedAt,\n endedAt,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n });\n\n return this.operations.batchInsert({\n tableName: TABLE_SPANS,\n records,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_BATCH_CREATE_SPANS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchUpdateSpans(args: {\n records: {\n traceId: string;\n spanId: string;\n updates: Partial<UpdateSpanRecord>;\n }[];\n }): Promise<void> {\n try {\n return this.operations.batchUpdate({\n tableName: TABLE_SPANS,\n updates: args.records.map(record => {\n const data: Partial<UpdateSpanRecord> = { ...record.updates };\n\n if (data.endedAt instanceof Date) {\n data.endedAt = data.endedAt.toISOString() as any;\n }\n if (data.startedAt instanceof Date) {\n data.startedAt = data.startedAt.toISOString() as any;\n }\n\n // Add updatedAt timestamp\n const updateData = {\n ...data,\n updatedAt: new Date().toISOString(),\n };\n\n return {\n keys: { spanId: record.spanId, traceId: record.traceId },\n data: updateData,\n };\n }),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_BATCH_UPDATE_SPANS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchDeleteTraces(args: { traceIds: string[] }): Promise<void> {\n try {\n const collection = await this.operations.getCollection(TABLE_SPANS);\n\n await collection.deleteMany({\n traceId: { $in: args.traceIds },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MONGODB_STORE_BATCH_DELETE_TRACES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n /**\n * Transform MongoDB document to SpanRecord format\n */\n private transformSpanFromMongo(doc: any): SpanRecord {\n // Remove MongoDB's _id field and return clean span record\n const { _id, ...span } = doc;\n\n // Ensure dates are properly formatted\n if (span.startedAt && typeof span.startedAt === 'string') {\n span.startedAt = span.startedAt;\n }\n if (span.endedAt && typeof span.endedAt === 'string') {\n span.endedAt = span.endedAt;\n }\n if (span.createdAt && typeof span.createdAt === 'string') {\n span.createdAt = new Date(span.createdAt);\n }\n if (span.updatedAt && typeof span.updatedAt === 'string') {\n span.updatedAt = new Date(span.updatedAt);\n }\n\n return span as SpanRecord;\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { safelyParseJSON, StoreOperations, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport type { ConnectorHandler } from '../../connectors/base';\n\nexport interface MongoDBOperationsConfig {\n connector: ConnectorHandler;\n}\nexport class StoreOperationsMongoDB extends StoreOperations {\n readonly #connector: ConnectorHandler;\n\n constructor(config: MongoDBOperationsConfig) {\n super();\n this.#connector = config.connector;\n }\n\n async getCollection(collectionName: string) {\n return this.#connector.getCollection(collectionName);\n }\n\n async hasColumn(_table: string, _column: string): Promise<boolean> {\n // MongoDB is schemaless, so we can assume any column exists\n // We could check a sample document, but for now return true\n return true;\n }\n\n async createTable(): Promise<void> {\n // Nothing to do here, MongoDB is schemaless\n }\n\n async alterTable(_args: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n // Nothing to do here, MongoDB is schemaless\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n const collection = await this.getCollection(tableName);\n await collection.deleteMany({});\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_CLEAR_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n this.logger.error(mastraError.message);\n this.logger?.trackException(mastraError);\n throw mastraError;\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n const collection = await this.getCollection(tableName);\n await collection.drop();\n } catch (error) {\n // Collection might not exist, which is fine\n if (error instanceof Error && error.message.includes('ns not found')) {\n return;\n }\n throw new MastraError(\n {\n id: 'MONGODB_STORE_DROP_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n private processJsonbFields(tableName: TABLE_NAMES, record: Record<string, any>): Record<string, any> {\n const schema = TABLE_SCHEMAS[tableName];\n\n // If no schema is found, return the record as-is (MongoDB can handle dynamic schemas)\n if (!schema) {\n return record;\n }\n\n return Object.fromEntries(\n Object.entries(schema).map(([key, value]) => {\n if (value.type === 'jsonb' && record[key] && typeof record[key] === 'string') {\n return [key, safelyParseJSON(record[key])];\n }\n return [key, record[key]];\n }),\n );\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n try {\n const collection = await this.getCollection(tableName);\n const recordToInsert = this.processJsonbFields(tableName, record);\n await collection.insertOne(recordToInsert);\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n this.logger.error(mastraError.message);\n this.logger?.trackException(mastraError);\n throw mastraError;\n }\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n if (!records.length) {\n return;\n }\n\n try {\n const collection = await this.getCollection(tableName);\n const processedRecords = records.map(record => this.processJsonbFields(tableName, record));\n await collection.insertMany(processedRecords);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_BATCH_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n this.logger.info(`Loading ${tableName} with keys ${JSON.stringify(keys)}`);\n try {\n const collection = await this.getCollection(tableName);\n return (await collection.find(keys).toArray()) as R;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_LOAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async update({\n tableName,\n keys,\n data,\n }: {\n tableName: TABLE_NAMES;\n keys: Record<string, any>;\n data: Record<string, any>;\n }): Promise<void> {\n try {\n const collection = await this.getCollection(tableName);\n const processedData = this.processJsonbFields(tableName, data);\n\n // Filter out undefined values to prevent MongoDB from removing fields\n const cleanData = Object.fromEntries(Object.entries(processedData).filter(([_, value]) => value !== undefined));\n\n await collection.updateOne(keys, { $set: cleanData });\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_UPDATE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async batchUpdate({\n tableName,\n updates,\n }: {\n tableName: TABLE_NAMES;\n updates: Array<{\n keys: Record<string, any>;\n data: Record<string, any>;\n }>;\n }): Promise<void> {\n if (!updates.length) {\n return;\n }\n\n try {\n const collection = await this.getCollection(tableName);\n const bulkOps = updates.map(({ keys, data }) => {\n const processedData = this.processJsonbFields(tableName, data);\n\n // Filter out undefined values to prevent MongoDB from removing fields\n const cleanData = Object.fromEntries(Object.entries(processedData).filter(([_, value]) => value !== undefined));\n\n return {\n updateOne: {\n filter: keys,\n update: { $set: cleanData },\n },\n };\n });\n\n await collection.bulkWrite(bulkOps);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_BATCH_UPDATE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { ScoreRowData, ScoringEntityType, ScoringSource, ValidatedSaveScorePayload } from '@mastra/core/evals';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport {\n ScoresStorage,\n TABLE_SCORERS,\n calculatePagination,\n normalizePerPage,\n safelyParseJSON,\n} from '@mastra/core/storage';\nimport type { PaginationInfo, StoragePagination } from '@mastra/core/storage';\nimport type { StoreOperationsMongoDB } from '../operations';\n\nfunction transformScoreRow(row: Record<string, any>): ScoreRowData {\n let scorerValue: any = null;\n if (row.scorer) {\n try {\n scorerValue = typeof row.scorer === 'string' ? safelyParseJSON(row.scorer) : row.scorer;\n } catch (e) {\n console.warn('Failed to parse scorer:', e);\n }\n }\n\n let preprocessStepResultValue: any = null;\n if (row.preprocessStepResult) {\n try {\n preprocessStepResultValue =\n typeof row.preprocessStepResult === 'string'\n ? safelyParseJSON(row.preprocessStepResult)\n : row.preprocessStepResult;\n } catch (e) {\n console.warn('Failed to parse preprocessStepResult:', e);\n }\n }\n\n let analyzeStepResultValue: any = null;\n if (row.analyzeStepResult) {\n try {\n analyzeStepResultValue =\n typeof row.analyzeStepResult === 'string' ? safelyParseJSON(row.analyzeStepResult) : row.analyzeStepResult;\n } catch (e) {\n console.warn('Failed to parse analyzeStepResult:', e);\n }\n }\n\n let inputValue: any = null;\n if (row.input) {\n try {\n inputValue = typeof row.input === 'string' ? safelyParseJSON(row.input) : row.input;\n } catch (e) {\n console.warn('Failed to parse input:', e);\n }\n }\n\n let outputValue: any = null;\n if (row.output) {\n try {\n outputValue = typeof row.output === 'string' ? safelyParseJSON(row.output) : row.output;\n } catch (e) {\n console.warn('Failed to parse output:', e);\n }\n }\n\n let entityValue: any = null;\n if (row.entity) {\n try {\n entityValue = typeof row.entity === 'string' ? safelyParseJSON(row.entity) : row.entity;\n } catch (e) {\n console.warn('Failed to parse entity:', e);\n }\n }\n\n let requestContextValue: any = null;\n if (row.requestContext) {\n try {\n requestContextValue =\n typeof row.requestContext === 'string' ? safelyParseJSON(row.requestContext) : row.requestContext;\n } catch (e) {\n console.warn('Failed to parse requestContext:', e);\n }\n }\n\n let metadataValue: any = null;\n if (row.metadata) {\n try {\n metadataValue = typeof row.metadata === 'string' ? safelyParseJSON(row.metadata) : row.metadata;\n } catch (e) {\n console.warn('Failed to parse metadata:', e);\n }\n }\n\n return {\n id: row.id as string,\n entityId: row.entityId as string,\n entityType: row.entityType as ScoringEntityType,\n scorerId: row.scorerId as string,\n traceId: row.traceId as string,\n spanId: row.spanId as string,\n runId: row.runId as string,\n scorer: scorerValue,\n preprocessStepResult: preprocessStepResultValue,\n preprocessPrompt: row.preprocessPrompt as string,\n analyzeStepResult: analyzeStepResultValue,\n generateScorePrompt: row.generateScorePrompt as string,\n score: row.score as number,\n analyzePrompt: row.analyzePrompt as string,\n reasonPrompt: row.reasonPrompt as string,\n metadata: metadataValue,\n input: inputValue,\n output: outputValue,\n additionalContext: row.additionalContext,\n requestContext: requestContextValue,\n entity: entityValue,\n source: row.source as ScoringSource,\n resourceId: row.resourceId as string,\n threadId: row.threadId as string,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n };\n}\n\nexport class ScoresStorageMongoDB extends ScoresStorage {\n private operations: StoreOperationsMongoDB;\n\n constructor({ operations }: { operations: StoreOperationsMongoDB }) {\n super();\n this.operations = operations;\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const collection = await this.operations.getCollection(TABLE_SCORERS);\n const document = await collection.findOne({ id });\n\n if (!document) {\n return null;\n }\n\n return transformScoreRow(document);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_SCORE_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async saveScore(score: Omit<ScoreRowData, 'id' | 'createdAt' | 'updatedAt'>): Promise<{ score: ScoreRowData }> {\n let validatedScore: ValidatedSaveScorePayload;\n try {\n validatedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_SAVE_SCORE_VALIDATION_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n try {\n const now = new Date();\n const scoreId = `score-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n const scoreData = {\n id: scoreId,\n entityId: validatedScore.entityId,\n entityType: validatedScore.entityType,\n scorerId: validatedScore.scorerId,\n traceId: validatedScore.traceId || '',\n spanId: validatedScore.spanId || '',\n runId: validatedScore.runId,\n scorer:\n typeof validatedScore.scorer === 'string' ? safelyParseJSON(validatedScore.scorer) : validatedScore.scorer,\n preprocessStepResult:\n typeof validatedScore.preprocessStepResult === 'string'\n ? safelyParseJSON(validatedScore.preprocessStepResult)\n : validatedScore.preprocessStepResult,\n analyzeStepResult:\n typeof validatedScore.analyzeStepResult === 'string'\n ? safelyParseJSON(validatedScore.analyzeStepResult)\n : validatedScore.analyzeStepResult,\n score: validatedScore.score,\n reason: validatedScore.reason,\n preprocessPrompt: validatedScore.preprocessPrompt,\n generateScorePrompt: validatedScore.generateScorePrompt,\n generateReasonPrompt: validatedScore.generateReasonPrompt,\n analyzePrompt: validatedScore.analyzePrompt,\n input: typeof validatedScore.input === 'string' ? safelyParseJSON(validatedScore.input) : validatedScore.input,\n output:\n typeof validatedScore.output === 'string' ? safelyParseJSON(validatedScore.output) : validatedScore.output,\n additionalContext: validatedScore.additionalContext,\n requestContext:\n typeof validatedScore.requestContext === 'string'\n ? safelyParseJSON(validatedScore.requestContext)\n : validatedScore.requestContext,\n entity:\n typeof validatedScore.entity === 'string' ? safelyParseJSON(validatedScore.entity) : validatedScore.entity,\n source: validatedScore.source,\n resourceId: validatedScore.resourceId || '',\n threadId: validatedScore.threadId || '',\n createdAt: now,\n updatedAt: now,\n };\n\n const collection = await this.operations.getCollection(TABLE_SCORERS);\n await collection.insertOne(scoreData);\n\n const savedScore: ScoreRowData = {\n ...score,\n id: scoreId,\n createdAt: now,\n updatedAt: now,\n };\n\n return { score: savedScore };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_SAVE_SCORE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerId: score.scorerId, runId: score.runId },\n },\n error,\n );\n }\n }\n\n async listScoresByScorerId({\n scorerId,\n pagination,\n entityId,\n entityType,\n source,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const query: any = { scorerId };\n\n if (entityId) {\n query.entityId = entityId;\n }\n\n if (entityType) {\n query.entityType = entityType;\n }\n\n if (source) {\n query.source = source;\n }\n\n const collection = await this.operations.getCollection(TABLE_SCORERS);\n const total = await collection.countDocuments(query);\n\n if (total === 0) {\n return {\n scores: [],\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n };\n }\n\n const end = perPageInput === false ? total : start + perPage;\n\n // Build query - omit limit() when perPage is false to fetch all results\n let cursor = collection.find(query).sort({ createdAt: 'desc' }).skip(start);\n\n if (perPageInput !== false) {\n cursor = cursor.limit(perPage);\n }\n\n const documents = await cursor.toArray();\n const scores = documents.map(row => transformScoreRow(row));\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_SCORES_BY_SCORER_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerId, page: pagination.page, perPage: pagination.perPage },\n },\n error,\n );\n }\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const collection = await this.operations.getCollection(TABLE_SCORERS);\n const total = await collection.countDocuments({ runId });\n\n if (total === 0) {\n return {\n scores: [],\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n };\n }\n\n const end = perPageInput === false ? total : start + perPage;\n\n // Build query - omit limit() when perPage is false to fetch all results\n let cursor = collection.find({ runId }).sort({ createdAt: 'desc' }).skip(start);\n\n if (perPageInput !== false) {\n cursor = cursor.limit(perPage);\n }\n\n const documents = await cursor.toArray();\n const scores = documents.map(row => transformScoreRow(row));\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_SCORES_BY_RUN_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, page: pagination.page, perPage: pagination.perPage },\n },\n error,\n );\n }\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const collection = await this.operations.getCollection(TABLE_SCORERS);\n const total = await collection.countDocuments({ entityId, entityType });\n\n if (total === 0) {\n return {\n scores: [],\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n };\n }\n\n const end = perPageInput === false ? total : start + perPage;\n\n // Build query - omit limit() when perPage is false to fetch all results\n let cursor = collection.find({ entityId, entityType }).sort({ createdAt: 'desc' }).skip(start);\n\n if (perPageInput !== false) {\n cursor = cursor.limit(perPage);\n }\n\n const documents = await cursor.toArray();\n const scores = documents.map(row => transformScoreRow(row));\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_SCORES_BY_ENTITY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityId, entityType, page: pagination.page, perPage: pagination.perPage },\n },\n error,\n );\n }\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const query = { traceId, spanId };\n const collection = await this.operations.getCollection(TABLE_SCORERS);\n const total = await collection.countDocuments(query);\n\n if (total === 0) {\n return {\n scores: [],\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n };\n }\n\n const end = perPageInput === false ? total : start + perPage;\n\n // Build query - omit limit() when perPage is false to fetch all results\n let cursor = collection.find(query).sort({ createdAt: 'desc' }).skip(start);\n\n if (perPageInput !== false) {\n cursor = cursor.limit(perPage);\n }\n\n const documents = await cursor.toArray();\n const scores = documents.map(row => transformScoreRow(row));\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_SCORES_BY_SPAN_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId, spanId, page: pagination.page, perPage: pagination.perPage },\n },\n error,\n );\n }\n }\n}\n","import { ErrorDomain, ErrorCategory, MastraError } from '@mastra/core/error';\nimport { WorkflowsStorage, TABLE_WORKFLOW_SNAPSHOT, safelyParseJSON, normalizePerPage } from '@mastra/core/storage';\nimport type { WorkflowRun, WorkflowRuns, StorageListWorkflowRunsInput } from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport type { StoreOperationsMongoDB } from '../operations';\n\nexport class WorkflowsStorageMongoDB extends WorkflowsStorage {\n private operations: StoreOperationsMongoDB;\n\n constructor({ operations }: { operations: StoreOperationsMongoDB }) {\n super();\n this.operations = operations;\n }\n\n updateWorkflowResults(\n {\n // workflowName,\n // runId,\n // stepId,\n // result,\n // requestContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n },\n ): Promise<Record<string, StepResult<any, any, any, any>>> {\n throw new Error('Method not implemented.');\n }\n updateWorkflowState(\n {\n // workflowName,\n // runId,\n // opts,\n }: {\n workflowName: string;\n runId: string;\n opts: {\n status: string;\n result?: StepResult<any, any, any, any>;\n error?: string;\n suspendedPaths?: Record<string, number[]>;\n waitingPaths?: Record<string, number[]>;\n };\n },\n ): Promise<WorkflowRunState | undefined> {\n throw new Error('Method not implemented.');\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n try {\n const collection = await this.operations.getCollection(TABLE_WORKFLOW_SNAPSHOT);\n await collection.updateOne(\n { workflow_name: workflowName, run_id: runId },\n {\n $set: {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot,\n createdAt: new Date(),\n updatedAt: new Date(),\n },\n },\n { upsert: true },\n );\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_PERSIST_WORKFLOW_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n try {\n const result = await this.operations.load<any[]>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: {\n workflow_name: workflowName,\n run_id: runId,\n },\n });\n\n if (!result?.length) {\n return null;\n }\n\n return typeof result[0].snapshot === 'string' ? safelyParseJSON(result[0].snapshot) : result[0].snapshot;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_LOAD_WORKFLOW_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async listWorkflowRuns(args?: StorageListWorkflowRunsInput): Promise<WorkflowRuns> {\n const options = args || {};\n try {\n const query: any = {};\n if (options.workflowName) {\n query['workflow_name'] = options.workflowName;\n }\n if (options.status) {\n query['snapshot.status'] = options.status;\n }\n if (options.fromDate) {\n query['createdAt'] = { $gte: options.fromDate };\n }\n if (options.toDate) {\n if (query['createdAt']) {\n query['createdAt'].$lte = options.toDate;\n } else {\n query['createdAt'] = { $lte: options.toDate };\n }\n }\n if (options.resourceId) {\n query['resourceId'] = options.resourceId;\n }\n\n const collection = await this.operations.getCollection(TABLE_WORKFLOW_SNAPSHOT);\n let total = 0;\n\n let cursor = collection.find(query).sort({ createdAt: -1 });\n if (options.page !== undefined && typeof options.perPage === 'number') {\n // Validate page is non-negative\n if (options.page < 0) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_INVALID_PAGE',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page: options.page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n total = await collection.countDocuments(query);\n const normalizedPerPage = normalizePerPage(options.perPage, Number.MAX_SAFE_INTEGER);\n\n // Handle perPage = 0 edge case (MongoDB limit(0) disables limit)\n if (normalizedPerPage === 0) {\n return { runs: [], total };\n }\n\n const offset = options.page * normalizedPerPage;\n cursor = cursor.skip(offset);\n // Cap to MongoDB's 32-bit signed integer max to prevent overflow\n cursor = cursor.limit(Math.min(normalizedPerPage, 2147483647));\n }\n\n const results = await cursor.toArray();\n\n const runs = results.map(row => this.parseWorkflowRun(row));\n\n return {\n runs,\n total: total || runs.length,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_LIST_WORKFLOW_RUNS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName: options.workflowName || 'unknown' },\n },\n error,\n );\n }\n }\n\n async getWorkflowRunById(args: { runId: string; workflowName?: string }): Promise<WorkflowRun | null> {\n try {\n const query: any = {};\n if (args.runId) {\n query['run_id'] = args.runId;\n }\n if (args.workflowName) {\n query['workflow_name'] = args.workflowName;\n }\n\n const collection = await this.operations.getCollection(TABLE_WORKFLOW_SNAPSHOT);\n const result = await collection.findOne(query);\n if (!result) {\n return null;\n }\n\n return this.parseWorkflowRun(result);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_GET_WORKFLOW_RUN_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId: args.runId },\n },\n error,\n );\n }\n }\n\n private parseWorkflowRun(row: any): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\n if (typeof parsedSnapshot === 'string') {\n try {\n parsedSnapshot = typeof row.snapshot === 'string' ? safelyParseJSON(row.snapshot as string) : row.snapshot;\n } catch (e) {\n // If parsing fails, return the raw snapshot string\n console.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n }\n }\n\n return {\n workflowName: row.workflow_name as string,\n runId: row.run_id as string,\n snapshot: parsedSnapshot,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n resourceId: row.resourceId,\n };\n }\n}\n","import type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport type { MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport type {\n PaginationInfo,\n StorageColumn,\n StorageDomains,\n StoragePagination,\n StorageResourceType,\n TABLE_NAMES,\n WorkflowRun,\n WorkflowRuns,\n SpanRecord,\n TraceRecord,\n TracesPaginatedArg,\n CreateSpanRecord,\n UpdateSpanRecord,\n StorageListWorkflowRunsInput,\n} from '@mastra/core/storage';\nimport { MastraStorage } from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { MongoDBConnector } from './connectors/MongoDBConnector';\nimport { MemoryStorageMongoDB } from './domains/memory';\nimport { ObservabilityMongoDB } from './domains/observability';\nimport { StoreOperationsMongoDB } from './domains/operations';\nimport { ScoresStorageMongoDB } from './domains/scores';\nimport { WorkflowsStorageMongoDB } from './domains/workflows';\nimport type { MongoDBConfig } from './types';\n\nconst loadConnector = (config: MongoDBConfig): MongoDBConnector => {\n try {\n if ('connectorHandler' in config) {\n return MongoDBConnector.fromConnectionHandler(config.connectorHandler);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_CONSTRUCTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { connectionHandler: true },\n },\n error,\n );\n }\n\n try {\n return MongoDBConnector.fromDatabaseConfig({\n id: config.id,\n options: config.options,\n url: config.url,\n dbName: config.dbName,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_CONSTRUCTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { url: config?.url, dbName: config?.dbName },\n },\n error,\n );\n }\n};\n\nexport class MongoDBStore extends MastraStorage {\n #connector: MongoDBConnector;\n\n stores: StorageDomains;\n\n public get supports(): {\n selectByIncludeResourceScope: boolean;\n resourceWorkingMemory: boolean;\n hasColumn: boolean;\n createTable: boolean;\n deleteMessages: boolean;\n listScoresBySpan: boolean;\n } {\n return {\n selectByIncludeResourceScope: true,\n resourceWorkingMemory: true,\n hasColumn: false,\n createTable: false,\n deleteMessages: false,\n listScoresBySpan: true,\n };\n }\n\n constructor(config: MongoDBConfig) {\n super({ id: config.id, name: 'MongoDBStore' });\n\n this.stores = {} as StorageDomains;\n\n this.#connector = loadConnector(config);\n\n const operations = new StoreOperationsMongoDB({\n connector: this.#connector,\n });\n\n const memory = new MemoryStorageMongoDB({\n operations,\n });\n\n const scores = new ScoresStorageMongoDB({\n operations,\n });\n\n const workflows = new WorkflowsStorageMongoDB({\n operations,\n });\n\n const observability = new ObservabilityMongoDB({\n operations,\n });\n\n this.stores = {\n operations,\n memory,\n scores,\n workflows,\n observability,\n };\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n return this.stores.operations.createTable({ tableName, schema });\n }\n\n async alterTable(_args: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n return this.stores.operations.alterTable(_args);\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.dropTable({ tableName });\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.clearTable({ tableName });\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n return this.stores.operations.insert({ tableName, record });\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n return this.stores.operations.batchInsert({ tableName, records });\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n return this.stores.operations.load({ tableName, keys });\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n return this.stores.memory.getThreadById({ threadId });\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n return this.stores.memory.saveThread({ thread });\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n return this.stores.memory.updateThread({ id, title, metadata });\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n return this.stores.memory.deleteThread({ threadId });\n }\n\n async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n return this.stores.memory.listMessagesById({ messageIds });\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n return this.stores.memory.saveMessages(args);\n }\n\n async updateMessages(_args: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraDBMessage[]> {\n return this.stores.memory.updateMessages(_args);\n }\n\n async listWorkflowRuns(args?: StorageListWorkflowRunsInput): Promise<WorkflowRuns> {\n return this.stores.workflows.listWorkflowRuns(args);\n }\n\n async updateWorkflowResults({\n workflowName,\n runId,\n stepId,\n result,\n requestContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n return this.stores.workflows.updateWorkflowResults({ workflowName, runId, stepId, result, requestContext });\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: {\n status: string;\n result?: StepResult<any, any, any, any>;\n error?: string;\n suspendedPaths?: Record<string, number[]>;\n waitingPaths?: Record<string, number[]>;\n };\n }): Promise<WorkflowRunState | undefined> {\n return this.stores.workflows.updateWorkflowState({ workflowName, runId, opts });\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n return this.stores.workflows.persistWorkflowSnapshot({ workflowName, runId, resourceId, snapshot });\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n return this.stores.workflows.loadWorkflowSnapshot({ workflowName, runId });\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n return this.stores.workflows.getWorkflowRunById({ runId, workflowName });\n }\n\n async close(): Promise<void> {\n try {\n await this.#connector.close();\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_MONGODB_STORE_CLOSE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n /**\n * SCORERS\n */\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n return this.stores.scores.getScoreById({ id });\n }\n\n async saveScore(score: Omit<ScoreRowData, 'id' | 'createdAt' | 'updatedAt'>): Promise<{ score: ScoreRowData }> {\n return this.stores.scores.saveScore(score);\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresByRunId({ runId, pagination });\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresByEntityId({ entityId, entityType, pagination });\n }\n\n async listScoresByScorerId({\n scorerId,\n pagination,\n entityId,\n entityType,\n source,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresByScorerId({ scorerId, pagination, entityId, entityType, source });\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresBySpan({ traceId, spanId, pagination });\n }\n\n /**\n * RESOURCES\n */\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n return this.stores.memory.getResourceById({ resourceId });\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n return this.stores.memory.saveResource({ resource });\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n return this.stores.memory.updateResource({\n resourceId,\n workingMemory,\n metadata,\n });\n }\n\n /**\n * Tracing/Observability\n */\n async createSpan(span: CreateSpanRecord): Promise<void> {\n if (!this.stores.observability) {\n throw new MastraError({\n id: 'MONGODB_STORE_OBSERVABILITY_NOT_INITIALIZED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Observability storage is not initialized',\n });\n }\n return this.stores.observability.createSpan(span);\n }\n\n async updateSpan({\n spanId,\n traceId,\n updates,\n }: {\n spanId: string;\n traceId: string;\n updates: Partial<UpdateSpanRecord>;\n }): Promise<void> {\n if (!this.stores.observability) {\n throw new MastraError({\n id: 'MONGODB_STORE_OBSERVABILITY_NOT_INITIALIZED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Observability storage is not initialized',\n });\n }\n return this.stores.observability.updateSpan({ spanId, traceId, updates });\n }\n\n async getTrace(traceId: string): Promise<TraceRecord | null> {\n if (!this.stores.observability) {\n throw new MastraError({\n id: 'MONGODB_STORE_OBSERVABILITY_NOT_INITIALIZED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Observability storage is not initialized',\n });\n }\n return this.stores.observability.getTrace(traceId);\n }\n\n async getTracesPaginated(args: TracesPaginatedArg): Promise<{ pagination: PaginationInfo; spans: SpanRecord[] }> {\n if (!this.stores.observability) {\n throw new MastraError({\n id: 'MONGODB_STORE_OBSERVABILITY_NOT_INITIALIZED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Observability storage is not initialized',\n });\n }\n return this.stores.observability.getTracesPaginated(args);\n }\n\n async batchCreateSpans(args: { records: CreateSpanRecord[] }): Promise<void> {\n if (!this.stores.observability) {\n throw new MastraError({\n id: 'MONGODB_STORE_OBSERVABILITY_NOT_INITIALIZED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Observability storage is not initialized',\n });\n }\n return this.stores.observability.batchCreateSpans(args);\n }\n\n async batchUpdateSpans(args: {\n records: {\n traceId: string;\n spanId: string;\n updates: Partial<UpdateSpanRecord>;\n }[];\n }): Promise<void> {\n if (!this.stores.observability) {\n throw new MastraError({\n id: 'MONGODB_STORE_OBSERVABILITY_NOT_INITIALIZED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Observability storage is not initialized',\n });\n }\n return this.stores.observability.batchUpdateSpans(args);\n }\n\n async batchDeleteTraces(args: { traceIds: string[] }): Promise<void> {\n if (!this.stores.observability) {\n throw new MastraError({\n id: 'MONGODB_STORE_OBSERVABILITY_NOT_INITIALIZED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Observability storage is not initialized',\n });\n }\n return this.stores.observability.batchDeleteTraces(args);\n }\n}\n","/**\n * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for MongoDB Vector.\n */\nexport const MONGODB_PROMPT = `When querying MongoDB Vector, you can ONLY use the operators listed below. Any other operators will be rejected.\nImportant: Don't explain how to construct the filter - use the specified operators and fields to search the content and return relevant results.\nIf a user tries to give an explicit operator that is not supported, reject the filter entirely and let them know that the operator is not supported.\n\nBasic Comparison Operators:\n- $eq: Exact match (default when using field: value)\n Example: { \"category\": \"electronics\" }\n- $ne: Not equal\n Example: { \"category\": { \"$ne\": \"electronics\" } }\n- $gt: Greater than\n Example: { \"price\": { \"$gt\": 100 } }\n- $gte: Greater than or equal\n Example: { \"price\": { \"$gte\": 100 } }\n- $lt: Less than\n Example: { \"price\": { \"$lt\": 100 } }\n- $lte: Less than or equal\n Example: { \"price\": { \"$lte\": 100 } }\n\nArray Operators:\n- $in: Match any value in array\n Example: { \"category\": { \"$in\": [\"electronics\", \"books\"] } }\n- $nin: Does not match any value in array\n Example: { \"category\": { \"$nin\": [\"electronics\", \"books\"] } }\n- $all: Match all values in array\n Example: { \"tags\": { \"$all\": [\"premium\", \"sale\"] } }\n- $elemMatch: Match array elements that meet all specified conditions\n Example: { \"items\": { \"$elemMatch\": { \"price\": { \"$gt\": 100 } } } }\n- $size: Match arrays with specific length\n Example: { \"tags\": { \"$size\": 3 } }\n\nLogical Operators:\n- $and: Logical AND (can be implicit or explicit)\n Implicit Example: { \"price\": { \"$gt\": 100 }, \"category\": \"electronics\" }\n Explicit Example: { \"$and\": [{ \"price\": { \"$gt\": 100 } }, { \"category\": \"electronics\" }] }\n- $or: Logical OR\n Example: { \"$or\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n- $not: Logical NOT\n Example: { \"$not\": { \"category\": \"electronics\" } }\n- $nor: Logical NOR\n Example: { \"$nor\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n- $type: Check field type\n Example: { \"price\": { \"$type\": \"number\" } }\n\nText Search Operators:\n- $text: Full text search\n Example: { \"$text\": { \"$search\": \"gaming laptop\" } }\n- $regex: Regular expression match\n Example: { \"name\": { \"$regex\": \"^Gaming\" } }\n\nRestrictions:\n- Only logical operators ($and, $or, $not, $nor) can be used at the top level\n- Empty arrays in array operators will return no results\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported\n- At least one key-value pair is required in filter object\n- Empty objects and undefined values are treated as no filter\n- Invalid types in comparison operators will throw errors\n- All non-logical operators must be used within a field condition\n Valid: { \"field\": { \"$gt\": 100 } }\n Valid: { \"$and\": [...] }\n Invalid: { \"$gt\": 100 }\n- Logical operators must contain field conditions, not direct operators\n Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n Invalid: { \"$and\": [{ \"$gt\": 100 }] }\n- Logical operators ($and, $or, $not, $nor):\n - Can only be used at top level or nested within other logical operators\n - Can not be used on a field level, or be nested inside a field\n - Can not be used inside an operator\n - Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n - Valid: { \"$or\": [{ \"$and\": [{ \"field\": { \"$gt\": 100 } }] }] }\n - Invalid: { \"field\": { \"$and\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$or\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$gt\": { \"$and\": [{...}] } } }\n\nExample Complex Query:\n{\n \"$and\": [\n { \"category\": { \"$in\": [\"electronics\", \"computers\"] } },\n { \"price\": { \"$gte\": 100, \"$lte\": 1000 } },\n { \"tags\": { \"$all\": [\"premium\", \"sale\"] } },\n { \"items\": { \"$elemMatch\": { \"price\": { \"$gt\": 50 }, \"inStock\": true } } },\n { \"$text\": { \"$search\": \"gaming laptop\" } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": true }\n ]},\n { \"$not\": { \"status\": \"discontinued\" } }\n ]\n}`;\n"]}
|