@mastra/upstash 1.0.0-beta.5 → 1.0.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/index.cjs +23 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/domains/workflows/index.d.ts +4 -0
- package/dist/storage/domains/workflows/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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","TABLE_WORKFLOW_SNAPSHOT","TABLE_SCORERS","serializeDate","MemoryStorage","TABLE_THREADS","error","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","normalizePerPage","calculatePagination","key","MessageList","messageIds","TABLE_RESOURCES","StoreOperations","coreTransformScoreRow","ScoresStorage","saveScorePayloadSchema","WorkflowsStorage","data","MastraStorage","Redis","BaseFilterTranslator","op","val","MastraVector","Index","randomUUID","createVectorErrorId"],"mappings":"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","file":"index.cjs","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, { id: record.id });\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 createStorageErrorId,\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\n// Index key for fast message ID -> threadId lookup (backwards compatible)\nfunction getMessageIndexKey(messageId: string): string {\n return `msg-idx:${messageId}`;\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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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 // Store the message ID -> threadId index for fast lookups\n pipeline.set(getMessageIndexKey(message.id), message.threadId!);\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: createStorageErrorId('UPSTASH', '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 /**\n * Lookup threadId for a message - tries index first (O(1)), falls back to scan (backwards compatible)\n */\n private async _getThreadIdForMessage(messageId: string): Promise<string | null> {\n // Try the index first (fast path for new messages)\n const indexedThreadId = await this.client.get<string>(getMessageIndexKey(messageId));\n if (indexedThreadId) {\n return indexedThreadId;\n }\n\n // Fall back to scan for backwards compatibility (old messages without index)\n const existingKeyPattern = getMessageKey('*', messageId);\n const keys = await this.operations.scanKeys(existingKeyPattern);\n if (keys.length === 0) return null;\n\n // Get the message to find its threadId\n const messageData = await this.client.get<MastraDBMessage>(keys[0] as string);\n if (!messageData) return null;\n\n // Backfill the index for future lookups\n if (messageData.threadId) {\n await this.client.set(getMessageIndexKey(messageId), messageData.threadId);\n }\n\n return messageData.threadId || null;\n }\n\n private async _getIncludedMessages(include: StorageListMessagesInput['include']): Promise<MastraDBMessage[]> {\n if (!include?.length) return [];\n\n const messageIds = new Set<string>();\n const messageIdToThreadIds: Record<string, string> = {};\n\n for (const item of include) {\n // Step 1: Find the threadId for this message (index first, then scan)\n const itemThreadId = await this._getThreadIdForMessage(item.id);\n if (!itemThreadId) continue;\n\n messageIds.add(item.id);\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 if (messageIds.size === 0) return [];\n\n const pipeline = this.client.pipeline();\n Array.from(messageIds).forEach(id => {\n const tId = messageIdToThreadIds[id]!;\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 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 const rawMessages: (MastraDBMessage & { _index?: number })[] = [];\n\n // Try to get threadIds from index first (fast path)\n const indexPipeline = this.client.pipeline();\n messageIds.forEach(id => indexPipeline.get(getMessageIndexKey(id)));\n const indexResults = await indexPipeline.exec();\n\n const indexedIds: { messageId: string; threadId: string }[] = [];\n const unindexedIds: string[] = [];\n\n messageIds.forEach((id, i) => {\n const threadId = indexResults[i] as string | null;\n if (threadId) {\n indexedIds.push({ messageId: id, threadId });\n } else {\n unindexedIds.push(id);\n }\n });\n\n // Fetch indexed messages directly (O(1) per message)\n if (indexedIds.length > 0) {\n const messagePipeline = this.client.pipeline();\n indexedIds.forEach(({ messageId, threadId }) => messagePipeline.get(getMessageKey(threadId, messageId)));\n const messageResults = await messagePipeline.exec();\n rawMessages.push(...(messageResults.filter(msg => msg !== null) as (MastraDBMessage & { _index?: number })[]));\n }\n\n // Fall back to scan for unindexed messages (backwards compatibility)\n if (unindexedIds.length > 0) {\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 unindexedIds.map(id => getMessageKey(threadId, id)),\n );\n }),\n );\n\n const foundMessages = result.flat(1).filter(msg => !!msg) as (MastraDBMessage & { _index?: number })[];\n rawMessages.push(...foundMessages);\n\n // Backfill index for found messages\n if (foundMessages.length > 0) {\n const backfillPipeline = this.client.pipeline();\n foundMessages.forEach(msg => {\n if (msg.threadId) {\n backfillPipeline.set(getMessageIndexKey(msg.id), msg.threadId);\n }\n });\n await backfillPipeline.exec();\n }\n }\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: createStorageErrorId('UPSTASH', '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 // Normalize threadId to array\n const threadIds = Array.isArray(threadId) ? threadId : [threadId];\n\n if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {\n throw new MastraError(\n {\n id: createStorageErrorId('UPSTASH', 'LIST_MESSAGES', 'INVALID_THREAD_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: Array.isArray(threadId) ? threadId.join(',') : threadId },\n },\n new Error('threadId must be a non-empty string or array of non-empty strings'),\n );\n }\n\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: createStorageErrorId('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(include)) as MastraDBMessage[];\n includedMessages = included.map(this.parseStoredMessage);\n }\n\n // Get all message IDs from all thread sorted sets\n const allMessageIdsWithThreads: { threadId: string; messageId: string }[] = [];\n for (const tid of threadIds) {\n const threadMessagesKey = getThreadMessagesKey(tid);\n const messageIds = await this.client.zrange(threadMessagesKey, 0, -1);\n for (const mid of messageIds) {\n allMessageIdsWithThreads.push({ threadId: tid, messageId: mid as string });\n }\n }\n\n if (allMessageIdsWithThreads.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 allMessageIdsWithThreads.forEach(({ threadId: tid, messageId }) => pipeline.get(getMessageKey(tid, messageId)));\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 // Always sort messages by the sort field/direction before pagination\n // This ensures consistent ordering whether orderBy is explicit or uses the default (createdAt ASC)\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 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 // Always sort by createdAt (or specified field) to ensure consistent chronological ordering\n // This is critical when `include` parameter brings in messages from semantic recall\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\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: createStorageErrorId('UPSTASH', 'LIST_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : 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: createStorageErrorId('UPSTASH', '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 const foundMessageIds: string[] = [];\n\n // Try index first for each message (fast path)\n const indexPipeline = this.client.pipeline();\n messageIds.forEach(id => indexPipeline.get(getMessageIndexKey(id)));\n const indexResults = await indexPipeline.exec();\n\n const indexedMessages: { messageId: string; threadId: string }[] = [];\n const unindexedMessageIds: string[] = [];\n\n messageIds.forEach((id, i) => {\n const threadId = indexResults[i] as string | null;\n if (threadId) {\n indexedMessages.push({ messageId: id, threadId });\n } else {\n unindexedMessageIds.push(id);\n }\n });\n\n // Process indexed messages (fast path)\n for (const { messageId, threadId } of indexedMessages) {\n messageKeys.push(getMessageKey(threadId, messageId));\n foundMessageIds.push(messageId);\n threadIds.add(threadId);\n }\n\n // Fall back to scan for unindexed messages (backwards compatibility)\n for (const messageId of unindexedMessageIds) {\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 foundMessageIds.push(messageId);\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 // Delete all message index entries\n for (const messageId of foundMessageIds) {\n pipeline.del(getMessageIndexKey(messageId));\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: createStorageErrorId('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 { createStorageErrorId, 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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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 { SaveScorePayload, ScoreRowData, ScoringSource, ValidatedSaveScorePayload } from '@mastra/core/evals';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport {\n calculatePagination,\n normalizePerPage,\n ScoresStorage,\n TABLE_SCORERS,\n transformScoreRow as coreTransformScoreRow,\n createStorageErrorId,\n} 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\n/**\n * Upstash-specific score row transformation.\n * Uses default options (no timestamp conversion).\n */\nfunction transformScoreRow(row: Record<string, any>): ScoreRowData {\n return coreTransformScoreRow(row);\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: createStorageErrorId('UPSTASH', 'GET_SCORE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n ...(id && { id }),\n },\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: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let validatedScore: ValidatedSaveScorePayload;\n try {\n validatedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('UPSTASH', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: score.scorer?.id ?? 'unknown',\n entityId: score.entityId ?? 'unknown',\n entityType: score.entityType ?? 'unknown',\n traceId: score.traceId ?? '',\n spanId: score.spanId ?? '',\n },\n },\n error,\n );\n }\n\n const now = new Date();\n const id = crypto.randomUUID();\n const createdAt = now;\n const updatedAt = now;\n\n const scoreWithId = {\n ...validatedScore,\n id,\n createdAt,\n updatedAt,\n };\n\n const { key, processedRecord } = processRecord(TABLE_SCORERS, scoreWithId);\n try {\n await this.client.set(key, processedRecord);\n return { score: { ...validatedScore, id, createdAt, updatedAt } as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('UPSTASH', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { 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 {\n createStorageErrorId,\n normalizePerPage,\n TABLE_WORKFLOW_SNAPSHOT,\n WorkflowsStorage,\n} 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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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 status,\n }: StorageListWorkflowRunsInput): Promise<WorkflowRuns> {\n try {\n if (page !== undefined && page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('UPSTASH', 'LIST_WORKFLOW_RUNS', '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 if (status) {\n let snapshot = w.snapshot;\n if (typeof snapshot === 'string') {\n try {\n snapshot = JSON.parse(snapshot) as WorkflowRunState;\n } catch (e) {\n console.warn(`Failed to parse snapshot for workflow ${w.workflowName}: ${e}`);\n return false;\n }\n }\n return snapshot.status === status;\n }\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 if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('UPSTASH', '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 { SaveScorePayload, 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 * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new UpstashStore({ ...config, disableInit: false });\n * await storage.init(); // Explicitly run migrations\n *\n * // In runtime application:\n * const storage = new UpstashStore({ ...config, disableInit: true });\n * // No auto-init, tables must already exist\n */\n disableInit?: boolean;\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', disableInit: config.disableInit });\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(args: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n return this.stores.workflows.listWorkflowRuns(args);\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: SaveScorePayload): 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 { createVectorErrorId } from '@mastra/core/storage';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n CreateIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n DescribeIndexParams,\n IndexStats,\n QueryResult,\n DeleteVectorsParams,\n UpdateVectorParams,\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: createVectorErrorId('UPSTASH', '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: createVectorErrorId('UPSTASH', '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: createVectorErrorId('UPSTASH', '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: createVectorErrorId('UPSTASH', '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: any) {\n // If the namespace doesn't exist, treat it as a no-op (already deleted)\n const errorMessage = error?.message || '';\n if (errorMessage.includes('does not exist') || errorMessage.includes('not found')) {\n this.logger.info(`Namespace ${namespace} does not exist, treating as already deleted`);\n return;\n }\n throw new MastraError(\n {\n id: createVectorErrorId('UPSTASH', '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 or multiple vectors matching a filter.\n * @param params - Parameters containing the id or filter for targeting the vector(s) to update\n * @param params.indexName - The name of the namespace containing the vector.\n * @param params.id - The ID of the vector to update (mutually exclusive with filter).\n * @param params.filter - Filter to match multiple vectors to update (mutually exclusive with id).\n * @param params.update - An object containing the vector and/or metadata to update.\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(params: UpdateVectorParams<UpstashVectorFilter>): Promise<void> {\n const { indexName: namespace, update } = params;\n // Extract Upstash-specific sparseVector field from update\n const upstashUpdate = update as UpstashUpdateVectorParams['update'];\n const sparseVector = upstashUpdate.sparseVector;\n\n // Validate mutually exclusive parameters\n if ('id' in params && params.id && 'filter' in params && params.filter) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'UPDATE_VECTOR', 'MUTUALLY_EXCLUSIVE'),\n text: 'Cannot specify both id and filter - they are mutually exclusive',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n if (!('id' in params && params.id) && !('filter' in params && params.filter)) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'UPDATE_VECTOR', 'NO_TARGET'),\n text: 'Either id or filter must be provided',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n if (!update.vector && !update.metadata && !sparseVector) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'UPDATE_VECTOR', 'NO_PAYLOAD'),\n text: 'No update data provided',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n // Validate filter is not empty\n if ('filter' in params && params.filter && Object.keys(params.filter).length === 0) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'UPDATE_VECTOR', 'EMPTY_FILTER'),\n text: 'Filter cannot be an empty filter object',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n // Note: Upstash requires both vector and metadata for upsert operations.\n // For partial updates (metadata-only or vector-only), we fetch the existing data\n // and merge it with the updates before calling upsert.\n\n try {\n const ns = this.client.namespace(namespace);\n\n // Handle update by ID\n if ('id' in params && params.id) {\n const points: any = { id: params.id };\n\n // For partial updates (metadata-only or vector-only), fetch existing data\n if (!update.vector || !update.metadata) {\n try {\n const existing = await ns.fetch([params.id], {\n includeVectors: true,\n includeMetadata: true,\n });\n\n if (existing && existing.length > 0 && existing[0]) {\n if (!update.vector && existing[0]?.vector) {\n points.vector = existing[0].vector;\n }\n if (!update.metadata && existing[0]?.metadata) {\n points.metadata = existing[0].metadata;\n }\n }\n } catch (fetchError) {\n // If fetch fails, we'll just proceed with what we have\n this.logger.warn(`Failed to fetch existing vector ${params.id} for partial update: ${fetchError}`);\n }\n }\n\n if (update.vector) points.vector = update.vector;\n if (update.metadata) points.metadata = update.metadata;\n if (sparseVector) points.sparseVector = sparseVector;\n\n await ns.upsert(points);\n }\n // Handle update by filter\n else if ('filter' in params && params.filter) {\n const filterString = this.transformFilter(params.filter);\n if (filterString) {\n // Get index stats to know dimensions for dummy vector\n const stats = await this.describeIndex({ indexName: namespace });\n\n // Create a normalized dummy vector for querying (avoid zero vector for cosine similarity)\n const dummyVector = new Array(stats.dimension).fill(1 / Math.sqrt(stats.dimension));\n\n // Query to get all matching vectors\n // For metadata-only updates, we need to fetch existing vectors\n const needsVectors = !update.vector;\n const results = await ns.query({\n vector: dummyVector,\n topK: 1000, // Upstash's max query limit\n filter: filterString,\n includeVectors: needsVectors,\n includeMetadata: needsVectors,\n });\n\n // Update each matching vector\n for (const result of results) {\n const points: any = { id: `${result.id}` };\n\n // For metadata-only updates, reuse existing vector\n if (update.vector) {\n points.vector = update.vector;\n } else if (result.vector) {\n points.vector = result.vector;\n }\n\n // For vector-only updates, reuse existing metadata\n if (update.metadata) {\n points.metadata = update.metadata;\n } else if (result.metadata) {\n points.metadata = result.metadata;\n }\n\n if (sparseVector) points.sparseVector = sparseVector;\n\n await ns.upsert(points);\n }\n }\n }\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createVectorErrorId('UPSTASH', 'UPDATE_VECTOR', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace,\n ...('id' in params && params.id && { id: params.id }),\n ...('filter' in params && params.filter && { filter: JSON.stringify(params.filter) }),\n },\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 const ns = this.client.namespace(namespace);\n await ns.delete(id);\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('UPSTASH', 'DELETE_VECTOR', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace,\n ...(id && { id }),\n },\n },\n error,\n );\n this.logger?.error(mastraError.toString());\n }\n }\n\n /**\n * Deletes multiple vectors by IDs or filter.\n * @param indexName - The name of the namespace containing the vectors.\n * @param ids - Array of vector IDs to delete (mutually exclusive with filter).\n * @param filter - Filter to match vectors to delete (mutually exclusive with ids).\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if both ids and filter are provided, or if neither is provided.\n */\n async deleteVectors({ indexName: namespace, filter, ids }: DeleteVectorsParams<UpstashVectorFilter>): Promise<void> {\n // Validate mutually exclusive parameters\n if (ids && filter) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'DELETE_VECTORS', 'MUTUALLY_EXCLUSIVE'),\n text: 'Cannot specify both ids and filter - they are mutually exclusive',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n if (!ids && !filter) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'DELETE_VECTORS', 'NO_TARGET'),\n text: 'Either filter or ids must be provided',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n // Validate ids array is not empty\n if (ids && ids.length === 0) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'DELETE_VECTORS', 'EMPTY_IDS'),\n text: 'Cannot delete with empty ids array',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n // Validate filter is not empty\n if (filter && Object.keys(filter).length === 0) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'DELETE_VECTORS', 'EMPTY_FILTER'),\n text: 'Cannot delete with empty filter object',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n try {\n const ns = this.client.namespace(namespace);\n\n if (ids) {\n // Delete by IDs - Upstash's delete accepts individual IDs or arrays\n await ns.delete(ids);\n } else if (filter) {\n // Delete by filter - Query first to get matching IDs, then delete\n const filterString = this.transformFilter(filter);\n if (filterString) {\n // Get index stats to know dimensions for dummy vector\n const stats = await this.describeIndex({ indexName: namespace });\n\n // Create a normalized dummy vector for querying (avoid zero vector for cosine similarity)\n const dummyVector = new Array(stats.dimension).fill(1 / Math.sqrt(stats.dimension));\n\n // Query to get all matching vectors\n const results = await ns.query({\n vector: dummyVector,\n topK: 1000, // Upstash's max query limit\n filter: filterString,\n includeVectors: false,\n includeMetadata: false,\n });\n\n // Delete all matching vectors\n const idsToDelete = results.map(r => `${r.id}`);\n if (idsToDelete.length > 0) {\n await ns.delete(idsToDelete);\n }\n }\n }\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createVectorErrorId('UPSTASH', 'DELETE_VECTORS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace,\n ...(filter && { filter: JSON.stringify(filter) }),\n ...(ids && { idsCount: ids.length }),\n },\n },\n error,\n );\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","TABLE_WORKFLOW_SNAPSHOT","TABLE_SCORERS","serializeDate","MemoryStorage","TABLE_THREADS","error","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","normalizePerPage","calculatePagination","key","MessageList","messageIds","TABLE_RESOURCES","StoreOperations","coreTransformScoreRow","ScoresStorage","saveScorePayloadSchema","WorkflowsStorage","data","MastraStorage","Redis","BaseFilterTranslator","op","val","MastraVector","Index","randomUUID","createVectorErrorId"],"mappings":"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","file":"index.cjs","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, { id: record.id });\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 createStorageErrorId,\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\n// Index key for fast message ID -> threadId lookup (backwards compatible)\nfunction getMessageIndexKey(messageId: string): string {\n return `msg-idx:${messageId}`;\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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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 // Store the message ID -> threadId index for fast lookups\n pipeline.set(getMessageIndexKey(message.id), message.threadId!);\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: createStorageErrorId('UPSTASH', '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 /**\n * Lookup threadId for a message - tries index first (O(1)), falls back to scan (backwards compatible)\n */\n private async _getThreadIdForMessage(messageId: string): Promise<string | null> {\n // Try the index first (fast path for new messages)\n const indexedThreadId = await this.client.get<string>(getMessageIndexKey(messageId));\n if (indexedThreadId) {\n return indexedThreadId;\n }\n\n // Fall back to scan for backwards compatibility (old messages without index)\n const existingKeyPattern = getMessageKey('*', messageId);\n const keys = await this.operations.scanKeys(existingKeyPattern);\n if (keys.length === 0) return null;\n\n // Get the message to find its threadId\n const messageData = await this.client.get<MastraDBMessage>(keys[0] as string);\n if (!messageData) return null;\n\n // Backfill the index for future lookups\n if (messageData.threadId) {\n await this.client.set(getMessageIndexKey(messageId), messageData.threadId);\n }\n\n return messageData.threadId || null;\n }\n\n private async _getIncludedMessages(include: StorageListMessagesInput['include']): Promise<MastraDBMessage[]> {\n if (!include?.length) return [];\n\n const messageIds = new Set<string>();\n const messageIdToThreadIds: Record<string, string> = {};\n\n for (const item of include) {\n // Step 1: Find the threadId for this message (index first, then scan)\n const itemThreadId = await this._getThreadIdForMessage(item.id);\n if (!itemThreadId) continue;\n\n messageIds.add(item.id);\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 if (messageIds.size === 0) return [];\n\n const pipeline = this.client.pipeline();\n Array.from(messageIds).forEach(id => {\n const tId = messageIdToThreadIds[id]!;\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 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 const rawMessages: (MastraDBMessage & { _index?: number })[] = [];\n\n // Try to get threadIds from index first (fast path)\n const indexPipeline = this.client.pipeline();\n messageIds.forEach(id => indexPipeline.get(getMessageIndexKey(id)));\n const indexResults = await indexPipeline.exec();\n\n const indexedIds: { messageId: string; threadId: string }[] = [];\n const unindexedIds: string[] = [];\n\n messageIds.forEach((id, i) => {\n const threadId = indexResults[i] as string | null;\n if (threadId) {\n indexedIds.push({ messageId: id, threadId });\n } else {\n unindexedIds.push(id);\n }\n });\n\n // Fetch indexed messages directly (O(1) per message)\n if (indexedIds.length > 0) {\n const messagePipeline = this.client.pipeline();\n indexedIds.forEach(({ messageId, threadId }) => messagePipeline.get(getMessageKey(threadId, messageId)));\n const messageResults = await messagePipeline.exec();\n rawMessages.push(...(messageResults.filter(msg => msg !== null) as (MastraDBMessage & { _index?: number })[]));\n }\n\n // Fall back to scan for unindexed messages (backwards compatibility)\n if (unindexedIds.length > 0) {\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 unindexedIds.map(id => getMessageKey(threadId, id)),\n );\n }),\n );\n\n const foundMessages = result.flat(1).filter(msg => !!msg) as (MastraDBMessage & { _index?: number })[];\n rawMessages.push(...foundMessages);\n\n // Backfill index for found messages\n if (foundMessages.length > 0) {\n const backfillPipeline = this.client.pipeline();\n foundMessages.forEach(msg => {\n if (msg.threadId) {\n backfillPipeline.set(getMessageIndexKey(msg.id), msg.threadId);\n }\n });\n await backfillPipeline.exec();\n }\n }\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: createStorageErrorId('UPSTASH', '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 // Normalize threadId to array\n const threadIds = Array.isArray(threadId) ? threadId : [threadId];\n\n if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {\n throw new MastraError(\n {\n id: createStorageErrorId('UPSTASH', 'LIST_MESSAGES', 'INVALID_THREAD_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: Array.isArray(threadId) ? threadId.join(',') : threadId },\n },\n new Error('threadId must be a non-empty string or array of non-empty strings'),\n );\n }\n\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: createStorageErrorId('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(include)) as MastraDBMessage[];\n includedMessages = included.map(this.parseStoredMessage);\n }\n\n // Get all message IDs from all thread sorted sets\n const allMessageIdsWithThreads: { threadId: string; messageId: string }[] = [];\n for (const tid of threadIds) {\n const threadMessagesKey = getThreadMessagesKey(tid);\n const messageIds = await this.client.zrange(threadMessagesKey, 0, -1);\n for (const mid of messageIds) {\n allMessageIdsWithThreads.push({ threadId: tid, messageId: mid as string });\n }\n }\n\n if (allMessageIdsWithThreads.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 allMessageIdsWithThreads.forEach(({ threadId: tid, messageId }) => pipeline.get(getMessageKey(tid, messageId)));\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 // Always sort messages by the sort field/direction before pagination\n // This ensures consistent ordering whether orderBy is explicit or uses the default (createdAt ASC)\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 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 // Always sort by createdAt (or specified field) to ensure consistent chronological ordering\n // This is critical when `include` parameter brings in messages from semantic recall\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\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: createStorageErrorId('UPSTASH', 'LIST_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : 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: createStorageErrorId('UPSTASH', '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 const foundMessageIds: string[] = [];\n\n // Try index first for each message (fast path)\n const indexPipeline = this.client.pipeline();\n messageIds.forEach(id => indexPipeline.get(getMessageIndexKey(id)));\n const indexResults = await indexPipeline.exec();\n\n const indexedMessages: { messageId: string; threadId: string }[] = [];\n const unindexedMessageIds: string[] = [];\n\n messageIds.forEach((id, i) => {\n const threadId = indexResults[i] as string | null;\n if (threadId) {\n indexedMessages.push({ messageId: id, threadId });\n } else {\n unindexedMessageIds.push(id);\n }\n });\n\n // Process indexed messages (fast path)\n for (const { messageId, threadId } of indexedMessages) {\n messageKeys.push(getMessageKey(threadId, messageId));\n foundMessageIds.push(messageId);\n threadIds.add(threadId);\n }\n\n // Fall back to scan for unindexed messages (backwards compatibility)\n for (const messageId of unindexedMessageIds) {\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 foundMessageIds.push(messageId);\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 // Delete all message index entries\n for (const messageId of foundMessageIds) {\n pipeline.del(getMessageIndexKey(messageId));\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: createStorageErrorId('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 { createStorageErrorId, 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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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 { SaveScorePayload, ScoreRowData, ScoringSource, ValidatedSaveScorePayload } from '@mastra/core/evals';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport {\n calculatePagination,\n normalizePerPage,\n ScoresStorage,\n TABLE_SCORERS,\n transformScoreRow as coreTransformScoreRow,\n createStorageErrorId,\n} 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\n/**\n * Upstash-specific score row transformation.\n * Uses default options (no timestamp conversion).\n */\nfunction transformScoreRow(row: Record<string, any>): ScoreRowData {\n return coreTransformScoreRow(row);\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: createStorageErrorId('UPSTASH', 'GET_SCORE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n ...(id && { id }),\n },\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: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let validatedScore: ValidatedSaveScorePayload;\n try {\n validatedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('UPSTASH', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: score.scorer?.id ?? 'unknown',\n entityId: score.entityId ?? 'unknown',\n entityType: score.entityType ?? 'unknown',\n traceId: score.traceId ?? '',\n spanId: score.spanId ?? '',\n },\n },\n error,\n );\n }\n\n const now = new Date();\n const id = crypto.randomUUID();\n const createdAt = now;\n const updatedAt = now;\n\n const scoreWithId = {\n ...validatedScore,\n id,\n createdAt,\n updatedAt,\n };\n\n const { key, processedRecord } = processRecord(TABLE_SCORERS, scoreWithId);\n try {\n await this.client.set(key, processedRecord);\n return { score: { ...validatedScore, id, createdAt, updatedAt } as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('UPSTASH', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { 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 {\n createStorageErrorId,\n normalizePerPage,\n TABLE_WORKFLOW_SNAPSHOT,\n WorkflowsStorage,\n} 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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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: createStorageErrorId('UPSTASH', '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 deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n const key = getKey(TABLE_WORKFLOW_SNAPSHOT, { namespace: 'workflows', workflow_name: workflowName, run_id: runId });\n try {\n await this.client.del(key);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('UPSTASH', 'DELETE_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace: 'workflows',\n runId,\n 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 status,\n }: StorageListWorkflowRunsInput): Promise<WorkflowRuns> {\n try {\n if (page !== undefined && page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('UPSTASH', 'LIST_WORKFLOW_RUNS', '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 if (status) {\n let snapshot = w.snapshot;\n if (typeof snapshot === 'string') {\n try {\n snapshot = JSON.parse(snapshot) as WorkflowRunState;\n } catch (e) {\n console.warn(`Failed to parse snapshot for workflow ${w.workflowName}: ${e}`);\n return false;\n }\n }\n return snapshot.status === status;\n }\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 if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('UPSTASH', '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 { SaveScorePayload, 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 * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new UpstashStore({ ...config, disableInit: false });\n * await storage.init(); // Explicitly run migrations\n *\n * // In runtime application:\n * const storage = new UpstashStore({ ...config, disableInit: true });\n * // No auto-init, tables must already exist\n */\n disableInit?: boolean;\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', disableInit: config.disableInit });\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 deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n return this.stores.workflows.deleteWorkflowRunById({ runId, workflowName });\n }\n\n async listWorkflowRuns(args: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n return this.stores.workflows.listWorkflowRuns(args);\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: SaveScorePayload): 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 { createVectorErrorId } from '@mastra/core/storage';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n CreateIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n DescribeIndexParams,\n IndexStats,\n QueryResult,\n DeleteVectorsParams,\n UpdateVectorParams,\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: createVectorErrorId('UPSTASH', '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: createVectorErrorId('UPSTASH', '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: createVectorErrorId('UPSTASH', '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: createVectorErrorId('UPSTASH', '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: any) {\n // If the namespace doesn't exist, treat it as a no-op (already deleted)\n const errorMessage = error?.message || '';\n if (errorMessage.includes('does not exist') || errorMessage.includes('not found')) {\n this.logger.info(`Namespace ${namespace} does not exist, treating as already deleted`);\n return;\n }\n throw new MastraError(\n {\n id: createVectorErrorId('UPSTASH', '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 or multiple vectors matching a filter.\n * @param params - Parameters containing the id or filter for targeting the vector(s) to update\n * @param params.indexName - The name of the namespace containing the vector.\n * @param params.id - The ID of the vector to update (mutually exclusive with filter).\n * @param params.filter - Filter to match multiple vectors to update (mutually exclusive with id).\n * @param params.update - An object containing the vector and/or metadata to update.\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(params: UpdateVectorParams<UpstashVectorFilter>): Promise<void> {\n const { indexName: namespace, update } = params;\n // Extract Upstash-specific sparseVector field from update\n const upstashUpdate = update as UpstashUpdateVectorParams['update'];\n const sparseVector = upstashUpdate.sparseVector;\n\n // Validate mutually exclusive parameters\n if ('id' in params && params.id && 'filter' in params && params.filter) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'UPDATE_VECTOR', 'MUTUALLY_EXCLUSIVE'),\n text: 'Cannot specify both id and filter - they are mutually exclusive',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n if (!('id' in params && params.id) && !('filter' in params && params.filter)) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'UPDATE_VECTOR', 'NO_TARGET'),\n text: 'Either id or filter must be provided',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n if (!update.vector && !update.metadata && !sparseVector) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'UPDATE_VECTOR', 'NO_PAYLOAD'),\n text: 'No update data provided',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n // Validate filter is not empty\n if ('filter' in params && params.filter && Object.keys(params.filter).length === 0) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'UPDATE_VECTOR', 'EMPTY_FILTER'),\n text: 'Filter cannot be an empty filter object',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n // Note: Upstash requires both vector and metadata for upsert operations.\n // For partial updates (metadata-only or vector-only), we fetch the existing data\n // and merge it with the updates before calling upsert.\n\n try {\n const ns = this.client.namespace(namespace);\n\n // Handle update by ID\n if ('id' in params && params.id) {\n const points: any = { id: params.id };\n\n // For partial updates (metadata-only or vector-only), fetch existing data\n if (!update.vector || !update.metadata) {\n try {\n const existing = await ns.fetch([params.id], {\n includeVectors: true,\n includeMetadata: true,\n });\n\n if (existing && existing.length > 0 && existing[0]) {\n if (!update.vector && existing[0]?.vector) {\n points.vector = existing[0].vector;\n }\n if (!update.metadata && existing[0]?.metadata) {\n points.metadata = existing[0].metadata;\n }\n }\n } catch (fetchError) {\n // If fetch fails, we'll just proceed with what we have\n this.logger.warn(`Failed to fetch existing vector ${params.id} for partial update: ${fetchError}`);\n }\n }\n\n if (update.vector) points.vector = update.vector;\n if (update.metadata) points.metadata = update.metadata;\n if (sparseVector) points.sparseVector = sparseVector;\n\n await ns.upsert(points);\n }\n // Handle update by filter\n else if ('filter' in params && params.filter) {\n const filterString = this.transformFilter(params.filter);\n if (filterString) {\n // Get index stats to know dimensions for dummy vector\n const stats = await this.describeIndex({ indexName: namespace });\n\n // Create a normalized dummy vector for querying (avoid zero vector for cosine similarity)\n const dummyVector = new Array(stats.dimension).fill(1 / Math.sqrt(stats.dimension));\n\n // Query to get all matching vectors\n // For metadata-only updates, we need to fetch existing vectors\n const needsVectors = !update.vector;\n const results = await ns.query({\n vector: dummyVector,\n topK: 1000, // Upstash's max query limit\n filter: filterString,\n includeVectors: needsVectors,\n includeMetadata: needsVectors,\n });\n\n // Update each matching vector\n for (const result of results) {\n const points: any = { id: `${result.id}` };\n\n // For metadata-only updates, reuse existing vector\n if (update.vector) {\n points.vector = update.vector;\n } else if (result.vector) {\n points.vector = result.vector;\n }\n\n // For vector-only updates, reuse existing metadata\n if (update.metadata) {\n points.metadata = update.metadata;\n } else if (result.metadata) {\n points.metadata = result.metadata;\n }\n\n if (sparseVector) points.sparseVector = sparseVector;\n\n await ns.upsert(points);\n }\n }\n }\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createVectorErrorId('UPSTASH', 'UPDATE_VECTOR', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace,\n ...('id' in params && params.id && { id: params.id }),\n ...('filter' in params && params.filter && { filter: JSON.stringify(params.filter) }),\n },\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 const ns = this.client.namespace(namespace);\n await ns.delete(id);\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('UPSTASH', 'DELETE_VECTOR', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace,\n ...(id && { id }),\n },\n },\n error,\n );\n this.logger?.error(mastraError.toString());\n }\n }\n\n /**\n * Deletes multiple vectors by IDs or filter.\n * @param indexName - The name of the namespace containing the vectors.\n * @param ids - Array of vector IDs to delete (mutually exclusive with filter).\n * @param filter - Filter to match vectors to delete (mutually exclusive with ids).\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if both ids and filter are provided, or if neither is provided.\n */\n async deleteVectors({ indexName: namespace, filter, ids }: DeleteVectorsParams<UpstashVectorFilter>): Promise<void> {\n // Validate mutually exclusive parameters\n if (ids && filter) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'DELETE_VECTORS', 'MUTUALLY_EXCLUSIVE'),\n text: 'Cannot specify both ids and filter - they are mutually exclusive',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n if (!ids && !filter) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'DELETE_VECTORS', 'NO_TARGET'),\n text: 'Either filter or ids must be provided',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n // Validate ids array is not empty\n if (ids && ids.length === 0) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'DELETE_VECTORS', 'EMPTY_IDS'),\n text: 'Cannot delete with empty ids array',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n // Validate filter is not empty\n if (filter && Object.keys(filter).length === 0) {\n throw new MastraError({\n id: createVectorErrorId('UPSTASH', 'DELETE_VECTORS', 'EMPTY_FILTER'),\n text: 'Cannot delete with empty filter object',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { namespace },\n });\n }\n\n try {\n const ns = this.client.namespace(namespace);\n\n if (ids) {\n // Delete by IDs - Upstash's delete accepts individual IDs or arrays\n await ns.delete(ids);\n } else if (filter) {\n // Delete by filter - Query first to get matching IDs, then delete\n const filterString = this.transformFilter(filter);\n if (filterString) {\n // Get index stats to know dimensions for dummy vector\n const stats = await this.describeIndex({ indexName: namespace });\n\n // Create a normalized dummy vector for querying (avoid zero vector for cosine similarity)\n const dummyVector = new Array(stats.dimension).fill(1 / Math.sqrt(stats.dimension));\n\n // Query to get all matching vectors\n const results = await ns.query({\n vector: dummyVector,\n topK: 1000, // Upstash's max query limit\n filter: filterString,\n includeVectors: false,\n includeMetadata: false,\n });\n\n // Delete all matching vectors\n const idsToDelete = results.map(r => `${r.id}`);\n if (idsToDelete.length > 0) {\n await ns.delete(idsToDelete);\n }\n }\n }\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createVectorErrorId('UPSTASH', 'DELETE_VECTORS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n namespace,\n ...(filter && { filter: JSON.stringify(filter) }),\n ...(ids && { idsCount: ids.length }),\n },\n },\n error,\n );\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"]}
|