@mastra/convex 1.0.2 → 1.0.3
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 +44 -0
- package/dist/{chunk-MCT7W5NR.js → chunk-2HJD4TC6.js} +15 -3
- package/dist/chunk-2HJD4TC6.js.map +1 -0
- package/dist/{chunk-R2DNQNIO.cjs → chunk-YELPY4DF.cjs} +15 -3
- package/dist/chunk-YELPY4DF.cjs.map +1 -0
- package/dist/docs/SKILL.md +13 -36
- package/dist/docs/{SOURCE_MAP.json → assets/SOURCE_MAP.json} +2 -2
- package/dist/docs/{storage/01-reference.md → references/reference-storage-convex.md} +37 -22
- package/dist/docs/{vectors/01-reference.md → references/reference-vectors-convex.md} +87 -24
- package/dist/index.cjs +12 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +11 -7
- package/dist/index.js.map +1 -1
- package/dist/server/index.cjs +2 -2
- package/dist/server/index.js +1 -1
- package/dist/storage/db/index.d.ts +2 -2
- package/dist/storage/db/index.d.ts.map +1 -1
- package/dist/storage/domains/workflows/index.d.ts +3 -1
- package/dist/storage/domains/workflows/index.d.ts.map +1 -1
- package/dist/storage/types.d.ts +9 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/package.json +5 -6
- package/dist/chunk-MCT7W5NR.js.map +0 -1
- package/dist/chunk-R2DNQNIO.cjs.map +0 -1
- package/dist/docs/README.md +0 -32
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkYELPY4DF_cjs = require('./chunk-YELPY4DF.cjs');
|
|
4
4
|
var chunkFTVDAP6U_cjs = require('./chunk-FTVDAP6U.cjs');
|
|
5
5
|
var storage = require('@mastra/core/storage');
|
|
6
6
|
var agent = require('@mastra/core/agent');
|
|
@@ -146,11 +146,12 @@ var ConvexDB = class extends base.MastraBase {
|
|
|
146
146
|
});
|
|
147
147
|
return result;
|
|
148
148
|
}
|
|
149
|
-
async queryTable(tableName, filters) {
|
|
149
|
+
async queryTable(tableName, filters, indexHint) {
|
|
150
150
|
return this.client.callStorage({
|
|
151
151
|
op: "queryTable",
|
|
152
152
|
tableName,
|
|
153
|
-
filters
|
|
153
|
+
filters,
|
|
154
|
+
indexHint
|
|
154
155
|
});
|
|
155
156
|
}
|
|
156
157
|
async deleteMany(tableName, ids) {
|
|
@@ -778,7 +779,9 @@ var WorkflowsConvex = class extends storage.WorkflowsStorage {
|
|
|
778
779
|
workflowName,
|
|
779
780
|
runId,
|
|
780
781
|
resourceId,
|
|
781
|
-
snapshot
|
|
782
|
+
snapshot,
|
|
783
|
+
createdAt,
|
|
784
|
+
updatedAt
|
|
782
785
|
}) {
|
|
783
786
|
const now = /* @__PURE__ */ new Date();
|
|
784
787
|
const existing = await this.#db.load({
|
|
@@ -792,8 +795,8 @@ var WorkflowsConvex = class extends storage.WorkflowsStorage {
|
|
|
792
795
|
run_id: runId,
|
|
793
796
|
resourceId,
|
|
794
797
|
snapshot,
|
|
795
|
-
createdAt: existing?.createdAt ?? now.toISOString(),
|
|
796
|
-
updatedAt: now.toISOString()
|
|
798
|
+
createdAt: existing?.createdAt ?? (createdAt ? new Date(createdAt).toISOString() : now.toISOString()),
|
|
799
|
+
updatedAt: updatedAt ? new Date(updatedAt).toISOString() : now.toISOString()
|
|
797
800
|
}
|
|
798
801
|
});
|
|
799
802
|
}
|
|
@@ -810,7 +813,8 @@ var WorkflowsConvex = class extends storage.WorkflowsStorage {
|
|
|
810
813
|
}
|
|
811
814
|
async listWorkflowRuns(args = {}) {
|
|
812
815
|
const { workflowName, fromDate, toDate, perPage, page, resourceId, status } = args;
|
|
813
|
-
|
|
816
|
+
const indexHint = workflowName ? { index: "by_workflow", workflowName } : void 0;
|
|
817
|
+
let rows = await this.#db.queryTable(storage.TABLE_WORKFLOW_SNAPSHOT, void 0, indexHint);
|
|
814
818
|
if (workflowName) rows = rows.filter((run) => run.workflow_name === workflowName);
|
|
815
819
|
if (resourceId) rows = rows.filter((run) => run.resourceId === resourceId);
|
|
816
820
|
if (fromDate) rows = rows.filter((run) => new Date(run.createdAt).getTime() >= fromDate.getTime());
|
|
@@ -1210,7 +1214,7 @@ function cosineSimilarity(a, b) {
|
|
|
1210
1214
|
|
|
1211
1215
|
Object.defineProperty(exports, "mastraStorage", {
|
|
1212
1216
|
enumerable: true,
|
|
1213
|
-
get: function () { return
|
|
1217
|
+
get: function () { return chunkYELPY4DF_cjs.mastraStorage; }
|
|
1214
1218
|
});
|
|
1215
1219
|
Object.defineProperty(exports, "TABLE_MESSAGES", {
|
|
1216
1220
|
enumerable: true,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/client.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/index.ts","../src/vector/index.ts"],"names":["MastraBase","TABLE_WORKFLOW_SNAPSHOT","crypto","MemoryStorage","TABLE_THREADS","TABLE_MESSAGES","TABLE_RESOURCES","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","error","normalizePerPage","calculatePagination","filterByDateRange","MessageList","safelyParseJSON","ScoresStorage","TABLE_SCORERS","WorkflowsStorage","MastraCompositeStore","MastraVector","existing","updated"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { StorageRequest, StorageResponse } from './types';\n\nexport type ConvexAdminClientConfig = {\n deploymentUrl: string;\n adminAuthToken: string;\n storageFunction?: string;\n};\n\n/** Response from callStorageRaw that includes batch info */\nexport type RawStorageResult<T = any> = {\n result: T;\n hasMore?: boolean;\n};\n\nconst DEFAULT_STORAGE_FUNCTION = 'mastra/storage:handle';\n\nexport class ConvexAdminClient {\n private readonly deploymentUrl: string;\n private readonly adminAuthToken: string;\n private readonly storageFunction: string;\n\n constructor({ deploymentUrl, adminAuthToken, storageFunction }: ConvexAdminClientConfig) {\n if (!deploymentUrl) {\n throw new Error('ConvexAdminClient: deploymentUrl is required.');\n }\n\n if (!adminAuthToken) {\n throw new Error('ConvexAdminClient: adminAuthToken is required.');\n }\n\n this.deploymentUrl = deploymentUrl.replace(/\\/$/, ''); // Remove trailing slash\n this.adminAuthToken = adminAuthToken;\n this.storageFunction = storageFunction ?? DEFAULT_STORAGE_FUNCTION;\n }\n\n /**\n * Call storage and return the full response including hasMore flag.\n * Use this for operations that may need multiple calls (e.g., clearTable).\n */\n async callStorageRaw<T = any>(request: StorageRequest): Promise<RawStorageResult<T>> {\n // Use Convex HTTP API directly with admin auth\n const url = `${this.deploymentUrl}/api/mutation`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Convex ${this.adminAuthToken}`,\n },\n body: JSON.stringify({\n path: this.storageFunction,\n args: request,\n format: 'json',\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Convex API error: ${response.status} ${text}`);\n }\n\n const result = (await response.json()) as {\n status?: string;\n errorMessage?: string;\n errorCode?: string;\n value?: StorageResponse;\n };\n\n // Handle Convex response format\n if (result.status === 'error') {\n const error = new Error(result.errorMessage || 'Unknown Convex error');\n (error as any).code = result.errorCode;\n throw error;\n }\n\n const storageResponse = result.value as StorageResponse;\n if (!storageResponse?.ok) {\n const errResponse = storageResponse as { ok: false; error: string; code?: string; details?: Record<string, any> };\n const error = new Error(errResponse?.error || 'Unknown Convex storage error');\n (error as any).code = errResponse?.code;\n (error as any).details = errResponse?.details;\n throw error;\n }\n\n return {\n result: storageResponse.result as T,\n hasMore: storageResponse.hasMore,\n };\n }\n\n async callStorage<T = any>(request: StorageRequest): Promise<T> {\n const { result } = await this.callStorageRaw<T>(request);\n return result;\n }\n}\n","import crypto from 'node:crypto';\n\nimport { MastraBase } from '@mastra/core/base';\nimport { TABLE_WORKFLOW_SNAPSHOT } from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\n\nimport { ConvexAdminClient } from '../client';\nimport type { EqualityFilter } from '../types';\n\n/**\n * Configuration for standalone domain usage.\n * Accepts either:\n * 1. An existing ConvexAdminClient\n * 2. Config to create a new client internally\n */\nexport type ConvexDomainConfig = ConvexDomainClientConfig | ConvexDomainRestConfig;\n\n/**\n * Pass an existing ConvexAdminClient\n */\nexport interface ConvexDomainClientConfig {\n client: ConvexAdminClient;\n}\n\n/**\n * Pass config to create a new ConvexAdminClient internally\n */\nexport interface ConvexDomainRestConfig {\n deploymentUrl: string;\n adminAuthToken: string;\n storageFunction?: string;\n}\n\n/**\n * Resolves ConvexDomainConfig to a ConvexAdminClient.\n * Handles creating a new client if config is provided.\n */\nexport function resolveConvexConfig(config: ConvexDomainConfig): ConvexAdminClient {\n // Existing client\n if ('client' in config) {\n return config.client;\n }\n\n // Config to create new client\n return new ConvexAdminClient(config);\n}\n\nexport class ConvexDB extends MastraBase {\n constructor(private readonly client: ConvexAdminClient) {\n super({ name: 'convex-db' });\n }\n\n async hasColumn(_table: string, _column: string): Promise<boolean> {\n return true;\n }\n\n async createTable({\n tableName,\n schema: _schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n // No-op for Convex; schema is managed server-side via schema.ts\n this.logger.debug(`ConvexDB: createTable called for ${tableName} (schema managed server-side)`);\n }\n\n async alterTable({\n tableName,\n schema: _schema,\n ifNotExists: _ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n // No-op for Convex; schema is managed server-side via schema.ts\n this.logger.debug(`ConvexDB: alterTable called for ${tableName} (schema managed server-side)`);\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n // Delete in batches since each mutation can only delete a small number of docs\n // to stay within Convex's 1-second mutation timeout.\n let hasMore = true;\n while (hasMore) {\n const response = await this.client.callStorageRaw({\n op: 'clearTable',\n tableName,\n });\n hasMore = response.hasMore ?? false;\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n // Delete in batches since each mutation can only delete a small number of docs\n // to stay within Convex's 1-second mutation timeout.\n let hasMore = true;\n while (hasMore) {\n const response = await this.client.callStorageRaw({\n op: 'dropTable',\n tableName,\n });\n hasMore = response.hasMore ?? false;\n }\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n await this.client.callStorage({\n op: 'insert',\n tableName,\n record: this.normalizeRecord(tableName, record),\n });\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n if (records.length === 0) return;\n\n await this.client.callStorage({\n op: 'batchInsert',\n tableName,\n records: records.map(record => this.normalizeRecord(tableName, record)),\n });\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<R | null> {\n const result = await this.client.callStorage<R | null>({\n op: 'load',\n tableName,\n keys,\n });\n\n return result;\n }\n\n public async queryTable<R>(tableName: TABLE_NAMES, filters?: EqualityFilter[]): Promise<R[]> {\n return this.client.callStorage<R[]>({\n op: 'queryTable',\n tableName,\n filters,\n });\n }\n\n public async deleteMany(tableName: TABLE_NAMES, ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n await this.client.callStorage({\n op: 'deleteMany',\n tableName,\n ids,\n });\n }\n\n private normalizeRecord(tableName: TABLE_NAMES, record: Record<string, any>): Record<string, any> {\n const normalized: Record<string, any> = { ...record };\n\n if (tableName === TABLE_WORKFLOW_SNAPSHOT && !normalized.id) {\n const runId = normalized.run_id || normalized.runId;\n const workflowName = normalized.workflow_name || normalized.workflowName;\n normalized.id = workflowName ? `${workflowName}-${runId}` : runId;\n }\n\n if (!normalized.id) {\n normalized.id = crypto.randomUUID();\n }\n\n for (const [key, value] of Object.entries(normalized)) {\n if (value instanceof Date) {\n normalized[key] = value.toISOString();\n }\n }\n\n return normalized;\n }\n}\n","import { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport {\n filterByDateRange,\n MemoryStorage,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n calculatePagination,\n createStorageErrorId,\n normalizePerPage,\n safelyParseJSON,\n} from '@mastra/core/storage';\nimport type {\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n StorageResourceType,\n} from '@mastra/core/storage';\n\nimport { ConvexDB, resolveConvexConfig } from '../../db';\nimport type { ConvexDomainConfig } from '../../db';\n\ntype StoredMessage = {\n id: string;\n thread_id: string;\n content: string;\n role: string;\n type: string;\n createdAt: string;\n resourceId: string | null;\n};\n\nexport class MemoryConvex extends MemoryStorage {\n #db: ConvexDB;\n constructor(config: ConvexDomainConfig) {\n super();\n const client = resolveConvexConfig(config);\n this.#db = new ConvexDB(client);\n }\n\n async init(): Promise<void> {\n // No-op for Convex; schema is managed server-side.\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_THREADS });\n await this.#db.clearTable({ tableName: TABLE_MESSAGES });\n await this.#db.clearTable({ tableName: TABLE_RESOURCES });\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n const row = await this.#db.load<\n (Omit<StorageThreadType, 'createdAt' | 'updatedAt'> & { createdAt: string; updatedAt: string }) | null\n >({\n tableName: TABLE_THREADS,\n keys: { id: threadId },\n });\n\n if (!row) return null;\n\n return {\n ...row,\n metadata: typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n };\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n await this.#db.insert({\n tableName: TABLE_THREADS,\n record: {\n ...thread,\n metadata: thread.metadata ?? {},\n },\n });\n return thread;\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n const existing = await this.getThreadById({ threadId: id });\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('CONVEX', 'UPDATE_THREAD', 'THREAD_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread ${id} not found`,\n });\n }\n\n const updated: StorageThreadType = {\n ...existing,\n title,\n metadata: {\n ...existing.metadata,\n ...metadata,\n },\n updatedAt: new Date(),\n };\n\n await this.saveThread({ thread: updated });\n return updated;\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n const messages = await this.#db.queryTable<StoredMessage>(TABLE_MESSAGES, [\n { field: 'thread_id', value: threadId },\n ]);\n await this.#db.deleteMany(\n TABLE_MESSAGES,\n messages.map(msg => msg.id),\n );\n await this.#db.deleteMany(TABLE_THREADS, [threadId]);\n }\n\n async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n\n try {\n // Validate pagination input before normalization\n // This ensures page === 0 when perPageInput === false\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CONVEX', '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 const { field, direction } = this.parseOrderBy(orderBy);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n // Build query filters\n const queryFilters: Array<{ field: string; value: any }> = [];\n\n if (filter?.resourceId) {\n queryFilters.push({ field: 'resourceId', value: filter.resourceId });\n }\n\n const rows = await this.#db.queryTable<\n Omit<StorageThreadType, 'createdAt' | 'updatedAt'> & { createdAt: string; updatedAt: string }\n >(TABLE_THREADS, queryFilters);\n\n let threads = rows.map(row => ({\n ...row,\n metadata: typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n }));\n\n // Apply metadata filters if provided (AND logic)\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n threads = threads.filter(thread => {\n if (!thread.metadata) return false;\n return Object.entries(filter.metadata!).every(([key, value]) => thread.metadata![key] === value);\n });\n }\n\n threads.sort((a, b) => {\n const aValue = a[field];\n const bValue = b[field];\n const aTime = aValue instanceof Date ? aValue.getTime() : new Date(aValue as any).getTime();\n const bTime = bValue instanceof Date ? bValue.getTime() : new Date(bValue as any).getTime();\n return direction === 'ASC' ? aTime - bTime : bTime - aTime;\n });\n\n const total = threads.length;\n const paginated = perPageInput === false ? threads : threads.slice(offset, offset + perPage);\n\n return {\n threads: paginated,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n }\n\n async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n // Normalize threadId to array\n const threadIds = Array.isArray(threadId) ? threadId : [threadId];\n\n if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {\n throw new MastraError(\n {\n id: createStorageErrorId('CONVEX', '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 const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n // Fetch messages from all threads\n let rows: StoredMessage[] = [];\n for (const tid of threadIds) {\n const threadRows = await this.#db.queryTable<StoredMessage>(TABLE_MESSAGES, [{ field: 'thread_id', value: tid }]);\n rows.push(...threadRows);\n }\n\n if (resourceId) {\n rows = rows.filter(row => row.resourceId === resourceId);\n }\n\n // Apply date range filter\n rows = filterByDateRange(rows, row => new Date(row.createdAt), filter?.dateRange);\n\n rows.sort((a, b) => {\n const aValue =\n field === 'createdAt' || field === 'updatedAt'\n ? new Date((a as Record<string, any>)[field]).getTime()\n : (a as Record<string, any>)[field];\n const bValue =\n field === 'createdAt' || field === 'updatedAt'\n ? new Date((b as Record<string, any>)[field]).getTime()\n : (b as Record<string, any>)[field];\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n const totalThreadMessages = rows.length;\n const paginatedRows = perPageInput === false ? rows : rows.slice(offset, offset + perPage);\n const messages = paginatedRows.map(row => this.parseStoredMessage(row));\n const messageIds = new Set(messages.map(msg => msg.id));\n\n if (include && include.length > 0) {\n // Cache messages from threads as needed\n const threadMessagesCache = new Map<string, StoredMessage[]>();\n // Pre-populate cache with already-fetched thread messages\n for (const tid of threadIds) {\n const tidRows = rows.filter(r => r.thread_id === tid);\n threadMessagesCache.set(tid, tidRows);\n }\n\n for (const includeItem of include) {\n // First, find the message to get its threadId\n let targetThreadId: string | undefined;\n let target: StoredMessage | undefined;\n\n // Check in cached threads first\n for (const [tid, cachedRows] of threadMessagesCache) {\n target = cachedRows.find(row => row.id === includeItem.id);\n if (target) {\n targetThreadId = tid;\n break;\n }\n }\n\n // If not found, query by message ID directly\n if (!target) {\n const messageRows = await this.#db.queryTable<StoredMessage>(TABLE_MESSAGES, [\n { field: 'id', value: includeItem.id },\n ]);\n if (messageRows.length > 0) {\n target = messageRows[0];\n targetThreadId = target!.thread_id;\n\n // Cache the thread's messages for context lookup\n if (targetThreadId && !threadMessagesCache.has(targetThreadId)) {\n const otherThreadRows = await this.#db.queryTable<StoredMessage>(TABLE_MESSAGES, [\n { field: 'thread_id', value: targetThreadId },\n ]);\n threadMessagesCache.set(targetThreadId, otherThreadRows);\n }\n }\n }\n\n if (!target || !targetThreadId) continue;\n\n if (!messageIds.has(target.id)) {\n messages.push(this.parseStoredMessage(target));\n messageIds.add(target.id);\n }\n\n const targetThreadRows = threadMessagesCache.get(targetThreadId) || [];\n await this.addContextMessages({\n includeItem,\n allMessages: targetThreadRows,\n targetThreadId,\n messageIds,\n messages,\n });\n }\n }\n\n messages.sort((a, b) => {\n const aValue =\n field === 'createdAt' || field === 'updatedAt' ? new Date((a as any)[field]).getTime() : (a as any)[field];\n const bValue =\n field === 'createdAt' || field === 'updatedAt' ? new Date((b as any)[field]).getTime() : (b as any)[field];\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n const hasMore =\n include && include.length > 0\n ? new Set(messages.filter(m => m.threadId === threadId).map(m => m.id)).size < totalThreadMessages\n : perPageInput === false\n ? false\n : offset + perPage < totalThreadMessages;\n\n return {\n messages,\n total: totalThreadMessages,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n }\n\n async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) {\n return { messages: [] };\n }\n const rows = await this.#db.queryTable<StoredMessage>(TABLE_MESSAGES, undefined);\n const filtered = rows.filter(row => messageIds.includes(row.id)).map(row => this.parseStoredMessage(row));\n const list = new MessageList().add(filtered, 'memory');\n return { messages: list.get.all.db() };\n }\n\n async saveMessages({ messages }: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messages.length === 0) return { messages: [] };\n\n const normalized = messages.map(message => {\n if (!message.threadId) {\n throw new Error('Thread ID is required');\n }\n if (!message.resourceId) {\n throw new Error('Resource ID is required');\n }\n const createdAt = message.createdAt instanceof Date ? message.createdAt.toISOString() : message.createdAt;\n return {\n id: message.id,\n thread_id: message.threadId,\n content: JSON.stringify(message.content),\n role: message.role,\n type: message.type || 'v2',\n createdAt,\n resourceId: message.resourceId,\n };\n });\n\n await this.#db.batchInsert({\n tableName: TABLE_MESSAGES,\n records: normalized,\n });\n\n // Update thread updatedAt timestamps for all affected threads\n const threadIds = [...new Set(messages.map(m => m.threadId).filter(Boolean) as string[])];\n const now = new Date();\n for (const threadId of threadIds) {\n const thread = await this.getThreadById({ threadId });\n if (thread) {\n await this.#db.insert({\n tableName: TABLE_THREADS,\n record: {\n ...thread,\n id: thread.id,\n updatedAt: now.toISOString(),\n createdAt: thread.createdAt instanceof Date ? thread.createdAt.toISOString() : thread.createdAt,\n metadata: thread.metadata ?? {},\n },\n });\n }\n }\n\n const list = new MessageList().add(messages, 'memory');\n return { messages: list.get.all.db() };\n }\n\n async updateMessages({\n messages,\n }: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraDBMessage[]> {\n if (messages.length === 0) return [];\n\n const existing = await this.#db.queryTable<StoredMessage>(TABLE_MESSAGES, undefined);\n const updated: MastraDBMessage[] = [];\n const affectedThreadIds = new Set<string>();\n\n for (const update of messages) {\n const current = existing.find(row => row.id === update.id);\n if (!current) continue;\n\n // Track old thread for timestamp update\n affectedThreadIds.add(current.thread_id);\n\n if (update.threadId) {\n // Track new thread for timestamp update when moving messages\n affectedThreadIds.add(update.threadId);\n current.thread_id = update.threadId;\n }\n if (update.resourceId !== undefined) {\n current.resourceId = update.resourceId ?? null;\n }\n if (update.role) {\n current.role = update.role;\n }\n if (update.type) {\n current.type = update.type;\n }\n if (update.content) {\n const existingContent = safelyParseJSON(current.content) || {};\n const mergedContent = {\n ...existingContent,\n ...update.content,\n ...(existingContent.metadata && update.content.metadata\n ? { metadata: { ...existingContent.metadata, ...update.content.metadata } }\n : {}),\n };\n current.content = JSON.stringify(mergedContent);\n }\n\n await this.#db.insert({\n tableName: TABLE_MESSAGES,\n record: current,\n });\n updated.push(this.parseStoredMessage(current));\n }\n\n // Update thread updatedAt timestamps for all affected threads\n const now = new Date();\n for (const threadId of affectedThreadIds) {\n const thread = await this.getThreadById({ threadId });\n if (thread) {\n await this.#db.insert({\n tableName: TABLE_THREADS,\n record: {\n ...thread,\n id: thread.id,\n updatedAt: now.toISOString(),\n createdAt: thread.createdAt instanceof Date ? thread.createdAt.toISOString() : thread.createdAt,\n metadata: thread.metadata ?? {},\n },\n });\n }\n }\n\n return updated;\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n await this.#db.deleteMany(TABLE_MESSAGES, messageIds);\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n const record: Record<string, unknown> = {\n ...resource,\n createdAt: resource.createdAt instanceof Date ? resource.createdAt.toISOString() : resource.createdAt,\n updatedAt: resource.updatedAt instanceof Date ? resource.updatedAt.toISOString() : resource.updatedAt,\n };\n // Only include metadata if it's defined\n if (resource.metadata !== undefined) {\n record.metadata = resource.metadata;\n }\n await this.#db.insert({\n tableName: TABLE_RESOURCES,\n record,\n });\n return resource;\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n const record = await this.#db.load<\n (Omit<StorageResourceType, 'createdAt' | 'updatedAt'> & { createdAt: string; updatedAt: string }) | null\n >({\n tableName: TABLE_RESOURCES,\n keys: { id: resourceId },\n });\n if (!record) return null;\n\n return {\n ...record,\n metadata: typeof record.metadata === 'string' ? safelyParseJSON(record.metadata) : record.metadata,\n createdAt: new Date(record.createdAt),\n updatedAt: new Date(record.updatedAt),\n };\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n const existing = await this.getResourceById({ resourceId });\n const now = new Date();\n if (!existing) {\n const created: StorageResourceType = {\n id: resourceId,\n workingMemory,\n metadata: metadata ?? {},\n createdAt: now,\n updatedAt: now,\n };\n return this.saveResource({ resource: created });\n }\n\n const updated: StorageResourceType = {\n ...existing,\n workingMemory: workingMemory ?? existing.workingMemory,\n metadata: {\n ...existing.metadata,\n ...metadata,\n },\n updatedAt: now,\n };\n\n await this.saveResource({ resource: updated });\n return updated;\n }\n\n private parseStoredMessage(message: StoredMessage): MastraDBMessage {\n const content = safelyParseJSON(message.content);\n return {\n id: message.id,\n threadId: message.thread_id,\n content,\n role: message.role as MastraDBMessage['role'],\n type: message.type,\n createdAt: new Date(message.createdAt),\n resourceId: message.resourceId ?? undefined,\n };\n }\n\n private async addContextMessages({\n includeItem,\n allMessages,\n targetThreadId,\n messageIds,\n messages,\n }: {\n includeItem: NonNullable<StorageListMessagesInput['include']>[number];\n allMessages: StoredMessage[];\n targetThreadId: string;\n messageIds: Set<string>;\n messages: MastraDBMessage[];\n }): Promise<void> {\n const ordered = allMessages\n .filter(row => row.thread_id === targetThreadId)\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n\n const targetIndex = ordered.findIndex(row => row.id === includeItem.id);\n if (targetIndex === -1) return;\n\n if (includeItem.withPreviousMessages) {\n const start = Math.max(0, targetIndex - includeItem.withPreviousMessages);\n for (let i = start; i < targetIndex; i++) {\n const row = ordered[i];\n if (row && !messageIds.has(row.id)) {\n messages.push(this.parseStoredMessage(row));\n messageIds.add(row.id);\n }\n }\n }\n\n if (includeItem.withNextMessages) {\n const end = Math.min(ordered.length, targetIndex + includeItem.withNextMessages + 1);\n for (let i = targetIndex + 1; i < end; i++) {\n const row = ordered[i];\n if (row && !messageIds.has(row.id)) {\n messages.push(this.parseStoredMessage(row));\n messageIds.add(row.id);\n }\n }\n }\n }\n}\n","import crypto from 'node:crypto';\n\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type {\n ListScoresResponse,\n SaveScorePayload,\n ScoreRowData,\n ScoringEntityType,\n ScoringSource,\n} from '@mastra/core/evals';\nimport { TABLE_SCORERS, ScoresStorage, createStorageErrorId } from '@mastra/core/storage';\nimport type { StoragePagination } from '@mastra/core/storage';\n\nimport { ConvexDB, resolveConvexConfig } from '../../db';\nimport type { ConvexDomainConfig } from '../../db';\n\ntype StoredScore = Omit<ScoreRowData, 'createdAt' | 'updatedAt'> & {\n createdAt: string;\n updatedAt: string;\n};\n\nexport class ScoresConvex extends ScoresStorage {\n #db: ConvexDB;\n constructor(config: ConvexDomainConfig) {\n super();\n const client = resolveConvexConfig(config);\n this.#db = new ConvexDB(client);\n }\n\n async init(): Promise<void> {\n // No-op for Convex; schema is managed server-side.\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_SCORERS });\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n const row = await this.#db.load<StoredScore | null>({\n tableName: TABLE_SCORERS,\n keys: { id },\n });\n return row ? this.deserialize(row) : null;\n }\n\n async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n const now = new Date();\n const record = {\n ...score,\n id: crypto.randomUUID(),\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n } as StoredScore;\n\n await this.#db.insert({\n tableName: TABLE_SCORERS,\n record,\n });\n\n return { score: this.deserialize(record) };\n }\n\n async listScoresByScorerId({\n scorerId,\n pagination,\n entityId,\n entityType,\n source,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: ScoringEntityType;\n source?: ScoringSource;\n }): Promise<ListScoresResponse> {\n return this.listScores({\n filters: { scorerId, entityId, entityType, source },\n pagination,\n });\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n return this.listScores({\n filters: { runId },\n pagination,\n });\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n entityId: string;\n entityType: ScoringEntityType;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n return this.listScores({\n filters: { entityId, entityType },\n pagination,\n });\n }\n\n private async listScores({\n filters,\n pagination,\n }: {\n filters: Partial<Pick<ScoreRowData, 'scorerId' | 'entityId' | 'entityType' | 'runId' | 'source'>>;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n if (pagination.page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('CONVEX', 'LIST_SCORES', 'INVALID_PAGINATION'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n new Error('page must be >= 0'),\n );\n }\n\n const rows = await this.#db.queryTable<StoredScore>(TABLE_SCORERS, undefined);\n const filtered = rows\n .filter(row => (filters.scorerId ? row.scorerId === filters.scorerId : true))\n .filter(row => (filters.entityId ? row.entityId === filters.entityId : true))\n .filter(row => (filters.entityType ? row.entityType === filters.entityType : true))\n .filter(row => (filters.runId ? row.runId === filters.runId : true))\n .filter(row => (filters.source ? row.source === filters.source : true))\n .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n const { perPage, page } = pagination;\n const perPageValue = perPage === false ? filtered.length : perPage;\n const start = perPage === false ? 0 : page * perPageValue;\n const end = perPage === false ? filtered.length : start + perPageValue;\n const slice = filtered.slice(start, end).map(row => this.deserialize(row));\n\n return {\n pagination: {\n total: filtered.length,\n page,\n perPage,\n hasMore: perPage === false ? false : end < filtered.length,\n },\n scores: slice,\n };\n }\n\n private deserialize(row: StoredScore): ScoreRowData {\n return {\n ...(row as unknown as ScoreRowData),\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n };\n }\n}\n","import { TABLE_WORKFLOW_SNAPSHOT, normalizePerPage, WorkflowsStorage } from '@mastra/core/storage';\nimport type {\n StorageListWorkflowRunsInput,\n StorageWorkflowRun,\n WorkflowRun,\n WorkflowRuns,\n UpdateWorkflowStateOptions,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\n\nimport { ConvexDB, resolveConvexConfig } from '../../db';\nimport type { ConvexDomainConfig } from '../../db';\n\ntype RawWorkflowRun = Omit<StorageWorkflowRun, 'createdAt' | 'updatedAt' | 'snapshot'> & {\n createdAt: string;\n updatedAt: string;\n snapshot: WorkflowRunState | string;\n};\n\nexport class WorkflowsConvex extends WorkflowsStorage {\n #db: ConvexDB;\n constructor(config: ConvexDomainConfig) {\n super();\n const client = resolveConvexConfig(config);\n this.#db = new ConvexDB(client);\n }\n\n async init(): Promise<void> {\n // No-op for Convex; schema is managed server-side.\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_WORKFLOW_SNAPSHOT });\n }\n\n async updateWorkflowResults({\n workflowName,\n runId,\n stepId,\n result,\n requestContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n const run = await this.getRun(workflowName, runId);\n if (!run) return {};\n\n const snapshot = this.ensureSnapshot(run);\n snapshot.context = snapshot.context || {};\n snapshot.context[stepId] = result;\n snapshot.requestContext = { ...(snapshot.requestContext || {}), ...requestContext };\n\n await this.persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId: run.resourceId,\n snapshot,\n });\n\n return JSON.parse(JSON.stringify(snapshot.context));\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined> {\n const run = await this.getRun(workflowName, runId);\n if (!run) return undefined;\n\n const snapshot = this.ensureSnapshot(run);\n const updated = { ...snapshot, ...opts };\n\n await this.persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId: run.resourceId,\n snapshot: updated,\n });\n\n return updated;\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n const now = new Date();\n // Check if a record already exists to preserve createdAt\n const existing = await this.#db.load<{ createdAt?: string } | null>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n\n await this.#db.insert({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n record: {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot,\n createdAt: existing?.createdAt ?? now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n const row = await this.#db.load<{ snapshot: WorkflowRunState | string } | null>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n\n if (!row) return null;\n return typeof row.snapshot === 'string' ? JSON.parse(row.snapshot) : JSON.parse(JSON.stringify(row.snapshot));\n }\n\n async listWorkflowRuns(args: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n const { workflowName, fromDate, toDate, perPage, page, resourceId, status } = args;\n\n let rows = await this.#db.queryTable<RawWorkflowRun>(TABLE_WORKFLOW_SNAPSHOT, undefined);\n\n if (workflowName) rows = rows.filter(run => run.workflow_name === workflowName);\n if (resourceId) rows = rows.filter(run => run.resourceId === resourceId);\n if (fromDate) rows = rows.filter(run => new Date(run.createdAt).getTime() >= fromDate.getTime());\n if (toDate) rows = rows.filter(run => new Date(run.createdAt).getTime() <= toDate.getTime());\n if (status) {\n rows = rows.filter(run => {\n const snapshot = this.ensureSnapshot(run);\n return snapshot.status === status;\n });\n }\n\n const total = rows.length;\n rows.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n if (perPage !== undefined && page !== undefined) {\n const normalized = normalizePerPage(perPage, Number.MAX_SAFE_INTEGER);\n const offset = page * normalized;\n rows = rows.slice(offset, offset + normalized);\n }\n\n const runs: WorkflowRun[] = rows.map(run => ({\n workflowName: run.workflow_name,\n runId: run.run_id,\n snapshot: this.ensureSnapshot(run),\n createdAt: new Date(run.createdAt),\n updatedAt: new Date(run.updatedAt),\n resourceId: run.resourceId,\n }));\n\n return { runs, total };\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n const runs = await this.#db.queryTable<RawWorkflowRun>(TABLE_WORKFLOW_SNAPSHOT, undefined);\n const match = runs.find(run => run.run_id === runId && (!workflowName || run.workflow_name === workflowName));\n if (!match) return null;\n\n return {\n workflowName: match.workflow_name,\n runId: match.run_id,\n snapshot: this.ensureSnapshot(match),\n createdAt: new Date(match.createdAt),\n updatedAt: new Date(match.updatedAt),\n resourceId: match.resourceId,\n };\n }\n\n async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n await this.#db.deleteMany(TABLE_WORKFLOW_SNAPSHOT, [`${workflowName}-${runId}`]);\n }\n\n private async getRun(workflowName: string, runId: string): Promise<RawWorkflowRun | null> {\n const runs = await this.#db.queryTable<RawWorkflowRun>(TABLE_WORKFLOW_SNAPSHOT, [\n { field: 'workflow_name', value: workflowName },\n ]);\n return runs.find(run => run.run_id === runId) ?? null;\n }\n\n private ensureSnapshot(run: { snapshot: WorkflowRunState | string }): WorkflowRunState {\n if (!run.snapshot) {\n return {\n context: {},\n activePaths: [],\n activeStepsPath: {},\n timestamp: Date.now(),\n suspendedPaths: {},\n resumeLabels: {},\n serializedStepGraph: [],\n value: {},\n waitingPaths: {},\n status: 'pending',\n runId: '',\n };\n }\n\n if (typeof run.snapshot === 'string') {\n return JSON.parse(run.snapshot);\n }\n\n return JSON.parse(JSON.stringify(run.snapshot));\n }\n}\n","import type { StorageDomains } from '@mastra/core/storage';\nimport { MastraCompositeStore } from '@mastra/core/storage';\n\nimport type { ConvexAdminClientConfig } from './client';\nimport { ConvexAdminClient } from './client';\nimport { MemoryConvex } from './domains/memory';\nimport { ScoresConvex } from './domains/scores';\nimport { WorkflowsConvex } from './domains/workflows';\n\n// Export domain classes for direct use with MastraStorage composition\nexport { MemoryConvex, ScoresConvex, WorkflowsConvex };\nexport type { ConvexDomainConfig } from './db';\n\n/**\n * Convex configuration type.\n *\n * Accepts either:\n * - A pre-configured ConvexAdminClient: `{ id, client }`\n * - Deployment config: `{ id, deploymentUrl, adminAuthToken, storageFunction? }`\n */\nexport type ConvexStoreConfig = {\n id: string;\n name?: string;\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new ConvexStore({ ...config, disableInit: false });\n * await storage.init(); // Explicitly run migrations\n *\n * // In runtime application:\n * const storage = new ConvexStore({ ...config, disableInit: true });\n * // No auto-init, tables must already exist\n */\n disableInit?: boolean;\n} & (\n | {\n /**\n * Pre-configured ConvexAdminClient.\n * Use this when you need to configure the client before initialization.\n *\n * @example\n * ```typescript\n * import { ConvexAdminClient } from '@mastra/convex/storage/client';\n *\n * const client = new ConvexAdminClient({\n * deploymentUrl: 'https://your-deployment.convex.cloud',\n * adminAuthToken: 'your-token',\n * storageFunction: 'custom/storage:handle',\n * });\n *\n * const store = new ConvexStore({ id: 'my-store', client });\n * ```\n */\n client: ConvexAdminClient;\n }\n | ConvexAdminClientConfig\n);\n\n/**\n * Type guard for pre-configured client config\n */\nconst isClientConfig = (config: ConvexStoreConfig): config is ConvexStoreConfig & { client: ConvexAdminClient } => {\n return 'client' in config;\n};\n\n/**\n * Convex storage adapter for Mastra.\n *\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * const storage = new ConvexStore({ id: 'my-store', deploymentUrl: '...', adminAuthToken: '...' });\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 */\nexport class ConvexStore extends MastraCompositeStore {\n declare stores: StorageDomains;\n\n constructor(config: ConvexStoreConfig) {\n super({ id: config.id, name: config.name ?? 'ConvexStore', disableInit: config.disableInit });\n\n // Handle pre-configured client vs creating new one\n const client = isClientConfig(config) ? config.client : new ConvexAdminClient(config);\n\n const domainConfig = { client };\n const memory = new MemoryConvex(domainConfig);\n const workflows = new WorkflowsConvex(domainConfig);\n const scores = new ScoresConvex(domainConfig);\n\n this.stores = {\n memory,\n workflows,\n scores,\n };\n }\n}\n","import crypto from 'node:crypto';\n\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n CreateIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n DeleteVectorsParams,\n DescribeIndexParams,\n IndexStats,\n QueryResult,\n QueryVectorParams,\n UpdateVectorParams,\n UpsertVectorParams,\n} from '@mastra/core/vector';\n\nimport type { ConvexAdminClientConfig } from '../storage/client';\nimport { ConvexAdminClient } from '../storage/client';\nimport type { StorageRequest } from '../storage/types';\n\ntype VectorRecord = {\n id: string;\n embedding: number[];\n metadata?: Record<string, any>;\n};\n\ntype VectorFilter = {\n metadata?: Record<string, any>;\n};\n\nconst INDEX_METADATA_TABLE = 'mastra_vector_indexes';\n\nexport type ConvexVectorConfig = ConvexAdminClientConfig & {\n id: string;\n};\n\nexport class ConvexVector extends MastraVector<VectorFilter> {\n private readonly client: ConvexAdminClient;\n\n constructor(config: ConvexVectorConfig) {\n super({ id: config.id });\n this.client = new ConvexAdminClient(config);\n }\n\n async createIndex({ indexName, dimension }: CreateIndexParams): Promise<void> {\n await this.callStorage({\n op: 'insert',\n tableName: INDEX_METADATA_TABLE,\n record: {\n id: indexName,\n indexName,\n dimension,\n metric: 'cosine',\n createdAt: new Date().toISOString(),\n },\n });\n }\n\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n await this.callStorage({\n op: 'deleteMany',\n tableName: INDEX_METADATA_TABLE,\n ids: [indexName],\n });\n // Delete in batches since each mutation can only delete a small number of docs\n // to stay within Convex's 1-second mutation timeout.\n await this.callStorageUntilComplete({\n op: 'clearTable',\n tableName: this.vectorTable(indexName),\n });\n }\n\n async truncateIndex({ indexName }: DeleteIndexParams): Promise<void> {\n // Delete in batches since each mutation can only delete a small number of docs\n // to stay within Convex's 1-second mutation timeout.\n await this.callStorageUntilComplete({\n op: 'clearTable',\n tableName: this.vectorTable(indexName),\n });\n }\n\n async listIndexes(): Promise<string[]> {\n const indexes = await this.callStorage<{ id: string }[]>({\n op: 'queryTable',\n tableName: INDEX_METADATA_TABLE,\n });\n return indexes.map(index => index.id);\n }\n\n async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n const index = await this.callStorage<{ dimension: number } | null>({\n op: 'load',\n tableName: INDEX_METADATA_TABLE,\n keys: { id: indexName },\n });\n if (!index) {\n throw new Error(`Index ${indexName} not found`);\n }\n\n const vectors = await this.callStorage<VectorRecord[]>({\n op: 'queryTable',\n tableName: this.vectorTable(indexName),\n });\n\n return {\n dimension: index.dimension,\n count: vectors.length,\n metric: 'cosine',\n };\n }\n\n async upsert({ indexName, vectors, ids, metadata }: UpsertVectorParams<VectorFilter>): Promise<string[]> {\n const vectorIds = ids ?? vectors.map(() => crypto.randomUUID());\n\n const records: VectorRecord[] = vectors.map((vector, i) => ({\n id: vectorIds[i]!,\n embedding: vector,\n metadata: metadata?.[i],\n }));\n\n await this.callStorage({\n op: 'batchInsert',\n tableName: this.vectorTable(indexName),\n records,\n });\n\n return vectorIds;\n }\n\n async query({\n indexName,\n queryVector,\n topK = 10,\n includeVector = false,\n filter,\n }: QueryVectorParams<VectorFilter>): Promise<QueryResult[]> {\n const vectors = await this.callStorage<VectorRecord[]>({\n op: 'queryTable',\n tableName: this.vectorTable(indexName),\n });\n\n const filtered =\n filter && !this.isEmptyFilter(filter)\n ? vectors.filter(record => this.matchesFilter(record.metadata, filter))\n : vectors;\n\n const scored = filtered\n .map(record => ({\n id: record.id,\n score: cosineSimilarity(queryVector, record.embedding),\n metadata: record.metadata,\n ...(includeVector ? { vector: record.embedding } : {}),\n }))\n .filter(result => Number.isFinite(result.score))\n .sort((a, b) => b.score - a.score)\n .slice(0, topK);\n\n return scored;\n }\n\n async updateVector(params: UpdateVectorParams<VectorFilter>): Promise<void> {\n const hasId = 'id' in params && params.id;\n const hasFilter = 'filter' in params && params.filter !== undefined;\n\n // Check for mutually exclusive parameters\n if (hasId && hasFilter) {\n throw new Error('ConvexVector.updateVector: id and filter are mutually exclusive');\n }\n\n // Check for filter-based update\n if (hasFilter) {\n const filter = params.filter as VectorFilter;\n // Check for empty filter\n if (this.isEmptyFilter(filter)) {\n throw new Error('ConvexVector.updateVector: cannot update with empty filter');\n }\n\n // Update by filter - find all matching records and update them\n const vectors = await this.callStorage<VectorRecord[]>({\n op: 'queryTable',\n tableName: this.vectorTable(params.indexName),\n });\n\n const matching = vectors.filter(record => this.matchesFilter(record.metadata, filter));\n\n for (const existing of matching) {\n const updated: VectorRecord = {\n ...existing,\n ...(params.update.vector ? { embedding: params.update.vector } : {}),\n ...(params.update.metadata ? { metadata: { ...existing.metadata, ...params.update.metadata } } : {}),\n };\n\n await this.callStorage({\n op: 'insert',\n tableName: this.vectorTable(params.indexName),\n record: updated,\n });\n }\n return;\n }\n\n // Update by id\n if (!hasId) {\n throw new Error('ConvexVector.updateVector: Either id or filter must be provided');\n }\n\n const existing = await this.callStorage<VectorRecord | null>({\n op: 'load',\n tableName: this.vectorTable(params.indexName),\n keys: { id: params.id },\n });\n if (!existing) return;\n\n const updated: VectorRecord = {\n ...existing,\n ...(params.update.vector ? { embedding: params.update.vector } : {}),\n ...(params.update.metadata ? { metadata: { ...existing.metadata, ...params.update.metadata } } : {}),\n };\n\n await this.callStorage({\n op: 'insert',\n tableName: this.vectorTable(params.indexName),\n record: updated,\n });\n }\n\n async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n await this.callStorage({\n op: 'deleteMany',\n tableName: this.vectorTable(indexName),\n ids: [id],\n });\n }\n\n async deleteVectors(params: DeleteVectorsParams<VectorFilter>): Promise<void> {\n const { indexName } = params;\n const hasIds = 'ids' in params && params.ids !== undefined;\n const hasFilter = 'filter' in params && params.filter !== undefined;\n\n // Check for mutually exclusive parameters\n if (hasIds && hasFilter) {\n throw new Error('ConvexVector.deleteVectors: ids and filter are mutually exclusive');\n }\n\n // Check that at least one is provided\n if (!hasIds && !hasFilter) {\n throw new Error('ConvexVector.deleteVectors: Either filter or ids must be provided');\n }\n\n // Handle ID-based deletion\n if (hasIds) {\n const ids = params.ids as string[];\n if (ids.length === 0) {\n throw new Error('ConvexVector.deleteVectors: cannot delete with empty ids array');\n }\n await this.callStorage({\n op: 'deleteMany',\n tableName: this.vectorTable(indexName),\n ids,\n });\n return;\n }\n\n // Handle filter-based deletion\n const filter = params.filter as VectorFilter;\n if (this.isEmptyFilter(filter)) {\n throw new Error('ConvexVector.deleteVectors: cannot delete with empty filter');\n }\n\n // Find all matching vectors and delete them\n const vectors = await this.callStorage<VectorRecord[]>({\n op: 'queryTable',\n tableName: this.vectorTable(indexName),\n });\n\n const matchingIds = vectors.filter(record => this.matchesFilter(record.metadata, filter)).map(record => record.id);\n\n if (matchingIds.length > 0) {\n await this.callStorage({\n op: 'deleteMany',\n tableName: this.vectorTable(indexName),\n ids: matchingIds,\n });\n }\n }\n\n private vectorTable(indexName: string) {\n return `mastra_vector_${indexName}`;\n }\n\n private isEmptyFilter(filter: VectorFilter | Record<string, any>): boolean {\n if (!filter) return true;\n return Object.keys(filter).length === 0;\n }\n\n private matchesFilter(\n recordMetadata: Record<string, any> | undefined,\n filter: VectorFilter | Record<string, any>,\n ): boolean {\n if (!recordMetadata) return false;\n if (!filter || Object.keys(filter).length === 0) return true;\n\n // Handle VectorFilter with metadata property\n if ('metadata' in filter && filter.metadata) {\n return this.matchesFilterConditions(recordMetadata, filter.metadata);\n }\n\n // Handle direct filter conditions\n return this.matchesFilterConditions(recordMetadata, filter);\n }\n\n private matchesFilterConditions(recordMetadata: Record<string, any>, conditions: Record<string, any>): boolean {\n for (const [key, value] of Object.entries(conditions)) {\n // Handle $and operator\n if (key === '$and' && Array.isArray(value)) {\n const allMatch = value.every((cond: Record<string, any>) => this.matchesFilterConditions(recordMetadata, cond));\n if (!allMatch) return false;\n continue;\n }\n\n // Handle $or operator\n if (key === '$or' && Array.isArray(value)) {\n const anyMatch = value.some((cond: Record<string, any>) => this.matchesFilterConditions(recordMetadata, cond));\n if (!anyMatch) return false;\n continue;\n }\n\n // Handle $in operator\n if (typeof value === 'object' && value !== null && '$in' in value) {\n if (!Array.isArray(value.$in) || !value.$in.includes(recordMetadata[key])) {\n return false;\n }\n continue;\n }\n\n // Handle $nin operator\n if (typeof value === 'object' && value !== null && '$nin' in value) {\n if (Array.isArray(value.$nin) && value.$nin.includes(recordMetadata[key])) {\n return false;\n }\n continue;\n }\n\n // Handle $gt operator\n if (typeof value === 'object' && value !== null && '$gt' in value) {\n if (!(recordMetadata[key] > value.$gt)) {\n return false;\n }\n continue;\n }\n\n // Handle $gte operator\n if (typeof value === 'object' && value !== null && '$gte' in value) {\n if (!(recordMetadata[key] >= value.$gte)) {\n return false;\n }\n continue;\n }\n\n // Handle $lt operator\n if (typeof value === 'object' && value !== null && '$lt' in value) {\n if (!(recordMetadata[key] < value.$lt)) {\n return false;\n }\n continue;\n }\n\n // Handle $lte operator\n if (typeof value === 'object' && value !== null && '$lte' in value) {\n if (!(recordMetadata[key] <= value.$lte)) {\n return false;\n }\n continue;\n }\n\n // Handle $ne operator\n if (typeof value === 'object' && value !== null && '$ne' in value) {\n if (recordMetadata[key] === value.$ne) {\n return false;\n }\n continue;\n }\n\n // Handle simple equality\n if (recordMetadata[key] !== value) {\n return false;\n }\n }\n\n return true;\n }\n\n private async callStorage<T = any>(request: StorageRequest): Promise<T> {\n return this.client.callStorage<T>(request);\n }\n\n /**\n * Call storage repeatedly until hasMore is false.\n * Use for bulk operations like clearTable that may need multiple batches.\n */\n private async callStorageUntilComplete(request: StorageRequest): Promise<void> {\n let hasMore = true;\n while (hasMore) {\n const response = await this.client.callStorageRaw(request);\n hasMore = response.hasMore ?? false;\n }\n }\n}\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n return -1;\n }\n\n let dot = 0;\n let magA = 0;\n let magB = 0;\n\n for (let i = 0; i < a.length; i++) {\n const aVal = a[i] ?? 0;\n const bVal = b[i] ?? 0;\n dot += aVal * bVal;\n magA += aVal * aVal;\n magB += bVal * bVal;\n }\n\n if (magA === 0 || magB === 0) {\n return -1;\n }\n\n return dot / (Math.sqrt(magA) * Math.sqrt(magB));\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/storage/client.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/index.ts","../src/vector/index.ts"],"names":["MastraBase","TABLE_WORKFLOW_SNAPSHOT","crypto","MemoryStorage","TABLE_THREADS","TABLE_MESSAGES","TABLE_RESOURCES","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","error","normalizePerPage","calculatePagination","filterByDateRange","MessageList","safelyParseJSON","ScoresStorage","TABLE_SCORERS","WorkflowsStorage","MastraCompositeStore","MastraVector","existing","updated"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { StorageRequest, StorageResponse } from './types';\n\nexport type ConvexAdminClientConfig = {\n deploymentUrl: string;\n adminAuthToken: string;\n storageFunction?: string;\n};\n\n/** Response from callStorageRaw that includes batch info */\nexport type RawStorageResult<T = any> = {\n result: T;\n hasMore?: boolean;\n};\n\nconst DEFAULT_STORAGE_FUNCTION = 'mastra/storage:handle';\n\nexport class ConvexAdminClient {\n private readonly deploymentUrl: string;\n private readonly adminAuthToken: string;\n private readonly storageFunction: string;\n\n constructor({ deploymentUrl, adminAuthToken, storageFunction }: ConvexAdminClientConfig) {\n if (!deploymentUrl) {\n throw new Error('ConvexAdminClient: deploymentUrl is required.');\n }\n\n if (!adminAuthToken) {\n throw new Error('ConvexAdminClient: adminAuthToken is required.');\n }\n\n this.deploymentUrl = deploymentUrl.replace(/\\/$/, ''); // Remove trailing slash\n this.adminAuthToken = adminAuthToken;\n this.storageFunction = storageFunction ?? DEFAULT_STORAGE_FUNCTION;\n }\n\n /**\n * Call storage and return the full response including hasMore flag.\n * Use this for operations that may need multiple calls (e.g., clearTable).\n */\n async callStorageRaw<T = any>(request: StorageRequest): Promise<RawStorageResult<T>> {\n // Use Convex HTTP API directly with admin auth\n const url = `${this.deploymentUrl}/api/mutation`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Convex ${this.adminAuthToken}`,\n },\n body: JSON.stringify({\n path: this.storageFunction,\n args: request,\n format: 'json',\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Convex API error: ${response.status} ${text}`);\n }\n\n const result = (await response.json()) as {\n status?: string;\n errorMessage?: string;\n errorCode?: string;\n value?: StorageResponse;\n };\n\n // Handle Convex response format\n if (result.status === 'error') {\n const error = new Error(result.errorMessage || 'Unknown Convex error');\n (error as any).code = result.errorCode;\n throw error;\n }\n\n const storageResponse = result.value as StorageResponse;\n if (!storageResponse?.ok) {\n const errResponse = storageResponse as { ok: false; error: string; code?: string; details?: Record<string, any> };\n const error = new Error(errResponse?.error || 'Unknown Convex storage error');\n (error as any).code = errResponse?.code;\n (error as any).details = errResponse?.details;\n throw error;\n }\n\n return {\n result: storageResponse.result as T,\n hasMore: storageResponse.hasMore,\n };\n }\n\n async callStorage<T = any>(request: StorageRequest): Promise<T> {\n const { result } = await this.callStorageRaw<T>(request);\n return result;\n }\n}\n","import crypto from 'node:crypto';\n\nimport { MastraBase } from '@mastra/core/base';\nimport { TABLE_WORKFLOW_SNAPSHOT } from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\n\nimport { ConvexAdminClient } from '../client';\nimport type { EqualityFilter, IndexHint } from '../types';\n\n/**\n * Configuration for standalone domain usage.\n * Accepts either:\n * 1. An existing ConvexAdminClient\n * 2. Config to create a new client internally\n */\nexport type ConvexDomainConfig = ConvexDomainClientConfig | ConvexDomainRestConfig;\n\n/**\n * Pass an existing ConvexAdminClient\n */\nexport interface ConvexDomainClientConfig {\n client: ConvexAdminClient;\n}\n\n/**\n * Pass config to create a new ConvexAdminClient internally\n */\nexport interface ConvexDomainRestConfig {\n deploymentUrl: string;\n adminAuthToken: string;\n storageFunction?: string;\n}\n\n/**\n * Resolves ConvexDomainConfig to a ConvexAdminClient.\n * Handles creating a new client if config is provided.\n */\nexport function resolveConvexConfig(config: ConvexDomainConfig): ConvexAdminClient {\n // Existing client\n if ('client' in config) {\n return config.client;\n }\n\n // Config to create new client\n return new ConvexAdminClient(config);\n}\n\nexport class ConvexDB extends MastraBase {\n constructor(private readonly client: ConvexAdminClient) {\n super({ name: 'convex-db' });\n }\n\n async hasColumn(_table: string, _column: string): Promise<boolean> {\n return true;\n }\n\n async createTable({\n tableName,\n schema: _schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n // No-op for Convex; schema is managed server-side via schema.ts\n this.logger.debug(`ConvexDB: createTable called for ${tableName} (schema managed server-side)`);\n }\n\n async alterTable({\n tableName,\n schema: _schema,\n ifNotExists: _ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n // No-op for Convex; schema is managed server-side via schema.ts\n this.logger.debug(`ConvexDB: alterTable called for ${tableName} (schema managed server-side)`);\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n // Delete in batches since each mutation can only delete a small number of docs\n // to stay within Convex's 1-second mutation timeout.\n let hasMore = true;\n while (hasMore) {\n const response = await this.client.callStorageRaw({\n op: 'clearTable',\n tableName,\n });\n hasMore = response.hasMore ?? false;\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n // Delete in batches since each mutation can only delete a small number of docs\n // to stay within Convex's 1-second mutation timeout.\n let hasMore = true;\n while (hasMore) {\n const response = await this.client.callStorageRaw({\n op: 'dropTable',\n tableName,\n });\n hasMore = response.hasMore ?? false;\n }\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n await this.client.callStorage({\n op: 'insert',\n tableName,\n record: this.normalizeRecord(tableName, record),\n });\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n if (records.length === 0) return;\n\n await this.client.callStorage({\n op: 'batchInsert',\n tableName,\n records: records.map(record => this.normalizeRecord(tableName, record)),\n });\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<R | null> {\n const result = await this.client.callStorage<R | null>({\n op: 'load',\n tableName,\n keys,\n });\n\n return result;\n }\n\n public async queryTable<R>(tableName: TABLE_NAMES, filters?: EqualityFilter[], indexHint?: IndexHint): Promise<R[]> {\n return this.client.callStorage<R[]>({\n op: 'queryTable',\n tableName,\n filters,\n indexHint,\n });\n }\n\n public async deleteMany(tableName: TABLE_NAMES, ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n await this.client.callStorage({\n op: 'deleteMany',\n tableName,\n ids,\n });\n }\n\n private normalizeRecord(tableName: TABLE_NAMES, record: Record<string, any>): Record<string, any> {\n const normalized: Record<string, any> = { ...record };\n\n if (tableName === TABLE_WORKFLOW_SNAPSHOT && !normalized.id) {\n const runId = normalized.run_id || normalized.runId;\n const workflowName = normalized.workflow_name || normalized.workflowName;\n normalized.id = workflowName ? `${workflowName}-${runId}` : runId;\n }\n\n if (!normalized.id) {\n normalized.id = crypto.randomUUID();\n }\n\n for (const [key, value] of Object.entries(normalized)) {\n if (value instanceof Date) {\n normalized[key] = value.toISOString();\n }\n }\n\n return normalized;\n }\n}\n","import { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport {\n filterByDateRange,\n MemoryStorage,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n calculatePagination,\n createStorageErrorId,\n normalizePerPage,\n safelyParseJSON,\n} from '@mastra/core/storage';\nimport type {\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n StorageResourceType,\n} from '@mastra/core/storage';\n\nimport { ConvexDB, resolveConvexConfig } from '../../db';\nimport type { ConvexDomainConfig } from '../../db';\n\ntype StoredMessage = {\n id: string;\n thread_id: string;\n content: string;\n role: string;\n type: string;\n createdAt: string;\n resourceId: string | null;\n};\n\nexport class MemoryConvex extends MemoryStorage {\n #db: ConvexDB;\n constructor(config: ConvexDomainConfig) {\n super();\n const client = resolveConvexConfig(config);\n this.#db = new ConvexDB(client);\n }\n\n async init(): Promise<void> {\n // No-op for Convex; schema is managed server-side.\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_THREADS });\n await this.#db.clearTable({ tableName: TABLE_MESSAGES });\n await this.#db.clearTable({ tableName: TABLE_RESOURCES });\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n const row = await this.#db.load<\n (Omit<StorageThreadType, 'createdAt' | 'updatedAt'> & { createdAt: string; updatedAt: string }) | null\n >({\n tableName: TABLE_THREADS,\n keys: { id: threadId },\n });\n\n if (!row) return null;\n\n return {\n ...row,\n metadata: typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n };\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n await this.#db.insert({\n tableName: TABLE_THREADS,\n record: {\n ...thread,\n metadata: thread.metadata ?? {},\n },\n });\n return thread;\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n const existing = await this.getThreadById({ threadId: id });\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('CONVEX', 'UPDATE_THREAD', 'THREAD_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread ${id} not found`,\n });\n }\n\n const updated: StorageThreadType = {\n ...existing,\n title,\n metadata: {\n ...existing.metadata,\n ...metadata,\n },\n updatedAt: new Date(),\n };\n\n await this.saveThread({ thread: updated });\n return updated;\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n const messages = await this.#db.queryTable<StoredMessage>(TABLE_MESSAGES, [\n { field: 'thread_id', value: threadId },\n ]);\n await this.#db.deleteMany(\n TABLE_MESSAGES,\n messages.map(msg => msg.id),\n );\n await this.#db.deleteMany(TABLE_THREADS, [threadId]);\n }\n\n async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n\n try {\n // Validate pagination input before normalization\n // This ensures page === 0 when perPageInput === false\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CONVEX', '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 const { field, direction } = this.parseOrderBy(orderBy);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n // Build query filters\n const queryFilters: Array<{ field: string; value: any }> = [];\n\n if (filter?.resourceId) {\n queryFilters.push({ field: 'resourceId', value: filter.resourceId });\n }\n\n const rows = await this.#db.queryTable<\n Omit<StorageThreadType, 'createdAt' | 'updatedAt'> & { createdAt: string; updatedAt: string }\n >(TABLE_THREADS, queryFilters);\n\n let threads = rows.map(row => ({\n ...row,\n metadata: typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n }));\n\n // Apply metadata filters if provided (AND logic)\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n threads = threads.filter(thread => {\n if (!thread.metadata) return false;\n return Object.entries(filter.metadata!).every(([key, value]) => thread.metadata![key] === value);\n });\n }\n\n threads.sort((a, b) => {\n const aValue = a[field];\n const bValue = b[field];\n const aTime = aValue instanceof Date ? aValue.getTime() : new Date(aValue as any).getTime();\n const bTime = bValue instanceof Date ? bValue.getTime() : new Date(bValue as any).getTime();\n return direction === 'ASC' ? aTime - bTime : bTime - aTime;\n });\n\n const total = threads.length;\n const paginated = perPageInput === false ? threads : threads.slice(offset, offset + perPage);\n\n return {\n threads: paginated,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n }\n\n async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n // Normalize threadId to array\n const threadIds = Array.isArray(threadId) ? threadId : [threadId];\n\n if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {\n throw new MastraError(\n {\n id: createStorageErrorId('CONVEX', '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 const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n // Fetch messages from all threads\n let rows: StoredMessage[] = [];\n for (const tid of threadIds) {\n const threadRows = await this.#db.queryTable<StoredMessage>(TABLE_MESSAGES, [{ field: 'thread_id', value: tid }]);\n rows.push(...threadRows);\n }\n\n if (resourceId) {\n rows = rows.filter(row => row.resourceId === resourceId);\n }\n\n // Apply date range filter\n rows = filterByDateRange(rows, row => new Date(row.createdAt), filter?.dateRange);\n\n rows.sort((a, b) => {\n const aValue =\n field === 'createdAt' || field === 'updatedAt'\n ? new Date((a as Record<string, any>)[field]).getTime()\n : (a as Record<string, any>)[field];\n const bValue =\n field === 'createdAt' || field === 'updatedAt'\n ? new Date((b as Record<string, any>)[field]).getTime()\n : (b as Record<string, any>)[field];\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n const totalThreadMessages = rows.length;\n const paginatedRows = perPageInput === false ? rows : rows.slice(offset, offset + perPage);\n const messages = paginatedRows.map(row => this.parseStoredMessage(row));\n const messageIds = new Set(messages.map(msg => msg.id));\n\n if (include && include.length > 0) {\n // Cache messages from threads as needed\n const threadMessagesCache = new Map<string, StoredMessage[]>();\n // Pre-populate cache with already-fetched thread messages\n for (const tid of threadIds) {\n const tidRows = rows.filter(r => r.thread_id === tid);\n threadMessagesCache.set(tid, tidRows);\n }\n\n for (const includeItem of include) {\n // First, find the message to get its threadId\n let targetThreadId: string | undefined;\n let target: StoredMessage | undefined;\n\n // Check in cached threads first\n for (const [tid, cachedRows] of threadMessagesCache) {\n target = cachedRows.find(row => row.id === includeItem.id);\n if (target) {\n targetThreadId = tid;\n break;\n }\n }\n\n // If not found, query by message ID directly\n if (!target) {\n const messageRows = await this.#db.queryTable<StoredMessage>(TABLE_MESSAGES, [\n { field: 'id', value: includeItem.id },\n ]);\n if (messageRows.length > 0) {\n target = messageRows[0];\n targetThreadId = target!.thread_id;\n\n // Cache the thread's messages for context lookup\n if (targetThreadId && !threadMessagesCache.has(targetThreadId)) {\n const otherThreadRows = await this.#db.queryTable<StoredMessage>(TABLE_MESSAGES, [\n { field: 'thread_id', value: targetThreadId },\n ]);\n threadMessagesCache.set(targetThreadId, otherThreadRows);\n }\n }\n }\n\n if (!target || !targetThreadId) continue;\n\n if (!messageIds.has(target.id)) {\n messages.push(this.parseStoredMessage(target));\n messageIds.add(target.id);\n }\n\n const targetThreadRows = threadMessagesCache.get(targetThreadId) || [];\n await this.addContextMessages({\n includeItem,\n allMessages: targetThreadRows,\n targetThreadId,\n messageIds,\n messages,\n });\n }\n }\n\n messages.sort((a, b) => {\n const aValue =\n field === 'createdAt' || field === 'updatedAt' ? new Date((a as any)[field]).getTime() : (a as any)[field];\n const bValue =\n field === 'createdAt' || field === 'updatedAt' ? new Date((b as any)[field]).getTime() : (b as any)[field];\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n const hasMore =\n include && include.length > 0\n ? new Set(messages.filter(m => m.threadId === threadId).map(m => m.id)).size < totalThreadMessages\n : perPageInput === false\n ? false\n : offset + perPage < totalThreadMessages;\n\n return {\n messages,\n total: totalThreadMessages,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n }\n\n async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) {\n return { messages: [] };\n }\n const rows = await this.#db.queryTable<StoredMessage>(TABLE_MESSAGES, undefined);\n const filtered = rows.filter(row => messageIds.includes(row.id)).map(row => this.parseStoredMessage(row));\n const list = new MessageList().add(filtered, 'memory');\n return { messages: list.get.all.db() };\n }\n\n async saveMessages({ messages }: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messages.length === 0) return { messages: [] };\n\n const normalized = messages.map(message => {\n if (!message.threadId) {\n throw new Error('Thread ID is required');\n }\n if (!message.resourceId) {\n throw new Error('Resource ID is required');\n }\n const createdAt = message.createdAt instanceof Date ? message.createdAt.toISOString() : message.createdAt;\n return {\n id: message.id,\n thread_id: message.threadId,\n content: JSON.stringify(message.content),\n role: message.role,\n type: message.type || 'v2',\n createdAt,\n resourceId: message.resourceId,\n };\n });\n\n await this.#db.batchInsert({\n tableName: TABLE_MESSAGES,\n records: normalized,\n });\n\n // Update thread updatedAt timestamps for all affected threads\n const threadIds = [...new Set(messages.map(m => m.threadId).filter(Boolean) as string[])];\n const now = new Date();\n for (const threadId of threadIds) {\n const thread = await this.getThreadById({ threadId });\n if (thread) {\n await this.#db.insert({\n tableName: TABLE_THREADS,\n record: {\n ...thread,\n id: thread.id,\n updatedAt: now.toISOString(),\n createdAt: thread.createdAt instanceof Date ? thread.createdAt.toISOString() : thread.createdAt,\n metadata: thread.metadata ?? {},\n },\n });\n }\n }\n\n const list = new MessageList().add(messages, 'memory');\n return { messages: list.get.all.db() };\n }\n\n async updateMessages({\n messages,\n }: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraDBMessage[]> {\n if (messages.length === 0) return [];\n\n const existing = await this.#db.queryTable<StoredMessage>(TABLE_MESSAGES, undefined);\n const updated: MastraDBMessage[] = [];\n const affectedThreadIds = new Set<string>();\n\n for (const update of messages) {\n const current = existing.find(row => row.id === update.id);\n if (!current) continue;\n\n // Track old thread for timestamp update\n affectedThreadIds.add(current.thread_id);\n\n if (update.threadId) {\n // Track new thread for timestamp update when moving messages\n affectedThreadIds.add(update.threadId);\n current.thread_id = update.threadId;\n }\n if (update.resourceId !== undefined) {\n current.resourceId = update.resourceId ?? null;\n }\n if (update.role) {\n current.role = update.role;\n }\n if (update.type) {\n current.type = update.type;\n }\n if (update.content) {\n const existingContent = safelyParseJSON(current.content) || {};\n const mergedContent = {\n ...existingContent,\n ...update.content,\n ...(existingContent.metadata && update.content.metadata\n ? { metadata: { ...existingContent.metadata, ...update.content.metadata } }\n : {}),\n };\n current.content = JSON.stringify(mergedContent);\n }\n\n await this.#db.insert({\n tableName: TABLE_MESSAGES,\n record: current,\n });\n updated.push(this.parseStoredMessage(current));\n }\n\n // Update thread updatedAt timestamps for all affected threads\n const now = new Date();\n for (const threadId of affectedThreadIds) {\n const thread = await this.getThreadById({ threadId });\n if (thread) {\n await this.#db.insert({\n tableName: TABLE_THREADS,\n record: {\n ...thread,\n id: thread.id,\n updatedAt: now.toISOString(),\n createdAt: thread.createdAt instanceof Date ? thread.createdAt.toISOString() : thread.createdAt,\n metadata: thread.metadata ?? {},\n },\n });\n }\n }\n\n return updated;\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n await this.#db.deleteMany(TABLE_MESSAGES, messageIds);\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n const record: Record<string, unknown> = {\n ...resource,\n createdAt: resource.createdAt instanceof Date ? resource.createdAt.toISOString() : resource.createdAt,\n updatedAt: resource.updatedAt instanceof Date ? resource.updatedAt.toISOString() : resource.updatedAt,\n };\n // Only include metadata if it's defined\n if (resource.metadata !== undefined) {\n record.metadata = resource.metadata;\n }\n await this.#db.insert({\n tableName: TABLE_RESOURCES,\n record,\n });\n return resource;\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n const record = await this.#db.load<\n (Omit<StorageResourceType, 'createdAt' | 'updatedAt'> & { createdAt: string; updatedAt: string }) | null\n >({\n tableName: TABLE_RESOURCES,\n keys: { id: resourceId },\n });\n if (!record) return null;\n\n return {\n ...record,\n metadata: typeof record.metadata === 'string' ? safelyParseJSON(record.metadata) : record.metadata,\n createdAt: new Date(record.createdAt),\n updatedAt: new Date(record.updatedAt),\n };\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n const existing = await this.getResourceById({ resourceId });\n const now = new Date();\n if (!existing) {\n const created: StorageResourceType = {\n id: resourceId,\n workingMemory,\n metadata: metadata ?? {},\n createdAt: now,\n updatedAt: now,\n };\n return this.saveResource({ resource: created });\n }\n\n const updated: StorageResourceType = {\n ...existing,\n workingMemory: workingMemory ?? existing.workingMemory,\n metadata: {\n ...existing.metadata,\n ...metadata,\n },\n updatedAt: now,\n };\n\n await this.saveResource({ resource: updated });\n return updated;\n }\n\n private parseStoredMessage(message: StoredMessage): MastraDBMessage {\n const content = safelyParseJSON(message.content);\n return {\n id: message.id,\n threadId: message.thread_id,\n content,\n role: message.role as MastraDBMessage['role'],\n type: message.type,\n createdAt: new Date(message.createdAt),\n resourceId: message.resourceId ?? undefined,\n };\n }\n\n private async addContextMessages({\n includeItem,\n allMessages,\n targetThreadId,\n messageIds,\n messages,\n }: {\n includeItem: NonNullable<StorageListMessagesInput['include']>[number];\n allMessages: StoredMessage[];\n targetThreadId: string;\n messageIds: Set<string>;\n messages: MastraDBMessage[];\n }): Promise<void> {\n const ordered = allMessages\n .filter(row => row.thread_id === targetThreadId)\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n\n const targetIndex = ordered.findIndex(row => row.id === includeItem.id);\n if (targetIndex === -1) return;\n\n if (includeItem.withPreviousMessages) {\n const start = Math.max(0, targetIndex - includeItem.withPreviousMessages);\n for (let i = start; i < targetIndex; i++) {\n const row = ordered[i];\n if (row && !messageIds.has(row.id)) {\n messages.push(this.parseStoredMessage(row));\n messageIds.add(row.id);\n }\n }\n }\n\n if (includeItem.withNextMessages) {\n const end = Math.min(ordered.length, targetIndex + includeItem.withNextMessages + 1);\n for (let i = targetIndex + 1; i < end; i++) {\n const row = ordered[i];\n if (row && !messageIds.has(row.id)) {\n messages.push(this.parseStoredMessage(row));\n messageIds.add(row.id);\n }\n }\n }\n }\n}\n","import crypto from 'node:crypto';\n\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type {\n ListScoresResponse,\n SaveScorePayload,\n ScoreRowData,\n ScoringEntityType,\n ScoringSource,\n} from '@mastra/core/evals';\nimport { TABLE_SCORERS, ScoresStorage, createStorageErrorId } from '@mastra/core/storage';\nimport type { StoragePagination } from '@mastra/core/storage';\n\nimport { ConvexDB, resolveConvexConfig } from '../../db';\nimport type { ConvexDomainConfig } from '../../db';\n\ntype StoredScore = Omit<ScoreRowData, 'createdAt' | 'updatedAt'> & {\n createdAt: string;\n updatedAt: string;\n};\n\nexport class ScoresConvex extends ScoresStorage {\n #db: ConvexDB;\n constructor(config: ConvexDomainConfig) {\n super();\n const client = resolveConvexConfig(config);\n this.#db = new ConvexDB(client);\n }\n\n async init(): Promise<void> {\n // No-op for Convex; schema is managed server-side.\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_SCORERS });\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n const row = await this.#db.load<StoredScore | null>({\n tableName: TABLE_SCORERS,\n keys: { id },\n });\n return row ? this.deserialize(row) : null;\n }\n\n async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n const now = new Date();\n const record = {\n ...score,\n id: crypto.randomUUID(),\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n } as StoredScore;\n\n await this.#db.insert({\n tableName: TABLE_SCORERS,\n record,\n });\n\n return { score: this.deserialize(record) };\n }\n\n async listScoresByScorerId({\n scorerId,\n pagination,\n entityId,\n entityType,\n source,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: ScoringEntityType;\n source?: ScoringSource;\n }): Promise<ListScoresResponse> {\n return this.listScores({\n filters: { scorerId, entityId, entityType, source },\n pagination,\n });\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n return this.listScores({\n filters: { runId },\n pagination,\n });\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n entityId: string;\n entityType: ScoringEntityType;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n return this.listScores({\n filters: { entityId, entityType },\n pagination,\n });\n }\n\n private async listScores({\n filters,\n pagination,\n }: {\n filters: Partial<Pick<ScoreRowData, 'scorerId' | 'entityId' | 'entityType' | 'runId' | 'source'>>;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n if (pagination.page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('CONVEX', 'LIST_SCORES', 'INVALID_PAGINATION'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n new Error('page must be >= 0'),\n );\n }\n\n const rows = await this.#db.queryTable<StoredScore>(TABLE_SCORERS, undefined);\n const filtered = rows\n .filter(row => (filters.scorerId ? row.scorerId === filters.scorerId : true))\n .filter(row => (filters.entityId ? row.entityId === filters.entityId : true))\n .filter(row => (filters.entityType ? row.entityType === filters.entityType : true))\n .filter(row => (filters.runId ? row.runId === filters.runId : true))\n .filter(row => (filters.source ? row.source === filters.source : true))\n .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n const { perPage, page } = pagination;\n const perPageValue = perPage === false ? filtered.length : perPage;\n const start = perPage === false ? 0 : page * perPageValue;\n const end = perPage === false ? filtered.length : start + perPageValue;\n const slice = filtered.slice(start, end).map(row => this.deserialize(row));\n\n return {\n pagination: {\n total: filtered.length,\n page,\n perPage,\n hasMore: perPage === false ? false : end < filtered.length,\n },\n scores: slice,\n };\n }\n\n private deserialize(row: StoredScore): ScoreRowData {\n return {\n ...(row as unknown as ScoreRowData),\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n };\n }\n}\n","import { TABLE_WORKFLOW_SNAPSHOT, normalizePerPage, WorkflowsStorage } from '@mastra/core/storage';\nimport type {\n StorageListWorkflowRunsInput,\n StorageWorkflowRun,\n WorkflowRun,\n WorkflowRuns,\n UpdateWorkflowStateOptions,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\n\nimport { ConvexDB, resolveConvexConfig } from '../../db';\nimport type { ConvexDomainConfig } from '../../db';\n\ntype RawWorkflowRun = Omit<StorageWorkflowRun, 'createdAt' | 'updatedAt' | 'snapshot'> & {\n createdAt: string;\n updatedAt: string;\n snapshot: WorkflowRunState | string;\n};\n\nexport class WorkflowsConvex extends WorkflowsStorage {\n #db: ConvexDB;\n constructor(config: ConvexDomainConfig) {\n super();\n const client = resolveConvexConfig(config);\n this.#db = new ConvexDB(client);\n }\n\n async init(): Promise<void> {\n // No-op for Convex; schema is managed server-side.\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_WORKFLOW_SNAPSHOT });\n }\n\n async updateWorkflowResults({\n workflowName,\n runId,\n stepId,\n result,\n requestContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n const run = await this.getRun(workflowName, runId);\n if (!run) return {};\n\n const snapshot = this.ensureSnapshot(run);\n snapshot.context = snapshot.context || {};\n snapshot.context[stepId] = result;\n snapshot.requestContext = { ...(snapshot.requestContext || {}), ...requestContext };\n\n await this.persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId: run.resourceId,\n snapshot,\n });\n\n return JSON.parse(JSON.stringify(snapshot.context));\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined> {\n const run = await this.getRun(workflowName, runId);\n if (!run) return undefined;\n\n const snapshot = this.ensureSnapshot(run);\n const updated = { ...snapshot, ...opts };\n\n await this.persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId: run.resourceId,\n snapshot: updated,\n });\n\n return updated;\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void> {\n const now = new Date();\n // Check if a record already exists to preserve createdAt\n const existing = await this.#db.load<{ createdAt?: string } | null>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n\n await this.#db.insert({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n record: {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot,\n createdAt: existing?.createdAt ?? (createdAt ? new Date(createdAt).toISOString() : now.toISOString()),\n updatedAt: updatedAt ? new Date(updatedAt).toISOString() : now.toISOString(),\n },\n });\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n const row = await this.#db.load<{ snapshot: WorkflowRunState | string } | null>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n\n if (!row) return null;\n return typeof row.snapshot === 'string' ? JSON.parse(row.snapshot) : JSON.parse(JSON.stringify(row.snapshot));\n }\n\n async listWorkflowRuns(args: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n const { workflowName, fromDate, toDate, perPage, page, resourceId, status } = args;\n\n // Use index hint if workflowName is provided - critical for performance\n const indexHint = workflowName ? { index: 'by_workflow' as const, workflowName } : undefined;\n\n let rows = await this.#db.queryTable<RawWorkflowRun>(TABLE_WORKFLOW_SNAPSHOT, undefined, indexHint);\n\n // Apply filters in JavaScript (status requires parsing snapshot JSON)\n if (workflowName) rows = rows.filter(run => run.workflow_name === workflowName);\n if (resourceId) rows = rows.filter(run => run.resourceId === resourceId);\n if (fromDate) rows = rows.filter(run => new Date(run.createdAt).getTime() >= fromDate.getTime());\n if (toDate) rows = rows.filter(run => new Date(run.createdAt).getTime() <= toDate.getTime());\n if (status) {\n rows = rows.filter(run => {\n const snapshot = this.ensureSnapshot(run);\n return snapshot.status === status;\n });\n }\n\n const total = rows.length;\n rows.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n if (perPage !== undefined && page !== undefined) {\n const normalized = normalizePerPage(perPage, Number.MAX_SAFE_INTEGER);\n const offset = page * normalized;\n rows = rows.slice(offset, offset + normalized);\n }\n\n const runs: WorkflowRun[] = rows.map(run => ({\n workflowName: run.workflow_name,\n runId: run.run_id,\n snapshot: this.ensureSnapshot(run),\n createdAt: new Date(run.createdAt),\n updatedAt: new Date(run.updatedAt),\n resourceId: run.resourceId,\n }));\n\n return { runs, total };\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n const runs = await this.#db.queryTable<RawWorkflowRun>(TABLE_WORKFLOW_SNAPSHOT, undefined);\n const match = runs.find(run => run.run_id === runId && (!workflowName || run.workflow_name === workflowName));\n if (!match) return null;\n\n return {\n workflowName: match.workflow_name,\n runId: match.run_id,\n snapshot: this.ensureSnapshot(match),\n createdAt: new Date(match.createdAt),\n updatedAt: new Date(match.updatedAt),\n resourceId: match.resourceId,\n };\n }\n\n async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n await this.#db.deleteMany(TABLE_WORKFLOW_SNAPSHOT, [`${workflowName}-${runId}`]);\n }\n\n private async getRun(workflowName: string, runId: string): Promise<RawWorkflowRun | null> {\n const runs = await this.#db.queryTable<RawWorkflowRun>(TABLE_WORKFLOW_SNAPSHOT, [\n { field: 'workflow_name', value: workflowName },\n ]);\n return runs.find(run => run.run_id === runId) ?? null;\n }\n\n private ensureSnapshot(run: { snapshot: WorkflowRunState | string }): WorkflowRunState {\n if (!run.snapshot) {\n return {\n context: {},\n activePaths: [],\n activeStepsPath: {},\n timestamp: Date.now(),\n suspendedPaths: {},\n resumeLabels: {},\n serializedStepGraph: [],\n value: {},\n waitingPaths: {},\n status: 'pending',\n runId: '',\n };\n }\n\n if (typeof run.snapshot === 'string') {\n return JSON.parse(run.snapshot);\n }\n\n return JSON.parse(JSON.stringify(run.snapshot));\n }\n}\n","import type { StorageDomains } from '@mastra/core/storage';\nimport { MastraCompositeStore } from '@mastra/core/storage';\n\nimport type { ConvexAdminClientConfig } from './client';\nimport { ConvexAdminClient } from './client';\nimport { MemoryConvex } from './domains/memory';\nimport { ScoresConvex } from './domains/scores';\nimport { WorkflowsConvex } from './domains/workflows';\n\n// Export domain classes for direct use with MastraStorage composition\nexport { MemoryConvex, ScoresConvex, WorkflowsConvex };\nexport type { ConvexDomainConfig } from './db';\n\n/**\n * Convex configuration type.\n *\n * Accepts either:\n * - A pre-configured ConvexAdminClient: `{ id, client }`\n * - Deployment config: `{ id, deploymentUrl, adminAuthToken, storageFunction? }`\n */\nexport type ConvexStoreConfig = {\n id: string;\n name?: string;\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new ConvexStore({ ...config, disableInit: false });\n * await storage.init(); // Explicitly run migrations\n *\n * // In runtime application:\n * const storage = new ConvexStore({ ...config, disableInit: true });\n * // No auto-init, tables must already exist\n */\n disableInit?: boolean;\n} & (\n | {\n /**\n * Pre-configured ConvexAdminClient.\n * Use this when you need to configure the client before initialization.\n *\n * @example\n * ```typescript\n * import { ConvexAdminClient } from '@mastra/convex/storage/client';\n *\n * const client = new ConvexAdminClient({\n * deploymentUrl: 'https://your-deployment.convex.cloud',\n * adminAuthToken: 'your-token',\n * storageFunction: 'custom/storage:handle',\n * });\n *\n * const store = new ConvexStore({ id: 'my-store', client });\n * ```\n */\n client: ConvexAdminClient;\n }\n | ConvexAdminClientConfig\n);\n\n/**\n * Type guard for pre-configured client config\n */\nconst isClientConfig = (config: ConvexStoreConfig): config is ConvexStoreConfig & { client: ConvexAdminClient } => {\n return 'client' in config;\n};\n\n/**\n * Convex storage adapter for Mastra.\n *\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * const storage = new ConvexStore({ id: 'my-store', deploymentUrl: '...', adminAuthToken: '...' });\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 */\nexport class ConvexStore extends MastraCompositeStore {\n declare stores: StorageDomains;\n\n constructor(config: ConvexStoreConfig) {\n super({ id: config.id, name: config.name ?? 'ConvexStore', disableInit: config.disableInit });\n\n // Handle pre-configured client vs creating new one\n const client = isClientConfig(config) ? config.client : new ConvexAdminClient(config);\n\n const domainConfig = { client };\n const memory = new MemoryConvex(domainConfig);\n const workflows = new WorkflowsConvex(domainConfig);\n const scores = new ScoresConvex(domainConfig);\n\n this.stores = {\n memory,\n workflows,\n scores,\n };\n }\n}\n","import crypto from 'node:crypto';\n\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n CreateIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n DeleteVectorsParams,\n DescribeIndexParams,\n IndexStats,\n QueryResult,\n QueryVectorParams,\n UpdateVectorParams,\n UpsertVectorParams,\n} from '@mastra/core/vector';\n\nimport type { ConvexAdminClientConfig } from '../storage/client';\nimport { ConvexAdminClient } from '../storage/client';\nimport type { StorageRequest } from '../storage/types';\n\ntype VectorRecord = {\n id: string;\n embedding: number[];\n metadata?: Record<string, any>;\n};\n\ntype VectorFilter = {\n metadata?: Record<string, any>;\n};\n\nconst INDEX_METADATA_TABLE = 'mastra_vector_indexes';\n\nexport type ConvexVectorConfig = ConvexAdminClientConfig & {\n id: string;\n};\n\nexport class ConvexVector extends MastraVector<VectorFilter> {\n private readonly client: ConvexAdminClient;\n\n constructor(config: ConvexVectorConfig) {\n super({ id: config.id });\n this.client = new ConvexAdminClient(config);\n }\n\n async createIndex({ indexName, dimension }: CreateIndexParams): Promise<void> {\n await this.callStorage({\n op: 'insert',\n tableName: INDEX_METADATA_TABLE,\n record: {\n id: indexName,\n indexName,\n dimension,\n metric: 'cosine',\n createdAt: new Date().toISOString(),\n },\n });\n }\n\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n await this.callStorage({\n op: 'deleteMany',\n tableName: INDEX_METADATA_TABLE,\n ids: [indexName],\n });\n // Delete in batches since each mutation can only delete a small number of docs\n // to stay within Convex's 1-second mutation timeout.\n await this.callStorageUntilComplete({\n op: 'clearTable',\n tableName: this.vectorTable(indexName),\n });\n }\n\n async truncateIndex({ indexName }: DeleteIndexParams): Promise<void> {\n // Delete in batches since each mutation can only delete a small number of docs\n // to stay within Convex's 1-second mutation timeout.\n await this.callStorageUntilComplete({\n op: 'clearTable',\n tableName: this.vectorTable(indexName),\n });\n }\n\n async listIndexes(): Promise<string[]> {\n const indexes = await this.callStorage<{ id: string }[]>({\n op: 'queryTable',\n tableName: INDEX_METADATA_TABLE,\n });\n return indexes.map(index => index.id);\n }\n\n async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n const index = await this.callStorage<{ dimension: number } | null>({\n op: 'load',\n tableName: INDEX_METADATA_TABLE,\n keys: { id: indexName },\n });\n if (!index) {\n throw new Error(`Index ${indexName} not found`);\n }\n\n const vectors = await this.callStorage<VectorRecord[]>({\n op: 'queryTable',\n tableName: this.vectorTable(indexName),\n });\n\n return {\n dimension: index.dimension,\n count: vectors.length,\n metric: 'cosine',\n };\n }\n\n async upsert({ indexName, vectors, ids, metadata }: UpsertVectorParams<VectorFilter>): Promise<string[]> {\n const vectorIds = ids ?? vectors.map(() => crypto.randomUUID());\n\n const records: VectorRecord[] = vectors.map((vector, i) => ({\n id: vectorIds[i]!,\n embedding: vector,\n metadata: metadata?.[i],\n }));\n\n await this.callStorage({\n op: 'batchInsert',\n tableName: this.vectorTable(indexName),\n records,\n });\n\n return vectorIds;\n }\n\n async query({\n indexName,\n queryVector,\n topK = 10,\n includeVector = false,\n filter,\n }: QueryVectorParams<VectorFilter>): Promise<QueryResult[]> {\n const vectors = await this.callStorage<VectorRecord[]>({\n op: 'queryTable',\n tableName: this.vectorTable(indexName),\n });\n\n const filtered =\n filter && !this.isEmptyFilter(filter)\n ? vectors.filter(record => this.matchesFilter(record.metadata, filter))\n : vectors;\n\n const scored = filtered\n .map(record => ({\n id: record.id,\n score: cosineSimilarity(queryVector, record.embedding),\n metadata: record.metadata,\n ...(includeVector ? { vector: record.embedding } : {}),\n }))\n .filter(result => Number.isFinite(result.score))\n .sort((a, b) => b.score - a.score)\n .slice(0, topK);\n\n return scored;\n }\n\n async updateVector(params: UpdateVectorParams<VectorFilter>): Promise<void> {\n const hasId = 'id' in params && params.id;\n const hasFilter = 'filter' in params && params.filter !== undefined;\n\n // Check for mutually exclusive parameters\n if (hasId && hasFilter) {\n throw new Error('ConvexVector.updateVector: id and filter are mutually exclusive');\n }\n\n // Check for filter-based update\n if (hasFilter) {\n const filter = params.filter as VectorFilter;\n // Check for empty filter\n if (this.isEmptyFilter(filter)) {\n throw new Error('ConvexVector.updateVector: cannot update with empty filter');\n }\n\n // Update by filter - find all matching records and update them\n const vectors = await this.callStorage<VectorRecord[]>({\n op: 'queryTable',\n tableName: this.vectorTable(params.indexName),\n });\n\n const matching = vectors.filter(record => this.matchesFilter(record.metadata, filter));\n\n for (const existing of matching) {\n const updated: VectorRecord = {\n ...existing,\n ...(params.update.vector ? { embedding: params.update.vector } : {}),\n ...(params.update.metadata ? { metadata: { ...existing.metadata, ...params.update.metadata } } : {}),\n };\n\n await this.callStorage({\n op: 'insert',\n tableName: this.vectorTable(params.indexName),\n record: updated,\n });\n }\n return;\n }\n\n // Update by id\n if (!hasId) {\n throw new Error('ConvexVector.updateVector: Either id or filter must be provided');\n }\n\n const existing = await this.callStorage<VectorRecord | null>({\n op: 'load',\n tableName: this.vectorTable(params.indexName),\n keys: { id: params.id },\n });\n if (!existing) return;\n\n const updated: VectorRecord = {\n ...existing,\n ...(params.update.vector ? { embedding: params.update.vector } : {}),\n ...(params.update.metadata ? { metadata: { ...existing.metadata, ...params.update.metadata } } : {}),\n };\n\n await this.callStorage({\n op: 'insert',\n tableName: this.vectorTable(params.indexName),\n record: updated,\n });\n }\n\n async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n await this.callStorage({\n op: 'deleteMany',\n tableName: this.vectorTable(indexName),\n ids: [id],\n });\n }\n\n async deleteVectors(params: DeleteVectorsParams<VectorFilter>): Promise<void> {\n const { indexName } = params;\n const hasIds = 'ids' in params && params.ids !== undefined;\n const hasFilter = 'filter' in params && params.filter !== undefined;\n\n // Check for mutually exclusive parameters\n if (hasIds && hasFilter) {\n throw new Error('ConvexVector.deleteVectors: ids and filter are mutually exclusive');\n }\n\n // Check that at least one is provided\n if (!hasIds && !hasFilter) {\n throw new Error('ConvexVector.deleteVectors: Either filter or ids must be provided');\n }\n\n // Handle ID-based deletion\n if (hasIds) {\n const ids = params.ids as string[];\n if (ids.length === 0) {\n throw new Error('ConvexVector.deleteVectors: cannot delete with empty ids array');\n }\n await this.callStorage({\n op: 'deleteMany',\n tableName: this.vectorTable(indexName),\n ids,\n });\n return;\n }\n\n // Handle filter-based deletion\n const filter = params.filter as VectorFilter;\n if (this.isEmptyFilter(filter)) {\n throw new Error('ConvexVector.deleteVectors: cannot delete with empty filter');\n }\n\n // Find all matching vectors and delete them\n const vectors = await this.callStorage<VectorRecord[]>({\n op: 'queryTable',\n tableName: this.vectorTable(indexName),\n });\n\n const matchingIds = vectors.filter(record => this.matchesFilter(record.metadata, filter)).map(record => record.id);\n\n if (matchingIds.length > 0) {\n await this.callStorage({\n op: 'deleteMany',\n tableName: this.vectorTable(indexName),\n ids: matchingIds,\n });\n }\n }\n\n private vectorTable(indexName: string) {\n return `mastra_vector_${indexName}`;\n }\n\n private isEmptyFilter(filter: VectorFilter | Record<string, any>): boolean {\n if (!filter) return true;\n return Object.keys(filter).length === 0;\n }\n\n private matchesFilter(\n recordMetadata: Record<string, any> | undefined,\n filter: VectorFilter | Record<string, any>,\n ): boolean {\n if (!recordMetadata) return false;\n if (!filter || Object.keys(filter).length === 0) return true;\n\n // Handle VectorFilter with metadata property\n if ('metadata' in filter && filter.metadata) {\n return this.matchesFilterConditions(recordMetadata, filter.metadata);\n }\n\n // Handle direct filter conditions\n return this.matchesFilterConditions(recordMetadata, filter);\n }\n\n private matchesFilterConditions(recordMetadata: Record<string, any>, conditions: Record<string, any>): boolean {\n for (const [key, value] of Object.entries(conditions)) {\n // Handle $and operator\n if (key === '$and' && Array.isArray(value)) {\n const allMatch = value.every((cond: Record<string, any>) => this.matchesFilterConditions(recordMetadata, cond));\n if (!allMatch) return false;\n continue;\n }\n\n // Handle $or operator\n if (key === '$or' && Array.isArray(value)) {\n const anyMatch = value.some((cond: Record<string, any>) => this.matchesFilterConditions(recordMetadata, cond));\n if (!anyMatch) return false;\n continue;\n }\n\n // Handle $in operator\n if (typeof value === 'object' && value !== null && '$in' in value) {\n if (!Array.isArray(value.$in) || !value.$in.includes(recordMetadata[key])) {\n return false;\n }\n continue;\n }\n\n // Handle $nin operator\n if (typeof value === 'object' && value !== null && '$nin' in value) {\n if (Array.isArray(value.$nin) && value.$nin.includes(recordMetadata[key])) {\n return false;\n }\n continue;\n }\n\n // Handle $gt operator\n if (typeof value === 'object' && value !== null && '$gt' in value) {\n if (!(recordMetadata[key] > value.$gt)) {\n return false;\n }\n continue;\n }\n\n // Handle $gte operator\n if (typeof value === 'object' && value !== null && '$gte' in value) {\n if (!(recordMetadata[key] >= value.$gte)) {\n return false;\n }\n continue;\n }\n\n // Handle $lt operator\n if (typeof value === 'object' && value !== null && '$lt' in value) {\n if (!(recordMetadata[key] < value.$lt)) {\n return false;\n }\n continue;\n }\n\n // Handle $lte operator\n if (typeof value === 'object' && value !== null && '$lte' in value) {\n if (!(recordMetadata[key] <= value.$lte)) {\n return false;\n }\n continue;\n }\n\n // Handle $ne operator\n if (typeof value === 'object' && value !== null && '$ne' in value) {\n if (recordMetadata[key] === value.$ne) {\n return false;\n }\n continue;\n }\n\n // Handle simple equality\n if (recordMetadata[key] !== value) {\n return false;\n }\n }\n\n return true;\n }\n\n private async callStorage<T = any>(request: StorageRequest): Promise<T> {\n return this.client.callStorage<T>(request);\n }\n\n /**\n * Call storage repeatedly until hasMore is false.\n * Use for bulk operations like clearTable that may need multiple batches.\n */\n private async callStorageUntilComplete(request: StorageRequest): Promise<void> {\n let hasMore = true;\n while (hasMore) {\n const response = await this.client.callStorageRaw(request);\n hasMore = response.hasMore ?? false;\n }\n }\n}\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n return -1;\n }\n\n let dot = 0;\n let magA = 0;\n let magB = 0;\n\n for (let i = 0; i < a.length; i++) {\n const aVal = a[i] ?? 0;\n const bVal = b[i] ?? 0;\n dot += aVal * bVal;\n magA += aVal * aVal;\n magB += bVal * bVal;\n }\n\n if (magA === 0 || magB === 0) {\n return -1;\n }\n\n return dot / (Math.sqrt(magA) * Math.sqrt(magB));\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { mastraStorage } from './chunk-
|
|
1
|
+
export { mastraStorage } from './chunk-2HJD4TC6.js';
|
|
2
2
|
export { TABLE_MESSAGES, TABLE_RESOURCES, TABLE_SCORERS, TABLE_THREADS, TABLE_WORKFLOW_SNAPSHOT, mastraDocumentsTable, mastraMessagesTable, mastraResourcesTable, mastraScoresTable, mastraThreadsTable, mastraVectorIndexesTable, mastraVectorsTable, mastraWorkflowSnapshotsTable } from './chunk-G5FLGAPE.js';
|
|
3
3
|
import { MastraCompositeStore, MemoryStorage, TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES, createStorageErrorId, normalizePerPage, calculatePagination, filterByDateRange, safelyParseJSON, WorkflowsStorage, TABLE_WORKFLOW_SNAPSHOT, ScoresStorage, TABLE_SCORERS } from '@mastra/core/storage';
|
|
4
4
|
import { MessageList } from '@mastra/core/agent';
|
|
@@ -140,11 +140,12 @@ var ConvexDB = class extends MastraBase {
|
|
|
140
140
|
});
|
|
141
141
|
return result;
|
|
142
142
|
}
|
|
143
|
-
async queryTable(tableName, filters) {
|
|
143
|
+
async queryTable(tableName, filters, indexHint) {
|
|
144
144
|
return this.client.callStorage({
|
|
145
145
|
op: "queryTable",
|
|
146
146
|
tableName,
|
|
147
|
-
filters
|
|
147
|
+
filters,
|
|
148
|
+
indexHint
|
|
148
149
|
});
|
|
149
150
|
}
|
|
150
151
|
async deleteMany(tableName, ids) {
|
|
@@ -772,7 +773,9 @@ var WorkflowsConvex = class extends WorkflowsStorage {
|
|
|
772
773
|
workflowName,
|
|
773
774
|
runId,
|
|
774
775
|
resourceId,
|
|
775
|
-
snapshot
|
|
776
|
+
snapshot,
|
|
777
|
+
createdAt,
|
|
778
|
+
updatedAt
|
|
776
779
|
}) {
|
|
777
780
|
const now = /* @__PURE__ */ new Date();
|
|
778
781
|
const existing = await this.#db.load({
|
|
@@ -786,8 +789,8 @@ var WorkflowsConvex = class extends WorkflowsStorage {
|
|
|
786
789
|
run_id: runId,
|
|
787
790
|
resourceId,
|
|
788
791
|
snapshot,
|
|
789
|
-
createdAt: existing?.createdAt ?? now.toISOString(),
|
|
790
|
-
updatedAt: now.toISOString()
|
|
792
|
+
createdAt: existing?.createdAt ?? (createdAt ? new Date(createdAt).toISOString() : now.toISOString()),
|
|
793
|
+
updatedAt: updatedAt ? new Date(updatedAt).toISOString() : now.toISOString()
|
|
791
794
|
}
|
|
792
795
|
});
|
|
793
796
|
}
|
|
@@ -804,7 +807,8 @@ var WorkflowsConvex = class extends WorkflowsStorage {
|
|
|
804
807
|
}
|
|
805
808
|
async listWorkflowRuns(args = {}) {
|
|
806
809
|
const { workflowName, fromDate, toDate, perPage, page, resourceId, status } = args;
|
|
807
|
-
|
|
810
|
+
const indexHint = workflowName ? { index: "by_workflow", workflowName } : void 0;
|
|
811
|
+
let rows = await this.#db.queryTable(TABLE_WORKFLOW_SNAPSHOT, void 0, indexHint);
|
|
808
812
|
if (workflowName) rows = rows.filter((run) => run.workflow_name === workflowName);
|
|
809
813
|
if (resourceId) rows = rows.filter((run) => run.resourceId === resourceId);
|
|
810
814
|
if (fromDate) rows = rows.filter((run) => new Date(run.createdAt).getTime() >= fromDate.getTime());
|