@mastra/upstash 0.15.8-alpha.0 → 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storage/domains/legacy-evals/index.ts","../src/storage/domains/utils.ts","../src/storage/domains/memory/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/filter.ts","../src/vector/index.ts","../src/vector/prompt.ts"],"names":["TABLE_EVALS","TABLE_MESSAGES","MastraError","ErrorDomain","ErrorCategory","key","TABLE_SCORERS","TABLE_WORKFLOW_SNAPSHOT","data","op","val"],"mappings":"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","file":"index.js","sourcesContent":["import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MetricResult, TestInfo } from '@mastra/core/eval';\nimport type { EvalRow, PaginationArgs, PaginationInfo } from '@mastra/core/storage';\nimport { LegacyEvalsStorage, TABLE_EVALS } from '@mastra/core/storage';\nimport type { Redis } from '@upstash/redis';\nimport type { StoreOperationsUpstash } from '../operations';\n\nfunction transformEvalRecord(record: Record<string, any>): EvalRow {\n // Parse JSON strings if needed\n let result = record.result;\n if (typeof result === 'string') {\n try {\n result = JSON.parse(result);\n } catch {\n console.warn('Failed to parse result JSON:');\n }\n }\n\n let testInfo = record.test_info;\n if (typeof testInfo === 'string') {\n try {\n testInfo = JSON.parse(testInfo);\n } catch {\n console.warn('Failed to parse test_info JSON:');\n }\n }\n\n return {\n agentName: record.agent_name,\n input: record.input,\n output: record.output,\n result: result as MetricResult,\n metricName: record.metric_name,\n instructions: record.instructions,\n testInfo: testInfo as TestInfo | undefined,\n globalRunId: record.global_run_id,\n runId: record.run_id,\n createdAt:\n typeof record.created_at === 'string'\n ? record.created_at\n : record.created_at instanceof Date\n ? record.created_at.toISOString()\n : new Date().toISOString(),\n };\n}\n\nexport class StoreLegacyEvalsUpstash extends LegacyEvalsStorage {\n private client: Redis;\n private operations: StoreOperationsUpstash;\n constructor({ client, operations }: { client: Redis; operations: StoreOperationsUpstash }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n /**\n * @deprecated Use getEvals instead\n */\n async getEvalsByAgentName(agentName: string, type?: 'test' | 'live'): Promise<EvalRow[]> {\n try {\n const pattern = `${TABLE_EVALS}:*`;\n const keys = await this.operations.scanKeys(pattern);\n\n // Check if we have any keys before using pipeline\n if (keys.length === 0) {\n return [];\n }\n\n // Use pipeline for batch fetching to improve performance\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n\n // Filter by agent name and remove nulls\n const nonNullRecords = results.filter(\n (record): record is Record<string, any> =>\n record !== null && typeof record === 'object' && 'agent_name' in record && record.agent_name === agentName,\n );\n\n let filteredEvals = nonNullRecords;\n\n if (type === 'test') {\n filteredEvals = filteredEvals.filter(record => {\n if (!record.test_info) return false;\n\n // Handle test_info as a JSON string\n try {\n if (typeof record.test_info === 'string') {\n const parsedTestInfo = JSON.parse(record.test_info);\n return parsedTestInfo && typeof parsedTestInfo === 'object' && 'testPath' in parsedTestInfo;\n }\n\n // Handle test_info as an object\n return typeof record.test_info === 'object' && 'testPath' in record.test_info;\n } catch {\n return false;\n }\n });\n } else if (type === 'live') {\n filteredEvals = filteredEvals.filter(record => {\n if (!record.test_info) return true;\n\n // Handle test_info as a JSON string\n try {\n if (typeof record.test_info === 'string') {\n const parsedTestInfo = JSON.parse(record.test_info);\n return !(parsedTestInfo && typeof parsedTestInfo === 'object' && 'testPath' in parsedTestInfo);\n }\n\n // Handle test_info as an object\n return !(typeof record.test_info === 'object' && 'testPath' in record.test_info);\n } catch {\n return true;\n }\n });\n }\n\n // Transform to EvalRow format\n return filteredEvals.map(record => transformEvalRecord(record));\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_GET_EVALS_BY_AGENT_NAME_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentName },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n this.logger.error(mastraError.toString());\n return [];\n }\n }\n\n /**\n * Get all evaluations with pagination and total count\n * @param options Pagination and filtering options\n * @returns Object with evals array and total count\n */\n async getEvals(\n options?: {\n agentName?: string;\n type?: 'test' | 'live';\n } & PaginationArgs,\n ): Promise<PaginationInfo & { evals: EvalRow[] }> {\n try {\n // Default pagination parameters\n const { agentName, type, page = 0, perPage = 100, dateRange } = options || {};\n const fromDate = dateRange?.start;\n const toDate = dateRange?.end;\n\n // Get all keys that match the evals table pattern using cursor-based scanning\n const pattern = `${TABLE_EVALS}:*`;\n const keys = await this.operations.scanKeys(pattern);\n\n // Check if we have any keys before using pipeline\n if (keys.length === 0) {\n return {\n evals: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n // Use pipeline for batch fetching to improve performance\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n\n // Process results and apply filters\n let filteredEvals = results\n .map((result: any) => result as Record<string, any> | null)\n .filter((record): record is Record<string, any> => record !== null && typeof record === 'object');\n\n // Apply agent name filter if provided\n if (agentName) {\n filteredEvals = filteredEvals.filter(record => record.agent_name === agentName);\n }\n\n // Apply type filter if provided\n if (type === 'test') {\n filteredEvals = filteredEvals.filter(record => {\n if (!record.test_info) return false;\n\n try {\n if (typeof record.test_info === 'string') {\n const parsedTestInfo = JSON.parse(record.test_info);\n return parsedTestInfo && typeof parsedTestInfo === 'object' && 'testPath' in parsedTestInfo;\n }\n return typeof record.test_info === 'object' && 'testPath' in record.test_info;\n } catch {\n return false;\n }\n });\n } else if (type === 'live') {\n filteredEvals = filteredEvals.filter(record => {\n if (!record.test_info) return true;\n\n try {\n if (typeof record.test_info === 'string') {\n const parsedTestInfo = JSON.parse(record.test_info);\n return !(parsedTestInfo && typeof parsedTestInfo === 'object' && 'testPath' in parsedTestInfo);\n }\n return !(typeof record.test_info === 'object' && 'testPath' in record.test_info);\n } catch {\n return true;\n }\n });\n }\n\n // Apply date filters if provided\n if (fromDate) {\n filteredEvals = filteredEvals.filter(record => {\n const createdAt = new Date(record.created_at || record.createdAt || 0);\n return createdAt.getTime() >= fromDate.getTime();\n });\n }\n\n if (toDate) {\n filteredEvals = filteredEvals.filter(record => {\n const createdAt = new Date(record.created_at || record.createdAt || 0);\n return createdAt.getTime() <= toDate.getTime();\n });\n }\n\n // Sort by creation date (newest first)\n filteredEvals.sort((a, b) => {\n const dateA = new Date(a.created_at || a.createdAt || 0).getTime();\n const dateB = new Date(b.created_at || b.createdAt || 0).getTime();\n return dateB - dateA;\n });\n\n const total = filteredEvals.length;\n\n // Apply pagination\n const start = page * perPage;\n const end = start + perPage;\n const paginatedEvals = filteredEvals.slice(start, end);\n const hasMore = end < total;\n\n // Transform to EvalRow format\n const evals = paginatedEvals.map(record => transformEvalRecord(record));\n\n return {\n evals,\n total,\n page,\n perPage,\n hasMore,\n };\n } catch (error) {\n const { page = 0, perPage = 100 } = options || {};\n const mastraError = new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_GET_EVALS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n page,\n perPage,\n },\n },\n error,\n );\n this.logger.error(mastraError.toString());\n this.logger?.trackException(mastraError);\n return {\n evals: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n }\n}\n","import {\n serializeDate,\n TABLE_MESSAGES,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_EVALS,\n TABLE_SCORERS,\n} from '@mastra/core/storage';\nimport type { TABLE_NAMES } from '@mastra/core/storage';\n\nexport function ensureDate(value: any): Date | null {\n if (!value) return null;\n if (value instanceof Date) return value;\n if (typeof value === 'string') return new Date(value);\n if (typeof value === 'number') return new Date(value);\n return null;\n}\n\nexport function parseJSON(value: any): any {\n if (typeof value === 'string') {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n return value;\n}\n\nexport function getKey(tableName: TABLE_NAMES, keys: Record<string, any>): string {\n const keyParts = Object.entries(keys)\n .filter(([_, value]) => value !== undefined)\n .map(([key, value]) => `${key}:${value}`);\n return `${tableName}:${keyParts.join(':')}`;\n}\n\nexport function processRecord(tableName: TABLE_NAMES, record: Record<string, any>) {\n let key: string;\n\n if (tableName === TABLE_MESSAGES) {\n // For messages, use threadId as the primary key component\n key = getKey(tableName, { threadId: record.threadId, id: record.id });\n } else if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n key = getKey(tableName, {\n namespace: record.namespace || 'workflows',\n workflow_name: record.workflow_name,\n run_id: record.run_id,\n ...(record.resourceId ? { resourceId: record.resourceId } : {}),\n });\n } else if (tableName === TABLE_EVALS) {\n key = getKey(tableName, { id: record.run_id });\n } else if (tableName === TABLE_SCORERS) {\n key = getKey(tableName, { runId: record.runId });\n } else {\n key = getKey(tableName, { id: record.id });\n }\n\n // Convert dates to ISO strings before storing\n const processedRecord = {\n ...record,\n createdAt: serializeDate(record.createdAt),\n updatedAt: serializeDate(record.updatedAt),\n };\n\n return { key, processedRecord };\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 TABLE_RESOURCES,\n TABLE_THREADS,\n resolveMessageLimit,\n TABLE_MESSAGES,\n} from '@mastra/core/storage';\nimport type { StorageGetMessagesArg, PaginationInfo, StorageResourceType } from '@mastra/core/storage';\nimport type { Redis } from '@upstash/redis';\nimport type { StoreOperationsUpstash } from '../operations';\nimport { ensureDate, getKey, processRecord } from '../utils';\n\nfunction getThreadMessagesKey(threadId: string): string {\n return `thread:${threadId}:messages`;\n}\n\nfunction getMessageKey(threadId: string, messageId: string): string {\n const key = getKey(TABLE_MESSAGES, { threadId, id: messageId });\n return key;\n}\n\nexport class StoreMemoryUpstash extends MemoryStorage {\n private client: Redis;\n private operations: StoreOperationsUpstash;\n constructor({ client, operations }: { client: Redis; operations: StoreOperationsUpstash }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const thread = await this.operations.load<StorageThreadType>({\n tableName: TABLE_THREADS,\n keys: { id: threadId },\n });\n\n if (!thread) return null;\n\n return {\n ...thread,\n createdAt: ensureDate(thread.createdAt)!,\n updatedAt: ensureDate(thread.updatedAt)!,\n metadata: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_GET_THREAD_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n },\n },\n error,\n );\n }\n }\n\n /**\n * @deprecated use getThreadsByResourceIdPaginated instead\n */\n async getThreadsByResourceId({ resourceId }: { resourceId: string }): Promise<StorageThreadType[]> {\n try {\n const pattern = `${TABLE_THREADS}:*`;\n const keys = await this.operations.scanKeys(pattern);\n\n if (keys.length === 0) {\n return [];\n }\n\n const allThreads: StorageThreadType[] = [];\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n\n for (let i = 0; i < results.length; i++) {\n const thread = results[i] as StorageThreadType | null;\n if (thread && thread.resourceId === resourceId) {\n allThreads.push({\n ...thread,\n createdAt: ensureDate(thread.createdAt)!,\n updatedAt: ensureDate(thread.updatedAt)!,\n metadata: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n });\n }\n }\n\n allThreads.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n return allThreads;\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_GET_THREADS_BY_RESOURCE_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n resourceId,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n this.logger.error(mastraError.toString());\n return [];\n }\n }\n\n public async getThreadsByResourceIdPaginated(args: {\n resourceId: string;\n page: number;\n perPage: number;\n }): Promise<PaginationInfo & { threads: StorageThreadType[] }> {\n const { resourceId, page = 0, perPage = 100 } = args;\n\n try {\n const allThreads = await this.getThreadsByResourceId({ resourceId });\n\n const total = allThreads.length;\n const start = page * perPage;\n const end = start + perPage;\n const paginatedThreads = allThreads.slice(start, end);\n const hasMore = end < total;\n\n return {\n threads: paginatedThreads,\n total,\n page,\n perPage,\n hasMore,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_GET_THREADS_BY_RESOURCE_ID_PAGINATED_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n resourceId,\n page,\n perPage,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n this.logger.error(mastraError.toString());\n return {\n threads: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n await this.operations.insert({\n tableName: TABLE_THREADS,\n record: thread,\n });\n return thread;\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_SAVE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: thread.id,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n this.logger.error(mastraError.toString());\n throw mastraError;\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_UPSTASH_STORAGE_UPDATE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread ${id} not found`,\n details: {\n threadId: id,\n },\n });\n }\n\n const updatedThread = {\n ...thread,\n title,\n metadata: {\n ...thread.metadata,\n ...metadata,\n },\n };\n\n try {\n await this.saveThread({ thread: updatedThread });\n return updatedThread;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_UPDATE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: id,\n },\n },\n error,\n );\n }\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n // Delete thread metadata and sorted set\n const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const threadMessagesKey = getThreadMessagesKey(threadId);\n try {\n const messageIds: string[] = await this.client.zrange(threadMessagesKey, 0, -1);\n\n const pipeline = this.client.pipeline();\n pipeline.del(threadKey);\n pipeline.del(threadMessagesKey);\n\n for (let i = 0; i < messageIds.length; i++) {\n const messageId = messageIds[i];\n const messageKey = getMessageKey(threadId, messageId as string);\n pipeline.del(messageKey);\n }\n\n await pipeline.exec();\n\n // Bulk delete all message keys for this thread if any remain\n await this.operations.scanAndDelete(getMessageKey(threadId, '*'));\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_DELETE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n },\n },\n error,\n );\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 args: { messages: MastraMessageV1[]; format?: undefined | 'v1' } | { messages: MastraMessageV2[]; format: 'v2' },\n ): Promise<MastraMessageV2[] | MastraMessageV1[]> {\n const { messages, format = 'v1' } = args;\n if (messages.length === 0) return [];\n\n const threadId = messages[0]?.threadId;\n try {\n if (!threadId) {\n throw new Error('Thread ID is required');\n }\n\n // Check if thread exists\n const thread = await this.getThreadById({ threadId });\n if (!thread) {\n throw new Error(`Thread ${threadId} not found`);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_SAVE_MESSAGES_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n\n // Add an index to each message to maintain order\n const messagesWithIndex = messages.map((message, index) => {\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 return {\n ...message,\n _index: index,\n };\n });\n\n // Get current thread data once (all messages belong to same thread)\n const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const existingThread = await this.client.get<StorageThreadType>(threadKey);\n\n try {\n const batchSize = 1000;\n for (let i = 0; i < messagesWithIndex.length; i += batchSize) {\n const batch = messagesWithIndex.slice(i, i + batchSize);\n const pipeline = this.client.pipeline();\n\n for (const message of batch) {\n const key = getMessageKey(message.threadId!, message.id);\n const createdAtScore = new Date(message.createdAt).getTime();\n const score = message._index !== undefined ? message._index : createdAtScore;\n\n // Check if this message id exists in another thread\n const existingKeyPattern = getMessageKey('*', message.id);\n const keys = await this.operations.scanKeys(existingKeyPattern);\n\n if (keys.length > 0) {\n const pipeline2 = this.client.pipeline();\n keys.forEach(key => pipeline2.get(key));\n const results = await pipeline2.exec();\n const existingMessages = results.filter(\n (msg): msg is MastraMessageV2 | MastraMessageV1 => msg !== null,\n ) as (MastraMessageV2 | MastraMessageV1)[];\n for (const existingMessage of existingMessages) {\n const existingMessageKey = getMessageKey(existingMessage.threadId!, existingMessage.id);\n if (existingMessage && existingMessage.threadId !== message.threadId) {\n pipeline.del(existingMessageKey);\n // Remove from old thread's sorted set\n pipeline.zrem(getThreadMessagesKey(existingMessage.threadId!), existingMessage.id);\n }\n }\n }\n\n // Store the message data\n pipeline.set(key, message);\n\n // Add to sorted set for this thread\n pipeline.zadd(getThreadMessagesKey(message.threadId!), {\n score,\n member: message.id,\n });\n }\n\n // Update the thread's updatedAt field (only in the first batch)\n if (i === 0 && existingThread) {\n const updatedThread = {\n ...existingThread,\n updatedAt: new Date(),\n };\n pipeline.set(threadKey, processRecord(TABLE_THREADS, updatedThread).processedRecord);\n }\n\n await pipeline.exec();\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: 'STORAGE_UPSTASH_STORAGE_SAVE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n },\n },\n error,\n );\n }\n }\n\n private async _getIncludedMessages(\n threadId: string,\n selectBy: StorageGetMessagesArg['selectBy'],\n ): Promise<MastraMessageV2[] | MastraMessageV1[]> {\n if (!threadId.trim()) throw new Error('threadId must be a non-empty string');\n\n const messageIds = new Set<string>();\n const messageIdToThreadIds: Record<string, string> = {};\n\n // First, get specifically included messages and their context\n if (selectBy?.include?.length) {\n for (const item of selectBy.include) {\n messageIds.add(item.id);\n\n // Use per-include threadId if present, else fallback to main threadId\n const itemThreadId = item.threadId || threadId;\n messageIdToThreadIds[item.id] = itemThreadId;\n const itemThreadMessagesKey = getThreadMessagesKey(itemThreadId);\n\n // Get the rank of this message in the sorted set\n const rank = await this.client.zrank(itemThreadMessagesKey, item.id);\n if (rank === null) continue;\n\n // Get previous messages if requested\n if (item.withPreviousMessages) {\n const start = Math.max(0, rank - item.withPreviousMessages);\n const prevIds = rank === 0 ? [] : await this.client.zrange(itemThreadMessagesKey, start, rank - 1);\n prevIds.forEach(id => {\n messageIds.add(id as string);\n messageIdToThreadIds[id as string] = itemThreadId;\n });\n }\n\n // Get next messages if requested\n if (item.withNextMessages) {\n const nextIds = await this.client.zrange(itemThreadMessagesKey, rank + 1, rank + item.withNextMessages);\n nextIds.forEach(id => {\n messageIds.add(id as string);\n messageIdToThreadIds[id as string] = itemThreadId;\n });\n }\n }\n\n const pipeline = this.client.pipeline();\n Array.from(messageIds).forEach(id => {\n const tId = messageIdToThreadIds[id] || threadId;\n pipeline.get(getMessageKey(tId, id as string));\n });\n const results = await pipeline.exec();\n return results.filter(result => result !== null) as MastraMessageV2[] | MastraMessageV1[];\n }\n\n return [];\n }\n\n private parseStoredMessage(storedMessage: MastraMessageV2 & { _index?: number }): MastraMessageV2 {\n const defaultMessageContent = { format: 2, parts: [{ type: 'text', text: '' }] };\n const { _index, ...rest } = storedMessage;\n return {\n ...rest,\n createdAt: new Date(rest.createdAt),\n content: rest.content || defaultMessageContent,\n } satisfies MastraMessageV2;\n }\n\n /**\n * @deprecated use getMessagesPaginated instead\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 & { format?: 'v1' | 'v2' }): Promise<MastraMessageV1[] | MastraMessageV2[]> {\n try {\n if (!threadId.trim()) throw new Error('threadId must be a non-empty string');\n\n const threadMessagesKey = getThreadMessagesKey(threadId);\n const allMessageIds = await this.client.zrange(threadMessagesKey, 0, -1);\n const limit = resolveMessageLimit({ last: selectBy?.last, defaultLimit: Number.MAX_SAFE_INTEGER });\n\n const messageIds = new Set<string>();\n const messageIdToThreadIds: Record<string, string> = {};\n\n if (limit === 0 && !selectBy?.include) {\n return [];\n }\n\n // Then get the most recent messages (or all if no limit)\n if (limit === Number.MAX_SAFE_INTEGER) {\n // Get all messages\n const allIds = await this.client.zrange(threadMessagesKey, 0, -1);\n allIds.forEach(id => {\n messageIds.add(id as string);\n messageIdToThreadIds[id as string] = threadId;\n });\n } else if (limit > 0) {\n // Get limited number of recent messages\n const latestIds = await this.client.zrange(threadMessagesKey, -limit, -1);\n latestIds.forEach(id => {\n messageIds.add(id as string);\n messageIdToThreadIds[id as string] = threadId;\n });\n }\n\n const includedMessages = await this._getIncludedMessages(threadId, selectBy);\n\n // Fetch all needed messages in parallel\n const messages = [\n ...includedMessages,\n ...((\n await Promise.all(\n Array.from(messageIds).map(async id => {\n const tId = messageIdToThreadIds[id] || threadId;\n const byThreadId = await this.client.get<MastraMessageV2 & { _index?: number }>(getMessageKey(tId, id));\n if (byThreadId) return byThreadId;\n\n return null;\n }),\n )\n ).filter(msg => msg !== null) as (MastraMessageV2 & { _index?: number })[]),\n ];\n\n // Sort messages by their position in the sorted set\n messages.sort((a, b) => allMessageIds.indexOf(a!.id) - allMessageIds.indexOf(b!.id));\n\n const seen = new Set<string>();\n const dedupedMessages = messages.filter(row => {\n if (seen.has(row.id)) return false;\n seen.add(row.id);\n return true;\n });\n\n // Remove _index before returning and handle format conversion properly\n const prepared = dedupedMessages\n .filter(message => message !== null && message !== undefined)\n .map(message => {\n const { _index, ...messageWithoutIndex } = message as MastraMessageV2 & { _index?: number };\n return messageWithoutIndex as unknown as MastraMessageV1;\n });\n\n // For backward compatibility, return messages directly without using MessageList\n // since MessageList has deduplication logic that can cause issues\n if (format === 'v2') {\n // Convert V1 format back to V2 format\n return prepared.map(msg => ({\n ...msg,\n createdAt: new Date(msg.createdAt),\n content: msg.content || { format: 2, parts: [{ type: 'text', text: '' }] },\n })) as MastraMessageV2[];\n }\n\n return prepared.map(msg => ({\n ...msg,\n createdAt: new Date(msg.createdAt),\n }));\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_GET_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n resourceId: resourceId ?? '',\n },\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\n try {\n // Search in all threads in parallel\n const threadKeys = await this.client.keys('thread:*');\n\n const result = await Promise.all(\n threadKeys.map(threadKey => {\n const threadId = threadKey.split(':')[1];\n if (!threadId) throw new Error(`Failed to parse thread ID from thread key \"${threadKey}\"`);\n return this.client.mget<(MastraMessageV2 & { _index?: number })[]>(\n messageIds.map(id => getMessageKey(threadId, id)),\n );\n }),\n );\n\n const rawMessages = result.flat(1).filter(msg => !!msg) as (MastraMessageV2 & { _index?: number })[];\n\n const list = new MessageList().add(rawMessages.map(this.parseStoredMessage), '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: 'STORAGE_UPSTASH_STORAGE_GET_MESSAGES_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n messageIds: JSON.stringify(messageIds),\n },\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, selectBy, format } = args;\n const { page = 0, perPage = 40, dateRange } = selectBy?.pagination || {};\n const fromDate = dateRange?.start;\n const toDate = dateRange?.end;\n const threadMessagesKey = getThreadMessagesKey(threadId);\n const messages: (MastraMessageV2 | MastraMessageV1)[] = [];\n\n try {\n if (!threadId.trim()) throw new Error('threadId must be a non-empty string');\n\n const includedMessages = await this._getIncludedMessages(threadId, selectBy);\n messages.push(...includedMessages);\n\n const allMessageIds = await this.client.zrange(\n threadMessagesKey,\n args?.selectBy?.last ? -args.selectBy.last : 0,\n -1,\n );\n if (allMessageIds.length === 0) {\n return {\n messages: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n // Use pipeline to fetch all messages efficiently\n const pipeline = this.client.pipeline();\n allMessageIds.forEach(id => pipeline.get(getMessageKey(threadId, id as string)));\n const results = await pipeline.exec();\n\n // Process messages and apply filters - handle undefined results from pipeline\n let messagesData = results.filter((msg): msg is MastraMessageV2 | MastraMessageV1 => msg !== null) as (\n | MastraMessageV2\n | MastraMessageV1\n )[];\n\n // Apply date filters if provided\n if (fromDate) {\n messagesData = messagesData.filter(msg => msg && new Date(msg.createdAt).getTime() >= fromDate.getTime());\n }\n\n if (toDate) {\n messagesData = messagesData.filter(msg => msg && new Date(msg.createdAt).getTime() <= toDate.getTime());\n }\n\n // Sort messages by their position in the sorted set\n messagesData.sort((a, b) => allMessageIds.indexOf(a!.id) - allMessageIds.indexOf(b!.id));\n\n const total = messagesData.length;\n\n const start = page * perPage;\n const end = start + perPage;\n const hasMore = end < total;\n const paginatedMessages = messagesData.slice(start, end);\n\n messages.push(...paginatedMessages);\n\n const list = new MessageList().add(messages, 'memory');\n const finalMessages = (format === `v2` ? list.get.all.v2() : list.get.all.v1()) as\n | MastraMessageV1[]\n | MastraMessageV2[];\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage,\n hasMore,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_GET_MESSAGES_PAGINATED_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,\n hasMore: false,\n };\n }\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const key = `${TABLE_RESOURCES}:${resourceId}`;\n const data = await this.client.get<StorageResourceType>(key);\n\n if (!data) {\n return null;\n }\n\n return {\n ...data,\n createdAt: new Date(data.createdAt),\n updatedAt: new Date(data.updatedAt),\n // Ensure workingMemory is always returned as a string, regardless of automatic parsing\n workingMemory: typeof data.workingMemory === 'object' ? JSON.stringify(data.workingMemory) : data.workingMemory,\n metadata: typeof data.metadata === 'string' ? JSON.parse(data.metadata) : data.metadata,\n };\n } catch (error) {\n this.logger.error('Error getting resource by ID:', error);\n throw error;\n }\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n try {\n const key = `${TABLE_RESOURCES}:${resource.id}`;\n const serializedResource = {\n ...resource,\n metadata: JSON.stringify(resource.metadata),\n createdAt: resource.createdAt.toISOString(),\n updatedAt: resource.updatedAt.toISOString(),\n };\n\n await this.client.set(key, serializedResource);\n\n return resource;\n } catch (error) {\n this.logger.error('Error saving resource:', error);\n throw error;\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,\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: {\n ...existingResource.metadata,\n ...metadata,\n },\n updatedAt: new Date(),\n };\n\n await this.saveResource({ resource: updatedResource });\n return updatedResource;\n } catch (error) {\n this.logger.error('Error updating resource:', error);\n throw error;\n }\n }\n\n async updateMessages(args: {\n messages: (Partial<Omit<MastraMessageV2, 'createdAt'>> & {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraMessageV2[]> {\n const { messages } = args;\n\n if (messages.length === 0) {\n return [];\n }\n\n try {\n // Get all message IDs to update\n const messageIds = messages.map(m => m.id);\n\n // Find all existing messages by scanning for their keys\n const existingMessages: (MastraMessageV2 | MastraMessageV1)[] = [];\n const messageIdToKey: Record<string, string> = {};\n\n // Scan for all message keys that match any of the IDs\n for (const messageId of messageIds) {\n const pattern = getMessageKey('*', messageId);\n const keys = await this.operations.scanKeys(pattern);\n\n for (const key of keys) {\n const message = await this.client.get<MastraMessageV2 | MastraMessageV1>(key);\n if (message && message.id === messageId) {\n existingMessages.push(message);\n messageIdToKey[messageId] = key;\n break; // Found the message, no need to continue scanning\n }\n }\n }\n\n if (existingMessages.length === 0) {\n return [];\n }\n\n const threadIdsToUpdate = new Set<string>();\n const pipeline = this.client.pipeline();\n\n // Process each existing message for updates\n for (const existingMessage of existingMessages) {\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 // Track thread IDs that need updating\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n\n // Create updated message object\n const updatedMessage = { ...existingMessage };\n\n // Special handling for the content field to merge instead of overwrite\n if (fieldsToUpdate.content) {\n const existingContent = existingMessage.content as MastraMessageContentV2;\n const newContent = {\n ...existingContent,\n ...fieldsToUpdate.content,\n // Deep merge metadata if it exists on both\n ...(existingContent?.metadata && fieldsToUpdate.content.metadata\n ? {\n metadata: {\n ...existingContent.metadata,\n ...fieldsToUpdate.content.metadata,\n },\n }\n : {}),\n };\n updatedMessage.content = newContent;\n }\n\n // Update other fields\n for (const key in fieldsToUpdate) {\n if (Object.prototype.hasOwnProperty.call(fieldsToUpdate, key) && key !== 'content') {\n (updatedMessage as any)[key] = fieldsToUpdate[key as keyof typeof fieldsToUpdate];\n }\n }\n\n // Update the message in Redis\n const key = messageIdToKey[id];\n if (key) {\n // If the message is being moved to a different thread, we need to handle the key change\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n // Remove from old thread's sorted set\n const oldThreadMessagesKey = getThreadMessagesKey(existingMessage.threadId!);\n pipeline.zrem(oldThreadMessagesKey, id);\n\n // Delete the old message key\n pipeline.del(key);\n\n // Create new message key with new threadId\n const newKey = getMessageKey(updatePayload.threadId, id);\n pipeline.set(newKey, updatedMessage);\n\n // Add to new thread's sorted set\n const newThreadMessagesKey = getThreadMessagesKey(updatePayload.threadId);\n const score =\n (updatedMessage as any)._index !== undefined\n ? (updatedMessage as any)._index\n : new Date(updatedMessage.createdAt).getTime();\n pipeline.zadd(newThreadMessagesKey, { score, member: id });\n } else {\n // No thread change, just update the existing key\n pipeline.set(key, updatedMessage);\n }\n }\n }\n\n // Update thread timestamps\n const now = new Date();\n for (const threadId of threadIdsToUpdate) {\n if (threadId) {\n const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const existingThread = await this.client.get<StorageThreadType>(threadKey);\n if (existingThread) {\n const updatedThread = {\n ...existingThread,\n updatedAt: now,\n };\n pipeline.set(threadKey, processRecord(TABLE_THREADS, updatedThread).processedRecord);\n }\n }\n }\n\n // Execute all updates\n await pipeline.exec();\n\n // Return the updated messages\n const updatedMessages: MastraMessageV2[] = [];\n for (const messageId of messageIds) {\n const key = messageIdToKey[messageId];\n if (key) {\n const updatedMessage = await this.client.get<MastraMessageV2 | MastraMessageV1>(key);\n if (updatedMessage) {\n // Convert to V2 format if needed\n const v2e = updatedMessage as MastraMessageV2;\n updatedMessages.push(v2e);\n }\n }\n }\n\n return updatedMessages;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_UPDATE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n messageIds: messages.map(m => m.id).join(','),\n },\n },\n error,\n );\n }\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (!messageIds || messageIds.length === 0) {\n return;\n }\n\n try {\n const threadIds = new Set<string>();\n const messageKeys: string[] = [];\n\n // Find all message keys and collect thread IDs\n for (const messageId of messageIds) {\n const pattern = getMessageKey('*', messageId);\n const keys = await this.operations.scanKeys(pattern);\n\n for (const key of keys) {\n const message = await this.client.get<MastraMessageV2 | MastraMessageV1>(key);\n if (message && message.id === messageId) {\n messageKeys.push(key);\n if (message.threadId) {\n threadIds.add(message.threadId);\n }\n break;\n }\n }\n }\n\n if (messageKeys.length === 0) {\n // none of the message ids existed\n return;\n }\n\n const pipeline = this.client.pipeline();\n\n // Delete all messages\n for (const key of messageKeys) {\n pipeline.del(key);\n }\n\n // Update thread timestamps\n if (threadIds.size > 0) {\n for (const threadId of threadIds) {\n const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const thread = await this.client.get<StorageThreadType>(threadKey);\n if (thread) {\n const updatedThread = {\n ...thread,\n updatedAt: new Date(),\n };\n pipeline.set(threadKey, processRecord(TABLE_THREADS, updatedThread).processedRecord);\n }\n }\n }\n\n // Execute all operations\n await pipeline.exec();\n\n // TODO: Delete from vector store if semantic recall is enabled\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_DELETE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: messageIds.join(', ') },\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { StoreOperations } from '@mastra/core/storage';\nimport type { TABLE_NAMES, StorageColumn } from '@mastra/core/storage';\nimport type { Redis } from '@upstash/redis';\nimport { getKey, processRecord } from '../utils';\n\nexport class StoreOperationsUpstash extends StoreOperations {\n private client: Redis;\n\n constructor({ client }: { client: Redis }) {\n super();\n this.client = client;\n }\n\n async createTable({\n tableName: _tableName,\n schema: _schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n // For Redis/Upstash, tables are created implicitly when data is inserted\n // This method is a no-op for Redis-based storage\n }\n\n async alterTable({\n tableName: _tableName,\n schema: _schema,\n ifNotExists: _ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n // For Redis/Upstash, schema changes are handled implicitly\n // This method is a no-op for Redis-based storage\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n const pattern = `${tableName}:*`;\n try {\n await this.scanAndDelete(pattern);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_CLEAR_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.clearTable({ tableName });\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n const { key, processedRecord } = processRecord(tableName, record);\n\n try {\n await this.client.set(key, processedRecord);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async batchInsert(input: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n const { tableName, records } = input;\n if (!records.length) return;\n\n const batchSize = 1000;\n try {\n for (let i = 0; i < records.length; i += batchSize) {\n const batch = records.slice(i, i + batchSize);\n const pipeline = this.client.pipeline();\n for (const record of batch) {\n const { key, processedRecord } = processRecord(tableName, record);\n pipeline.set(key, processedRecord);\n }\n await pipeline.exec();\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_BATCH_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n const key = getKey(tableName, keys);\n try {\n const data = await this.client.get<R>(key);\n return data || null;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_LOAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async hasColumn(_tableName: TABLE_NAMES, _column: string): Promise<boolean> {\n // For Redis/Upstash, columns are dynamic and always available\n // This method always returns true for Redis-based storage\n return true;\n }\n\n async scanKeys(pattern: string, batchSize = 10000): Promise<string[]> {\n let cursor = '0';\n let keys: string[] = [];\n do {\n const [nextCursor, batch] = await this.client.scan(cursor, {\n match: pattern,\n count: batchSize,\n });\n keys.push(...batch);\n cursor = nextCursor;\n } while (cursor !== '0');\n return keys;\n }\n\n async scanAndDelete(pattern: string, batchSize = 10000): Promise<number> {\n let cursor = '0';\n let totalDeleted = 0;\n do {\n const [nextCursor, keys] = await this.client.scan(cursor, {\n match: pattern,\n count: batchSize,\n });\n if (keys.length > 0) {\n await this.client.del(...keys);\n totalDeleted += keys.length;\n }\n cursor = nextCursor;\n } while (cursor !== '0');\n return totalDeleted;\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { ScoreRowData, ScoringSource, ValidatedSaveScorePayload } from '@mastra/core/scores';\nimport { saveScorePayloadSchema } from '@mastra/core/scores';\nimport { ScoresStorage, TABLE_SCORERS } from '@mastra/core/storage';\nimport type { Redis } from '@upstash/redis';\nimport type { StoreOperationsUpstash } from '../operations';\nimport { processRecord } from '../utils';\n\nfunction transformScoreRow(row: Record<string, any>): ScoreRowData {\n const parseField = (v: any) => {\n if (typeof v === 'string') {\n try {\n return JSON.parse(v);\n } catch {\n return v;\n }\n }\n return v;\n };\n return {\n ...row,\n scorer: parseField(row.scorer),\n preprocessStepResult: parseField(row.preprocessStepResult),\n generateScorePrompt: row.generateScorePrompt,\n generateReasonPrompt: row.generateReasonPrompt,\n analyzeStepResult: parseField(row.analyzeStepResult),\n metadata: parseField(row.metadata),\n input: parseField(row.input),\n output: parseField(row.output),\n additionalContext: parseField(row.additionalContext),\n runtimeContext: parseField(row.runtimeContext),\n entity: parseField(row.entity),\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n } as ScoreRowData;\n}\n\nexport class ScoresUpstash extends ScoresStorage {\n private client: Redis;\n private operations: StoreOperationsUpstash;\n\n constructor({ client, operations }: { client: Redis; operations: StoreOperationsUpstash }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const data = await this.operations.load<ScoreRowData>({\n tableName: TABLE_SCORERS,\n keys: { id },\n });\n if (!data) return null;\n return transformScoreRow(data);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_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 getScoresByScorerId({\n scorerId,\n entityId,\n entityType,\n source,\n pagination = { page: 0, perPage: 20 },\n }: {\n scorerId: string;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n pagination?: { page: number; perPage: number };\n }): Promise<{\n scores: ScoreRowData[];\n pagination: { total: number; page: number; perPage: number; hasMore: boolean };\n }> {\n const pattern = `${TABLE_SCORERS}:*`;\n const keys = await this.operations.scanKeys(pattern);\n if (keys.length === 0) {\n return {\n scores: [],\n pagination: { total: 0, page: pagination.page, perPage: pagination.perPage, hasMore: false },\n };\n }\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n // Filter out nulls and by scorerId\n const filtered = results\n .map((row: any) => row as Record<string, any> | null)\n .filter((row): row is Record<string, any> => {\n if (!row || typeof row !== 'object') return false;\n if (row.scorerId !== scorerId) return false;\n if (entityId && row.entityId !== entityId) return false;\n if (entityType && row.entityType !== entityType) return false;\n if (source && row.source !== source) return false;\n return true;\n });\n const total = filtered.length;\n const { page, perPage } = pagination;\n const start = page * perPage;\n const end = start + perPage;\n const paged = filtered.slice(start, end);\n const scores = paged.map(row => transformScoreRow(row));\n return {\n scores,\n pagination: {\n total,\n page,\n perPage,\n hasMore: end < total,\n },\n };\n }\n\n async saveScore(score: ScoreRowData): 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_UPSTASH_STORAGE_SAVE_SCORE_VALIDATION_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n const { key, processedRecord } = processRecord(TABLE_SCORERS, validatedScore);\n try {\n await this.client.set(key, processedRecord);\n return { score };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_SAVE_SCORE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: score.id },\n },\n error,\n );\n }\n }\n\n async getScoresByRunId({\n runId,\n pagination = { page: 0, perPage: 20 },\n }: {\n runId: string;\n pagination?: { page: number; perPage: number };\n }): Promise<{\n scores: ScoreRowData[];\n pagination: { total: number; page: number; perPage: number; hasMore: boolean };\n }> {\n const pattern = `${TABLE_SCORERS}:*`;\n const keys = await this.operations.scanKeys(pattern);\n if (keys.length === 0) {\n return {\n scores: [],\n pagination: { total: 0, page: pagination.page, perPage: pagination.perPage, hasMore: false },\n };\n }\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n // Filter out nulls and by runId\n const filtered = results\n .map((row: any) => row as Record<string, any> | null)\n .filter((row): row is Record<string, any> => !!row && typeof row === 'object' && row.runId === runId);\n const total = filtered.length;\n const { page, perPage } = pagination;\n const start = page * perPage;\n const end = start + perPage;\n const paged = filtered.slice(start, end);\n const scores = paged.map(row => transformScoreRow(row));\n return {\n scores,\n pagination: {\n total,\n page,\n perPage,\n hasMore: end < total,\n },\n };\n }\n\n async getScoresByEntityId({\n entityId,\n entityType,\n pagination = { page: 0, perPage: 20 },\n }: {\n entityId: string;\n entityType?: string;\n pagination?: { page: number; perPage: number };\n }): Promise<{\n scores: ScoreRowData[];\n pagination: { total: number; page: number; perPage: number; hasMore: boolean };\n }> {\n const pattern = `${TABLE_SCORERS}:*`;\n const keys = await this.operations.scanKeys(pattern);\n if (keys.length === 0) {\n return {\n scores: [],\n pagination: { total: 0, page: pagination.page, perPage: pagination.perPage, hasMore: false },\n };\n }\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n\n const filtered = results\n .map((row: any) => row as Record<string, any> | null)\n .filter((row): row is Record<string, any> => {\n if (!row || typeof row !== 'object') return false;\n if (row.entityId !== entityId) return false;\n if (entityType && row.entityType !== entityType) return false;\n return true;\n });\n const total = filtered.length;\n const { page, perPage } = pagination;\n const start = page * perPage;\n const end = start + perPage;\n const paged = filtered.slice(start, end);\n const scores = paged.map(row => transformScoreRow(row));\n return {\n scores,\n pagination: {\n total,\n page,\n perPage,\n hasMore: end < total,\n },\n };\n }\n\n async getScoresBySpan({\n traceId,\n spanId,\n pagination = { page: 0, perPage: 20 },\n }: {\n traceId: string;\n spanId: string;\n pagination?: { page: number; perPage: number };\n }): Promise<{\n scores: ScoreRowData[];\n pagination: { total: number; page: number; perPage: number; hasMore: boolean };\n }> {\n const pattern = `${TABLE_SCORERS}:*`;\n const keys = await this.operations.scanKeys(pattern);\n if (keys.length === 0) {\n return {\n scores: [],\n pagination: { total: 0, page: pagination.page, perPage: pagination.perPage, hasMore: false },\n };\n }\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n // Filter out nulls and by traceId and spanId\n const filtered = results\n .map((row: any) => row as Record<string, any> | null)\n .filter((row): row is Record<string, any> => {\n if (!row || typeof row !== 'object') return false;\n if (row.traceId !== traceId) return false;\n if (row.spanId !== spanId) return false;\n return true;\n });\n const total = filtered.length;\n const { page, perPage } = pagination;\n const start = page * perPage;\n const end = start + perPage;\n const paged = filtered.slice(start, end);\n const scores = paged.map(row => transformScoreRow(row));\n return {\n scores,\n pagination: {\n total,\n page,\n perPage,\n hasMore: end < total,\n },\n };\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { StorageGetTracesArg, PaginationInfo, PaginationArgs } from '@mastra/core/storage';\nimport { TracesStorage, TABLE_TRACES } from '@mastra/core/storage';\nimport type { Redis } from '@upstash/redis';\nimport type { StoreOperationsUpstash } from '../operations';\nimport { ensureDate, parseJSON } from '../utils';\n\nexport class TracesUpstash extends TracesStorage {\n private client: Redis;\n private operations: StoreOperationsUpstash;\n\n constructor({ client, operations }: { client: Redis; operations: StoreOperationsUpstash }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n /**\n * @deprecated use getTracesPaginated instead\n */\n public async getTraces(args: StorageGetTracesArg): Promise<any[]> {\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 { traces } = await this.getTracesPaginated(args);\n return traces;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_GET_TRACES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n public async getTracesPaginated(\n args: {\n name?: string;\n scope?: string;\n attributes?: Record<string, string>;\n filters?: Record<string, any>;\n } & PaginationArgs,\n ): Promise<PaginationInfo & { traces: any[] }> {\n const { name, scope, page = 0, perPage = 100, attributes, filters, dateRange } = args;\n const fromDate = dateRange?.start;\n const toDate = dateRange?.end;\n\n try {\n const pattern = `${TABLE_TRACES}:*`;\n const keys = await this.operations.scanKeys(pattern);\n\n if (keys.length === 0) {\n return {\n traces: [],\n total: 0,\n page,\n perPage: perPage || 100,\n hasMore: false,\n };\n }\n\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n\n let filteredTraces = results.filter(\n (record): record is Record<string, any> => record !== null && typeof record === 'object',\n );\n\n if (name) {\n filteredTraces = filteredTraces.filter(record => record.name?.toLowerCase().startsWith(name.toLowerCase()));\n }\n if (scope) {\n filteredTraces = filteredTraces.filter(record => record.scope === scope);\n }\n if (attributes) {\n filteredTraces = filteredTraces.filter(record => {\n const recordAttributes = record.attributes;\n if (!recordAttributes) return false;\n const parsedAttributes =\n typeof recordAttributes === 'string' ? JSON.parse(recordAttributes) : recordAttributes;\n return Object.entries(attributes).every(([key, value]) => parsedAttributes[key] === value);\n });\n }\n if (filters) {\n filteredTraces = filteredTraces.filter(record =>\n Object.entries(filters).every(([key, value]) => record[key] === value),\n );\n }\n if (fromDate) {\n filteredTraces = filteredTraces.filter(\n record => new Date(record.createdAt).getTime() >= new Date(fromDate).getTime(),\n );\n }\n if (toDate) {\n filteredTraces = filteredTraces.filter(\n record => new Date(record.createdAt).getTime() <= new Date(toDate).getTime(),\n );\n }\n\n filteredTraces.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n const transformedTraces = filteredTraces.map(record => ({\n id: record.id,\n parentSpanId: record.parentSpanId,\n traceId: record.traceId,\n name: record.name,\n scope: record.scope,\n kind: record.kind,\n status: parseJSON(record.status),\n events: parseJSON(record.events),\n links: parseJSON(record.links),\n attributes: parseJSON(record.attributes),\n startTime: record.startTime,\n endTime: record.endTime,\n other: parseJSON(record.other),\n createdAt: ensureDate(record.createdAt),\n }));\n\n const total = transformedTraces.length;\n const resolvedPerPage = perPage || 100;\n const start = page * resolvedPerPage;\n const end = start + resolvedPerPage;\n const paginatedTraces = transformedTraces.slice(start, end);\n const hasMore = end < total;\n\n return {\n traces: paginatedTraces,\n total,\n page,\n perPage: resolvedPerPage,\n hasMore,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_GET_TRACES_PAGINATED_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n name: args.name || '',\n scope: args.scope || '',\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n this.logger.error(mastraError.toString());\n return {\n traces: [],\n total: 0,\n page,\n perPage: perPage || 100,\n hasMore: false,\n };\n }\n }\n\n async batchTraceInsert(args: { records: Record<string, any>[] }): Promise<void> {\n return this.operations.batchInsert({\n tableName: TABLE_TRACES,\n records: args.records,\n });\n }\n}\n","import type { StepResult, WorkflowRun, WorkflowRuns, WorkflowRunState } from '@mastra/core';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { TABLE_WORKFLOW_SNAPSHOT, WorkflowsStorage } from '@mastra/core/storage';\nimport type { Redis } from '@upstash/redis';\nimport type { StoreOperationsUpstash } from '../operations';\nimport { ensureDate, getKey } from '../utils';\n\nfunction parseWorkflowRun(row: any): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\n if (typeof parsedSnapshot === 'string') {\n try {\n parsedSnapshot = JSON.parse(row.snapshot as string) as WorkflowRunState;\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,\n runId: row.run_id,\n snapshot: parsedSnapshot,\n createdAt: ensureDate(row.createdAt)!,\n updatedAt: ensureDate(row.updatedAt)!,\n resourceId: row.resourceId,\n };\n}\nexport class WorkflowsUpstash extends WorkflowsStorage {\n private client: Redis;\n private operations: StoreOperationsUpstash;\n\n constructor({ client, operations }: { client: Redis; operations: StoreOperationsUpstash }) {\n super();\n this.client = client;\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(params: {\n namespace: string;\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n const { namespace = 'workflows', workflowName, runId, resourceId, snapshot } = params;\n try {\n await this.operations.insert({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n record: {\n namespace,\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot,\n createdAt: new Date(),\n updatedAt: new Date(),\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_PERSIST_WORKFLOW_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace,\n workflowName,\n runId,\n },\n },\n error,\n );\n }\n }\n\n async loadWorkflowSnapshot(params: {\n namespace: string;\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n const { namespace = 'workflows', workflowName, runId } = params;\n const key = getKey(TABLE_WORKFLOW_SNAPSHOT, {\n namespace,\n workflow_name: workflowName,\n run_id: runId,\n });\n try {\n const data = await this.client.get<{\n namespace: string;\n workflow_name: string;\n run_id: string;\n snapshot: WorkflowRunState;\n }>(key);\n if (!data) return null;\n return data.snapshot;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_LOAD_WORKFLOW_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace,\n workflowName,\n runId,\n },\n },\n error,\n );\n }\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n try {\n const key =\n getKey(TABLE_WORKFLOW_SNAPSHOT, { namespace: 'workflows', workflow_name: workflowName, run_id: runId }) + '*';\n const keys = await this.operations.scanKeys(key);\n const workflows = await Promise.all(\n keys.map(async key => {\n const data = await this.client.get<{\n workflow_name: string;\n run_id: string;\n snapshot: WorkflowRunState | string;\n createdAt: string | Date;\n updatedAt: string | Date;\n resourceId: string;\n }>(key);\n return data;\n }),\n );\n const data = workflows.find(w => w?.run_id === runId && w?.workflow_name === workflowName) as WorkflowRun | null;\n if (!data) return null;\n return parseWorkflowRun(data);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_GET_WORKFLOW_RUN_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace: 'workflows',\n runId,\n workflowName: workflowName || '',\n },\n },\n error,\n );\n }\n }\n\n async getWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n limit,\n offset,\n resourceId,\n }: {\n workflowName?: string;\n fromDate?: Date;\n toDate?: Date;\n limit?: number;\n offset?: number;\n resourceId?: string;\n }): Promise<WorkflowRuns> {\n try {\n // Get all workflow keys\n let pattern = getKey(TABLE_WORKFLOW_SNAPSHOT, { namespace: 'workflows' }) + ':*';\n if (workflowName && resourceId) {\n pattern = getKey(TABLE_WORKFLOW_SNAPSHOT, {\n namespace: 'workflows',\n workflow_name: workflowName,\n run_id: '*',\n resourceId,\n });\n } else if (workflowName) {\n pattern = getKey(TABLE_WORKFLOW_SNAPSHOT, { namespace: 'workflows', workflow_name: workflowName }) + ':*';\n } else if (resourceId) {\n pattern = getKey(TABLE_WORKFLOW_SNAPSHOT, {\n namespace: 'workflows',\n workflow_name: '*',\n run_id: '*',\n resourceId,\n });\n }\n const keys = await this.operations.scanKeys(pattern);\n\n // Check if we have any keys before using pipeline\n if (keys.length === 0) {\n return { runs: [], total: 0 };\n }\n\n // Use pipeline for batch fetching to improve performance\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n\n // Filter and transform results - handle undefined results\n let runs = results\n .map((result: any) => result as Record<string, any> | null)\n .filter(\n (record): record is Record<string, any> =>\n record !== null && record !== undefined && typeof record === 'object' && 'workflow_name' in record,\n )\n // Only filter by workflowName if it was specifically requested\n .filter(record => !workflowName || record.workflow_name === workflowName)\n .map(w => parseWorkflowRun(w!))\n .filter(w => {\n if (fromDate && w.createdAt < fromDate) return false;\n if (toDate && w.createdAt > toDate) return false;\n return true;\n })\n .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n\n const total = runs.length;\n\n // Apply pagination if requested\n if (limit !== undefined && offset !== undefined) {\n runs = runs.slice(offset, offset + limit);\n }\n\n return { runs, total };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_GET_WORKFLOW_RUNS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace: 'workflows',\n workflowName: workflowName || '',\n resourceId: resourceId || '',\n },\n },\n error,\n );\n }\n }\n}\n","import type { MastraMessageContentV2, MastraMessageV2 } from '@mastra/core/agent';\nimport type { StorageThreadType, MastraMessageV1 } from '@mastra/core/memory';\nimport type { ScoreRowData, ScoringSource } from '@mastra/core/scores';\nimport { MastraStorage } from '@mastra/core/storage';\nimport type {\n TABLE_NAMES,\n StorageColumn,\n StorageGetMessagesArg,\n StorageResourceType,\n EvalRow,\n WorkflowRuns,\n WorkflowRun,\n PaginationInfo,\n PaginationArgs,\n StorageGetTracesArg,\n StoragePagination,\n StorageDomains,\n} from '@mastra/core/storage';\n\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { Redis } from '@upstash/redis';\nimport { StoreLegacyEvalsUpstash } from './domains/legacy-evals';\nimport { StoreMemoryUpstash } from './domains/memory';\nimport { StoreOperationsUpstash } from './domains/operations';\nimport { ScoresUpstash } from './domains/scores';\nimport { TracesUpstash } from './domains/traces';\nimport { WorkflowsUpstash } from './domains/workflows';\n\nexport interface UpstashConfig {\n url: string;\n token: string;\n}\n\nexport class UpstashStore extends MastraStorage {\n private redis: Redis;\n stores: StorageDomains;\n\n constructor(config: UpstashConfig) {\n super({ name: 'Upstash' });\n this.redis = new Redis({\n url: config.url,\n token: config.token,\n });\n\n const operations = new StoreOperationsUpstash({ client: this.redis });\n const traces = new TracesUpstash({ client: this.redis, operations });\n const scores = new ScoresUpstash({ client: this.redis, operations });\n const workflows = new WorkflowsUpstash({ client: this.redis, operations });\n const memory = new StoreMemoryUpstash({ client: this.redis, operations });\n const legacyEvals = new StoreLegacyEvalsUpstash({ client: this.redis, operations });\n\n this.stores = {\n operations,\n traces,\n scores,\n workflows,\n memory,\n legacyEvals,\n };\n }\n\n public get supports() {\n return {\n selectByIncludeResourceScope: true,\n resourceWorkingMemory: true,\n hasColumn: false,\n createTable: false,\n deleteMessages: true,\n getScoresBySpan: true,\n };\n }\n\n /**\n * @deprecated Use getEvals instead\n */\n async getEvalsByAgentName(agentName: string, type?: 'test' | 'live'): Promise<EvalRow[]> {\n return this.stores.legacyEvals.getEvalsByAgentName(agentName, type);\n }\n\n /**\n * Get all evaluations with pagination and total count\n * @param options Pagination and filtering options\n * @returns Object with evals array and total count\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 /**\n * @deprecated use getTracesPaginated instead\n */\n public async getTraces(args: StorageGetTracesArg): Promise<any[]> {\n return this.stores.traces.getTraces(args);\n }\n\n public async getTracesPaginated(\n args: {\n name?: string;\n scope?: string;\n attributes?: Record<string, string>;\n filters?: Record<string, any>;\n } & PaginationArgs,\n ): Promise<PaginationInfo & { traces: any[] }> {\n return this.stores.traces.getTracesPaginated(args);\n }\n\n async batchTraceInsert(args: { records: Record<string, any>[] }): Promise<void> {\n return this.stores.traces.batchTraceInsert(args);\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 /**\n * No-op: This backend is schemaless and does not require schema changes.\n * @param tableName Name of the table\n * @param schema Schema of the table\n * @param ifNotExists Array of column names to add if they don't exist\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 clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.clearTable({ tableName });\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.dropTable({ 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(input: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n return this.stores.operations.batchInsert(input);\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n return this.stores.operations.load<R>({ tableName, keys });\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n return this.stores.memory.getThreadById({ threadId });\n }\n\n /**\n * @deprecated use getThreadsByResourceIdPaginated instead\n */\n async getThreadsByResourceId({ resourceId }: { resourceId: string }): Promise<StorageThreadType[]> {\n return this.stores.memory.getThreadsByResourceId({ resourceId });\n }\n\n public 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 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 /**\n * @deprecated use getMessagesPaginated instead\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 & { format?: 'v1' | 'v2' }): Promise<MastraMessageV1[] | MastraMessageV2[]> {\n return this.stores.memory.getMessages({ threadId, selectBy, format });\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 public async getMessagesPaginated(\n args: StorageGetMessagesArg & {\n format?: 'v1' | 'v2';\n },\n ): Promise<PaginationInfo & { messages: MastraMessageV1[] | MastraMessageV2[] }> {\n return this.stores.memory.getMessagesPaginated(args);\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(params: {\n namespace: string;\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n return this.stores.workflows.persistWorkflowSnapshot(params);\n }\n\n async loadWorkflowSnapshot(params: {\n namespace: string;\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n return this.stores.workflows.loadWorkflowSnapshot(params);\n }\n\n async getWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n limit,\n offset,\n resourceId,\n }: {\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({ workflowName, fromDate, toDate, limit, offset, resourceId });\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 // No explicit cleanup needed for Upstash Redis\n }\n\n async updateMessages(args: {\n messages: (Partial<Omit<MastraMessageV2, 'createdAt'>> & {\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 deleteMessages(messageIds: string[]): Promise<void> {\n return this.stores.memory.deleteMessages(messageIds);\n }\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({ resourceId, workingMemory, metadata });\n }\n\n async getScoreById({ id: _id }: { id: string }): Promise<ScoreRowData | null> {\n return this.stores.scores.getScoreById({ id: _id });\n }\n\n async saveScore(score: ScoreRowData): 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({\n entityId,\n entityType,\n pagination,\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 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","import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type { OperatorSupport, VectorFilter, OperatorValueMap } from '@mastra/core/vector/filter';\n\ntype UpstashOperatorValueMap = Omit<OperatorValueMap, '$options' | '$elemMatch'> & {\n $contains: string;\n};\n\nexport type UpstashVectorFilter = VectorFilter<keyof UpstashOperatorValueMap, UpstashOperatorValueMap>;\n\nexport class UpstashFilterTranslator extends BaseFilterTranslator<UpstashVectorFilter, string | undefined> {\n protected override getSupportedOperators(): OperatorSupport {\n return {\n ...BaseFilterTranslator.DEFAULT_OPERATORS,\n array: ['$in', '$nin', '$all'],\n regex: ['$regex'],\n custom: ['$contains'],\n };\n }\n\n translate(filter?: UpstashVectorFilter): string | undefined {\n if (this.isEmpty(filter)) return undefined;\n this.validateFilter(filter);\n return this.translateNode(filter);\n }\n\n private translateNode(node: UpstashVectorFilter, path: string = ''): string {\n if (this.isRegex(node)) {\n throw new Error('Direct regex pattern format is not supported in Upstash');\n }\n if (node === null || node === undefined) {\n throw new Error('Filtering for null/undefined values is not supported by Upstash Vector');\n }\n\n // Handle primitives (direct equality)\n if (this.isPrimitive(node)) {\n if (node === null || node === undefined) {\n throw new Error('Filtering for null/undefined values is not supported by Upstash Vector');\n }\n return this.formatComparison(path, '=', node);\n }\n\n // Handle arrays (IN operator)\n if (Array.isArray(node)) {\n if (node.length === 0) {\n return '(HAS FIELD empty AND HAS NOT FIELD empty)';\n }\n return `${path} IN (${this.formatArray(node)})`;\n }\n\n const entries = Object.entries(node as Record<string, any>);\n const conditions: string[] = [];\n\n for (const [key, value] of entries) {\n const newPath = path ? `${path}.${key}` : key;\n\n if (this.isOperator(key)) {\n conditions.push(this.translateOperator(key, value, path));\n } else if (typeof value === 'object' && value !== null) {\n conditions.push(this.translateNode(value, newPath));\n } else if (value === null || value === undefined) {\n throw new Error('Filtering for null/undefined values is not supported by Upstash Vector');\n } else {\n conditions.push(this.formatComparison(newPath, '=', value));\n }\n }\n\n return conditions.length > 1 ? `(${conditions.join(' AND ')})` : (conditions[0] ?? '');\n }\n\n private readonly COMPARISON_OPS = {\n $eq: '=',\n $ne: '!=',\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n } as const;\n\n private translateOperator(operator: string, value: any, path: string): string {\n // Handle comparison operators\n if (this.isBasicOperator(operator) || this.isNumericOperator(operator)) {\n return this.formatComparison(path, this.COMPARISON_OPS[operator], value);\n }\n\n // Handle special operators\n switch (operator) {\n case '$in':\n if (!Array.isArray(value) || value.length === 0) {\n return '(HAS FIELD empty AND HAS NOT FIELD empty)'; // Always false\n }\n return `${path} IN (${this.formatArray(value)})`;\n case '$nin':\n return `${path} NOT IN (${this.formatArray(value)})`;\n case '$contains':\n return `${path} CONTAINS ${this.formatValue(value)}`;\n case '$regex':\n return `${path} GLOB ${this.formatValue(value)}`;\n case '$exists':\n return value ? `HAS FIELD ${path}` : `HAS NOT FIELD ${path}`;\n\n case '$and':\n if (!Array.isArray(value) || value.length === 0) {\n return '(HAS FIELD empty OR HAS NOT FIELD empty)';\n }\n return this.joinConditions(value, 'AND');\n\n case '$or':\n if (!Array.isArray(value) || value.length === 0) {\n return '(HAS FIELD empty AND HAS NOT FIELD empty)';\n }\n return this.joinConditions(value, 'OR');\n\n case '$not':\n return this.formatNot(path, value);\n\n case '$nor':\n return this.formatNot('', { $or: value });\n case '$all':\n return this.translateOperator(\n '$and',\n value.map((item: unknown) => ({ [path]: { $contains: item } })),\n '',\n );\n\n default:\n throw new Error(`Unsupported operator: ${operator}`);\n }\n }\n\n private readonly NEGATED_OPERATORS: Record<string, string> = {\n $eq: '$ne',\n $ne: '$eq',\n $gt: '$lte',\n $gte: '$lt',\n $lt: '$gte',\n $lte: '$gt',\n $in: '$nin',\n $nin: '$in',\n $exists: '$exists', // Special case - we'll flip the value\n };\n\n private formatNot(path: string, value: any): string {\n if (typeof value !== 'object') {\n return `${path} != ${this.formatValue(value)}`;\n }\n\n if (!Object.keys(value).some(k => k.startsWith('$'))) {\n const [fieldName, fieldValue] = Object.entries(value)[0] ?? [];\n\n // If it's a nested condition with an operator\n if (typeof fieldValue === 'object' && fieldValue !== null && Object.keys(fieldValue)[0]?.startsWith('$')) {\n const [op, val] = Object.entries(fieldValue)[0] ?? [];\n const negatedOp = this.NEGATED_OPERATORS[op as string];\n if (!negatedOp) throw new Error(`Unsupported operator in NOT: ${op}`);\n\n // Special case for $exists - negate the value instead of the operator\n if (op === '$exists') {\n return this.translateOperator(op, !val, fieldName ?? '');\n }\n\n return this.translateOperator(negatedOp, val, fieldName ?? '');\n }\n\n // Otherwise handle as simple field value\n return `${fieldName} != ${this.formatValue(fieldValue)}`;\n }\n\n // Handle top-level operators\n const [op, val] = Object.entries(value)[0] ?? [];\n\n // Handle comparison operators\n if (op === '$lt') return `${path} >= ${this.formatValue(val)}`;\n if (op === '$lte') return `${path} > ${this.formatValue(val)}`;\n if (op === '$gt') return `${path} <= ${this.formatValue(val)}`;\n if (op === '$gte') return `${path} < ${this.formatValue(val)}`;\n if (op === '$ne') return `${path} = ${this.formatValue(val)}`;\n if (op === '$eq') return `${path} != ${this.formatValue(val)}`;\n\n // Special cases\n if (op === '$contains') return `${path} NOT CONTAINS ${this.formatValue(val)}`;\n if (op === '$regex') return `${path} NOT GLOB ${this.formatValue(val)}`;\n if (op === '$in') return `${path} NOT IN (${this.formatArray(val as any[])})`;\n if (op === '$exists') return val ? `HAS NOT FIELD ${path}` : `HAS FIELD ${path}`;\n\n // Transform NOT(AND) into OR(NOT) and NOT(OR) into AND(NOT)\n if (op === '$and' || op === '$or') {\n const newOp = op === '$and' ? '$or' : '$and';\n const conditions = (val as any[]).map((condition: any) => {\n const [fieldName, fieldValue] = Object.entries(condition)[0] ?? [];\n return { [fieldName as string]: { $not: fieldValue } };\n });\n return this.translateOperator(newOp, conditions, '');\n }\n\n // NOT(NOR) is equivalent to OR\n if (op === '$nor') {\n return this.translateOperator('$or', val, '');\n }\n\n return `${path} != ${this.formatValue(val)}`;\n }\n\n private formatValue(value: any): string {\n if (value === null || value === undefined) {\n throw new Error('Filtering for null/undefined values is not supported by Upstash Vector');\n }\n\n if (typeof value === 'string') {\n // Check for quotes in the string content\n const hasSingleQuote = /'/g.test(value);\n const hasDoubleQuote = /\"/g.test(value);\n\n // If string has both types of quotes, escape single quotes and use single quotes\n // If string has single quotes, use double quotes\n // Otherwise, use single quotes (default)\n if (hasSingleQuote && hasDoubleQuote) {\n return `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n }\n if (hasSingleQuote) {\n return `\"${value}\"`;\n }\n return `'${value}'`;\n }\n\n if (typeof value === 'number') {\n // Handle scientific notation by converting to decimal\n if (Math.abs(value) < 1e-6 || Math.abs(value) > 1e6) {\n return value.toFixed(20).replace(/\\.?0+$/, '');\n }\n // Regular numbers (including zero and negative)\n return value.toString();\n }\n\n return String(value);\n }\n\n private formatArray(values: any[]): string {\n return values\n .map(value => {\n if (value === null || value === undefined) {\n throw new Error('Filtering for null/undefined values is not supported by Upstash Vector');\n }\n return this.formatValue(value);\n })\n .join(', ');\n }\n\n private formatComparison(path: string, op: string, value: any): string {\n return `${path} ${op} ${this.formatValue(value)}`;\n }\n\n private joinConditions(conditions: any[], operator: string): string {\n const translated = Array.isArray(conditions)\n ? conditions.map(c => this.translateNode(c))\n : [this.translateNode(conditions)];\n\n // Don't wrap in parentheses if there's only one condition\n return `(${translated.join(` ${operator} `)})`;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n CreateIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n DescribeIndexParams,\n IndexStats,\n QueryResult,\n} from '@mastra/core/vector';\nimport { Index } from '@upstash/vector';\n\nimport { UpstashFilterTranslator } from './filter';\nimport type { UpstashVectorFilter } from './filter';\nimport type { UpstashUpsertVectorParams, UpstashQueryVectorParams, UpstashUpdateVectorParams } from './types';\n\nexport class UpstashVector extends MastraVector<UpstashVectorFilter> {\n private client: Index;\n\n /**\n * Creates a new UpstashVector instance.\n * @param {object} params - The parameters for the UpstashVector.\n * @param {string} params.url - The URL of the Upstash vector index.\n * @param {string} params.token - The token for the Upstash vector index.\n */\n constructor({ url, token }: { url: string; token: string }) {\n super();\n this.client = new Index({\n url,\n token,\n });\n }\n\n /**\n * Upserts vectors into the index.\n * @param {UpsertVectorParams} params - The parameters for the upsert operation.\n * @returns {Promise<string[]>} A promise that resolves to the IDs of the upserted vectors.\n */\n async upsert({\n indexName: namespace,\n vectors,\n metadata,\n ids,\n sparseVectors,\n }: UpstashUpsertVectorParams): Promise<string[]> {\n const generatedIds = ids || vectors.map(() => randomUUID());\n\n const points = vectors.map((vector, index) => ({\n id: generatedIds[index]!,\n vector,\n ...(sparseVectors?.[index] && { sparseVector: sparseVectors[index] }),\n metadata: metadata?.[index],\n }));\n\n try {\n await this.client.upsert(points, {\n namespace,\n });\n return generatedIds;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_VECTOR_UPSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace, vectorCount: vectors.length },\n },\n error,\n );\n }\n }\n\n /**\n * Transforms a Mastra vector filter into an Upstash-compatible filter string.\n * @param {UpstashVectorFilter} [filter] - The filter to transform.\n * @returns {string | undefined} The transformed filter string, or undefined if no filter is provided.\n */\n transformFilter(filter?: UpstashVectorFilter) {\n const translator = new UpstashFilterTranslator();\n return translator.translate(filter);\n }\n\n /**\n * Creates a new index. For Upstash, this is a no-op as indexes (known as namespaces in Upstash) are created on-the-fly.\n * @param {CreateIndexParams} _params - The parameters for creating the index (ignored).\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n */\n async createIndex(_params: CreateIndexParams): Promise<void> {\n this.logger.debug('No need to call createIndex for Upstash');\n }\n\n /**\n * Queries the vector index.\n * @param {QueryVectorParams} params - The parameters for the query operation. indexName is the namespace in Upstash.\n * @returns {Promise<QueryResult[]>} A promise that resolves to the query results.\n */\n async query({\n indexName: namespace,\n queryVector,\n topK = 10,\n filter,\n includeVector = false,\n sparseVector,\n fusionAlgorithm,\n queryMode,\n }: UpstashQueryVectorParams): Promise<QueryResult[]> {\n try {\n const ns = this.client.namespace(namespace);\n\n const filterString = this.transformFilter(filter);\n const results = await ns.query({\n topK,\n vector: queryVector,\n ...(sparseVector && { sparseVector }),\n includeVectors: includeVector,\n includeMetadata: true,\n ...(filterString ? { filter: filterString } : {}),\n ...(fusionAlgorithm && { fusionAlgorithm }),\n ...(queryMode && { queryMode }),\n });\n\n // Map the results to our expected format\n return (results || []).map(result => ({\n id: `${result.id}`,\n score: result.score,\n metadata: result.metadata,\n ...(includeVector && { vector: result.vector || [] }),\n }));\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_VECTOR_QUERY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace, topK },\n },\n error,\n );\n }\n }\n\n /**\n * Lists all namespaces in the Upstash vector index, which correspond to indexes.\n * @returns {Promise<string[]>} A promise that resolves to a list of index names.\n */\n async listIndexes(): Promise<string[]> {\n try {\n const indexes = await this.client.listNamespaces();\n return indexes.filter(Boolean);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_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 namespace to describe\n * @returns A promise that resolves to the index statistics including dimension, count and metric\n */\n async describeIndex({ indexName: namespace }: DescribeIndexParams): Promise<IndexStats> {\n try {\n const info = await this.client.info();\n\n return {\n dimension: info.dimension,\n count: info.namespaces?.[namespace]?.vectorCount || 0,\n metric: info?.similarityFunction?.toLowerCase() as 'cosine' | 'euclidean' | 'dotproduct',\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_VECTOR_DESCRIBE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes an index (namespace).\n * @param {DeleteIndexParams} params - The parameters for the delete operation.\n * @returns {Promise<void>} A promise that resolves when the deletion is complete.\n */\n async deleteIndex({ indexName: namespace }: DeleteIndexParams): Promise<void> {\n try {\n await this.client.deleteNamespace(namespace);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_VECTOR_DELETE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace },\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 namespace 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: namespace, id, update }: UpstashUpdateVectorParams): Promise<void> {\n if (!update.vector && !update.metadata && !update.sparseVector) {\n throw new MastraError({\n id: 'STORAGE_UPSTASH_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace, id },\n text: 'No update data provided',\n });\n }\n\n // The upstash client throws an exception as: 'This index requires dense/sparse vectors' when\n // only metadata is present in the update object.\n if (!update.vector && !update.sparseVector && update.metadata) {\n throw new MastraError({\n id: 'STORAGE_UPSTASH_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace, id },\n text: 'Both vector and metadata must be provided for an update',\n });\n }\n\n try {\n const points: any = { id };\n\n if (update.vector) points.vector = update.vector;\n if (update.metadata) points.metadata = update.metadata;\n if (update.sparseVector) points.sparseVector = update.sparseVector;\n\n await this.client.upsert(points, { namespace });\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace, id },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a vector by its ID.\n * @param indexName - The name of the namespace 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: namespace, id }: DeleteVectorParams): Promise<void> {\n try {\n await this.client.delete(id, {\n namespace,\n });\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'STORAGE_UPSTASH_VECTOR_DELETE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace, id },\n },\n error,\n );\n this.logger?.error(mastraError.toString());\n }\n }\n}\n","/**\n * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for Upstash Vector.\n */\nexport const UPSTASH_PROMPT = `When querying Upstash 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\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\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n\nRestrictions:\n- Regex patterns are not supported\n- Only $and and $or logical operators are supported at the top level\n- Empty arrays in $in/$nin will return no results\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported with both implicit and explicit $and\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):\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 { \"rating\": { \"$exists\": true, \"$gt\": 4 } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": true }\n ]}\n ]\n}`;\n"]}
1
+ {"version":3,"sources":["../src/storage/domains/utils.ts","../src/storage/domains/memory/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/filter.ts","../src/vector/index.ts","../src/vector/prompt.ts"],"names":["TABLE_MESSAGES","key","MastraError","ErrorDomain","ErrorCategory","TABLE_SCORERS","normalizePerPage","calculatePagination","TABLE_WORKFLOW_SNAPSHOT","data","op","val"],"mappings":"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","file":"index.js","sourcesContent":["import { serializeDate, TABLE_MESSAGES, TABLE_WORKFLOW_SNAPSHOT, TABLE_SCORERS } from '@mastra/core/storage';\nimport type { TABLE_NAMES } from '@mastra/core/storage';\n\nexport function ensureDate(value: any): Date | null {\n if (!value) return null;\n if (value instanceof Date) return value;\n if (typeof value === 'string') return new Date(value);\n if (typeof value === 'number') return new Date(value);\n return null;\n}\n\nexport function parseJSON(value: any): any {\n if (typeof value === 'string') {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n return value;\n}\n\nexport function getKey(tableName: TABLE_NAMES, keys: Record<string, any>): string {\n const keyParts = Object.entries(keys)\n .filter(([_, value]) => value !== undefined)\n .map(([key, value]) => `${key}:${value}`);\n return `${tableName}:${keyParts.join(':')}`;\n}\n\nexport function processRecord(tableName: TABLE_NAMES, record: Record<string, any>) {\n let key: string;\n\n if (tableName === TABLE_MESSAGES) {\n // For messages, use threadId as the primary key component\n key = getKey(tableName, { threadId: record.threadId, id: record.id });\n } else if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n key = getKey(tableName, {\n namespace: record.namespace || 'workflows',\n workflow_name: record.workflow_name,\n run_id: record.run_id,\n ...(record.resourceId ? { resourceId: record.resourceId } : {}),\n });\n } else if (tableName === TABLE_SCORERS) {\n key = getKey(tableName, { runId: record.runId });\n } else {\n key = getKey(tableName, { id: record.id });\n }\n\n // Convert dates to ISO strings before storing\n const processedRecord = {\n ...record,\n createdAt: serializeDate(record.createdAt),\n updatedAt: serializeDate(record.updatedAt),\n };\n\n return { key, processedRecord };\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 { MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport {\n MemoryStorage,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_MESSAGES,\n normalizePerPage,\n calculatePagination,\n} from '@mastra/core/storage';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsByResourceIdInput,\n StorageListThreadsByResourceIdOutput,\n ThreadOrderBy,\n ThreadSortDirection,\n} from '@mastra/core/storage';\nimport type { Redis } from '@upstash/redis';\nimport type { StoreOperationsUpstash } from '../operations';\nimport { ensureDate, getKey, processRecord } from '../utils';\n\nfunction getThreadMessagesKey(threadId: string): string {\n return `thread:${threadId}:messages`;\n}\n\nfunction getMessageKey(threadId: string, messageId: string): string {\n const key = getKey(TABLE_MESSAGES, { threadId, id: messageId });\n return key;\n}\n\nexport class StoreMemoryUpstash extends MemoryStorage {\n private client: Redis;\n private operations: StoreOperationsUpstash;\n constructor({ client, operations }: { client: Redis; operations: StoreOperationsUpstash }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const thread = await this.operations.load<StorageThreadType>({\n tableName: TABLE_THREADS,\n keys: { id: threadId },\n });\n\n if (!thread) return null;\n\n return {\n ...thread,\n createdAt: ensureDate(thread.createdAt)!,\n updatedAt: ensureDate(thread.updatedAt)!,\n metadata: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_GET_THREAD_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n },\n },\n error,\n );\n }\n }\n\n public async listThreadsByResourceId(\n args: StorageListThreadsByResourceIdInput,\n ): Promise<StorageListThreadsByResourceIdOutput> {\n const { resourceId, page = 0, perPage: perPageInput, orderBy } = args;\n const { field, direction } = this.parseOrderBy(orderBy);\n const perPage = normalizePerPage(perPageInput, 100);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_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 { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n let allThreads: StorageThreadType[] = [];\n const pattern = `${TABLE_THREADS}:*`;\n const keys = await this.operations.scanKeys(pattern);\n\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n\n for (let i = 0; i < results.length; i++) {\n const thread = results[i] as StorageThreadType | null;\n if (thread && thread.resourceId === resourceId) {\n allThreads.push({\n ...thread,\n createdAt: ensureDate(thread.createdAt)!,\n updatedAt: ensureDate(thread.updatedAt)!,\n metadata: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n });\n }\n }\n\n // Apply sorting with parameters\n const sortedThreads = this.sortThreads(allThreads, field, direction);\n\n const total = sortedThreads.length;\n // When perPage is false (get all), ignore page offset\n const end = perPageInput === false ? total : offset + perPage;\n const paginatedThreads = sortedThreads.slice(offset, end);\n const hasMore = perPageInput === false ? false : end < total;\n\n return {\n threads: paginatedThreads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_LIST_THREADS_BY_RESOURCE_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n resourceId,\n page,\n perPage,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n this.logger.error(mastraError.toString());\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n await this.operations.insert({\n tableName: TABLE_THREADS,\n record: thread,\n });\n return thread;\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_SAVE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: thread.id,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n this.logger.error(mastraError.toString());\n throw mastraError;\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_UPSTASH_STORAGE_UPDATE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread ${id} not found`,\n details: {\n threadId: id,\n },\n });\n }\n\n const updatedThread = {\n ...thread,\n title,\n metadata: {\n ...thread.metadata,\n ...metadata,\n },\n };\n\n try {\n await this.saveThread({ thread: updatedThread });\n return updatedThread;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_UPDATE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: id,\n },\n },\n error,\n );\n }\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n // Delete thread metadata and sorted set\n const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const threadMessagesKey = getThreadMessagesKey(threadId);\n try {\n const messageIds: string[] = await this.client.zrange(threadMessagesKey, 0, -1);\n\n const pipeline = this.client.pipeline();\n pipeline.del(threadKey);\n pipeline.del(threadMessagesKey);\n\n for (let i = 0; i < messageIds.length; i++) {\n const messageId = messageIds[i];\n const messageKey = getMessageKey(threadId, messageId as string);\n pipeline.del(messageKey);\n }\n\n await pipeline.exec();\n\n // Bulk delete all message keys for this thread if any remain\n await this.operations.scanAndDelete(getMessageKey(threadId, '*'));\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_DELETE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n },\n },\n error,\n );\n }\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n const { messages } = args;\n if (messages.length === 0) return { messages: [] };\n\n const threadId = messages[0]?.threadId;\n try {\n if (!threadId) {\n throw new Error('Thread ID is required');\n }\n\n // Check if thread exists\n const thread = await this.getThreadById({ threadId });\n if (!thread) {\n throw new Error(`Thread ${threadId} not found`);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_SAVE_MESSAGES_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n\n // Add an index to each message to maintain order\n const messagesWithIndex = messages.map((message, index) => {\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 return {\n ...message,\n _index: index,\n };\n });\n\n // Get current thread data once (all messages belong to same thread)\n const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const existingThread = await this.client.get<StorageThreadType>(threadKey);\n\n try {\n const batchSize = 1000;\n for (let i = 0; i < messagesWithIndex.length; i += batchSize) {\n const batch = messagesWithIndex.slice(i, i + batchSize);\n const pipeline = this.client.pipeline();\n\n for (const message of batch) {\n const key = getMessageKey(message.threadId!, message.id);\n const createdAtScore = new Date(message.createdAt).getTime();\n const score = message._index !== undefined ? message._index : createdAtScore;\n\n // Check if this message id exists in another thread\n const existingKeyPattern = getMessageKey('*', message.id);\n const keys = await this.operations.scanKeys(existingKeyPattern);\n\n if (keys.length > 0) {\n const pipeline2 = this.client.pipeline();\n keys.forEach(key => pipeline2.get(key));\n const results = await pipeline2.exec();\n const existingMessages = results.filter((msg): msg is MastraDBMessage => msg !== null) as MastraDBMessage[];\n for (const existingMessage of existingMessages) {\n const existingMessageKey = getMessageKey(existingMessage.threadId!, existingMessage.id);\n if (existingMessage && existingMessage.threadId !== message.threadId) {\n pipeline.del(existingMessageKey);\n // Remove from old thread's sorted set\n pipeline.zrem(getThreadMessagesKey(existingMessage.threadId!), existingMessage.id);\n }\n }\n }\n\n // Store the message data\n pipeline.set(key, message);\n\n // Add to sorted set for this thread\n pipeline.zadd(getThreadMessagesKey(message.threadId!), {\n score,\n member: message.id,\n });\n }\n\n // Update the thread's updatedAt field (only in the first batch)\n if (i === 0 && existingThread) {\n const updatedThread = {\n ...existingThread,\n updatedAt: new Date(),\n };\n pipeline.set(threadKey, processRecord(TABLE_THREADS, updatedThread).processedRecord);\n }\n\n await pipeline.exec();\n }\n\n const list = new MessageList().add(messages as any, 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_SAVE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n },\n },\n error,\n );\n }\n }\n\n private async _getIncludedMessages(\n threadId: string,\n include: StorageListMessagesInput['include'],\n ): Promise<MastraDBMessage[]> {\n if (!threadId.trim()) throw new Error('threadId must be a non-empty string');\n\n const messageIds = new Set<string>();\n const messageIdToThreadIds: Record<string, string> = {};\n\n // First, get specifically included messages and their context\n if (include?.length) {\n for (const item of include) {\n messageIds.add(item.id);\n\n // Use per-include threadId if present, else fallback to main threadId\n const itemThreadId = item.threadId || threadId;\n messageIdToThreadIds[item.id] = itemThreadId;\n const itemThreadMessagesKey = getThreadMessagesKey(itemThreadId);\n\n // Get the rank of this message in the sorted set\n const rank = await this.client.zrank(itemThreadMessagesKey, item.id);\n if (rank === null) continue;\n\n // Get previous messages if requested\n if (item.withPreviousMessages) {\n const start = Math.max(0, rank - item.withPreviousMessages);\n const prevIds = rank === 0 ? [] : await this.client.zrange(itemThreadMessagesKey, start, rank - 1);\n prevIds.forEach(id => {\n messageIds.add(id as string);\n messageIdToThreadIds[id as string] = itemThreadId;\n });\n }\n\n // Get next messages if requested\n if (item.withNextMessages) {\n const nextIds = await this.client.zrange(itemThreadMessagesKey, rank + 1, rank + item.withNextMessages);\n nextIds.forEach(id => {\n messageIds.add(id as string);\n messageIdToThreadIds[id as string] = itemThreadId;\n });\n }\n }\n\n const pipeline = this.client.pipeline();\n Array.from(messageIds).forEach(id => {\n const tId = messageIdToThreadIds[id] || threadId;\n pipeline.get(getMessageKey(tId, id as string));\n });\n const results = await pipeline.exec();\n return results.filter(result => result !== null) as MastraDBMessage[];\n }\n\n return [];\n }\n\n private parseStoredMessage(storedMessage: MastraDBMessage & { _index?: number }): MastraDBMessage {\n const defaultMessageContent = { format: 2, parts: [{ type: 'text', text: '' }] };\n const { _index, ...rest } = storedMessage;\n return {\n ...rest,\n createdAt: new Date(rest.createdAt),\n content: rest.content || defaultMessageContent,\n } satisfies MastraDBMessage;\n }\n\n public async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n\n try {\n // Search in all threads in parallel\n const threadKeys = await this.client.keys('thread:*');\n\n const result = await Promise.all(\n threadKeys.map(threadKey => {\n const threadId = threadKey.split(':')[1];\n if (!threadId) throw new Error(`Failed to parse thread ID from thread key \"${threadKey}\"`);\n return this.client.mget<(MastraDBMessage & { _index?: number })[]>(\n messageIds.map(id => getMessageKey(threadId, id)),\n );\n }),\n );\n\n const rawMessages = result.flat(1).filter(msg => !!msg) as (MastraDBMessage & { _index?: number })[];\n\n const list = new MessageList().add(rawMessages.map(this.parseStoredMessage), 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_LIST_MESSAGES_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n messageIds: JSON.stringify(messageIds),\n },\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_UPSTASH_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 const threadMessagesKey = getThreadMessagesKey(threadId);\n const perPage = normalizePerPage(perPageInput, 40);\n // When perPage is false (get all), ignore page offset\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n if (page < 0) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_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 // Get included messages with context if specified\n let includedMessages: MastraDBMessage[] = [];\n if (include && include.length > 0) {\n const included = (await this._getIncludedMessages(threadId, include)) as MastraDBMessage[];\n includedMessages = included.map(this.parseStoredMessage);\n }\n\n // Get all message IDs from the sorted set\n const allMessageIds = await this.client.zrange(threadMessagesKey, 0, -1);\n if (allMessageIds.length === 0) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Use pipeline to fetch all messages efficiently\n const pipeline = this.client.pipeline();\n allMessageIds.forEach(id => pipeline.get(getMessageKey(threadId, id as string)));\n const results = await pipeline.exec();\n\n // Process messages and apply filters\n let messagesData = results\n .filter((msg): msg is MastraDBMessage & { _index?: number } => msg !== null)\n .map(this.parseStoredMessage);\n\n // Filter by resourceId if provided\n if (resourceId) {\n messagesData = messagesData.filter(msg => msg.resourceId === resourceId);\n }\n\n // Apply date filters if provided\n const dateRange = filter?.dateRange;\n if (dateRange?.start) {\n const fromDate = dateRange.start;\n messagesData = messagesData.filter(msg => new Date(msg.createdAt).getTime() >= fromDate.getTime());\n }\n\n if (dateRange?.end) {\n const toDate = dateRange.end;\n messagesData = messagesData.filter(msg => new Date(msg.createdAt).getTime() <= toDate.getTime());\n }\n\n // Determine sort field and direction, default to ASC (oldest first)\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n // Type-safe field accessor helper\n const getFieldValue = (msg: MastraDBMessage): number => {\n if (field === 'createdAt') {\n return new Date(msg.createdAt).getTime();\n }\n // Access other fields with type-safe casting\n const value = (msg as Record<string, unknown>)[field];\n if (typeof value === 'number') {\n return value;\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n // Handle missing/undefined values - treat as 0 for numeric comparison\n return 0;\n };\n\n // Sort messages by orderBy field and direction only if orderBy is specified\n // If orderBy is undefined, keep messages in sorted-set order for correct pagination\n if (orderBy) {\n messagesData.sort((a, b) => {\n const aValue = getFieldValue(a);\n const bValue = getFieldValue(b);\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n });\n }\n\n const total = messagesData.length;\n\n // Apply pagination\n const start = offset;\n const end = perPageInput === false ? total : start + perPage;\n const paginatedMessages = messagesData.slice(start, end);\n\n // Combine paginated messages with included messages, deduplicating\n const messageIds = new Set<string>();\n const allMessages: MastraDBMessage[] = [];\n\n // Add paginated messages first\n for (const msg of paginatedMessages) {\n if (!messageIds.has(msg.id)) {\n allMessages.push(msg);\n messageIds.add(msg.id);\n }\n }\n\n // Add included messages (with context), avoiding duplicates\n for (const msg of includedMessages) {\n if (!messageIds.has(msg.id)) {\n allMessages.push(msg);\n messageIds.add(msg.id);\n }\n }\n\n // Use MessageList for proper deduplication and format conversion\n const list = new MessageList().add(allMessages, 'memory');\n let finalMessages = list.get.all.db();\n\n // Sort all messages (paginated + included) for final output - must be done AFTER MessageList\n // because MessageList.get.all.db() sorts by createdAt ASC internally\n if (orderBy) {\n finalMessages = finalMessages.sort((a, b) => {\n const aValue = getFieldValue(a);\n const bValue = getFieldValue(b);\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n });\n } else {\n // Build Map for O(1) lookups instead of O(n) indexOf\n const messageIdToPosition = new Map<string, number>();\n allMessageIds.forEach((id, index) => {\n messageIdToPosition.set(id as string, index);\n });\n\n finalMessages = finalMessages.sort((a, b) => {\n const aPos = messageIdToPosition.get(a.id) ?? Number.MAX_SAFE_INTEGER;\n const bPos = messageIdToPosition.get(b.id) ?? Number.MAX_SAFE_INTEGER;\n return aPos - bPos;\n });\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 && end < 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: 'STORAGE_UPSTASH_STORAGE_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 getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const key = `${TABLE_RESOURCES}:${resourceId}`;\n const data = await this.client.get<StorageResourceType>(key);\n\n if (!data) {\n return null;\n }\n\n return {\n ...data,\n createdAt: new Date(data.createdAt),\n updatedAt: new Date(data.updatedAt),\n // Ensure workingMemory is always returned as a string, regardless of automatic parsing\n workingMemory: typeof data.workingMemory === 'object' ? JSON.stringify(data.workingMemory) : data.workingMemory,\n metadata: typeof data.metadata === 'string' ? JSON.parse(data.metadata) : data.metadata,\n };\n } catch (error) {\n this.logger.error('Error getting resource by ID:', error);\n throw error;\n }\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n try {\n const key = `${TABLE_RESOURCES}:${resource.id}`;\n const serializedResource = {\n ...resource,\n metadata: JSON.stringify(resource.metadata),\n createdAt: resource.createdAt.toISOString(),\n updatedAt: resource.updatedAt.toISOString(),\n };\n\n await this.client.set(key, serializedResource);\n\n return resource;\n } catch (error) {\n this.logger.error('Error saving resource:', error);\n throw error;\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,\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: {\n ...existingResource.metadata,\n ...metadata,\n },\n updatedAt: new Date(),\n };\n\n await this.saveResource({ resource: updatedResource });\n return updatedResource;\n } catch (error) {\n this.logger.error('Error updating resource:', error);\n throw error;\n }\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 const { messages } = args;\n\n if (messages.length === 0) {\n return [];\n }\n\n try {\n // Get all message IDs to update\n const messageIds = messages.map(m => m.id);\n\n // Find all existing messages by scanning for their keys\n const existingMessages: MastraDBMessage[] = [];\n const messageIdToKey: Record<string, string> = {};\n\n // Scan for all message keys that match any of the IDs\n for (const messageId of messageIds) {\n const pattern = getMessageKey('*', messageId);\n const keys = await this.operations.scanKeys(pattern);\n\n for (const key of keys) {\n const message = await this.client.get<MastraDBMessage>(key);\n if (message && message.id === messageId) {\n existingMessages.push(message);\n messageIdToKey[messageId] = key;\n break; // Found the message, no need to continue scanning\n }\n }\n }\n\n if (existingMessages.length === 0) {\n return [];\n }\n\n const threadIdsToUpdate = new Set<string>();\n const pipeline = this.client.pipeline();\n\n // Process each existing message for updates\n for (const existingMessage of existingMessages) {\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 // Track thread IDs that need updating\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n\n // Create updated message object\n const updatedMessage = { ...existingMessage };\n\n // Special handling for the content field to merge instead of overwrite\n if (fieldsToUpdate.content) {\n const existingContent = existingMessage.content as MastraMessageContentV2;\n const newContent = {\n ...existingContent,\n ...fieldsToUpdate.content,\n // Deep merge metadata if it exists on both\n ...(existingContent?.metadata && fieldsToUpdate.content.metadata\n ? {\n metadata: {\n ...existingContent.metadata,\n ...fieldsToUpdate.content.metadata,\n },\n }\n : {}),\n };\n updatedMessage.content = newContent;\n }\n\n // Update other fields\n for (const key in fieldsToUpdate) {\n if (Object.prototype.hasOwnProperty.call(fieldsToUpdate, key) && key !== 'content') {\n (updatedMessage as any)[key] = fieldsToUpdate[key as keyof typeof fieldsToUpdate];\n }\n }\n\n // Update the message in Redis\n const key = messageIdToKey[id];\n if (key) {\n // If the message is being moved to a different thread, we need to handle the key change\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n // Remove from old thread's sorted set\n const oldThreadMessagesKey = getThreadMessagesKey(existingMessage.threadId!);\n pipeline.zrem(oldThreadMessagesKey, id);\n\n // Delete the old message key\n pipeline.del(key);\n\n // Create new message key with new threadId\n const newKey = getMessageKey(updatePayload.threadId, id);\n pipeline.set(newKey, updatedMessage);\n\n // Add to new thread's sorted set\n const newThreadMessagesKey = getThreadMessagesKey(updatePayload.threadId);\n const score =\n (updatedMessage as any)._index !== undefined\n ? (updatedMessage as any)._index\n : new Date(updatedMessage.createdAt).getTime();\n pipeline.zadd(newThreadMessagesKey, { score, member: id });\n } else {\n // No thread change, just update the existing key\n pipeline.set(key, updatedMessage);\n }\n }\n }\n\n // Update thread timestamps\n const now = new Date();\n for (const threadId of threadIdsToUpdate) {\n if (threadId) {\n const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const existingThread = await this.client.get<StorageThreadType>(threadKey);\n if (existingThread) {\n const updatedThread = {\n ...existingThread,\n updatedAt: now,\n };\n pipeline.set(threadKey, processRecord(TABLE_THREADS, updatedThread).processedRecord);\n }\n }\n }\n\n // Execute all updates\n await pipeline.exec();\n\n // Return the updated messages\n const updatedMessages: MastraDBMessage[] = [];\n for (const messageId of messageIds) {\n const key = messageIdToKey[messageId];\n if (key) {\n const updatedMessage = await this.client.get<MastraDBMessage>(key);\n if (updatedMessage) {\n updatedMessages.push(updatedMessage);\n }\n }\n }\n\n return updatedMessages;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_UPDATE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n messageIds: messages.map(m => m.id).join(','),\n },\n },\n error,\n );\n }\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (!messageIds || messageIds.length === 0) {\n return;\n }\n\n try {\n const threadIds = new Set<string>();\n const messageKeys: string[] = [];\n\n // Find all message keys and collect thread IDs\n for (const messageId of messageIds) {\n const pattern = getMessageKey('*', messageId);\n const keys = await this.operations.scanKeys(pattern);\n\n for (const key of keys) {\n const message = await this.client.get<MastraDBMessage>(key);\n if (message && message.id === messageId) {\n messageKeys.push(key);\n if (message.threadId) {\n threadIds.add(message.threadId);\n }\n break;\n }\n }\n }\n\n if (messageKeys.length === 0) {\n // none of the message ids existed\n return;\n }\n\n const pipeline = this.client.pipeline();\n\n // Delete all messages\n for (const key of messageKeys) {\n pipeline.del(key);\n }\n\n // Update thread timestamps\n if (threadIds.size > 0) {\n for (const threadId of threadIds) {\n const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const thread = await this.client.get<StorageThreadType>(threadKey);\n if (thread) {\n const updatedThread = {\n ...thread,\n updatedAt: new Date(),\n };\n pipeline.set(threadKey, processRecord(TABLE_THREADS, updatedThread).processedRecord);\n }\n }\n }\n\n // Execute all operations\n await pipeline.exec();\n\n // TODO: Delete from vector store if semantic recall is enabled\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_DELETE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: messageIds.join(', ') },\n },\n error,\n );\n }\n }\n\n private sortThreads(\n threads: StorageThreadType[],\n field: ThreadOrderBy,\n direction: ThreadSortDirection,\n ): StorageThreadType[] {\n return threads.sort((a, b) => {\n const aValue = new Date(a[field]).getTime();\n const bValue = new Date(b[field]).getTime();\n\n if (direction === 'ASC') {\n return aValue - bValue;\n } else {\n return bValue - aValue;\n }\n });\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { StoreOperations } from '@mastra/core/storage';\nimport type { TABLE_NAMES, StorageColumn } from '@mastra/core/storage';\nimport type { Redis } from '@upstash/redis';\nimport { getKey, processRecord } from '../utils';\n\nexport class StoreOperationsUpstash extends StoreOperations {\n private client: Redis;\n\n constructor({ client }: { client: Redis }) {\n super();\n this.client = client;\n }\n\n async createTable({\n tableName: _tableName,\n schema: _schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n // For Redis/Upstash, tables are created implicitly when data is inserted\n // This method is a no-op for Redis-based storage\n }\n\n async alterTable({\n tableName: _tableName,\n schema: _schema,\n ifNotExists: _ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n // For Redis/Upstash, schema changes are handled implicitly\n // This method is a no-op for Redis-based storage\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n const pattern = `${tableName}:*`;\n try {\n await this.scanAndDelete(pattern);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_CLEAR_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.clearTable({ tableName });\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n const { key, processedRecord } = processRecord(tableName, record);\n\n try {\n await this.client.set(key, processedRecord);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async batchInsert(input: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n const { tableName, records } = input;\n if (!records.length) return;\n\n const batchSize = 1000;\n try {\n for (let i = 0; i < records.length; i += batchSize) {\n const batch = records.slice(i, i + batchSize);\n const pipeline = this.client.pipeline();\n for (const record of batch) {\n const { key, processedRecord } = processRecord(tableName, record);\n pipeline.set(key, processedRecord);\n }\n await pipeline.exec();\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_BATCH_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n const key = getKey(tableName, keys);\n try {\n const data = await this.client.get<R>(key);\n return data || null;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_LOAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async hasColumn(_tableName: TABLE_NAMES, _column: string): Promise<boolean> {\n // For Redis/Upstash, columns are dynamic and always available\n // This method always returns true for Redis-based storage\n return true;\n }\n\n async scanKeys(pattern: string, batchSize = 10000): Promise<string[]> {\n let cursor = '0';\n let keys: string[] = [];\n do {\n const [nextCursor, batch] = await this.client.scan(cursor, {\n match: pattern,\n count: batchSize,\n });\n keys.push(...batch);\n cursor = nextCursor;\n } while (cursor !== '0');\n return keys;\n }\n\n async scanAndDelete(pattern: string, batchSize = 10000): Promise<number> {\n let cursor = '0';\n let totalDeleted = 0;\n do {\n const [nextCursor, keys] = await this.client.scan(cursor, {\n match: pattern,\n count: batchSize,\n });\n if (keys.length > 0) {\n await this.client.del(...keys);\n totalDeleted += keys.length;\n }\n cursor = nextCursor;\n } while (cursor !== '0');\n return totalDeleted;\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { ScoreRowData, ScoringSource, ValidatedSaveScorePayload } from '@mastra/core/evals';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport { calculatePagination, normalizePerPage, ScoresStorage, TABLE_SCORERS } from '@mastra/core/storage';\nimport type { PaginationInfo, StoragePagination } from '@mastra/core/storage';\nimport type { Redis } from '@upstash/redis';\nimport type { StoreOperationsUpstash } from '../operations';\nimport { processRecord } from '../utils';\n\nfunction transformScoreRow(row: Record<string, any>): ScoreRowData {\n const parseField = (v: any) => {\n if (typeof v === 'string') {\n try {\n return JSON.parse(v);\n } catch {\n return v;\n }\n }\n return v;\n };\n return {\n ...row,\n scorer: parseField(row.scorer),\n preprocessStepResult: parseField(row.preprocessStepResult),\n generateScorePrompt: row.generateScorePrompt,\n generateReasonPrompt: row.generateReasonPrompt,\n analyzeStepResult: parseField(row.analyzeStepResult),\n metadata: parseField(row.metadata),\n input: parseField(row.input),\n output: parseField(row.output),\n additionalContext: parseField(row.additionalContext),\n requestContext: parseField(row.requestContext),\n entity: parseField(row.entity),\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n } as ScoreRowData;\n}\n\nexport class ScoresUpstash extends ScoresStorage {\n private client: Redis;\n private operations: StoreOperationsUpstash;\n\n constructor({ client, operations }: { client: Redis; operations: StoreOperationsUpstash }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const data = await this.operations.load<ScoreRowData>({\n tableName: TABLE_SCORERS,\n keys: { id },\n });\n if (!data) return null;\n return transformScoreRow(data);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_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 listScoresByScorerId({\n scorerId,\n entityId,\n entityType,\n source,\n pagination = { page: 0, perPage: 20 },\n }: {\n scorerId: string;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n pagination?: StoragePagination;\n }): Promise<{\n scores: ScoreRowData[];\n pagination: PaginationInfo;\n }> {\n const pattern = `${TABLE_SCORERS}:*`;\n const keys = await this.operations.scanKeys(pattern);\n const { page, perPage: perPageInput } = pagination;\n if (keys.length === 0) {\n return {\n scores: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\n };\n }\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n // Filter out nulls and by scorerId\n const filtered = results\n .map((raw: any) => {\n if (!raw) return null;\n if (typeof raw === 'string') {\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n }\n return raw as Record<string, any>;\n })\n .filter((row): row is Record<string, any> => {\n if (!row || typeof row !== 'object') return false;\n if (row.scorerId !== scorerId) return false;\n if (entityId && row.entityId !== entityId) return false;\n if (entityType && row.entityType !== entityType) return false;\n if (source && row.source !== source) return false;\n return true;\n });\n const perPage = normalizePerPage(perPageInput, 100); // false → MAX_SAFE_INTEGER\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? filtered.length : start + perPage;\n const total = filtered.length;\n const paged = filtered.slice(start, end);\n const scores = paged.map(row => transformScoreRow(row));\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n }\n\n async saveScore(score: ScoreRowData): 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_UPSTASH_STORAGE_SAVE_SCORE_VALIDATION_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n const { key, processedRecord } = processRecord(TABLE_SCORERS, validatedScore);\n try {\n await this.client.set(key, processedRecord);\n return { score };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_SAVE_SCORE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: score.id },\n },\n error,\n );\n }\n }\n\n async listScoresByRunId({\n runId,\n pagination = { page: 0, perPage: 20 },\n }: {\n runId: string;\n pagination?: StoragePagination;\n }): Promise<{\n scores: ScoreRowData[];\n pagination: PaginationInfo;\n }> {\n const pattern = `${TABLE_SCORERS}:*`;\n const keys = await this.operations.scanKeys(pattern);\n const { page, perPage: perPageInput } = pagination;\n if (keys.length === 0) {\n return {\n scores: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\n };\n }\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n // Filter out nulls and by runId\n const filtered = results\n .map((raw: any) => {\n if (!raw) return null;\n if (typeof raw === 'string') {\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n }\n return raw as Record<string, any>;\n })\n .filter((row): row is Record<string, any> => !!row && typeof row === 'object' && row.runId === runId);\n const total = filtered.length;\n const perPage = normalizePerPage(perPageInput, 100); // false → MAX_SAFE_INTEGER\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? filtered.length : start + perPage;\n const paged = filtered.slice(start, end);\n const scores = paged.map(row => transformScoreRow(row));\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination = { page: 0, perPage: 20 },\n }: {\n entityId: string;\n entityType?: string;\n pagination?: StoragePagination;\n }): Promise<{\n scores: ScoreRowData[];\n pagination: PaginationInfo;\n }> {\n const pattern = `${TABLE_SCORERS}:*`;\n const keys = await this.operations.scanKeys(pattern);\n const { page, perPage: perPageInput } = pagination;\n if (keys.length === 0) {\n return {\n scores: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\n };\n }\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n\n const filtered = results\n .map((raw: any) => {\n if (!raw) return null;\n if (typeof raw === 'string') {\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n }\n return raw as Record<string, any>;\n })\n .filter((row): row is Record<string, any> => {\n if (!row || typeof row !== 'object') return false;\n if (row.entityId !== entityId) return false;\n if (entityType && row.entityType !== entityType) return false;\n return true;\n });\n const total = filtered.length;\n const perPage = normalizePerPage(perPageInput, 100); // false → MAX_SAFE_INTEGER\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? filtered.length : start + perPage;\n const paged = filtered.slice(start, end);\n const scores = paged.map(row => transformScoreRow(row));\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination = { page: 0, perPage: 20 },\n }: {\n traceId: string;\n spanId: string;\n pagination?: StoragePagination;\n }): Promise<{\n scores: ScoreRowData[];\n pagination: PaginationInfo;\n }> {\n const pattern = `${TABLE_SCORERS}:*`;\n const keys = await this.operations.scanKeys(pattern);\n const { page, perPage: perPageInput } = pagination;\n if (keys.length === 0) {\n return {\n scores: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\n };\n }\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n // Filter out nulls and by traceId and spanId\n const filtered = results\n .map((raw: any) => {\n if (!raw) return null;\n if (typeof raw === 'string') {\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n }\n return raw as Record<string, any>;\n })\n .filter((row): row is Record<string, any> => {\n if (!row || typeof row !== 'object') return false;\n if (row.traceId !== traceId) return false;\n if (row.spanId !== spanId) return false;\n return true;\n });\n const total = filtered.length;\n const perPage = normalizePerPage(perPageInput, 100); // false → MAX_SAFE_INTEGER\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? filtered.length : start + perPage;\n const paged = filtered.slice(start, end);\n const scores = paged.map(row => transformScoreRow(row));\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { normalizePerPage, TABLE_WORKFLOW_SNAPSHOT, WorkflowsStorage } from '@mastra/core/storage';\nimport type { StorageListWorkflowRunsInput, WorkflowRun, WorkflowRuns } from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport type { Redis } from '@upstash/redis';\nimport type { StoreOperationsUpstash } from '../operations';\nimport { ensureDate, getKey } from '../utils';\n\nfunction parseWorkflowRun(row: any): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\n if (typeof parsedSnapshot === 'string') {\n try {\n parsedSnapshot = JSON.parse(row.snapshot as string) as WorkflowRunState;\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,\n runId: row.run_id,\n snapshot: parsedSnapshot,\n createdAt: ensureDate(row.createdAt)!,\n updatedAt: ensureDate(row.updatedAt)!,\n resourceId: row.resourceId,\n };\n}\nexport class WorkflowsUpstash extends WorkflowsStorage {\n private client: Redis;\n private operations: StoreOperationsUpstash;\n\n constructor({ client, operations }: { client: Redis; operations: StoreOperationsUpstash }) {\n super();\n this.client = client;\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(params: {\n namespace: string;\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n const { namespace = 'workflows', workflowName, runId, resourceId, snapshot } = params;\n try {\n await this.operations.insert({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n record: {\n namespace,\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot,\n createdAt: new Date(),\n updatedAt: new Date(),\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_PERSIST_WORKFLOW_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace,\n workflowName,\n runId,\n },\n },\n error,\n );\n }\n }\n\n async loadWorkflowSnapshot(params: {\n namespace: string;\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n const { namespace = 'workflows', workflowName, runId } = params;\n const key = getKey(TABLE_WORKFLOW_SNAPSHOT, {\n namespace,\n workflow_name: workflowName,\n run_id: runId,\n });\n try {\n const data = await this.client.get<{\n namespace: string;\n workflow_name: string;\n run_id: string;\n snapshot: WorkflowRunState;\n }>(key);\n if (!data) return null;\n return data.snapshot;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_LOAD_WORKFLOW_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace,\n workflowName,\n runId,\n },\n },\n error,\n );\n }\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n try {\n const key =\n getKey(TABLE_WORKFLOW_SNAPSHOT, { namespace: 'workflows', workflow_name: workflowName, run_id: runId }) + '*';\n const keys = await this.operations.scanKeys(key);\n const workflows = await Promise.all(\n keys.map(async key => {\n const data = await this.client.get<{\n workflow_name: string;\n run_id: string;\n snapshot: WorkflowRunState | string;\n createdAt: string | Date;\n updatedAt: string | Date;\n resourceId: string;\n }>(key);\n return data;\n }),\n );\n const data = workflows.find(w => w?.run_id === runId && w?.workflow_name === workflowName) as WorkflowRun | null;\n if (!data) return null;\n return parseWorkflowRun(data);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_GET_WORKFLOW_RUN_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace: 'workflows',\n runId,\n workflowName: workflowName || '',\n },\n },\n error,\n );\n }\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n perPage,\n page,\n resourceId,\n }: StorageListWorkflowRunsInput): Promise<WorkflowRuns> {\n try {\n if (page !== undefined && page < 0) {\n throw new MastraError(\n {\n id: 'UPSTASH_STORE_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 // Get all workflow keys\n let pattern = getKey(TABLE_WORKFLOW_SNAPSHOT, { namespace: 'workflows' }) + ':*';\n if (workflowName && resourceId) {\n pattern = getKey(TABLE_WORKFLOW_SNAPSHOT, {\n namespace: 'workflows',\n workflow_name: workflowName,\n run_id: '*',\n resourceId,\n });\n } else if (workflowName) {\n pattern = getKey(TABLE_WORKFLOW_SNAPSHOT, { namespace: 'workflows', workflow_name: workflowName }) + ':*';\n } else if (resourceId) {\n pattern = getKey(TABLE_WORKFLOW_SNAPSHOT, {\n namespace: 'workflows',\n workflow_name: '*',\n run_id: '*',\n resourceId,\n });\n }\n const keys = await this.operations.scanKeys(pattern);\n\n // Check if we have any keys before using pipeline\n if (keys.length === 0) {\n return { runs: [], total: 0 };\n }\n\n // Use pipeline for batch fetching to improve performance\n const pipeline = this.client.pipeline();\n keys.forEach(key => pipeline.get(key));\n const results = await pipeline.exec();\n\n // Filter and transform results - handle undefined results\n let runs = results\n .map((result: any) => result as Record<string, any> | null)\n .filter(\n (record): record is Record<string, any> =>\n record !== null && record !== undefined && typeof record === 'object' && 'workflow_name' in record,\n )\n // Only filter by workflowName if it was specifically requested\n .filter(record => !workflowName || record.workflow_name === workflowName)\n .map(w => parseWorkflowRun(w!))\n .filter(w => {\n if (fromDate && w.createdAt < fromDate) return false;\n if (toDate && w.createdAt > toDate) return false;\n return true;\n })\n .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n\n const total = runs.length;\n\n // Apply pagination if requested\n if (typeof perPage === 'number' && typeof page === 'number') {\n const normalizedPerPage = normalizePerPage(perPage, Number.MAX_SAFE_INTEGER);\n const offset = page * normalizedPerPage;\n runs = runs.slice(offset, offset + normalizedPerPage);\n }\n\n return { runs, total };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_STORAGE_LIST_WORKFLOW_RUNS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace: 'workflows',\n workflowName: workflowName || '',\n resourceId: resourceId || '',\n },\n },\n error,\n );\n }\n }\n}\n","import type { MastraMessageContentV2, MastraDBMessage } from '@mastra/core/agent';\nimport type { ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport type { StorageThreadType } from '@mastra/core/memory';\nimport { MastraStorage } from '@mastra/core/storage';\nimport type {\n TABLE_NAMES,\n StorageColumn,\n StorageResourceType,\n WorkflowRuns,\n WorkflowRun,\n PaginationInfo,\n StoragePagination,\n StorageDomains,\n StorageListWorkflowRunsInput,\n} from '@mastra/core/storage';\n\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { Redis } from '@upstash/redis';\nimport { StoreMemoryUpstash } from './domains/memory';\nimport { StoreOperationsUpstash } from './domains/operations';\nimport { ScoresUpstash } from './domains/scores';\nimport { WorkflowsUpstash } from './domains/workflows';\n\nexport interface UpstashConfig {\n id: string;\n url: string;\n token: string;\n}\n\nexport class UpstashStore extends MastraStorage {\n private redis: Redis;\n stores: StorageDomains;\n\n constructor(config: UpstashConfig) {\n super({ id: config.id, name: 'Upstash' });\n this.redis = new Redis({\n url: config.url,\n token: config.token,\n });\n\n const operations = new StoreOperationsUpstash({ client: this.redis });\n const scores = new ScoresUpstash({ client: this.redis, operations });\n const workflows = new WorkflowsUpstash({ client: this.redis, operations });\n const memory = new StoreMemoryUpstash({ client: this.redis, operations });\n this.stores = {\n operations,\n scores,\n workflows,\n memory,\n };\n }\n\n public get supports() {\n return {\n selectByIncludeResourceScope: true,\n resourceWorkingMemory: true,\n hasColumn: false,\n createTable: false,\n deleteMessages: true,\n listScoresBySpan: true,\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 /**\n * No-op: This backend is schemaless and does not require schema changes.\n * @param tableName Name of the table\n * @param schema Schema of the table\n * @param ifNotExists Array of column names to add if they don't exist\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 clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.clearTable({ tableName });\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.dropTable({ 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(input: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n return this.stores.operations.batchInsert(input);\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n return this.stores.operations.load<R>({ 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 saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n return this.stores.memory.saveMessages(args);\n }\n\n async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n return this.stores.memory.listMessagesById({ messageIds });\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(params: {\n namespace: string;\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n return this.stores.workflows.persistWorkflowSnapshot(params);\n }\n\n async loadWorkflowSnapshot(params: {\n namespace: string;\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n return this.stores.workflows.loadWorkflowSnapshot(params);\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n perPage,\n page,\n resourceId,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n return this.stores.workflows.listWorkflowRuns({ workflowName, fromDate, toDate, perPage, page, resourceId });\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 // No explicit cleanup needed for Upstash Redis\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 deleteMessages(messageIds: string[]): Promise<void> {\n return this.stores.memory.deleteMessages(messageIds);\n }\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({ resourceId, workingMemory, metadata });\n }\n\n async getScoreById({ id: _id }: { id: string }): Promise<ScoreRowData | null> {\n return this.stores.scores.getScoreById({ id: _id });\n }\n\n async saveScore(score: ScoreRowData): 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({\n entityId,\n entityType,\n pagination,\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 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","import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type { OperatorSupport, VectorFilter, OperatorValueMap } from '@mastra/core/vector/filter';\n\ntype UpstashOperatorValueMap = Omit<OperatorValueMap, '$options' | '$elemMatch'> & {\n $contains: string;\n};\n\nexport type UpstashVectorFilter = VectorFilter<keyof UpstashOperatorValueMap, UpstashOperatorValueMap>;\n\nexport class UpstashFilterTranslator extends BaseFilterTranslator<UpstashVectorFilter, string | undefined> {\n protected override getSupportedOperators(): OperatorSupport {\n return {\n ...BaseFilterTranslator.DEFAULT_OPERATORS,\n array: ['$in', '$nin', '$all'],\n regex: ['$regex'],\n custom: ['$contains'],\n };\n }\n\n translate(filter?: UpstashVectorFilter): string | undefined {\n if (this.isEmpty(filter)) return undefined;\n this.validateFilter(filter);\n return this.translateNode(filter);\n }\n\n private translateNode(node: UpstashVectorFilter, path: string = ''): string {\n if (this.isRegex(node)) {\n throw new Error('Direct regex pattern format is not supported in Upstash');\n }\n if (node === null || node === undefined) {\n throw new Error('Filtering for null/undefined values is not supported by Upstash Vector');\n }\n\n // Handle primitives (direct equality)\n if (this.isPrimitive(node)) {\n if (node === null || node === undefined) {\n throw new Error('Filtering for null/undefined values is not supported by Upstash Vector');\n }\n return this.formatComparison(path, '=', node);\n }\n\n // Handle arrays (IN operator)\n if (Array.isArray(node)) {\n if (node.length === 0) {\n return '(HAS FIELD empty AND HAS NOT FIELD empty)';\n }\n return `${path} IN (${this.formatArray(node)})`;\n }\n\n const entries = Object.entries(node as Record<string, any>);\n const conditions: string[] = [];\n\n for (const [key, value] of entries) {\n const newPath = path ? `${path}.${key}` : key;\n\n if (this.isOperator(key)) {\n conditions.push(this.translateOperator(key, value, path));\n } else if (typeof value === 'object' && value !== null) {\n conditions.push(this.translateNode(value, newPath));\n } else if (value === null || value === undefined) {\n throw new Error('Filtering for null/undefined values is not supported by Upstash Vector');\n } else {\n conditions.push(this.formatComparison(newPath, '=', value));\n }\n }\n\n return conditions.length > 1 ? `(${conditions.join(' AND ')})` : (conditions[0] ?? '');\n }\n\n private readonly COMPARISON_OPS = {\n $eq: '=',\n $ne: '!=',\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n } as const;\n\n private translateOperator(operator: string, value: any, path: string): string {\n // Handle comparison operators\n if (this.isBasicOperator(operator) || this.isNumericOperator(operator)) {\n return this.formatComparison(path, this.COMPARISON_OPS[operator], value);\n }\n\n // Handle special operators\n switch (operator) {\n case '$in':\n if (!Array.isArray(value) || value.length === 0) {\n return '(HAS FIELD empty AND HAS NOT FIELD empty)'; // Always false\n }\n return `${path} IN (${this.formatArray(value)})`;\n case '$nin':\n return `${path} NOT IN (${this.formatArray(value)})`;\n case '$contains':\n return `${path} CONTAINS ${this.formatValue(value)}`;\n case '$regex':\n return `${path} GLOB ${this.formatValue(value)}`;\n case '$exists':\n return value ? `HAS FIELD ${path}` : `HAS NOT FIELD ${path}`;\n\n case '$and':\n if (!Array.isArray(value) || value.length === 0) {\n return '(HAS FIELD empty OR HAS NOT FIELD empty)';\n }\n return this.joinConditions(value, 'AND');\n\n case '$or':\n if (!Array.isArray(value) || value.length === 0) {\n return '(HAS FIELD empty AND HAS NOT FIELD empty)';\n }\n return this.joinConditions(value, 'OR');\n\n case '$not':\n return this.formatNot(path, value);\n\n case '$nor':\n return this.formatNot('', { $or: value });\n case '$all':\n return this.translateOperator(\n '$and',\n value.map((item: unknown) => ({ [path]: { $contains: item } })),\n '',\n );\n\n default:\n throw new Error(`Unsupported operator: ${operator}`);\n }\n }\n\n private readonly NEGATED_OPERATORS: Record<string, string> = {\n $eq: '$ne',\n $ne: '$eq',\n $gt: '$lte',\n $gte: '$lt',\n $lt: '$gte',\n $lte: '$gt',\n $in: '$nin',\n $nin: '$in',\n $exists: '$exists', // Special case - we'll flip the value\n };\n\n private formatNot(path: string, value: any): string {\n if (typeof value !== 'object') {\n return `${path} != ${this.formatValue(value)}`;\n }\n\n if (!Object.keys(value).some(k => k.startsWith('$'))) {\n const [fieldName, fieldValue] = Object.entries(value)[0] ?? [];\n\n // If it's a nested condition with an operator\n if (typeof fieldValue === 'object' && fieldValue !== null && Object.keys(fieldValue)[0]?.startsWith('$')) {\n const [op, val] = Object.entries(fieldValue)[0] ?? [];\n const negatedOp = this.NEGATED_OPERATORS[op as string];\n if (!negatedOp) throw new Error(`Unsupported operator in NOT: ${op}`);\n\n // Special case for $exists - negate the value instead of the operator\n if (op === '$exists') {\n return this.translateOperator(op, !val, fieldName ?? '');\n }\n\n return this.translateOperator(negatedOp, val, fieldName ?? '');\n }\n\n // Otherwise handle as simple field value\n return `${fieldName} != ${this.formatValue(fieldValue)}`;\n }\n\n // Handle top-level operators\n const [op, val] = Object.entries(value)[0] ?? [];\n\n // Handle comparison operators\n if (op === '$lt') return `${path} >= ${this.formatValue(val)}`;\n if (op === '$lte') return `${path} > ${this.formatValue(val)}`;\n if (op === '$gt') return `${path} <= ${this.formatValue(val)}`;\n if (op === '$gte') return `${path} < ${this.formatValue(val)}`;\n if (op === '$ne') return `${path} = ${this.formatValue(val)}`;\n if (op === '$eq') return `${path} != ${this.formatValue(val)}`;\n\n // Special cases\n if (op === '$contains') return `${path} NOT CONTAINS ${this.formatValue(val)}`;\n if (op === '$regex') return `${path} NOT GLOB ${this.formatValue(val)}`;\n if (op === '$in') return `${path} NOT IN (${this.formatArray(val as any[])})`;\n if (op === '$exists') return val ? `HAS NOT FIELD ${path}` : `HAS FIELD ${path}`;\n\n // Transform NOT(AND) into OR(NOT) and NOT(OR) into AND(NOT)\n if (op === '$and' || op === '$or') {\n const newOp = op === '$and' ? '$or' : '$and';\n const conditions = (val as any[]).map((condition: any) => {\n const [fieldName, fieldValue] = Object.entries(condition)[0] ?? [];\n return { [fieldName as string]: { $not: fieldValue } };\n });\n return this.translateOperator(newOp, conditions, '');\n }\n\n // NOT(NOR) is equivalent to OR\n if (op === '$nor') {\n return this.translateOperator('$or', val, '');\n }\n\n return `${path} != ${this.formatValue(val)}`;\n }\n\n private formatValue(value: any): string {\n if (value === null || value === undefined) {\n throw new Error('Filtering for null/undefined values is not supported by Upstash Vector');\n }\n\n if (typeof value === 'string') {\n // Check for quotes in the string content\n const hasSingleQuote = /'/g.test(value);\n const hasDoubleQuote = /\"/g.test(value);\n\n // If string has both types of quotes, escape single quotes and use single quotes\n // If string has single quotes, use double quotes\n // Otherwise, use single quotes (default)\n if (hasSingleQuote && hasDoubleQuote) {\n return `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n }\n if (hasSingleQuote) {\n return `\"${value}\"`;\n }\n return `'${value}'`;\n }\n\n if (typeof value === 'number') {\n // Handle scientific notation by converting to decimal\n if (Math.abs(value) < 1e-6 || Math.abs(value) > 1e6) {\n return value.toFixed(20).replace(/\\.?0+$/, '');\n }\n // Regular numbers (including zero and negative)\n return value.toString();\n }\n\n return String(value);\n }\n\n private formatArray(values: any[]): string {\n return values\n .map(value => {\n if (value === null || value === undefined) {\n throw new Error('Filtering for null/undefined values is not supported by Upstash Vector');\n }\n return this.formatValue(value);\n })\n .join(', ');\n }\n\n private formatComparison(path: string, op: string, value: any): string {\n return `${path} ${op} ${this.formatValue(value)}`;\n }\n\n private joinConditions(conditions: any[], operator: string): string {\n const translated = Array.isArray(conditions)\n ? conditions.map(c => this.translateNode(c))\n : [this.translateNode(conditions)];\n\n // Don't wrap in parentheses if there's only one condition\n return `(${translated.join(` ${operator} `)})`;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n CreateIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n DescribeIndexParams,\n IndexStats,\n QueryResult,\n} from '@mastra/core/vector';\nimport { Index } from '@upstash/vector';\n\nimport { UpstashFilterTranslator } from './filter';\nimport type { UpstashVectorFilter } from './filter';\nimport type { UpstashUpsertVectorParams, UpstashQueryVectorParams, UpstashUpdateVectorParams } from './types';\n\nexport class UpstashVector extends MastraVector<UpstashVectorFilter> {\n private client: Index;\n\n /**\n * Creates a new UpstashVector instance.\n * @param {object} params - The parameters for the UpstashVector.\n * @param {string} params.id - The unique identifier for this vector store instance.\n * @param {string} params.url - The URL of the Upstash vector index.\n * @param {string} params.token - The token for the Upstash vector index.\n */\n constructor({ url, token, id }: { url: string; token: string } & { id: string }) {\n super({ id });\n this.client = new Index({\n url,\n token,\n });\n }\n\n /**\n * Upserts vectors into the index.\n * @param {UpsertVectorParams} params - The parameters for the upsert operation.\n * @returns {Promise<string[]>} A promise that resolves to the IDs of the upserted vectors.\n */\n async upsert({\n indexName: namespace,\n vectors,\n metadata,\n ids,\n sparseVectors,\n }: UpstashUpsertVectorParams): Promise<string[]> {\n const generatedIds = ids || vectors.map(() => randomUUID());\n\n const points = vectors.map((vector, index) => ({\n id: generatedIds[index]!,\n vector,\n ...(sparseVectors?.[index] && { sparseVector: sparseVectors[index] }),\n metadata: metadata?.[index],\n }));\n\n try {\n await this.client.upsert(points, {\n namespace,\n });\n return generatedIds;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_VECTOR_UPSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace, vectorCount: vectors.length },\n },\n error,\n );\n }\n }\n\n /**\n * Transforms a Mastra vector filter into an Upstash-compatible filter string.\n * @param {UpstashVectorFilter} [filter] - The filter to transform.\n * @returns {string | undefined} The transformed filter string, or undefined if no filter is provided.\n */\n transformFilter(filter?: UpstashVectorFilter) {\n const translator = new UpstashFilterTranslator();\n return translator.translate(filter);\n }\n\n /**\n * Creates a new index. For Upstash, this is a no-op as indexes (known as namespaces in Upstash) are created on-the-fly.\n * @param {CreateIndexParams} _params - The parameters for creating the index (ignored).\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n */\n async createIndex(_params: CreateIndexParams): Promise<void> {\n this.logger.debug('No need to call createIndex for Upstash');\n }\n\n /**\n * Queries the vector index.\n * @param {QueryVectorParams} params - The parameters for the query operation. indexName is the namespace in Upstash.\n * @returns {Promise<QueryResult[]>} A promise that resolves to the query results.\n */\n async query({\n indexName: namespace,\n queryVector,\n topK = 10,\n filter,\n includeVector = false,\n sparseVector,\n fusionAlgorithm,\n queryMode,\n }: UpstashQueryVectorParams): Promise<QueryResult[]> {\n try {\n const ns = this.client.namespace(namespace);\n\n const filterString = this.transformFilter(filter);\n const results = await ns.query({\n topK,\n vector: queryVector,\n ...(sparseVector && { sparseVector }),\n includeVectors: includeVector,\n includeMetadata: true,\n ...(filterString ? { filter: filterString } : {}),\n ...(fusionAlgorithm && { fusionAlgorithm }),\n ...(queryMode && { queryMode }),\n });\n\n // Map the results to our expected format\n return (results || []).map(result => ({\n id: `${result.id}`,\n score: result.score,\n metadata: result.metadata,\n ...(includeVector && { vector: result.vector || [] }),\n }));\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_VECTOR_QUERY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace, topK },\n },\n error,\n );\n }\n }\n\n /**\n * Lists all namespaces in the Upstash vector index, which correspond to indexes.\n * @returns {Promise<string[]>} A promise that resolves to a list of index names.\n */\n async listIndexes(): Promise<string[]> {\n try {\n const indexes = await this.client.listNamespaces();\n return indexes.filter(Boolean);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_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 namespace to describe\n * @returns A promise that resolves to the index statistics including dimension, count and metric\n */\n async describeIndex({ indexName: namespace }: DescribeIndexParams): Promise<IndexStats> {\n try {\n const info = await this.client.info();\n\n return {\n dimension: info.dimension,\n count: info.namespaces?.[namespace]?.vectorCount || 0,\n metric: info?.similarityFunction?.toLowerCase() as 'cosine' | 'euclidean' | 'dotproduct',\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_VECTOR_DESCRIBE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes an index (namespace).\n * @param {DeleteIndexParams} params - The parameters for the delete operation.\n * @returns {Promise<void>} A promise that resolves when the deletion is complete.\n */\n async deleteIndex({ indexName: namespace }: DeleteIndexParams): Promise<void> {\n try {\n await this.client.deleteNamespace(namespace);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_VECTOR_DELETE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace },\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 namespace 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: namespace, id, update }: UpstashUpdateVectorParams): Promise<void> {\n if (!update.vector && !update.metadata && !update.sparseVector) {\n throw new MastraError({\n id: 'STORAGE_UPSTASH_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace, id },\n text: 'No update data provided',\n });\n }\n\n // The upstash client throws an exception as: 'This index requires dense/sparse vectors' when\n // only metadata is present in the update object.\n if (!update.vector && !update.sparseVector && update.metadata) {\n throw new MastraError({\n id: 'STORAGE_UPSTASH_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace, id },\n text: 'Both vector and metadata must be provided for an update',\n });\n }\n\n try {\n const points: any = { id };\n\n if (update.vector) points.vector = update.vector;\n if (update.metadata) points.metadata = update.metadata;\n if (update.sparseVector) points.sparseVector = update.sparseVector;\n\n await this.client.upsert(points, { namespace });\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_UPSTASH_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace, id },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a vector by its ID.\n * @param indexName - The name of the namespace 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: namespace, id }: DeleteVectorParams): Promise<void> {\n try {\n await this.client.delete(id, {\n namespace,\n });\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'STORAGE_UPSTASH_VECTOR_DELETE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { namespace, id },\n },\n error,\n );\n this.logger?.error(mastraError.toString());\n }\n }\n}\n","/**\n * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for Upstash Vector.\n */\nexport const UPSTASH_PROMPT = `When querying Upstash 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\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\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n\nRestrictions:\n- Regex patterns are not supported\n- Only $and and $or logical operators are supported at the top level\n- Empty arrays in $in/$nin will return no results\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported with both implicit and explicit $and\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):\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 { \"rating\": { \"$exists\": true, \"$gt\": 4 } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": true }\n ]}\n ]\n}`;\n"]}