@mastra/redis 1.0.1-alpha.0 → 1.0.2-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.
- package/CHANGELOG.md +19 -0
- package/dist/docs/SKILL.md +22 -0
- package/dist/docs/assets/SOURCE_MAP.json +6 -0
- package/dist/docs/references/reference-storage-redis.md +266 -0
- package/dist/index.cjs +1804 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1795 -0
- package/dist/index.js.map +1 -0
- package/dist/storage/db/index.d.ts +26 -0
- package/dist/storage/db/index.d.ts.map +1 -0
- package/dist/storage/domains/memory/index.d.ts +65 -0
- package/dist/storage/domains/memory/index.d.ts.map +1 -0
- package/dist/storage/domains/scores/index.d.ts +51 -0
- package/dist/storage/domains/scores/index.d.ts.map +1 -0
- package/dist/storage/domains/utils.d.ts +25 -0
- package/dist/storage/domains/utils.d.ts.map +1 -0
- package/dist/storage/domains/workflows/index.d.ts +47 -0
- package/dist/storage/domains/workflows/index.d.ts.map +1 -0
- package/dist/storage/index.d.ts +8 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/store.d.ts +66 -0
- package/dist/storage/store.d.ts.map +1 -0
- package/dist/storage/types.d.ts +88 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/utils.d.ts +8 -0
- package/dist/storage/utils.d.ts.map +1 -0
- package/package.json +8 -9
|
@@ -0,0 +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","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","list","key","crypto","normalizePerPage","calculatePagination","ensureDate","TABLE_WORKFLOW_SNAPSHOT","data"],"mappings":"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","file":"index.js","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"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { TABLE_NAMES } from '@mastra/core/storage';
|
|
2
|
+
import type { RedisClient } from '../types.js';
|
|
3
|
+
export declare class RedisDB {
|
|
4
|
+
private client;
|
|
5
|
+
constructor({ client }: {
|
|
6
|
+
client: RedisClient;
|
|
7
|
+
});
|
|
8
|
+
getClient(): RedisClient;
|
|
9
|
+
insert({ tableName, record }: {
|
|
10
|
+
tableName: TABLE_NAMES;
|
|
11
|
+
record: Record<string, unknown>;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
get<R>({ tableName, keys }: {
|
|
14
|
+
tableName: TABLE_NAMES;
|
|
15
|
+
keys: Record<string, string>;
|
|
16
|
+
}): Promise<R | null>;
|
|
17
|
+
scanAndDelete(pattern: string, batchSize?: number): Promise<number>;
|
|
18
|
+
scanKeys(pattern: string, batchSize?: number): Promise<string[]>;
|
|
19
|
+
deleteData({ tableName }: {
|
|
20
|
+
tableName: TABLE_NAMES;
|
|
21
|
+
}): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export interface RedisDomainConfig {
|
|
24
|
+
client: RedisClient;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/db/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAc;gBAEhB,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE;IAI/C,SAAS,IAAI,WAAW;IAIlB,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE;QAAE,SAAS,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBzG,GAAG,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;QAAE,SAAS,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAuBxG,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBlE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAc/D,UAAU,CAAC,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAkB3E;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,WAAW,CAAC;CACrB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { MastraMessageContentV2 } from '@mastra/core/agent';
|
|
2
|
+
import type { MastraDBMessage, StorageThreadType } from '@mastra/core/memory';
|
|
3
|
+
import { MemoryStorage } from '@mastra/core/storage';
|
|
4
|
+
import type { StorageResourceType, StorageListMessagesInput, StorageListMessagesOutput, StorageListThreadsInput, StorageListThreadsOutput, StorageCloneThreadInput, StorageCloneThreadOutput } from '@mastra/core/storage';
|
|
5
|
+
import type { RedisDomainConfig } from '../../db/index.js';
|
|
6
|
+
export declare class StoreMemoryRedis extends MemoryStorage {
|
|
7
|
+
private client;
|
|
8
|
+
private db;
|
|
9
|
+
constructor(config: RedisDomainConfig);
|
|
10
|
+
dangerouslyClearAll(): Promise<void>;
|
|
11
|
+
getThreadById({ threadId }: {
|
|
12
|
+
threadId: string;
|
|
13
|
+
}): Promise<StorageThreadType | null>;
|
|
14
|
+
listThreadsByResourceId(args: StorageListThreadsInput): Promise<StorageListThreadsOutput>;
|
|
15
|
+
listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput>;
|
|
16
|
+
saveThread({ thread }: {
|
|
17
|
+
thread: StorageThreadType;
|
|
18
|
+
}): Promise<StorageThreadType>;
|
|
19
|
+
updateThread({ id, title, metadata, }: {
|
|
20
|
+
id: string;
|
|
21
|
+
title: string;
|
|
22
|
+
metadata: Record<string, unknown>;
|
|
23
|
+
}): Promise<StorageThreadType>;
|
|
24
|
+
deleteThread({ threadId }: {
|
|
25
|
+
threadId: string;
|
|
26
|
+
}): Promise<void>;
|
|
27
|
+
saveMessages(args: {
|
|
28
|
+
messages: MastraDBMessage[];
|
|
29
|
+
}): Promise<{
|
|
30
|
+
messages: MastraDBMessage[];
|
|
31
|
+
}>;
|
|
32
|
+
private getThreadIdForMessage;
|
|
33
|
+
private getIncludedMessages;
|
|
34
|
+
private parseStoredMessage;
|
|
35
|
+
listMessagesById({ messageIds }: {
|
|
36
|
+
messageIds: string[];
|
|
37
|
+
}): Promise<{
|
|
38
|
+
messages: MastraDBMessage[];
|
|
39
|
+
}>;
|
|
40
|
+
listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput>;
|
|
41
|
+
getResourceById({ resourceId }: {
|
|
42
|
+
resourceId: string;
|
|
43
|
+
}): Promise<StorageResourceType | null>;
|
|
44
|
+
saveResource({ resource }: {
|
|
45
|
+
resource: StorageResourceType;
|
|
46
|
+
}): Promise<StorageResourceType>;
|
|
47
|
+
updateResource({ resourceId, workingMemory, metadata, }: {
|
|
48
|
+
resourceId: string;
|
|
49
|
+
workingMemory?: string;
|
|
50
|
+
metadata?: Record<string, unknown>;
|
|
51
|
+
}): Promise<StorageResourceType>;
|
|
52
|
+
updateMessages(args: {
|
|
53
|
+
messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {
|
|
54
|
+
id: string;
|
|
55
|
+
content?: {
|
|
56
|
+
metadata?: MastraMessageContentV2['metadata'];
|
|
57
|
+
content?: MastraMessageContentV2['content'];
|
|
58
|
+
};
|
|
59
|
+
})[];
|
|
60
|
+
}): Promise<MastraDBMessage[]>;
|
|
61
|
+
deleteMessages(messageIds: string[]): Promise<void>;
|
|
62
|
+
private sortThreads;
|
|
63
|
+
cloneThread(args: StorageCloneThreadInput): Promise<StorageCloneThreadOutput>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/memory/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { SaveScorePayload, ScoreRowData, ScoringSource } from '@mastra/core/evals';
|
|
2
|
+
import { ScoresStorage } from '@mastra/core/storage';
|
|
3
|
+
import type { PaginationInfo, StoragePagination } from '@mastra/core/storage';
|
|
4
|
+
import type { RedisDomainConfig } from '../../db/index.js';
|
|
5
|
+
export declare class ScoresRedis extends ScoresStorage {
|
|
6
|
+
private client;
|
|
7
|
+
private db;
|
|
8
|
+
constructor(config: RedisDomainConfig);
|
|
9
|
+
dangerouslyClearAll(): Promise<void>;
|
|
10
|
+
getScoreById({ id }: {
|
|
11
|
+
id: string;
|
|
12
|
+
}): Promise<ScoreRowData | null>;
|
|
13
|
+
listScoresByScorerId({ scorerId, entityId, entityType, source, pagination, }: {
|
|
14
|
+
scorerId: string;
|
|
15
|
+
entityId?: string;
|
|
16
|
+
entityType?: string;
|
|
17
|
+
source?: ScoringSource;
|
|
18
|
+
pagination?: StoragePagination;
|
|
19
|
+
}): Promise<{
|
|
20
|
+
scores: ScoreRowData[];
|
|
21
|
+
pagination: PaginationInfo;
|
|
22
|
+
}>;
|
|
23
|
+
saveScore(score: SaveScorePayload): Promise<{
|
|
24
|
+
score: ScoreRowData;
|
|
25
|
+
}>;
|
|
26
|
+
listScoresByRunId({ runId, pagination, }: {
|
|
27
|
+
runId: string;
|
|
28
|
+
pagination?: StoragePagination;
|
|
29
|
+
}): Promise<{
|
|
30
|
+
scores: ScoreRowData[];
|
|
31
|
+
pagination: PaginationInfo;
|
|
32
|
+
}>;
|
|
33
|
+
listScoresByEntityId({ entityId, entityType, pagination, }: {
|
|
34
|
+
entityId: string;
|
|
35
|
+
entityType?: string;
|
|
36
|
+
pagination?: StoragePagination;
|
|
37
|
+
}): Promise<{
|
|
38
|
+
scores: ScoreRowData[];
|
|
39
|
+
pagination: PaginationInfo;
|
|
40
|
+
}>;
|
|
41
|
+
listScoresBySpan({ traceId, spanId, pagination, }: {
|
|
42
|
+
traceId: string;
|
|
43
|
+
spanId: string;
|
|
44
|
+
pagination?: StoragePagination;
|
|
45
|
+
}): Promise<{
|
|
46
|
+
scores: ScoreRowData[];
|
|
47
|
+
pagination: PaginationInfo;
|
|
48
|
+
}>;
|
|
49
|
+
private fetchAndFilterScores;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/scores/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExF,OAAO,EAGL,aAAa,EAId,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAIlD,qBAAa,WAAY,SAAQ,aAAa;IAC5C,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,EAAE,CAAU;gBAER,MAAM,EAAE,iBAAiB;IAMxB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IA2BlE,oBAAoB,CAAC,EAChC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,MAAM,EACN,UAAqC,GACtC,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,aAAa,CAAC;QACvB,UAAU,CAAC,EAAE,iBAAiB,CAAC;KAChC,GAAG,OAAO,CAAC;QACV,MAAM,EAAE,YAAY,EAAE,CAAC;QACvB,UAAU,EAAE,cAAc,CAAC;KAC5B,CAAC;IAkBW,SAAS,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,YAAY,CAAA;KAAE,CAAC;IAiDpE,iBAAiB,CAAC,EAC7B,KAAK,EACL,UAAqC,GACtC,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,iBAAiB,CAAC;KAChC,GAAG,OAAO,CAAC;QACV,MAAM,EAAE,YAAY,EAAE,CAAC;QACvB,UAAU,EAAE,cAAc,CAAC;KAC5B,CAAC;IAIW,oBAAoB,CAAC,EAChC,QAAQ,EACR,UAAU,EACV,UAAqC,GACtC,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,iBAAiB,CAAC;KAChC,GAAG,OAAO,CAAC;QACV,MAAM,EAAE,YAAY,EAAE,CAAC;QACvB,UAAU,EAAE,cAAc,CAAC;KAC5B,CAAC;IAYW,gBAAgB,CAAC,EAC5B,OAAO,EACP,MAAM,EACN,UAAqC,GACtC,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,iBAAiB,CAAC;KAChC,GAAG,OAAO,CAAC;QACV,MAAM,EAAE,YAAY,EAAE,CAAC;QACvB,UAAU,EAAE,cAAc,CAAC;KAC5B,CAAC;YAIY,oBAAoB;CA6CnC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { TABLE_NAMES } from '@mastra/core/storage';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a Redis key from table name and key parts.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* getKey('mastra_threads', { id: 'thread-123' });
|
|
8
|
+
* // Returns: 'mastra_threads:id:thread-123'
|
|
9
|
+
*
|
|
10
|
+
* getKey('mastra_messages', { threadId: 'thread-123', id: 'msg-456' });
|
|
11
|
+
* // Returns: 'mastra_messages:threadId:thread-123:id:msg-456'
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare function getKey(tableName: TABLE_NAMES, keys: Record<string, unknown>): string;
|
|
15
|
+
/**
|
|
16
|
+
* Process a record for storage, generating the appropriate key and serializing dates.
|
|
17
|
+
*/
|
|
18
|
+
export declare function processRecord(tableName: TABLE_NAMES, record: Record<string, unknown>): {
|
|
19
|
+
key: string;
|
|
20
|
+
processedRecord: {
|
|
21
|
+
createdAt: string | undefined;
|
|
22
|
+
updatedAt: string | undefined;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/storage/domains/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,wBAAgB,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAYpF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;EAuBpF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { WorkflowsStorage } from '@mastra/core/storage';
|
|
2
|
+
import type { StorageListWorkflowRunsInput, WorkflowRun, WorkflowRuns, UpdateWorkflowStateOptions } from '@mastra/core/storage';
|
|
3
|
+
import type { StepResult, WorkflowRunState } from '@mastra/core/workflows';
|
|
4
|
+
import type { RedisDomainConfig } from '../../db/index.js';
|
|
5
|
+
export declare class WorkflowsRedis extends WorkflowsStorage {
|
|
6
|
+
private client;
|
|
7
|
+
private db;
|
|
8
|
+
constructor(config: RedisDomainConfig);
|
|
9
|
+
supportsConcurrentUpdates(): boolean;
|
|
10
|
+
dangerouslyClearAll(): Promise<void>;
|
|
11
|
+
updateWorkflowResults({ workflowName, runId, stepId, result, requestContext, }: {
|
|
12
|
+
workflowName: string;
|
|
13
|
+
runId: string;
|
|
14
|
+
stepId: string;
|
|
15
|
+
result: StepResult<unknown, unknown, unknown, unknown>;
|
|
16
|
+
requestContext: Record<string, unknown>;
|
|
17
|
+
}): Promise<Record<string, StepResult<unknown, unknown, unknown, unknown>>>;
|
|
18
|
+
updateWorkflowState({ workflowName, runId, opts, }: {
|
|
19
|
+
workflowName: string;
|
|
20
|
+
runId: string;
|
|
21
|
+
opts: UpdateWorkflowStateOptions;
|
|
22
|
+
}): Promise<WorkflowRunState | undefined>;
|
|
23
|
+
persistWorkflowSnapshot(params: {
|
|
24
|
+
namespace?: string;
|
|
25
|
+
workflowName: string;
|
|
26
|
+
runId: string;
|
|
27
|
+
resourceId?: string;
|
|
28
|
+
snapshot: WorkflowRunState;
|
|
29
|
+
createdAt?: Date;
|
|
30
|
+
updatedAt?: Date;
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
loadWorkflowSnapshot(params: {
|
|
33
|
+
namespace: string;
|
|
34
|
+
workflowName: string;
|
|
35
|
+
runId: string;
|
|
36
|
+
}): Promise<WorkflowRunState | null>;
|
|
37
|
+
getWorkflowRunById({ runId, workflowName, }: {
|
|
38
|
+
runId: string;
|
|
39
|
+
workflowName?: string;
|
|
40
|
+
}): Promise<WorkflowRun | null>;
|
|
41
|
+
deleteWorkflowRunById({ runId, workflowName }: {
|
|
42
|
+
runId: string;
|
|
43
|
+
workflowName: string;
|
|
44
|
+
}): Promise<void>;
|
|
45
|
+
listWorkflowRuns({ workflowName, fromDate, toDate, perPage, page, resourceId, status, }?: StorageListWorkflowRunsInput): Promise<WorkflowRuns>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/workflows/index.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,gBAAgB,EAEjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,4BAA4B,EAC5B,WAAW,EACX,YAAY,EACZ,0BAA0B,EAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAwBlD,qBAAa,cAAe,SAAQ,gBAAgB;IAClD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,EAAE,CAAU;gBAER,MAAM,EAAE,iBAAiB;IAM9B,yBAAyB,IAAI,OAAO;IAI9B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,qBAAqB,CAAC,EACjC,YAAY,EACZ,KAAK,EACL,MAAM,EACN,MAAM,EACN,cAAc,GACf,EAAE;QACD,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACvD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACzC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAkE9D,mBAAmB,CAAC,EAC/B,YAAY,EACZ,KAAK,EACL,IAAI,GACL,EAAE;QACD,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,0BAA0B,CAAC;KAClC,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAmD5B,uBAAuB,CAAC,MAAM,EAAE;QAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,gBAAgB,CAAC;QAC3B,SAAS,CAAC,EAAE,IAAI,CAAC;QACjB,SAAS,CAAC,EAAE,IAAI,CAAC;KAClB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoDJ,oBAAoB,CAAC,MAAM,EAAE;QACxC,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAoCvB,kBAAkB,CAAC,EAC9B,KAAK,EACL,YAAY,GACb,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IA6DlB,qBAAqB,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBtG,gBAAgB,CAAC,EAC5B,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,OAAO,EACP,IAAI,EACJ,UAAU,EACV,MAAM,GACP,GAAE,4BAAiC,GAAG,OAAO,CAAC,YAAY,CAAC;CAuG7D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { StoreMemoryRedis } from './domains/memory/index.js';
|
|
2
|
+
import { ScoresRedis } from './domains/scores/index.js';
|
|
3
|
+
import { WorkflowsRedis } from './domains/workflows/index.js';
|
|
4
|
+
export { StoreMemoryRedis, ScoresRedis, WorkflowsRedis };
|
|
5
|
+
export type { RedisDomainConfig } from './db/index.js';
|
|
6
|
+
export type { RedisClient, RedisConfig } from './types.js';
|
|
7
|
+
export { RedisStore } from './store.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC"}
|