@mastra/redis 1.0.2-alpha.0 → 1.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storage/domains/utils.ts","../src/storage/db/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/utils.ts","../src/storage/store.ts"],"names":["TABLE_MESSAGES","TABLE_WORKFLOW_SNAPSHOT","serializeDate","error","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","MemoryStorage","TABLE_THREADS","TABLE_RESOURCES","ensureDate","normalizePerPage","calculatePagination","jsonValueEquals","MessageList","list","filterByDateRange","key","ScoresStorage","TABLE_SCORERS","transformScoreRow","saveScorePayloadSchema","crypto","WorkflowsStorage","data","MastraStorage","createClient"],"mappings":"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","file":"index.cjs","sourcesContent":["import { serializeDate, TABLE_MESSAGES, TABLE_WORKFLOW_SNAPSHOT } from '@mastra/core/storage';\nimport type { TABLE_NAMES } from '@mastra/core/storage';\n\n/**\n * Generate a Redis key from table name and key parts.\n *\n * @example\n * ```typescript\n * getKey('mastra_threads', { id: 'thread-123' });\n * // Returns: 'mastra_threads:id:thread-123'\n *\n * getKey('mastra_messages', { threadId: 'thread-123', id: 'msg-456' });\n * // Returns: 'mastra_messages:threadId:thread-123:id:msg-456'\n * ```\n */\nexport function getKey(tableName: TABLE_NAMES, keys: Record<string, unknown>): string {\n const keyParts = Object.entries(keys)\n .filter(([_, value]) => value !== undefined)\n .map(([key, value]) => {\n if (value && typeof value === 'object') {\n return `${key}:${JSON.stringify(value)}`;\n }\n\n return `${key}:${value}`;\n });\n\n return `${tableName}:${keyParts.join(':')}`;\n}\n\n/**\n * Process a record for storage, generating the appropriate key and serializing dates.\n */\nexport function processRecord(tableName: TABLE_NAMES, record: Record<string, unknown>) {\n let key: string;\n\n if (tableName === TABLE_MESSAGES) {\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 {\n key = getKey(tableName, { id: record.id });\n }\n\n const processedRecord = {\n ...record,\n createdAt: serializeDate(record.createdAt as Date | string | undefined),\n updatedAt: serializeDate(record.updatedAt as Date | string | undefined),\n };\n\n return { key, processedRecord };\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createStorageErrorId } from '@mastra/core/storage';\nimport type { TABLE_NAMES } from '@mastra/core/storage';\n\nimport { getKey, processRecord } from '../domains/utils';\nimport type { RedisClient } from '../types';\n\nexport class RedisDB {\n private client: RedisClient;\n\n constructor({ client }: { client: RedisClient }) {\n this.client = client;\n }\n\n getClient(): RedisClient {\n return this.client;\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, unknown> }): Promise<void> {\n const { key, processedRecord } = processRecord(tableName, record);\n\n try {\n await this.client.set(key, JSON.stringify(processedRecord));\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 get<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(key);\n if (!data) {\n return null;\n }\n return JSON.parse(data) as R;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 scanAndDelete(pattern: string, batchSize = 10000): Promise<number> {\n let cursor = '0';\n let totalDeleted = 0;\n\n do {\n const result = await this.client.scan(cursor, { MATCH: pattern, COUNT: batchSize });\n\n if (result.keys.length > 0) {\n await this.client.del(result.keys);\n totalDeleted += result.keys.length;\n }\n\n cursor = result.cursor;\n } while (cursor !== '0');\n\n return totalDeleted;\n }\n\n async scanKeys(pattern: string, batchSize = 10000): Promise<string[]> {\n let cursor = '0';\n const keys: string[] = [];\n\n do {\n const result = await this.client.scan(cursor, { MATCH: pattern, COUNT: batchSize });\n\n keys.push(...result.keys);\n cursor = result.cursor;\n } while (cursor !== '0');\n\n return keys;\n }\n\n async deleteData({ 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('REDIS', '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\nexport interface RedisDomainConfig {\n client: RedisClient;\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 ensureDate,\n filterByDateRange,\n jsonValueEquals,\n} from '@mastra/core/storage';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n ThreadOrderBy,\n ThreadSortDirection,\n StorageCloneThreadInput,\n StorageCloneThreadOutput,\n ThreadCloneMetadata,\n} from '@mastra/core/storage';\n\nimport { RedisDB } from '../../db';\nimport type { RedisDomainConfig } from '../../db';\nimport type { RedisClient } from '../../types';\nimport { getKey, processRecord } from '../utils';\n\nexport class StoreMemoryRedis extends MemoryStorage {\n private client: RedisClient;\n private db: RedisDB;\n\n constructor(config: RedisDomainConfig) {\n super();\n this.client = config.client;\n this.db = new RedisDB({ client: config.client });\n }\n\n public async dangerouslyClearAll(): Promise<void> {\n await this.db.deleteData({ tableName: TABLE_THREADS });\n await this.db.deleteData({ tableName: TABLE_MESSAGES });\n await this.db.deleteData({ tableName: TABLE_RESOURCES });\n await this.db.scanAndDelete('msg-idx:*');\n await this.db.scanAndDelete('thread:*:messages');\n }\n\n public async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const thread = await this.db.get<StorageThreadType>({\n tableName: TABLE_THREADS,\n keys: { id: threadId },\n });\n\n if (!thread) {\n return null;\n }\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('REDIS', '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(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n return this.listThreads(args);\n }\n\n public async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n const { field, direction } = this.parseOrderBy(orderBy);\n\n try {\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'LIST_THREADS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page, ...(perPageInput !== undefined && { perPage: perPageInput }) },\n },\n error instanceof Error ? error : new Error('Invalid pagination parameters'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n\n try {\n this.validateMetadataKeys(filter?.metadata);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'LIST_THREADS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(', ') : '' },\n },\n error instanceof Error ? error : new Error('Invalid metadata key'),\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.db.scanKeys(pattern);\n\n if (keys.length === 0) {\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const results = await this.client.mGet(keys);\n\n for (let i = 0; i < results.length; i++) {\n const data = results[i];\n if (!data) {\n continue;\n }\n const thread = JSON.parse(data) as StorageThreadType;\n\n if (filter?.resourceId && thread.resourceId !== filter.resourceId) {\n continue;\n }\n\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n const threadMetadata = typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata;\n const matches = Object.entries(filter.metadata).every(([key, value]) =>\n jsonValueEquals(threadMetadata?.[key], value),\n );\n if (!matches) {\n continue;\n }\n }\n\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 const sortedThreads = this.sortThreads(allThreads, field, direction);\n const total = sortedThreads.length;\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('REDIS', 'LIST_THREADS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n ...(filter?.resourceId && { resourceId: filter.resourceId }),\n hasMetadataFilter: !!filter?.metadata,\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 public async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n await this.db.insert({\n tableName: TABLE_THREADS,\n record: thread,\n });\n return thread;\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public 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('REDIS', '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 updatedAt: new Date(),\n };\n\n try {\n await this.saveThread({ thread: updatedThread });\n return updatedThread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const threadMessagesKey = getThreadMessagesKey(threadId);\n\n try {\n const messageIds = await this.client.zRange(threadMessagesKey, 0, -1);\n\n const multi = this.client.multi();\n multi.del(threadKey);\n multi.del(threadMessagesKey);\n\n for (const messageId of messageIds) {\n const messageKey = getMessageKey(threadId, messageId);\n multi.del(messageKey);\n multi.del(getMessageIndexKey(messageId));\n }\n\n await multi.exec();\n await this.db.scanAndDelete(getMessageKey(threadId, '*'));\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n const { messages } = args;\n if (messages.length === 0) {\n return { messages: [] };\n }\n\n const threadId = messages[0]?.threadId;\n try {\n if (!threadId) {\n throw new Error('Thread ID is required');\n }\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('REDIS', 'SAVE_MESSAGES', 'INVALID_ARGS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n\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 const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const existingThreadData = await this.client.get(threadKey);\n const existingThread = existingThreadData ? (JSON.parse(existingThreadData) as StorageThreadType) : null;\n\n try {\n const batchSize = 1000;\n const existingThreadIds = await this.client.mGet(\n messagesWithIndex.map(message => getMessageIndexKey(message.id)),\n );\n\n for (let i = 0; i < messagesWithIndex.length; i += batchSize) {\n const batch = messagesWithIndex.slice(i, i + batchSize);\n const batchExistingThreadIds = existingThreadIds.slice(i, i + batch.length);\n const multi = this.client.multi();\n\n for (const [batchIndex, message] of batch.entries()) {\n const key = getMessageKey(message.threadId!, message.id);\n const score = getMessageScore(message);\n const existingThreadId = batchExistingThreadIds[batchIndex];\n\n if (existingThreadId && existingThreadId !== message.threadId) {\n const existingMessageKey = getMessageKey(existingThreadId, message.id);\n multi.del(existingMessageKey);\n multi.zRem(getThreadMessagesKey(existingThreadId), message.id);\n }\n\n multi.set(key, JSON.stringify(message));\n multi.set(getMessageIndexKey(message.id), message.threadId!);\n multi.zAdd(getThreadMessagesKey(message.threadId!), { score, value: message.id });\n }\n\n if (i === 0 && existingThread) {\n const updatedThread = {\n ...existingThread,\n updatedAt: new Date(),\n };\n multi.set(threadKey, JSON.stringify(processRecord(TABLE_THREADS, updatedThread).processedRecord));\n }\n\n await multi.exec();\n }\n\n const list = new MessageList().add(messages as Parameters<MessageList['add']>[0], 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n },\n },\n error,\n );\n }\n }\n\n private async getThreadIdForMessage(messageId: string): Promise<string | null> {\n const indexedThreadId = await this.client.get(getMessageIndexKey(messageId));\n if (indexedThreadId) {\n return indexedThreadId;\n }\n\n const keys = await this.db.scanKeys(getMessageKey('*', messageId));\n if (keys.length === 0) {\n return null;\n }\n\n const messageData = await this.client.get(keys[0] as string);\n if (!messageData) {\n return null;\n }\n\n const message = JSON.parse(messageData) as MastraDBMessage;\n if (message.threadId) {\n await this.client.set(getMessageIndexKey(messageId), message.threadId);\n }\n\n return message.threadId || null;\n }\n\n private async getIncludedMessages(include: StorageListMessagesInput['include']): Promise<MastraDBMessage[]> {\n if (!include?.length) {\n return [];\n }\n\n const messageIds = new Set<string>();\n const messageIdToThreadIds: Record<string, string> = {};\n\n for (const item of include) {\n const itemThreadId = await this.getThreadIdForMessage(item.id);\n if (!itemThreadId) {\n continue;\n }\n\n messageIds.add(item.id);\n messageIdToThreadIds[item.id] = itemThreadId;\n const itemThreadMessagesKey = getThreadMessagesKey(itemThreadId);\n\n const rank = await this.client.zRank(itemThreadMessagesKey, item.id);\n if (rank === null) {\n continue;\n }\n\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);\n messageIdToThreadIds[id] = itemThreadId;\n });\n }\n\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);\n messageIdToThreadIds[id] = itemThreadId;\n });\n }\n }\n\n if (messageIds.size === 0) {\n return [];\n }\n\n const keysToFetch = Array.from(messageIds).map(id => getMessageKey(messageIdToThreadIds[id]!, id));\n const results = await this.client.mGet(keysToFetch);\n\n return results.filter((data): data is string => data !== null).map(data => JSON.parse(data) 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) {\n return { messages: [] };\n }\n\n try {\n const rawMessages: (MastraDBMessage & { _index?: number })[] = [];\n\n const indexKeys = messageIds.map(id => getMessageIndexKey(id));\n const indexResults = await this.client.mGet(indexKeys);\n\n const indexedIds: { messageId: string; threadId: string }[] = [];\n const unindexedIds: string[] = [];\n\n messageIds.forEach((id, i) => {\n const threadId = indexResults[i];\n if (threadId) {\n indexedIds.push({ messageId: id, threadId });\n return;\n }\n unindexedIds.push(id);\n });\n\n if (indexedIds.length > 0) {\n const messageKeys = indexedIds.map(({ messageId, threadId }) => getMessageKey(threadId, messageId));\n const messageResults = await this.client.mGet(messageKeys);\n for (const data of messageResults) {\n if (data) {\n rawMessages.push(JSON.parse(data) as MastraDBMessage & { _index?: number });\n }\n }\n }\n\n if (unindexedIds.length > 0) {\n const threadKeys = await this.db.scanKeys('thread:*:messages');\n\n const result = await Promise.all(\n threadKeys.map(async threadKey => {\n const threadId = threadKey.split(':')[1];\n if (!threadId) {\n throw new Error(`Failed to parse thread ID from thread key \"${threadKey}\"`);\n }\n const msgKeys = unindexedIds.map(id => getMessageKey(threadId, id));\n return this.client.mGet(msgKeys);\n }),\n );\n\n const foundMessages = result\n .flat(1)\n .filter((data): data is string => !!data)\n .map(data => JSON.parse(data) as MastraDBMessage & { _index?: number });\n rawMessages.push(...foundMessages);\n\n if (foundMessages.length > 0) {\n const multi = this.client.multi();\n foundMessages.forEach(msg => {\n if (msg.threadId) {\n multi.set(getMessageIndexKey(msg.id), msg.threadId);\n }\n });\n await multi.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('REDIS', '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 const threadIds = Array.isArray(threadId) ? threadId : [threadId];\n const threadIdsSet = new Set(threadIds);\n\n if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'LIST_MESSAGES', 'INVALID_THREAD_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\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 const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'LIST_MESSAGES', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n const getFieldValue = (msg: MastraDBMessage): number => {\n if (field === 'createdAt') {\n return new Date(msg.createdAt).getTime();\n }\n\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 return 0;\n };\n\n if (perPage === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\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 if (perPage === 0 && include && include.length > 0) {\n const list = new MessageList().add(includedMessages, 'memory');\n const messages = list.get.all.db().sort((a, b) => {\n const aValue = getFieldValue(a);\n const bValue = getFieldValue(b);\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n });\n\n return {\n messages,\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const allMessageIdsWithThreads: { threadId: string; messageId: string }[] = [];\n for (const tid of threadIds) {\n const threadMessagesKey = getThreadMessagesKey(tid);\n const msgIds = await this.client.zRange(threadMessagesKey, 0, -1);\n for (const mid of msgIds) {\n allMessageIdsWithThreads.push({ threadId: tid, messageId: mid });\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 const messageKeys = allMessageIdsWithThreads.map(({ threadId: tid, messageId }) => getMessageKey(tid, messageId));\n const results = await this.client.mGet(messageKeys);\n\n let messagesData = results\n .filter((data): data is string => data !== null)\n .map(data => JSON.parse(data) as MastraDBMessage & { _index?: number })\n .map(this.parseStoredMessage);\n\n if (resourceId) {\n messagesData = messagesData.filter(msg => msg.resourceId === resourceId);\n }\n\n messagesData = filterByDateRange(\n messagesData,\n (msg: MastraDBMessage) => new Date(msg.createdAt),\n filter?.dateRange,\n );\n\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 const start = offset;\n const end = perPageInput === false ? total : start + perPage;\n const paginatedMessages = messagesData.slice(start, end);\n\n const messageIdsSet = new Set<string>();\n const allMessages: MastraDBMessage[] = [];\n\n for (const msg of paginatedMessages) {\n if (messageIdsSet.has(msg.id)) {\n continue;\n }\n allMessages.push(msg);\n messageIdsSet.add(msg.id);\n }\n\n for (const msg of includedMessages) {\n if (messageIdsSet.has(msg.id)) {\n continue;\n }\n allMessages.push(msg);\n messageIdsSet.add(msg.id);\n }\n\n const list = new MessageList().add(allMessages, 'memory');\n let finalMessages = list.get.all.db();\n\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 const returnedThreadMessageIds = new Set(\n finalMessages\n .filter(m => {\n return m.threadId && threadIdsSet.has(m.threadId);\n })\n .map(m => m.id),\n );\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('REDIS', '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 public async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const key = `${TABLE_RESOURCES}:${resourceId}`;\n const data = await this.client.get(key);\n if (!data) {\n return null;\n }\n\n const resource = JSON.parse(data) as StorageResourceType;\n\n return {\n ...resource,\n createdAt: new Date(resource.createdAt),\n updatedAt: new Date(resource.updatedAt),\n workingMemory:\n typeof resource.workingMemory === 'object' ? JSON.stringify(resource.workingMemory) : resource.workingMemory,\n metadata: typeof resource.metadata === 'string' ? JSON.parse(resource.metadata) : resource.metadata,\n };\n } catch (error) {\n this.logger.error('Error getting resource by ID:', error);\n throw error;\n }\n }\n\n public 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, JSON.stringify(serializedResource));\n\n return resource;\n } catch (error) {\n this.logger.error('Error saving resource:', error);\n throw error;\n }\n }\n\n public 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 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 public 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 if (messages.length === 0) {\n return [];\n }\n\n try {\n const messageIds = messages.map(m => m.id);\n const existingMessages: MastraDBMessage[] = [];\n const messageIdToKey: Record<string, string> = {};\n\n for (const messageId of messageIds) {\n const pattern = getMessageKey('*', messageId);\n const keys = await this.db.scanKeys(pattern);\n\n for (const key of keys) {\n const data = await this.client.get(key);\n if (!data) {\n continue;\n }\n const message = JSON.parse(data) as MastraDBMessage;\n if (message && message.id === messageId) {\n existingMessages.push(message);\n messageIdToKey[messageId] = key;\n break;\n }\n }\n }\n\n if (existingMessages.length === 0) {\n return [];\n }\n\n const threadIdsToUpdate = new Set<string>();\n const multi = this.client.multi();\n\n for (const existingMessage of existingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) {\n continue;\n }\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) {\n continue;\n }\n\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n\n const updatedMessage = { ...existingMessage };\n\n if (fieldsToUpdate.content) {\n const existingContent = existingMessage.content as MastraMessageContentV2;\n const newContent = {\n ...existingContent,\n ...fieldsToUpdate.content,\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 for (const key in fieldsToUpdate) {\n if (Object.prototype.hasOwnProperty.call(fieldsToUpdate, key) && key !== 'content') {\n (updatedMessage as Record<string, unknown>)[key] = fieldsToUpdate[key as keyof typeof fieldsToUpdate];\n }\n }\n\n const key = messageIdToKey[id];\n if (!key) {\n continue;\n }\n\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n multi.zRem(getThreadMessagesKey(existingMessage.threadId!), id);\n multi.del(key);\n\n const newKey = getMessageKey(updatePayload.threadId, id);\n multi.set(newKey, JSON.stringify(updatedMessage));\n multi.set(getMessageIndexKey(id), updatePayload.threadId);\n\n const score = getMessageScore(updatedMessage as MastraDBMessage & { _index?: number });\n multi.zAdd(getThreadMessagesKey(updatePayload.threadId), { score, value: id });\n\n messageIdToKey[id] = newKey;\n continue;\n }\n\n multi.set(key, JSON.stringify(updatedMessage));\n }\n\n const now = new Date();\n for (const threadId of threadIdsToUpdate) {\n if (threadId) {\n const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const existingThreadData = await this.client.get(threadKey);\n if (existingThreadData) {\n const existingThread = JSON.parse(existingThreadData) as StorageThreadType;\n const updatedThread = {\n ...existingThread,\n updatedAt: now,\n };\n multi.set(threadKey, JSON.stringify(processRecord(TABLE_THREADS, updatedThread).processedRecord));\n }\n }\n }\n\n await multi.exec();\n\n const updatedMessages: MastraDBMessage[] = [];\n for (const messageId of messageIds) {\n const key = messageIdToKey[messageId];\n if (key) {\n const data = await this.client.get(key);\n if (data) {\n updatedMessages.push(JSON.parse(data) as MastraDBMessage);\n }\n }\n }\n\n return updatedMessages;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public 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 const messageIdToThreadId = new Map<string, string>();\n\n const indexKeys = messageIds.map(id => getMessageIndexKey(id));\n const indexResults = await this.client.mGet(indexKeys);\n\n const indexedMessages: { messageId: string; threadId: string }[] = [];\n const unindexedMessageIds: string[] = [];\n\n messageIds.forEach((id, i) => {\n const threadId = indexResults[i];\n if (threadId) {\n indexedMessages.push({ messageId: id, threadId });\n return;\n }\n unindexedMessageIds.push(id);\n });\n\n for (const { messageId, threadId } of indexedMessages) {\n messageKeys.push(getMessageKey(threadId, messageId));\n foundMessageIds.push(messageId);\n messageIdToThreadId.set(messageId, threadId);\n threadIds.add(threadId);\n }\n\n for (const messageId of unindexedMessageIds) {\n const pattern = getMessageKey('*', messageId);\n const keys = await this.db.scanKeys(pattern);\n\n for (const key of keys) {\n const data = await this.client.get(key);\n if (!data) {\n continue;\n }\n const message = JSON.parse(data) as MastraDBMessage;\n if (message && message.id === messageId) {\n messageKeys.push(key);\n foundMessageIds.push(messageId);\n if (message.threadId) {\n messageIdToThreadId.set(messageId, message.threadId);\n threadIds.add(message.threadId);\n }\n break;\n }\n }\n }\n\n if (messageKeys.length === 0) {\n return;\n }\n\n const multi = this.client.multi();\n\n for (const key of messageKeys) {\n multi.del(key);\n }\n\n for (const messageId of foundMessageIds) {\n multi.del(getMessageIndexKey(messageId));\n }\n\n if (threadIds.size > 0) {\n for (const threadId of threadIds) {\n for (const [msgId, msgThreadId] of messageIdToThreadId) {\n if (msgThreadId === threadId) {\n multi.zRem(getThreadMessagesKey(threadId), msgId);\n }\n }\n\n const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const threadData = await this.client.get(threadKey);\n if (!threadData) {\n continue;\n }\n\n const thread = JSON.parse(threadData) as StorageThreadType;\n const updatedThread = { ...thread, updatedAt: new Date() };\n multi.set(threadKey, JSON.stringify(processRecord(TABLE_THREADS, updatedThread).processedRecord));\n }\n }\n\n await multi.exec();\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n });\n }\n\n public async cloneThread(args: StorageCloneThreadInput): Promise<StorageCloneThreadOutput> {\n const { sourceThreadId, newThreadId: providedThreadId, resourceId, title, metadata, options } = args;\n\n const sourceThread = await this.getThreadById({ threadId: sourceThreadId });\n if (!sourceThread) {\n throw new MastraError({\n id: createStorageErrorId('REDIS', 'CLONE_THREAD', 'SOURCE_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Source thread with id ${sourceThreadId} not found`,\n details: { sourceThreadId },\n });\n }\n\n const newThreadId = providedThreadId || crypto.randomUUID();\n\n const existingThread = await this.getThreadById({ threadId: newThreadId });\n if (existingThread) {\n throw new MastraError({\n id: createStorageErrorId('REDIS', 'CLONE_THREAD', 'THREAD_EXISTS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread with id ${newThreadId} already exists`,\n details: { newThreadId },\n });\n }\n\n try {\n const threadMessagesKey = getThreadMessagesKey(sourceThreadId);\n const msgIds = await this.client.zRange(threadMessagesKey, 0, -1);\n\n const messageKeys = msgIds.map(mid => getMessageKey(sourceThreadId, mid));\n let sourceMessages: (MastraDBMessage & { _index?: number })[] = [];\n\n if (messageKeys.length > 0) {\n const results = await this.client.mGet(messageKeys);\n sourceMessages = results\n .filter((data): data is string => data !== null)\n .map(data => {\n const msg = JSON.parse(data) as MastraDBMessage & { _index?: number };\n return { ...msg, createdAt: new Date(msg.createdAt) };\n });\n }\n\n if (options?.messageFilter?.startDate || options?.messageFilter?.endDate) {\n sourceMessages = filterByDateRange(sourceMessages, (msg: MastraDBMessage) => new Date(msg.createdAt), {\n start: options.messageFilter?.startDate,\n end: options.messageFilter?.endDate,\n });\n }\n\n if (options?.messageFilter?.messageIds && options.messageFilter.messageIds.length > 0) {\n const messageIdSet = new Set(options.messageFilter.messageIds);\n sourceMessages = sourceMessages.filter(msg => messageIdSet.has(msg.id));\n }\n\n sourceMessages.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n\n if (options?.messageLimit && options.messageLimit > 0 && sourceMessages.length > options.messageLimit) {\n sourceMessages = sourceMessages.slice(-options.messageLimit);\n }\n\n const now = new Date();\n const lastMessageId = sourceMessages.length > 0 ? sourceMessages[sourceMessages.length - 1]!.id : undefined;\n\n const cloneMetadata: ThreadCloneMetadata = {\n sourceThreadId,\n clonedAt: now,\n ...(lastMessageId && { lastMessageId }),\n };\n\n const newThread: StorageThreadType = {\n id: newThreadId,\n resourceId: resourceId || sourceThread.resourceId,\n title: title || (sourceThread.title ? `Clone of ${sourceThread.title}` : undefined),\n metadata: { ...metadata, clone: cloneMetadata },\n createdAt: now,\n updatedAt: now,\n };\n\n const multi = this.client.multi();\n const threadKey = getKey(TABLE_THREADS, { id: newThreadId });\n multi.set(threadKey, JSON.stringify(processRecord(TABLE_THREADS, newThread).processedRecord));\n\n const clonedMessages: MastraDBMessage[] = [];\n const targetResourceId = resourceId || sourceThread.resourceId;\n const newThreadMessagesKey = getThreadMessagesKey(newThreadId);\n\n for (let i = 0; i < sourceMessages.length; i++) {\n const sourceMsg = sourceMessages[i]!;\n const newMessageId = crypto.randomUUID();\n const { _index, ...restMsg } = sourceMsg;\n\n const newMessage: MastraDBMessage = {\n ...restMsg,\n id: newMessageId,\n threadId: newThreadId,\n resourceId: targetResourceId,\n };\n\n const messageKey = getMessageKey(newThreadId, newMessageId);\n multi.set(messageKey, JSON.stringify(newMessage));\n multi.set(getMessageIndexKey(newMessageId), newThreadId);\n const score = getMessageScore({ createdAt: newMessage.createdAt, _index: i });\n multi.zAdd(newThreadMessagesKey, { score, value: newMessageId });\n\n clonedMessages.push(newMessage);\n }\n\n await multi.exec();\n\n return {\n thread: newThread,\n clonedMessages,\n };\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'CLONE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { sourceThreadId, newThreadId },\n },\n error,\n );\n }\n }\n}\n\nfunction getThreadMessagesKey(threadId: string): string {\n return `thread:${threadId}:messages`;\n}\n\nfunction getMessageKey(threadId: string, messageId: string): string {\n return getKey(TABLE_MESSAGES, { threadId, id: messageId });\n}\n\nfunction getMessageIndexKey(messageId: string): string {\n return `msg-idx:${messageId}`;\n}\n\nfunction getMessageScore(message: { createdAt: Date | string; _index?: number }): number {\n const createdAtScore = new Date(message.createdAt).getTime();\n const index = typeof message._index === 'number' ? message._index : 0;\n return createdAtScore * 1000 + index;\n}\n","import crypto from 'node:crypto';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { SaveScorePayload, ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport {\n calculatePagination,\n normalizePerPage,\n ScoresStorage,\n TABLE_SCORERS,\n transformScoreRow,\n createStorageErrorId,\n} from '@mastra/core/storage';\nimport type { PaginationInfo, StoragePagination } from '@mastra/core/storage';\n\nimport { RedisDB } from '../../db';\nimport type { RedisDomainConfig } from '../../db';\nimport type { RedisClient } from '../../types';\nimport { processRecord } from '../utils';\n\nexport class ScoresRedis extends ScoresStorage {\n private client: RedisClient;\n private db: RedisDB;\n\n constructor(config: RedisDomainConfig) {\n super();\n this.client = config.client;\n this.db = new RedisDB({ client: config.client });\n }\n\n public async dangerouslyClearAll(): Promise<void> {\n await this.db.deleteData({ tableName: TABLE_SCORERS });\n }\n\n public async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const data = await this.db.get<ScoreRowData>({\n tableName: TABLE_SCORERS,\n keys: { id },\n });\n\n if (!data) {\n return null;\n }\n\n return transformScoreRow(data as Record<string, unknown>);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public 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 return this.fetchAndFilterScores(pagination, row => {\n if (row.scorerId !== scorerId) {\n return false;\n }\n if (entityId && row.entityId !== entityId) {\n return false;\n }\n if (entityType && row.entityType !== entityType) {\n return false;\n }\n if (source && row.source !== source) {\n return false;\n }\n return true;\n });\n }\n\n public async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let validatedScore: SaveScorePayload;\n try {\n validatedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: typeof score.scorer?.id === 'string' ? score.scorer.id : String(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\n const scoreWithId = {\n ...validatedScore,\n id,\n createdAt: now,\n updatedAt: now,\n };\n\n const { key, processedRecord } = processRecord(TABLE_SCORERS, scoreWithId);\n try {\n await this.client.set(key, JSON.stringify(processedRecord));\n return { score: { ...validatedScore, id, createdAt: now, updatedAt: now } as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n public 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 return this.fetchAndFilterScores(pagination, row => row.runId === runId);\n }\n\n public 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 return this.fetchAndFilterScores(pagination, row => {\n if (row.entityId !== entityId) {\n return false;\n }\n if (entityType && row.entityType !== entityType) {\n return false;\n }\n return true;\n });\n }\n\n public 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 return this.fetchAndFilterScores(pagination, row => row.traceId === traceId && row.spanId === spanId);\n }\n\n private async fetchAndFilterScores(\n pagination: StoragePagination,\n filterFn: (row: Record<string, unknown>) => boolean,\n ): Promise<{ scores: ScoreRowData[]; pagination: PaginationInfo }> {\n const { page, perPage: perPageInput } = pagination;\n const keys = await this.db.scanKeys(`${TABLE_SCORERS}:*`);\n\n if (keys.length === 0) {\n return {\n scores: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\n };\n }\n\n const results = await this.client.mGet(keys);\n\n const filtered = results\n .map((data): Record<string, unknown> | null => {\n if (!data) {\n return null;\n }\n try {\n return JSON.parse(data) as Record<string, unknown>;\n } catch {\n return null;\n }\n })\n .filter((row): row is Record<string, unknown> => !!row && typeof row === 'object' && filterFn(row));\n\n const total = filtered.length;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? total : start + perPage;\n const scores = filtered.slice(start, end).map(row => transformScoreRow(row));\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n normalizePerPage,\n TABLE_WORKFLOW_SNAPSHOT,\n WorkflowsStorage,\n ensureDate,\n} from '@mastra/core/storage';\nimport type {\n StorageListWorkflowRunsInput,\n WorkflowRun,\n WorkflowRuns,\n UpdateWorkflowStateOptions,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\n\nimport { RedisDB } from '../../db';\nimport type { RedisDomainConfig } from '../../db';\nimport type { RedisClient } from '../../types';\nimport { getKey } from '../utils';\n\nfunction parseWorkflowRun(row: Record<string, unknown>): 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 console.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n }\n }\n\n return {\n workflowName: row.workflow_name as string,\n runId: row.run_id as string,\n snapshot: parsedSnapshot,\n createdAt: ensureDate(row.createdAt as string | Date)!,\n updatedAt: ensureDate(row.updatedAt as string | Date)!,\n resourceId: row.resourceId as string | undefined,\n };\n}\n\nexport class WorkflowsRedis extends WorkflowsStorage {\n private client: RedisClient;\n private db: RedisDB;\n\n constructor(config: RedisDomainConfig) {\n super();\n this.client = config.client;\n this.db = new RedisDB({ client: config.client });\n }\n\n public supportsConcurrentUpdates(): boolean {\n return false;\n }\n\n public async dangerouslyClearAll(): Promise<void> {\n await this.db.deleteData({ tableName: TABLE_WORKFLOW_SNAPSHOT });\n }\n\n public 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<unknown, unknown, unknown, unknown>;\n requestContext: Record<string, unknown>;\n }): Promise<Record<string, StepResult<unknown, unknown, unknown, unknown>>> {\n try {\n const existingRecord = await this.db.get<{\n namespace: string;\n workflow_name: string;\n run_id: string;\n snapshot: WorkflowRunState;\n createdAt: string | Date;\n updatedAt: string | Date;\n }>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: {\n namespace: 'workflows',\n workflow_name: workflowName,\n run_id: runId,\n },\n });\n\n const existingSnapshot = existingRecord?.snapshot;\n let snapshot = existingSnapshot;\n\n if (!snapshot) {\n snapshot = {\n context: {},\n activePaths: [],\n timestamp: Date.now(),\n suspendedPaths: {},\n activeStepsPath: {},\n resumeLabels: {},\n serializedStepGraph: [],\n status: 'pending',\n value: {},\n waitingPaths: {},\n runId,\n requestContext: {},\n } as WorkflowRunState;\n }\n\n snapshot.context[stepId] = result;\n snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };\n\n await this.persistWorkflowSnapshot({\n namespace: 'workflows',\n workflowName,\n runId,\n snapshot,\n createdAt: existingRecord?.createdAt ? ensureDate(existingRecord.createdAt) : undefined,\n });\n\n return snapshot.context;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'UPDATE_WORKFLOW_RESULTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId, stepId },\n },\n error,\n );\n }\n }\n\n public async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined> {\n try {\n const existingRecord = await this.db.get<{\n namespace: string;\n workflow_name: string;\n run_id: string;\n snapshot: WorkflowRunState;\n createdAt: string | Date;\n updatedAt: string | Date;\n }>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: {\n namespace: 'workflows',\n workflow_name: workflowName,\n run_id: runId,\n },\n });\n\n const existingSnapshot = existingRecord?.snapshot;\n\n if (!existingSnapshot || !existingSnapshot.context) {\n return undefined;\n }\n\n const updatedSnapshot = { ...existingSnapshot, ...opts };\n\n await this.persistWorkflowSnapshot({\n namespace: 'workflows',\n workflowName,\n runId,\n snapshot: updatedSnapshot,\n createdAt: existingRecord?.createdAt ? ensureDate(existingRecord.createdAt) : undefined,\n });\n\n return updatedSnapshot;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'UPDATE_WORKFLOW_STATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n public async persistWorkflowSnapshot(params: {\n namespace?: string;\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void> {\n const { namespace = 'workflows', workflowName, runId, resourceId, snapshot, createdAt, updatedAt } = params;\n try {\n let finalCreatedAt = createdAt;\n if (!finalCreatedAt) {\n const existing = await this.db.get<{\n namespace: string;\n workflow_name: string;\n run_id: string;\n snapshot: WorkflowRunState;\n createdAt: string | Date;\n updatedAt: string | Date;\n }>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: {\n namespace,\n workflow_name: workflowName,\n run_id: runId,\n },\n });\n finalCreatedAt = existing?.createdAt ? ensureDate(existing.createdAt) : new Date();\n }\n\n await this.db.insert({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n record: {\n namespace,\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot,\n createdAt: finalCreatedAt,\n updatedAt: updatedAt ?? new Date(),\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public 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(key);\n if (!data) {\n return null;\n }\n const parsed = JSON.parse(data) as {\n namespace: string;\n workflow_name: string;\n run_id: string;\n snapshot: WorkflowRunState;\n };\n return parsed.snapshot;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public 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.db.scanKeys(key);\n\n if (keys.length === 0) {\n return null;\n }\n\n const results = await this.client.mGet(keys);\n const workflows = results\n .filter((data): data is string => data !== null)\n .map(\n data =>\n JSON.parse(data) as {\n workflow_name: string;\n run_id: string;\n snapshot: WorkflowRunState | string;\n createdAt: string | Date;\n updatedAt: string | Date;\n resourceId: string;\n },\n );\n\n const data = workflows.find(workflow => {\n if (!workflow) {\n return false;\n }\n\n const runIdMatch = workflow.run_id === runId;\n\n if (workflowName) {\n return runIdMatch && workflow.workflow_name === workflowName;\n }\n\n return runIdMatch;\n });\n\n if (!data) {\n return null;\n }\n\n return parseWorkflowRun(data as Record<string, unknown>);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public 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('REDIS', '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 public 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('REDIS', '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 const normalizedFrom = fromDate ? ensureDate(fromDate) : undefined;\n const normalizedTo = toDate ? ensureDate(toDate) : undefined;\n\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.db.scanKeys(pattern);\n\n if (keys.length === 0) {\n return { runs: [], total: 0 };\n }\n\n const results = await this.client.mGet(keys);\n\n let runs = results\n .filter((data): data is string => data !== null)\n .map(data => JSON.parse(data) as Record<string, unknown>)\n .filter(\n (record): record is Record<string, unknown> =>\n record !== null && record !== undefined && typeof record === 'object' && 'workflow_name' in record,\n )\n .filter(record => !workflowName || record.workflow_name === workflowName)\n .map(w => parseWorkflowRun(w))\n .filter(w => {\n if (normalizedFrom && w.createdAt < normalizedFrom) {\n return false;\n }\n if (normalizedTo && w.createdAt > normalizedTo) {\n return false;\n }\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 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) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 { RedisClient, RedisConfig } from './types';\n\nexport function isClientConfig(config: RedisConfig): config is RedisConfig & { client: RedisClient } {\n return 'client' in config;\n}\n\nexport function isConnectionStringConfig(config: RedisConfig): config is RedisConfig & { connectionString: string } {\n return 'connectionString' in config;\n}\n","import { MastraStorage } from '@mastra/core/storage';\nimport type { StorageDomains } from '@mastra/core/storage';\nimport { createClient } from 'redis';\n\nimport { StoreMemoryRedis } from './domains/memory';\nimport { ScoresRedis } from './domains/scores';\nimport { WorkflowsRedis } from './domains/workflows';\nimport type { RedisClient, RedisConfig } from './types';\nimport { isClientConfig, isConnectionStringConfig } from './utils';\n\n/**\n * Redis storage adapter for Mastra.\n *\n * Provides storage functionality for direct Redis connections using the official redis package.\n *\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * // Using connection string\n * const storage = new RedisStore({\n * id: 'my-store',\n * connectionString: 'redis://localhost:6379',\n * });\n *\n * // Using host/port\n * const storage = new RedisStore({\n * id: 'my-store',\n * host: 'localhost',\n * port: 6379,\n * password: 'secret',\n * });\n *\n * // Access memory domain\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Access workflows domain\n * const workflows = await storage.getStore('workflows');\n * await workflows?.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n * ```\n *\n * @example\n * ```typescript\n * // Using a pre-configured client for advanced features\n * import { createClient } from 'redis';\n *\n * const client = createClient({\n * url: 'redis://localhost:6379',\n * socket: {\n * reconnectStrategy: (retries) => Math.min(retries * 50, 2000),\n * },\n * });\n * await client.connect();\n *\n * const storage = new RedisStore({\n * id: 'my-store',\n * client,\n * });\n * ```\n */\nexport class RedisStore extends MastraStorage {\n private client: RedisClient;\n private shouldManageConnection: boolean;\n public stores: StorageDomains;\n\n constructor(config: RedisConfig) {\n super({ id: config.id, name: 'Redis', disableInit: config.disableInit });\n\n const { client, shouldManageConnection } = this.createClient(config);\n this.client = client;\n this.shouldManageConnection = shouldManageConnection;\n\n this.stores = {\n scores: new ScoresRedis({ client: this.client }),\n workflows: new WorkflowsRedis({ client: this.client }),\n memory: new StoreMemoryRedis({ client: this.client }),\n };\n }\n\n public override async init(): Promise<void> {\n if (this.shouldManageConnection && !this.client.isOpen) {\n await this.client.connect();\n }\n await super.init();\n }\n\n public getClient(): RedisClient {\n return this.client;\n }\n\n public async close(): Promise<void> {\n if (this.shouldManageConnection && this.client.isOpen) {\n await this.client.quit();\n }\n }\n\n private createClient(config: RedisConfig): { client: RedisClient; shouldManageConnection: boolean } {\n if (isClientConfig(config)) {\n return { client: config.client, shouldManageConnection: false };\n }\n\n if (isConnectionStringConfig(config)) {\n if (!config.connectionString?.trim()) {\n throw new Error('RedisStore: connectionString is required and cannot be empty.');\n }\n return {\n client: createClient({ url: config.connectionString }) as RedisClient,\n shouldManageConnection: true,\n };\n }\n\n if (!config.host?.trim()) {\n throw new Error('RedisStore: host is required and cannot be empty.');\n }\n\n const url = this.createClientUrl({\n ...config,\n db: config.db ?? 0,\n port: config.port ?? 6379,\n });\n\n return {\n client: createClient({ url }) as RedisClient,\n shouldManageConnection: true,\n };\n }\n\n private createClientUrl(config: { host: string; password?: string; port: number; db: number }): string {\n const encodedPassword = config.password ? encodeURIComponent(config.password) : null;\n\n if (config.password) {\n return `redis://:${encodedPassword}@${config.host}:${config.port || 6379}/${config.db || 0}`;\n }\n\n return `redis://${config.host}:${config.port || 6379}/${config.db || 0}`;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/storage/domains/utils.ts","../src/storage/db/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/utils.ts","../src/storage/store.ts","../src/cache.ts"],"names":["TABLE_MESSAGES","TABLE_WORKFLOW_SNAPSHOT","serializeDate","error","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","MemoryStorage","TABLE_THREADS","TABLE_RESOURCES","ensureDate","normalizePerPage","calculatePagination","jsonValueEquals","MessageList","list","filterByDateRange","key","ScoresStorage","TABLE_SCORERS","transformScoreRow","saveScorePayloadSchema","crypto","WorkflowsStorage","data","MastraStorage","createClient","MastraServerCache"],"mappings":"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","file":"index.cjs","sourcesContent":["import { serializeDate, TABLE_MESSAGES, TABLE_WORKFLOW_SNAPSHOT } from '@mastra/core/storage';\nimport type { TABLE_NAMES } from '@mastra/core/storage';\n\n/**\n * Generate a Redis key from table name and key parts.\n *\n * @example\n * ```typescript\n * getKey('mastra_threads', { id: 'thread-123' });\n * // Returns: 'mastra_threads:id:thread-123'\n *\n * getKey('mastra_messages', { threadId: 'thread-123', id: 'msg-456' });\n * // Returns: 'mastra_messages:threadId:thread-123:id:msg-456'\n * ```\n */\nexport function getKey(tableName: TABLE_NAMES, keys: Record<string, unknown>): string {\n const keyParts = Object.entries(keys)\n .filter(([_, value]) => value !== undefined)\n .map(([key, value]) => {\n if (value && typeof value === 'object') {\n return `${key}:${JSON.stringify(value)}`;\n }\n\n return `${key}:${value}`;\n });\n\n return `${tableName}:${keyParts.join(':')}`;\n}\n\n/**\n * Process a record for storage, generating the appropriate key and serializing dates.\n */\nexport function processRecord(tableName: TABLE_NAMES, record: Record<string, unknown>) {\n let key: string;\n\n if (tableName === TABLE_MESSAGES) {\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 {\n key = getKey(tableName, { id: record.id });\n }\n\n const processedRecord = {\n ...record,\n createdAt: serializeDate(record.createdAt as Date | string | undefined),\n updatedAt: serializeDate(record.updatedAt as Date | string | undefined),\n };\n\n return { key, processedRecord };\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createStorageErrorId } from '@mastra/core/storage';\nimport type { TABLE_NAMES } from '@mastra/core/storage';\n\nimport { getKey, processRecord } from '../domains/utils';\nimport type { RedisClient } from '../types';\n\nexport class RedisDB {\n private client: RedisClient;\n\n constructor({ client }: { client: RedisClient }) {\n this.client = client;\n }\n\n getClient(): RedisClient {\n return this.client;\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, unknown> }): Promise<void> {\n const { key, processedRecord } = processRecord(tableName, record);\n\n try {\n await this.client.set(key, JSON.stringify(processedRecord));\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 get<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(key);\n if (!data) {\n return null;\n }\n return JSON.parse(data) as R;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 scanAndDelete(pattern: string, batchSize = 10000): Promise<number> {\n let cursor = '0';\n let totalDeleted = 0;\n\n do {\n const result = await this.client.scan(cursor, { MATCH: pattern, COUNT: batchSize });\n\n if (result.keys.length > 0) {\n await this.client.del(result.keys);\n totalDeleted += result.keys.length;\n }\n\n cursor = result.cursor;\n } while (cursor !== '0');\n\n return totalDeleted;\n }\n\n async scanKeys(pattern: string, batchSize = 10000): Promise<string[]> {\n let cursor = '0';\n const keys: string[] = [];\n\n do {\n const result = await this.client.scan(cursor, { MATCH: pattern, COUNT: batchSize });\n\n keys.push(...result.keys);\n cursor = result.cursor;\n } while (cursor !== '0');\n\n return keys;\n }\n\n async deleteData({ 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('REDIS', '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\nexport interface RedisDomainConfig {\n client: RedisClient;\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 ensureDate,\n filterByDateRange,\n jsonValueEquals,\n} from '@mastra/core/storage';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n ThreadOrderBy,\n ThreadSortDirection,\n StorageCloneThreadInput,\n StorageCloneThreadOutput,\n ThreadCloneMetadata,\n} from '@mastra/core/storage';\n\nimport { RedisDB } from '../../db';\nimport type { RedisDomainConfig } from '../../db';\nimport type { RedisClient } from '../../types';\nimport { getKey, processRecord } from '../utils';\n\nexport class StoreMemoryRedis extends MemoryStorage {\n private client: RedisClient;\n private db: RedisDB;\n\n constructor(config: RedisDomainConfig) {\n super();\n this.client = config.client;\n this.db = new RedisDB({ client: config.client });\n }\n\n public async dangerouslyClearAll(): Promise<void> {\n await this.db.deleteData({ tableName: TABLE_THREADS });\n await this.db.deleteData({ tableName: TABLE_MESSAGES });\n await this.db.deleteData({ tableName: TABLE_RESOURCES });\n await this.db.scanAndDelete('msg-idx:*');\n await this.db.scanAndDelete('thread:*:messages');\n }\n\n public async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const thread = await this.db.get<StorageThreadType>({\n tableName: TABLE_THREADS,\n keys: { id: threadId },\n });\n\n if (!thread) {\n return null;\n }\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('REDIS', '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(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n return this.listThreads(args);\n }\n\n public async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n const { field, direction } = this.parseOrderBy(orderBy);\n\n try {\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'LIST_THREADS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page, ...(perPageInput !== undefined && { perPage: perPageInput }) },\n },\n error instanceof Error ? error : new Error('Invalid pagination parameters'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n\n try {\n this.validateMetadataKeys(filter?.metadata);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'LIST_THREADS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(', ') : '' },\n },\n error instanceof Error ? error : new Error('Invalid metadata key'),\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.db.scanKeys(pattern);\n\n if (keys.length === 0) {\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const results = await this.client.mGet(keys);\n\n for (let i = 0; i < results.length; i++) {\n const data = results[i];\n if (!data) {\n continue;\n }\n const thread = JSON.parse(data) as StorageThreadType;\n\n if (filter?.resourceId && thread.resourceId !== filter.resourceId) {\n continue;\n }\n\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n const threadMetadata = typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata;\n const matches = Object.entries(filter.metadata).every(([key, value]) =>\n jsonValueEquals(threadMetadata?.[key], value),\n );\n if (!matches) {\n continue;\n }\n }\n\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 const sortedThreads = this.sortThreads(allThreads, field, direction);\n const total = sortedThreads.length;\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('REDIS', 'LIST_THREADS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n ...(filter?.resourceId && { resourceId: filter.resourceId }),\n hasMetadataFilter: !!filter?.metadata,\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 public async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n await this.db.insert({\n tableName: TABLE_THREADS,\n record: thread,\n });\n return thread;\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public 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('REDIS', '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 updatedAt: new Date(),\n };\n\n try {\n await this.saveThread({ thread: updatedThread });\n return updatedThread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const threadMessagesKey = getThreadMessagesKey(threadId);\n\n try {\n const messageIds = await this.client.zRange(threadMessagesKey, 0, -1);\n\n const multi = this.client.multi();\n multi.del(threadKey);\n multi.del(threadMessagesKey);\n\n for (const messageId of messageIds) {\n const messageKey = getMessageKey(threadId, messageId);\n multi.del(messageKey);\n multi.del(getMessageIndexKey(messageId));\n }\n\n await multi.exec();\n await this.db.scanAndDelete(getMessageKey(threadId, '*'));\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n const { messages } = args;\n if (messages.length === 0) {\n return { messages: [] };\n }\n\n const threadId = messages[0]?.threadId;\n try {\n if (!threadId) {\n throw new Error('Thread ID is required');\n }\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('REDIS', 'SAVE_MESSAGES', 'INVALID_ARGS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n\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 const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const existingThreadData = await this.client.get(threadKey);\n const existingThread = existingThreadData ? (JSON.parse(existingThreadData) as StorageThreadType) : null;\n\n try {\n const batchSize = 1000;\n const existingThreadIds = await this.client.mGet(\n messagesWithIndex.map(message => getMessageIndexKey(message.id)),\n );\n\n for (let i = 0; i < messagesWithIndex.length; i += batchSize) {\n const batch = messagesWithIndex.slice(i, i + batchSize);\n const batchExistingThreadIds = existingThreadIds.slice(i, i + batch.length);\n const multi = this.client.multi();\n\n for (const [batchIndex, message] of batch.entries()) {\n const key = getMessageKey(message.threadId!, message.id);\n const score = getMessageScore(message);\n const existingThreadId = batchExistingThreadIds[batchIndex];\n\n if (existingThreadId && existingThreadId !== message.threadId) {\n const existingMessageKey = getMessageKey(existingThreadId, message.id);\n multi.del(existingMessageKey);\n multi.zRem(getThreadMessagesKey(existingThreadId), message.id);\n }\n\n multi.set(key, JSON.stringify(message));\n multi.set(getMessageIndexKey(message.id), message.threadId!);\n multi.zAdd(getThreadMessagesKey(message.threadId!), { score, value: message.id });\n }\n\n if (i === 0 && existingThread) {\n const updatedThread = {\n ...existingThread,\n updatedAt: new Date(),\n };\n multi.set(threadKey, JSON.stringify(processRecord(TABLE_THREADS, updatedThread).processedRecord));\n }\n\n await multi.exec();\n }\n\n const list = new MessageList().add(messages as Parameters<MessageList['add']>[0], 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n },\n },\n error,\n );\n }\n }\n\n private async getThreadIdForMessage(messageId: string): Promise<string | null> {\n const indexedThreadId = await this.client.get(getMessageIndexKey(messageId));\n if (indexedThreadId) {\n return indexedThreadId;\n }\n\n const keys = await this.db.scanKeys(getMessageKey('*', messageId));\n if (keys.length === 0) {\n return null;\n }\n\n const messageData = await this.client.get(keys[0] as string);\n if (!messageData) {\n return null;\n }\n\n const message = JSON.parse(messageData) as MastraDBMessage;\n if (message.threadId) {\n await this.client.set(getMessageIndexKey(messageId), message.threadId);\n }\n\n return message.threadId || null;\n }\n\n private async getIncludedMessages(include: StorageListMessagesInput['include']): Promise<MastraDBMessage[]> {\n if (!include?.length) {\n return [];\n }\n\n const messageIds = new Set<string>();\n const messageIdToThreadIds: Record<string, string> = {};\n\n for (const item of include) {\n const itemThreadId = await this.getThreadIdForMessage(item.id);\n if (!itemThreadId) {\n continue;\n }\n\n messageIds.add(item.id);\n messageIdToThreadIds[item.id] = itemThreadId;\n const itemThreadMessagesKey = getThreadMessagesKey(itemThreadId);\n\n const rank = await this.client.zRank(itemThreadMessagesKey, item.id);\n if (rank === null) {\n continue;\n }\n\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);\n messageIdToThreadIds[id] = itemThreadId;\n });\n }\n\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);\n messageIdToThreadIds[id] = itemThreadId;\n });\n }\n }\n\n if (messageIds.size === 0) {\n return [];\n }\n\n const keysToFetch = Array.from(messageIds).map(id => getMessageKey(messageIdToThreadIds[id]!, id));\n const results = await this.client.mGet(keysToFetch);\n\n return results.filter((data): data is string => data !== null).map(data => JSON.parse(data) 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) {\n return { messages: [] };\n }\n\n try {\n const rawMessages: (MastraDBMessage & { _index?: number })[] = [];\n\n const indexKeys = messageIds.map(id => getMessageIndexKey(id));\n const indexResults = await this.client.mGet(indexKeys);\n\n const indexedIds: { messageId: string; threadId: string }[] = [];\n const unindexedIds: string[] = [];\n\n messageIds.forEach((id, i) => {\n const threadId = indexResults[i];\n if (threadId) {\n indexedIds.push({ messageId: id, threadId });\n return;\n }\n unindexedIds.push(id);\n });\n\n if (indexedIds.length > 0) {\n const messageKeys = indexedIds.map(({ messageId, threadId }) => getMessageKey(threadId, messageId));\n const messageResults = await this.client.mGet(messageKeys);\n for (const data of messageResults) {\n if (data) {\n rawMessages.push(JSON.parse(data) as MastraDBMessage & { _index?: number });\n }\n }\n }\n\n if (unindexedIds.length > 0) {\n const threadKeys = await this.db.scanKeys('thread:*:messages');\n\n const result = await Promise.all(\n threadKeys.map(async threadKey => {\n const threadId = threadKey.split(':')[1];\n if (!threadId) {\n throw new Error(`Failed to parse thread ID from thread key \"${threadKey}\"`);\n }\n const msgKeys = unindexedIds.map(id => getMessageKey(threadId, id));\n return this.client.mGet(msgKeys);\n }),\n );\n\n const foundMessages = result\n .flat(1)\n .filter((data): data is string => !!data)\n .map(data => JSON.parse(data) as MastraDBMessage & { _index?: number });\n rawMessages.push(...foundMessages);\n\n if (foundMessages.length > 0) {\n const multi = this.client.multi();\n foundMessages.forEach(msg => {\n if (msg.threadId) {\n multi.set(getMessageIndexKey(msg.id), msg.threadId);\n }\n });\n await multi.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('REDIS', '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 const threadIds = Array.isArray(threadId) ? threadId : [threadId];\n const threadIdsSet = new Set(threadIds);\n\n if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'LIST_MESSAGES', 'INVALID_THREAD_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\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 const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'LIST_MESSAGES', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n const getFieldValue = (msg: MastraDBMessage): number => {\n if (field === 'createdAt') {\n return new Date(msg.createdAt).getTime();\n }\n\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 return 0;\n };\n\n if (perPage === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\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 if (perPage === 0 && include && include.length > 0) {\n const list = new MessageList().add(includedMessages, 'memory');\n const messages = list.get.all.db().sort((a, b) => {\n const aValue = getFieldValue(a);\n const bValue = getFieldValue(b);\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n });\n\n return {\n messages,\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const allMessageIdsWithThreads: { threadId: string; messageId: string }[] = [];\n for (const tid of threadIds) {\n const threadMessagesKey = getThreadMessagesKey(tid);\n const msgIds = await this.client.zRange(threadMessagesKey, 0, -1);\n for (const mid of msgIds) {\n allMessageIdsWithThreads.push({ threadId: tid, messageId: mid });\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 const messageKeys = allMessageIdsWithThreads.map(({ threadId: tid, messageId }) => getMessageKey(tid, messageId));\n const results = await this.client.mGet(messageKeys);\n\n let messagesData = results\n .filter((data): data is string => data !== null)\n .map(data => JSON.parse(data) as MastraDBMessage & { _index?: number })\n .map(this.parseStoredMessage);\n\n if (resourceId) {\n messagesData = messagesData.filter(msg => msg.resourceId === resourceId);\n }\n\n messagesData = filterByDateRange(\n messagesData,\n (msg: MastraDBMessage) => new Date(msg.createdAt),\n filter?.dateRange,\n );\n\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 const start = offset;\n const end = perPageInput === false ? total : start + perPage;\n const paginatedMessages = messagesData.slice(start, end);\n\n const messageIdsSet = new Set<string>();\n const allMessages: MastraDBMessage[] = [];\n\n for (const msg of paginatedMessages) {\n if (messageIdsSet.has(msg.id)) {\n continue;\n }\n allMessages.push(msg);\n messageIdsSet.add(msg.id);\n }\n\n for (const msg of includedMessages) {\n if (messageIdsSet.has(msg.id)) {\n continue;\n }\n allMessages.push(msg);\n messageIdsSet.add(msg.id);\n }\n\n const list = new MessageList().add(allMessages, 'memory');\n let finalMessages = list.get.all.db();\n\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 const returnedThreadMessageIds = new Set(\n finalMessages\n .filter(m => {\n return m.threadId && threadIdsSet.has(m.threadId);\n })\n .map(m => m.id),\n );\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('REDIS', '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 public async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const key = `${TABLE_RESOURCES}:${resourceId}`;\n const data = await this.client.get(key);\n if (!data) {\n return null;\n }\n\n const resource = JSON.parse(data) as StorageResourceType;\n\n return {\n ...resource,\n createdAt: new Date(resource.createdAt),\n updatedAt: new Date(resource.updatedAt),\n workingMemory:\n typeof resource.workingMemory === 'object' ? JSON.stringify(resource.workingMemory) : resource.workingMemory,\n metadata: typeof resource.metadata === 'string' ? JSON.parse(resource.metadata) : resource.metadata,\n };\n } catch (error) {\n this.logger.error('Error getting resource by ID:', error);\n throw error;\n }\n }\n\n public 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, JSON.stringify(serializedResource));\n\n return resource;\n } catch (error) {\n this.logger.error('Error saving resource:', error);\n throw error;\n }\n }\n\n public 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 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 public 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 if (messages.length === 0) {\n return [];\n }\n\n try {\n const messageIds = messages.map(m => m.id);\n const existingMessages: MastraDBMessage[] = [];\n const messageIdToKey: Record<string, string> = {};\n\n for (const messageId of messageIds) {\n const pattern = getMessageKey('*', messageId);\n const keys = await this.db.scanKeys(pattern);\n\n for (const key of keys) {\n const data = await this.client.get(key);\n if (!data) {\n continue;\n }\n const message = JSON.parse(data) as MastraDBMessage;\n if (message && message.id === messageId) {\n existingMessages.push(message);\n messageIdToKey[messageId] = key;\n break;\n }\n }\n }\n\n if (existingMessages.length === 0) {\n return [];\n }\n\n const threadIdsToUpdate = new Set<string>();\n const multi = this.client.multi();\n\n for (const existingMessage of existingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) {\n continue;\n }\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) {\n continue;\n }\n\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n\n const updatedMessage = { ...existingMessage };\n\n if (fieldsToUpdate.content) {\n const existingContent = existingMessage.content as MastraMessageContentV2;\n const newContent = {\n ...existingContent,\n ...fieldsToUpdate.content,\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 for (const key in fieldsToUpdate) {\n if (Object.prototype.hasOwnProperty.call(fieldsToUpdate, key) && key !== 'content') {\n (updatedMessage as Record<string, unknown>)[key] = fieldsToUpdate[key as keyof typeof fieldsToUpdate];\n }\n }\n\n const key = messageIdToKey[id];\n if (!key) {\n continue;\n }\n\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n multi.zRem(getThreadMessagesKey(existingMessage.threadId!), id);\n multi.del(key);\n\n const newKey = getMessageKey(updatePayload.threadId, id);\n multi.set(newKey, JSON.stringify(updatedMessage));\n multi.set(getMessageIndexKey(id), updatePayload.threadId);\n\n const score = getMessageScore(updatedMessage as MastraDBMessage & { _index?: number });\n multi.zAdd(getThreadMessagesKey(updatePayload.threadId), { score, value: id });\n\n messageIdToKey[id] = newKey;\n continue;\n }\n\n multi.set(key, JSON.stringify(updatedMessage));\n }\n\n const now = new Date();\n for (const threadId of threadIdsToUpdate) {\n if (threadId) {\n const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const existingThreadData = await this.client.get(threadKey);\n if (existingThreadData) {\n const existingThread = JSON.parse(existingThreadData) as StorageThreadType;\n const updatedThread = {\n ...existingThread,\n updatedAt: now,\n };\n multi.set(threadKey, JSON.stringify(processRecord(TABLE_THREADS, updatedThread).processedRecord));\n }\n }\n }\n\n await multi.exec();\n\n const updatedMessages: MastraDBMessage[] = [];\n for (const messageId of messageIds) {\n const key = messageIdToKey[messageId];\n if (key) {\n const data = await this.client.get(key);\n if (data) {\n updatedMessages.push(JSON.parse(data) as MastraDBMessage);\n }\n }\n }\n\n return updatedMessages;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public 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 const messageIdToThreadId = new Map<string, string>();\n\n const indexKeys = messageIds.map(id => getMessageIndexKey(id));\n const indexResults = await this.client.mGet(indexKeys);\n\n const indexedMessages: { messageId: string; threadId: string }[] = [];\n const unindexedMessageIds: string[] = [];\n\n messageIds.forEach((id, i) => {\n const threadId = indexResults[i];\n if (threadId) {\n indexedMessages.push({ messageId: id, threadId });\n return;\n }\n unindexedMessageIds.push(id);\n });\n\n for (const { messageId, threadId } of indexedMessages) {\n messageKeys.push(getMessageKey(threadId, messageId));\n foundMessageIds.push(messageId);\n messageIdToThreadId.set(messageId, threadId);\n threadIds.add(threadId);\n }\n\n for (const messageId of unindexedMessageIds) {\n const pattern = getMessageKey('*', messageId);\n const keys = await this.db.scanKeys(pattern);\n\n for (const key of keys) {\n const data = await this.client.get(key);\n if (!data) {\n continue;\n }\n const message = JSON.parse(data) as MastraDBMessage;\n if (message && message.id === messageId) {\n messageKeys.push(key);\n foundMessageIds.push(messageId);\n if (message.threadId) {\n messageIdToThreadId.set(messageId, message.threadId);\n threadIds.add(message.threadId);\n }\n break;\n }\n }\n }\n\n if (messageKeys.length === 0) {\n return;\n }\n\n const multi = this.client.multi();\n\n for (const key of messageKeys) {\n multi.del(key);\n }\n\n for (const messageId of foundMessageIds) {\n multi.del(getMessageIndexKey(messageId));\n }\n\n if (threadIds.size > 0) {\n for (const threadId of threadIds) {\n for (const [msgId, msgThreadId] of messageIdToThreadId) {\n if (msgThreadId === threadId) {\n multi.zRem(getThreadMessagesKey(threadId), msgId);\n }\n }\n\n const threadKey = getKey(TABLE_THREADS, { id: threadId });\n const threadData = await this.client.get(threadKey);\n if (!threadData) {\n continue;\n }\n\n const thread = JSON.parse(threadData) as StorageThreadType;\n const updatedThread = { ...thread, updatedAt: new Date() };\n multi.set(threadKey, JSON.stringify(processRecord(TABLE_THREADS, updatedThread).processedRecord));\n }\n }\n\n await multi.exec();\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n });\n }\n\n public async cloneThread(args: StorageCloneThreadInput): Promise<StorageCloneThreadOutput> {\n const { sourceThreadId, newThreadId: providedThreadId, resourceId, title, metadata, options } = args;\n\n const sourceThread = await this.getThreadById({ threadId: sourceThreadId });\n if (!sourceThread) {\n throw new MastraError({\n id: createStorageErrorId('REDIS', 'CLONE_THREAD', 'SOURCE_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Source thread with id ${sourceThreadId} not found`,\n details: { sourceThreadId },\n });\n }\n\n const newThreadId = providedThreadId || crypto.randomUUID();\n\n const existingThread = await this.getThreadById({ threadId: newThreadId });\n if (existingThread) {\n throw new MastraError({\n id: createStorageErrorId('REDIS', 'CLONE_THREAD', 'THREAD_EXISTS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread with id ${newThreadId} already exists`,\n details: { newThreadId },\n });\n }\n\n try {\n const threadMessagesKey = getThreadMessagesKey(sourceThreadId);\n const msgIds = await this.client.zRange(threadMessagesKey, 0, -1);\n\n const messageKeys = msgIds.map(mid => getMessageKey(sourceThreadId, mid));\n let sourceMessages: (MastraDBMessage & { _index?: number })[] = [];\n\n if (messageKeys.length > 0) {\n const results = await this.client.mGet(messageKeys);\n sourceMessages = results\n .filter((data): data is string => data !== null)\n .map(data => {\n const msg = JSON.parse(data) as MastraDBMessage & { _index?: number };\n return { ...msg, createdAt: new Date(msg.createdAt) };\n });\n }\n\n if (options?.messageFilter?.startDate || options?.messageFilter?.endDate) {\n sourceMessages = filterByDateRange(sourceMessages, (msg: MastraDBMessage) => new Date(msg.createdAt), {\n start: options.messageFilter?.startDate,\n end: options.messageFilter?.endDate,\n });\n }\n\n if (options?.messageFilter?.messageIds && options.messageFilter.messageIds.length > 0) {\n const messageIdSet = new Set(options.messageFilter.messageIds);\n sourceMessages = sourceMessages.filter(msg => messageIdSet.has(msg.id));\n }\n\n sourceMessages.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n\n if (options?.messageLimit && options.messageLimit > 0 && sourceMessages.length > options.messageLimit) {\n sourceMessages = sourceMessages.slice(-options.messageLimit);\n }\n\n const now = new Date();\n const lastMessageId = sourceMessages.length > 0 ? sourceMessages[sourceMessages.length - 1]!.id : undefined;\n\n const cloneMetadata: ThreadCloneMetadata = {\n sourceThreadId,\n clonedAt: now,\n ...(lastMessageId && { lastMessageId }),\n };\n\n const newThread: StorageThreadType = {\n id: newThreadId,\n resourceId: resourceId || sourceThread.resourceId,\n title: title || (sourceThread.title ? `Clone of ${sourceThread.title}` : undefined),\n metadata: { ...metadata, clone: cloneMetadata },\n createdAt: now,\n updatedAt: now,\n };\n\n const multi = this.client.multi();\n const threadKey = getKey(TABLE_THREADS, { id: newThreadId });\n multi.set(threadKey, JSON.stringify(processRecord(TABLE_THREADS, newThread).processedRecord));\n\n const clonedMessages: MastraDBMessage[] = [];\n const targetResourceId = resourceId || sourceThread.resourceId;\n const newThreadMessagesKey = getThreadMessagesKey(newThreadId);\n\n for (let i = 0; i < sourceMessages.length; i++) {\n const sourceMsg = sourceMessages[i]!;\n const newMessageId = crypto.randomUUID();\n const { _index, ...restMsg } = sourceMsg;\n\n const newMessage: MastraDBMessage = {\n ...restMsg,\n id: newMessageId,\n threadId: newThreadId,\n resourceId: targetResourceId,\n };\n\n const messageKey = getMessageKey(newThreadId, newMessageId);\n multi.set(messageKey, JSON.stringify(newMessage));\n multi.set(getMessageIndexKey(newMessageId), newThreadId);\n const score = getMessageScore({ createdAt: newMessage.createdAt, _index: i });\n multi.zAdd(newThreadMessagesKey, { score, value: newMessageId });\n\n clonedMessages.push(newMessage);\n }\n\n await multi.exec();\n\n return {\n thread: newThread,\n clonedMessages,\n };\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'CLONE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { sourceThreadId, newThreadId },\n },\n error,\n );\n }\n }\n}\n\nfunction getThreadMessagesKey(threadId: string): string {\n return `thread:${threadId}:messages`;\n}\n\nfunction getMessageKey(threadId: string, messageId: string): string {\n return getKey(TABLE_MESSAGES, { threadId, id: messageId });\n}\n\nfunction getMessageIndexKey(messageId: string): string {\n return `msg-idx:${messageId}`;\n}\n\nfunction getMessageScore(message: { createdAt: Date | string; _index?: number }): number {\n const createdAtScore = new Date(message.createdAt).getTime();\n const index = typeof message._index === 'number' ? message._index : 0;\n return createdAtScore * 1000 + index;\n}\n","import crypto from 'node:crypto';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { SaveScorePayload, ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport {\n calculatePagination,\n normalizePerPage,\n ScoresStorage,\n TABLE_SCORERS,\n transformScoreRow,\n createStorageErrorId,\n} from '@mastra/core/storage';\nimport type { PaginationInfo, StoragePagination } from '@mastra/core/storage';\n\nimport { RedisDB } from '../../db';\nimport type { RedisDomainConfig } from '../../db';\nimport type { RedisClient } from '../../types';\nimport { processRecord } from '../utils';\n\nexport class ScoresRedis extends ScoresStorage {\n private client: RedisClient;\n private db: RedisDB;\n\n constructor(config: RedisDomainConfig) {\n super();\n this.client = config.client;\n this.db = new RedisDB({ client: config.client });\n }\n\n public async dangerouslyClearAll(): Promise<void> {\n await this.db.deleteData({ tableName: TABLE_SCORERS });\n }\n\n public async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const data = await this.db.get<ScoreRowData>({\n tableName: TABLE_SCORERS,\n keys: { id },\n });\n\n if (!data) {\n return null;\n }\n\n return transformScoreRow(data as Record<string, unknown>);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public 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 return this.fetchAndFilterScores(pagination, row => {\n if (row.scorerId !== scorerId) {\n return false;\n }\n if (entityId && row.entityId !== entityId) {\n return false;\n }\n if (entityType && row.entityType !== entityType) {\n return false;\n }\n if (source && row.source !== source) {\n return false;\n }\n return true;\n });\n }\n\n public async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let validatedScore: SaveScorePayload;\n try {\n validatedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: typeof score.scorer?.id === 'string' ? score.scorer.id : String(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\n const scoreWithId = {\n ...validatedScore,\n id,\n createdAt: now,\n updatedAt: now,\n };\n\n const { key, processedRecord } = processRecord(TABLE_SCORERS, scoreWithId);\n try {\n await this.client.set(key, JSON.stringify(processedRecord));\n return { score: { ...validatedScore, id, createdAt: now, updatedAt: now } as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n public 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 return this.fetchAndFilterScores(pagination, row => row.runId === runId);\n }\n\n public 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 return this.fetchAndFilterScores(pagination, row => {\n if (row.entityId !== entityId) {\n return false;\n }\n if (entityType && row.entityType !== entityType) {\n return false;\n }\n return true;\n });\n }\n\n public 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 return this.fetchAndFilterScores(pagination, row => row.traceId === traceId && row.spanId === spanId);\n }\n\n private async fetchAndFilterScores(\n pagination: StoragePagination,\n filterFn: (row: Record<string, unknown>) => boolean,\n ): Promise<{ scores: ScoreRowData[]; pagination: PaginationInfo }> {\n const { page, perPage: perPageInput } = pagination;\n const keys = await this.db.scanKeys(`${TABLE_SCORERS}:*`);\n\n if (keys.length === 0) {\n return {\n scores: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\n };\n }\n\n const results = await this.client.mGet(keys);\n\n const filtered = results\n .map((data): Record<string, unknown> | null => {\n if (!data) {\n return null;\n }\n try {\n return JSON.parse(data) as Record<string, unknown>;\n } catch {\n return null;\n }\n })\n .filter((row): row is Record<string, unknown> => !!row && typeof row === 'object' && filterFn(row));\n\n const total = filtered.length;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? total : start + perPage;\n const scores = filtered.slice(start, end).map(row => transformScoreRow(row));\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n normalizePerPage,\n TABLE_WORKFLOW_SNAPSHOT,\n WorkflowsStorage,\n ensureDate,\n} from '@mastra/core/storage';\nimport type {\n StorageListWorkflowRunsInput,\n WorkflowRun,\n WorkflowRuns,\n UpdateWorkflowStateOptions,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\n\nimport { RedisDB } from '../../db';\nimport type { RedisDomainConfig } from '../../db';\nimport type { RedisClient } from '../../types';\nimport { getKey } from '../utils';\n\nfunction parseWorkflowRun(row: Record<string, unknown>): 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 console.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n }\n }\n\n return {\n workflowName: row.workflow_name as string,\n runId: row.run_id as string,\n snapshot: parsedSnapshot,\n createdAt: ensureDate(row.createdAt as string | Date)!,\n updatedAt: ensureDate(row.updatedAt as string | Date)!,\n resourceId: row.resourceId as string | undefined,\n };\n}\n\nexport class WorkflowsRedis extends WorkflowsStorage {\n private client: RedisClient;\n private db: RedisDB;\n\n constructor(config: RedisDomainConfig) {\n super();\n this.client = config.client;\n this.db = new RedisDB({ client: config.client });\n }\n\n public supportsConcurrentUpdates(): boolean {\n return false;\n }\n\n public async dangerouslyClearAll(): Promise<void> {\n await this.db.deleteData({ tableName: TABLE_WORKFLOW_SNAPSHOT });\n }\n\n public 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<unknown, unknown, unknown, unknown>;\n requestContext: Record<string, unknown>;\n }): Promise<Record<string, StepResult<unknown, unknown, unknown, unknown>>> {\n try {\n const existingRecord = await this.db.get<{\n namespace: string;\n workflow_name: string;\n run_id: string;\n snapshot: WorkflowRunState;\n createdAt: string | Date;\n updatedAt: string | Date;\n }>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: {\n namespace: 'workflows',\n workflow_name: workflowName,\n run_id: runId,\n },\n });\n\n const existingSnapshot = existingRecord?.snapshot;\n let snapshot = existingSnapshot;\n\n if (!snapshot) {\n snapshot = {\n context: {},\n activePaths: [],\n timestamp: Date.now(),\n suspendedPaths: {},\n activeStepsPath: {},\n resumeLabels: {},\n serializedStepGraph: [],\n status: 'pending',\n value: {},\n waitingPaths: {},\n runId,\n requestContext: {},\n } as WorkflowRunState;\n }\n\n snapshot.context[stepId] = result;\n snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };\n\n await this.persistWorkflowSnapshot({\n namespace: 'workflows',\n workflowName,\n runId,\n snapshot,\n createdAt: existingRecord?.createdAt ? ensureDate(existingRecord.createdAt) : undefined,\n });\n\n return snapshot.context;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'UPDATE_WORKFLOW_RESULTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId, stepId },\n },\n error,\n );\n }\n }\n\n public async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined> {\n try {\n const existingRecord = await this.db.get<{\n namespace: string;\n workflow_name: string;\n run_id: string;\n snapshot: WorkflowRunState;\n createdAt: string | Date;\n updatedAt: string | Date;\n }>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: {\n namespace: 'workflows',\n workflow_name: workflowName,\n run_id: runId,\n },\n });\n\n const existingSnapshot = existingRecord?.snapshot;\n\n if (!existingSnapshot || !existingSnapshot.context) {\n return undefined;\n }\n\n const updatedSnapshot = { ...existingSnapshot, ...opts };\n\n await this.persistWorkflowSnapshot({\n namespace: 'workflows',\n workflowName,\n runId,\n snapshot: updatedSnapshot,\n createdAt: existingRecord?.createdAt ? ensureDate(existingRecord.createdAt) : undefined,\n });\n\n return updatedSnapshot;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', 'UPDATE_WORKFLOW_STATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n public async persistWorkflowSnapshot(params: {\n namespace?: string;\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void> {\n const { namespace = 'workflows', workflowName, runId, resourceId, snapshot, createdAt, updatedAt } = params;\n try {\n let finalCreatedAt = createdAt;\n if (!finalCreatedAt) {\n const existing = await this.db.get<{\n namespace: string;\n workflow_name: string;\n run_id: string;\n snapshot: WorkflowRunState;\n createdAt: string | Date;\n updatedAt: string | Date;\n }>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: {\n namespace,\n workflow_name: workflowName,\n run_id: runId,\n },\n });\n finalCreatedAt = existing?.createdAt ? ensureDate(existing.createdAt) : new Date();\n }\n\n await this.db.insert({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n record: {\n namespace,\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot,\n createdAt: finalCreatedAt,\n updatedAt: updatedAt ?? new Date(),\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public 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(key);\n if (!data) {\n return null;\n }\n const parsed = JSON.parse(data) as {\n namespace: string;\n workflow_name: string;\n run_id: string;\n snapshot: WorkflowRunState;\n };\n return parsed.snapshot;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public 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.db.scanKeys(key);\n\n if (keys.length === 0) {\n return null;\n }\n\n const results = await this.client.mGet(keys);\n const workflows = results\n .filter((data): data is string => data !== null)\n .map(\n data =>\n JSON.parse(data) as {\n workflow_name: string;\n run_id: string;\n snapshot: WorkflowRunState | string;\n createdAt: string | Date;\n updatedAt: string | Date;\n resourceId: string;\n },\n );\n\n const data = workflows.find(workflow => {\n if (!workflow) {\n return false;\n }\n\n const runIdMatch = workflow.run_id === runId;\n\n if (workflowName) {\n return runIdMatch && workflow.workflow_name === workflowName;\n }\n\n return runIdMatch;\n });\n\n if (!data) {\n return null;\n }\n\n return parseWorkflowRun(data as Record<string, unknown>);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 public 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('REDIS', '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 public 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('REDIS', '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 const normalizedFrom = fromDate ? ensureDate(fromDate) : undefined;\n const normalizedTo = toDate ? ensureDate(toDate) : undefined;\n\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.db.scanKeys(pattern);\n\n if (keys.length === 0) {\n return { runs: [], total: 0 };\n }\n\n const results = await this.client.mGet(keys);\n\n let runs = results\n .filter((data): data is string => data !== null)\n .map(data => JSON.parse(data) as Record<string, unknown>)\n .filter(\n (record): record is Record<string, unknown> =>\n record !== null && record !== undefined && typeof record === 'object' && 'workflow_name' in record,\n )\n .filter(record => !workflowName || record.workflow_name === workflowName)\n .map(w => parseWorkflowRun(w))\n .filter(w => {\n if (normalizedFrom && w.createdAt < normalizedFrom) {\n return false;\n }\n if (normalizedTo && w.createdAt > normalizedTo) {\n return false;\n }\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 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) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('REDIS', '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 { RedisClient, RedisConfig } from './types';\n\nexport function isClientConfig(config: RedisConfig): config is RedisConfig & { client: RedisClient } {\n return 'client' in config;\n}\n\nexport function isConnectionStringConfig(config: RedisConfig): config is RedisConfig & { connectionString: string } {\n return 'connectionString' in config;\n}\n","import { MastraStorage } from '@mastra/core/storage';\nimport type { StorageDomains } from '@mastra/core/storage';\nimport { createClient } from 'redis';\n\nimport { StoreMemoryRedis } from './domains/memory';\nimport { ScoresRedis } from './domains/scores';\nimport { WorkflowsRedis } from './domains/workflows';\nimport type { RedisClient, RedisConfig } from './types';\nimport { isClientConfig, isConnectionStringConfig } from './utils';\n\n/**\n * Redis storage adapter for Mastra.\n *\n * Provides storage functionality for direct Redis connections using the official redis package.\n *\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * // Using connection string\n * const storage = new RedisStore({\n * id: 'my-store',\n * connectionString: 'redis://localhost:6379',\n * });\n *\n * // Using host/port\n * const storage = new RedisStore({\n * id: 'my-store',\n * host: 'localhost',\n * port: 6379,\n * password: 'secret',\n * });\n *\n * // Access memory domain\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Access workflows domain\n * const workflows = await storage.getStore('workflows');\n * await workflows?.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n * ```\n *\n * @example\n * ```typescript\n * // Using a pre-configured client for advanced features\n * import { createClient } from 'redis';\n *\n * const client = createClient({\n * url: 'redis://localhost:6379',\n * socket: {\n * reconnectStrategy: (retries) => Math.min(retries * 50, 2000),\n * },\n * });\n * await client.connect();\n *\n * const storage = new RedisStore({\n * id: 'my-store',\n * client,\n * });\n * ```\n */\nexport class RedisStore extends MastraStorage {\n private client: RedisClient;\n private shouldManageConnection: boolean;\n public stores: StorageDomains;\n\n constructor(config: RedisConfig) {\n super({ id: config.id, name: 'Redis', disableInit: config.disableInit });\n\n const { client, shouldManageConnection } = this.createClient(config);\n this.client = client;\n this.shouldManageConnection = shouldManageConnection;\n\n this.stores = {\n scores: new ScoresRedis({ client: this.client }),\n workflows: new WorkflowsRedis({ client: this.client }),\n memory: new StoreMemoryRedis({ client: this.client }),\n };\n }\n\n public override async init(): Promise<void> {\n if (this.shouldManageConnection && !this.client.isOpen) {\n await this.client.connect();\n }\n await super.init();\n }\n\n public getClient(): RedisClient {\n return this.client;\n }\n\n public async close(): Promise<void> {\n if (this.shouldManageConnection && this.client.isOpen) {\n await this.client.quit();\n }\n }\n\n private createClient(config: RedisConfig): { client: RedisClient; shouldManageConnection: boolean } {\n if (isClientConfig(config)) {\n return { client: config.client, shouldManageConnection: false };\n }\n\n if (isConnectionStringConfig(config)) {\n if (!config.connectionString?.trim()) {\n throw new Error('RedisStore: connectionString is required and cannot be empty.');\n }\n return {\n client: createClient({ url: config.connectionString }) as RedisClient,\n shouldManageConnection: true,\n };\n }\n\n if (!config.host?.trim()) {\n throw new Error('RedisStore: host is required and cannot be empty.');\n }\n\n const url = this.createClientUrl({\n ...config,\n db: config.db ?? 0,\n port: config.port ?? 6379,\n });\n\n return {\n client: createClient({ url }) as RedisClient,\n shouldManageConnection: true,\n };\n }\n\n private createClientUrl(config: { host: string; password?: string; port: number; db: number }): string {\n const encodedPassword = config.password ? encodeURIComponent(config.password) : null;\n\n if (config.password) {\n return `redis://:${encodedPassword}@${config.host}:${config.port || 6379}/${config.db || 0}`;\n }\n\n return `redis://${config.host}:${config.port || 6379}/${config.db || 0}`;\n }\n}\n","import { MastraServerCache } from '@mastra/core/cache';\n\nexport interface RedisClient {\n get(key: string): Promise<unknown>;\n set(key: string, value: unknown, ...args: unknown[]): Promise<unknown>;\n llen(key: string): Promise<number>;\n rpush(key: string, ...values: unknown[]): Promise<number>;\n lrange(key: string, start: number, stop: number): Promise<unknown[]>;\n del(...keys: string[]): Promise<number>;\n expire(key: string, seconds: number): Promise<number | boolean>;\n scan(cursor: string | number, ...args: unknown[]): Promise<[string | number, string[]]>;\n incr(key: string): Promise<number>;\n}\n\nexport interface RedisServerCacheOptions {\n keyPrefix?: string;\n ttlSeconds?: number;\n setWithExpiry?: (client: RedisClient, key: string, value: unknown, seconds: number) => Promise<unknown>;\n scanKeys?: (\n client: RedisClient,\n cursor: string | number,\n pattern: string,\n count: number,\n ) => Promise<[string | number, string[]]>;\n}\n\nconst defaultSetWithExpiry = (client: RedisClient, key: string, value: unknown, seconds: number): Promise<unknown> => {\n return client.set(key, value, 'EX', seconds);\n};\n\nconst defaultScanKeys = (\n client: RedisClient,\n cursor: string | number,\n pattern: string,\n count: number,\n): Promise<[string | number, string[]]> => {\n return client.scan(cursor, 'MATCH', pattern, 'COUNT', count);\n};\n\nexport class RedisServerCache extends MastraServerCache {\n private client: RedisClient;\n private keyPrefix: string;\n private ttlSeconds: number;\n private setWithExpiry: (client: RedisClient, key: string, value: unknown, seconds: number) => Promise<unknown>;\n private scanKeys: (\n client: RedisClient,\n cursor: string | number,\n pattern: string,\n count: number,\n ) => Promise<[string | number, string[]]>;\n\n constructor(config: { client: RedisClient }, options: RedisServerCacheOptions = {}) {\n super({ name: 'RedisServerCache' });\n\n this.client = config.client;\n this.keyPrefix = options.keyPrefix ?? 'mastra:cache:';\n this.ttlSeconds = options.ttlSeconds ?? 300;\n this.setWithExpiry = options.setWithExpiry ?? defaultSetWithExpiry;\n this.scanKeys = options.scanKeys ?? defaultScanKeys;\n }\n\n private getKey(key: string): string {\n return `${this.keyPrefix}${key}`;\n }\n\n private serialize(value: unknown): string {\n return JSON.stringify(value);\n }\n\n private deserialize(value: unknown): unknown {\n if (typeof value === 'string') {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n return value;\n }\n\n async get(key: string): Promise<unknown> {\n const fullKey = this.getKey(key);\n const value = await this.client.get(fullKey);\n if (value === null) {\n return null;\n }\n return this.deserialize(value);\n }\n\n async set(key: string, value: unknown): Promise<void> {\n const fullKey = this.getKey(key);\n const serialized = this.serialize(value);\n if (this.ttlSeconds > 0) {\n await this.setWithExpiry(this.client, fullKey, serialized, this.ttlSeconds);\n } else {\n await this.client.set(fullKey, serialized);\n }\n }\n\n async listLength(key: string): Promise<number> {\n const fullKey = this.getKey(key);\n return this.client.llen(fullKey);\n }\n\n async listPush(key: string, value: unknown): Promise<void> {\n const fullKey = this.getKey(key);\n const serialized = this.serialize(value);\n await this.client.rpush(fullKey, serialized);\n\n if (this.ttlSeconds > 0) {\n await this.client.expire(fullKey, this.ttlSeconds);\n }\n }\n\n async listFromTo(key: string, from: number, to: number = -1): Promise<unknown[]> {\n const fullKey = this.getKey(key);\n const values = await this.client.lrange(fullKey, from, to);\n return values.map(v => this.deserialize(v));\n }\n\n async delete(key: string): Promise<void> {\n const fullKey = this.getKey(key);\n await this.client.del(fullKey);\n }\n\n async clear(): Promise<void> {\n const pattern = `${this.keyPrefix}*`;\n let cursor: string | number = '0';\n\n do {\n const [nextCursor, keys] = await this.scanKeys(this.client, cursor, pattern, 100);\n\n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n\n cursor = nextCursor;\n } while (cursor !== '0' && cursor !== 0);\n }\n\n async increment(key: string): Promise<number> {\n const fullKey = this.getKey(key);\n return this.client.incr(fullKey);\n }\n}\n\nexport const upstashPreset: Pick<RedisServerCacheOptions, 'setWithExpiry' | 'scanKeys'> = {\n setWithExpiry: (client, key, value, seconds) => client.set(key, value, { ex: seconds } as any),\n scanKeys: (client, cursor, pattern, count) =>\n client.scan(cursor, { match: pattern, count } as any) as Promise<[string | number, string[]]>,\n};\n\nexport const nodeRedisPreset: Pick<RedisServerCacheOptions, 'setWithExpiry' | 'scanKeys'> = {\n setWithExpiry: (client, key, value, seconds) => client.set(key, value, { EX: seconds } as any),\n scanKeys: (client, cursor, pattern, count) =>\n client.scan(cursor, { MATCH: pattern, COUNT: count } as any) as Promise<[string | number, string[]]>,\n};\n"]}