@mastra/convex 1.0.11 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +138 -0
  2. package/README.md +76 -4
  3. package/dist/cache/client.d.ts +21 -0
  4. package/dist/cache/client.d.ts.map +1 -0
  5. package/dist/cache/index.d.ts +35 -0
  6. package/dist/cache/index.d.ts.map +1 -0
  7. package/dist/cache/types.d.ts +46 -0
  8. package/dist/cache/types.d.ts.map +1 -0
  9. package/dist/{chunk-FTVDAP6U.cjs → chunk-CV23JOCS.cjs} +44 -2
  10. package/dist/chunk-CV23JOCS.cjs.map +1 -0
  11. package/dist/chunk-EEELVBWO.cjs +893 -0
  12. package/dist/chunk-EEELVBWO.cjs.map +1 -0
  13. package/dist/chunk-FZDLZ4S3.js +887 -0
  14. package/dist/chunk-FZDLZ4S3.js.map +1 -0
  15. package/dist/{chunk-G5FLGAPE.js → chunk-JPWDG4L3.js} +42 -3
  16. package/dist/chunk-JPWDG4L3.js.map +1 -0
  17. package/dist/docs/SKILL.md +1 -1
  18. package/dist/docs/assets/SOURCE_MAP.json +44 -15
  19. package/dist/docs/references/reference-storage-convex.md +74 -12
  20. package/dist/docs/references/reference-vectors-convex.md +129 -7
  21. package/dist/index.cjs +515 -36
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +471 -23
  26. package/dist/index.js.map +1 -1
  27. package/dist/schema.cjs +29 -17
  28. package/dist/schema.d.ts +76 -0
  29. package/dist/schema.d.ts.map +1 -1
  30. package/dist/schema.js +1 -1
  31. package/dist/server/cache.d.ts +5 -0
  32. package/dist/server/cache.d.ts.map +1 -0
  33. package/dist/server/index.cjs +44 -16
  34. package/dist/server/index.d.ts +3 -1
  35. package/dist/server/index.d.ts.map +1 -1
  36. package/dist/server/index.js +2 -2
  37. package/dist/server/native-vector.d.ts +17 -0
  38. package/dist/server/native-vector.d.ts.map +1 -0
  39. package/dist/storage/client.d.ts +5 -0
  40. package/dist/storage/client.d.ts.map +1 -1
  41. package/dist/vector/native.d.ts +111 -0
  42. package/dist/vector/native.d.ts.map +1 -0
  43. package/package.json +5 -5
  44. package/dist/chunk-C6QDNSBM.cjs +0 -425
  45. package/dist/chunk-C6QDNSBM.cjs.map +0 -1
  46. package/dist/chunk-FTVDAP6U.cjs.map +0 -1
  47. package/dist/chunk-G5FLGAPE.js.map +0 -1
  48. package/dist/chunk-NXNW2MK5.js +0 -423
  49. package/dist/chunk-NXNW2MK5.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/cache.ts","../src/server/index-map.ts","../src/server/storage.ts","../src/server/native-vector.ts"],"names":["cleanup","mutationGeneric","mapInBatches"],"mappings":"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","file":"chunk-FZDLZ4S3.js","sourcesContent":["import type { GenericMutationCtx as MutationCtx } from 'convex/server';\nimport { mutationGeneric } from 'convex/server';\nimport type { GenericId } from 'convex/values';\n\nimport type { CacheRequest, CacheResponse } from '../cache/types';\n\nconst CACHE_TABLE = 'mastra_cache';\nconst CACHE_LIST_TABLE = 'mastra_cache_list_items';\nconst CACHE_MUTATION_BATCH_SIZE = 25;\n\ntype CacheKind = 'value' | 'list' | 'counter' | 'deleted';\ntype CacheDoc = {\n _id: GenericId<string>;\n key: string;\n keyPrefix: string;\n kind: CacheKind;\n value?: string;\n counter?: number;\n expiresAt: number | null;\n};\ntype CacheListItem = {\n _id: GenericId<string>;\n key: string;\n keyPrefix: string;\n index: number;\n value: string;\n};\ntype DeleteBatchResult = {\n hasMore: boolean;\n};\n\nfunction encodeValue(value: unknown): string {\n // The cache wire format stores JSON strings; undefined is represented as null.\n return JSON.stringify(value === undefined ? null : value);\n}\n\nfunction decodeValue(value: string): unknown {\n return JSON.parse(value);\n}\n\nfunction isExpired(doc: { expiresAt: number | null }, now: number): boolean {\n return doc.expiresAt !== null && doc.expiresAt <= now;\n}\n\nfunction normalizeListRange(from: number, to: number, length: number): { from: number; to: number } | null {\n const normalizedFrom = from < 0 ? Math.max(length + from, 0) : from;\n const normalizedTo = to < 0 ? length + to : to;\n if (normalizedTo < normalizedFrom || normalizedFrom >= length) return null;\n return { from: normalizedFrom, to: normalizedTo };\n}\n\nasync function findCacheDoc(ctx: MutationCtx<any>, key: string): Promise<CacheDoc | null> {\n return (await ctx.db\n .query(CACHE_TABLE)\n .withIndex('by_key', (q: any) => q.eq('key', key))\n .first()) as CacheDoc | null;\n}\n\nasync function deleteCacheKey(ctx: MutationCtx<any>, key: string): Promise<DeleteBatchResult> {\n const [doc, listItems] = await Promise.all([\n findCacheDoc(ctx, key),\n ctx.db\n .query(CACHE_LIST_TABLE)\n .withIndex('by_key_index', (q: any) => q.eq('key', key))\n .take(CACHE_MUTATION_BATCH_SIZE + 1),\n ]);\n\n if (doc && doc.kind !== 'deleted') {\n await ctx.db.patch(doc._id, { kind: 'deleted' });\n }\n\n for (const item of listItems.slice(0, CACHE_MUTATION_BATCH_SIZE) as CacheListItem[]) {\n await ctx.db.delete(item._id);\n }\n\n const hasMore = listItems.length > CACHE_MUTATION_BATCH_SIZE;\n if (doc && !hasMore) {\n await ctx.db.delete(doc._id);\n }\n\n return {\n hasMore,\n };\n}\n\nasync function getLiveCacheDoc(\n ctx: MutationCtx<any>,\n key: string,\n now: number,\n): Promise<{ doc: CacheDoc | null; hasMore: boolean }> {\n const doc = await findCacheDoc(ctx, key);\n if (!doc) return { doc: null, hasMore: false };\n if (doc.kind === 'deleted') {\n const cleanup = await deleteCacheKey(ctx, key);\n return { doc: null, hasMore: cleanup.hasMore };\n }\n if (!isExpired(doc, now)) return { doc, hasMore: false };\n\n const cleanup = await deleteCacheKey(ctx, key);\n return { doc: null, hasMore: cleanup.hasMore };\n}\n\nasync function writeCacheDoc(\n ctx: MutationCtx<any>,\n key: string,\n existing: CacheDoc | null,\n patch: Omit<CacheDoc, '_id' | 'key'>,\n): Promise<CacheDoc> {\n if (existing) {\n await ctx.db.patch(existing._id, patch);\n return { ...existing, ...patch };\n }\n\n const _id = await ctx.db.insert(CACHE_TABLE, { key, ...patch });\n return { _id, key, ...patch };\n}\n\nasync function clearPrefix(ctx: MutationCtx<any>, keyPrefix: string): Promise<boolean> {\n const [docs, orphanListItems] = await Promise.all([\n ctx.db\n .query(CACHE_TABLE)\n .withIndex('by_key_prefix', (q: any) => q.eq('keyPrefix', keyPrefix))\n .take(CACHE_MUTATION_BATCH_SIZE + 1),\n ctx.db\n .query(CACHE_LIST_TABLE)\n .withIndex('by_key_prefix', (q: any) => q.eq('keyPrefix', keyPrefix))\n .take(1),\n ]);\n\n if (docs.length > 0) {\n for (const doc of docs.slice(0, CACHE_MUTATION_BATCH_SIZE) as CacheDoc[]) {\n if (doc.kind === 'list' || doc.kind === 'deleted') {\n const cleanup = await deleteCacheKey(ctx, doc.key);\n return cleanup.hasMore || docs.length > 1 || orphanListItems.length > 0;\n }\n\n await ctx.db.delete(doc._id);\n }\n\n return docs.length > CACHE_MUTATION_BATCH_SIZE || orphanListItems.length > 0;\n }\n\n const listItems = (await ctx.db\n .query(CACHE_LIST_TABLE)\n .withIndex('by_key_prefix', (q: any) => q.eq('keyPrefix', keyPrefix))\n .take(CACHE_MUTATION_BATCH_SIZE + 1)) as CacheListItem[];\n\n for (const item of listItems.slice(0, CACHE_MUTATION_BATCH_SIZE)) {\n await ctx.db.delete(item._id);\n }\n\n return listItems.length > CACHE_MUTATION_BATCH_SIZE;\n}\n\nexport async function handleCacheOperation(ctx: MutationCtx<any>, request: CacheRequest): Promise<CacheResponse> {\n const now = Date.now();\n\n switch (request.op) {\n case 'get': {\n const { doc, hasMore } = await getLiveCacheDoc(ctx, request.key, now);\n if (hasMore) return { ok: true, result: null, hasMore: true };\n if (!doc || doc.kind !== 'value') return { ok: true, result: null };\n return { ok: true, result: decodeValue(doc.value ?? 'null') };\n }\n\n case 'set': {\n let existing = await findCacheDoc(ctx, request.key);\n if (existing && (isExpired(existing, now) || existing.kind !== 'value')) {\n const cleanup = await deleteCacheKey(ctx, request.key);\n if (cleanup.hasMore) {\n return { ok: true, hasMore: true };\n }\n existing = null;\n }\n\n await writeCacheDoc(ctx, request.key, existing, {\n keyPrefix: request.keyPrefix,\n kind: 'value',\n value: encodeValue(request.value),\n expiresAt: request.expiresAt,\n });\n return { ok: true };\n }\n\n case 'listLength': {\n const { doc, hasMore } = await getLiveCacheDoc(ctx, request.key, now);\n if (hasMore) return { ok: true, result: 0, hasMore: true };\n if (!doc) return { ok: true, result: 0 };\n if (doc.kind !== 'list') return { ok: false, error: `${request.key} exists but is not an array` };\n\n return { ok: true, result: doc.counter ?? 0 };\n }\n\n case 'listPush': {\n let existing = await findCacheDoc(ctx, request.key);\n if (existing && (isExpired(existing, now) || existing.kind === 'deleted')) {\n const cleanup = await deleteCacheKey(ctx, request.key);\n if (cleanup.hasMore) {\n return { ok: true, hasMore: true };\n }\n existing = null;\n }\n if (existing && existing.kind !== 'list') {\n return { ok: false, error: `${request.key} exists but is not an array` };\n }\n\n const doc = existing\n ? await writeCacheDoc(ctx, request.key, existing, {\n kind: 'list',\n keyPrefix: request.keyPrefix,\n counter: (existing.counter ?? 0) + 1,\n expiresAt: request.expiresAt,\n })\n : await writeCacheDoc(ctx, request.key, null, {\n kind: 'list',\n keyPrefix: request.keyPrefix,\n counter: 1,\n expiresAt: request.expiresAt,\n });\n\n await ctx.db.insert(CACHE_LIST_TABLE, {\n key: request.key,\n keyPrefix: request.keyPrefix,\n index: (doc.counter ?? 1) - 1,\n value: encodeValue(request.value),\n });\n\n return { ok: true };\n }\n\n case 'listFromTo': {\n const { doc, hasMore } = await getLiveCacheDoc(ctx, request.key, now);\n if (hasMore) return { ok: true, result: [], hasMore: true };\n if (!doc || doc.kind !== 'list') return { ok: true, result: [] };\n\n const range = normalizeListRange(request.from, request.to, doc.counter ?? 0);\n if (!range) return { ok: true, result: [] };\n\n const query = ctx.db.query(CACHE_LIST_TABLE).withIndex('by_key_index', (q: any) => {\n return q.eq('key', request.key).gte('index', range.from).lte('index', range.to);\n });\n const items = (await query.collect()) as CacheListItem[];\n\n return { ok: true, result: items.map(item => decodeValue(item.value)) };\n }\n\n case 'delete': {\n const cleanup = await deleteCacheKey(ctx, request.key);\n return { ok: true, hasMore: cleanup.hasMore };\n }\n\n case 'clear': {\n const hasMore = await clearPrefix(ctx, request.keyPrefix);\n return { ok: true, hasMore };\n }\n\n case 'increment': {\n let existing = await findCacheDoc(ctx, request.key);\n if (existing && (isExpired(existing, now) || existing.kind === 'deleted')) {\n const cleanup = await deleteCacheKey(ctx, request.key);\n if (cleanup.hasMore) {\n return { ok: true, hasMore: true };\n }\n existing = null;\n }\n if (existing && existing.kind !== 'counter') {\n return { ok: false, error: `${request.key} exists but is not a number` };\n }\n\n const nextCounter = (existing?.counter ?? 0) + 1;\n await writeCacheDoc(ctx, request.key, existing, {\n kind: 'counter',\n keyPrefix: request.keyPrefix,\n counter: nextCounter,\n expiresAt: request.expiresAt,\n });\n\n return { ok: true, result: nextCounter };\n }\n }\n\n return { ok: false, error: `Unsupported operation ${(request as any).op}` };\n}\n\nexport const mastraCache = mutationGeneric(\n async (ctx, request: CacheRequest): Promise<CacheResponse> => handleCacheOperation(ctx, request),\n);\n","/**\n * Index definitions for automatic query optimization.\n *\n * Maps each typed Convex table to its available indexes and their field lists.\n * Indexes with more fields are listed first so the best (most specific) match\n * is preferred during selection.\n *\n * These must stay in sync with the index definitions in schema.ts.\n */\nimport type { EqualityFilter } from '../storage/types';\n\nexport const TABLE_INDEX_MAP: Record<string, Array<{ name: string; fields: string[] }>> = {\n mastra_messages: [\n { name: 'by_thread_created', fields: ['thread_id', 'createdAt'] },\n { name: 'by_thread', fields: ['thread_id'] },\n { name: 'by_resource', fields: ['resourceId'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n mastra_threads: [\n { name: 'by_resource', fields: ['resourceId'] },\n { name: 'by_created', fields: ['createdAt'] },\n { name: 'by_updated', fields: ['updatedAt'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n mastra_resources: [\n { name: 'by_updated', fields: ['updatedAt'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n mastra_workflow_snapshots: [\n { name: 'by_workflow_run', fields: ['workflow_name', 'run_id'] },\n { name: 'by_workflow', fields: ['workflow_name'] },\n { name: 'by_resource', fields: ['resourceId'] },\n { name: 'by_created', fields: ['createdAt'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n mastra_scorers: [\n { name: 'by_entity', fields: ['entityId', 'entityType'] },\n { name: 'by_scorer', fields: ['scorerId'] },\n { name: 'by_run', fields: ['runId'] },\n { name: 'by_created', fields: ['createdAt'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n mastra_vector_indexes: [\n { name: 'by_name', fields: ['indexName'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n};\n\n/**\n * Finds the best matching index for the given equality filters on a Convex table.\n *\n * Returns the index name and the subset of filters that form the index prefix,\n * or null when no index matches.\n *\n * The \"best\" index is the one whose prefix has the most consecutive fields\n * covered by the provided filters. For example, given filters for `thread_id`\n * and `createdAt` on mastra_messages, the composite `by_thread_created` index\n * (fields: [thread_id, createdAt]) is preferred over `by_thread` (fields: [thread_id]).\n */\nexport function findBestIndex(\n convexTable: string,\n filters: EqualityFilter[],\n): { indexName: string; indexedFilters: EqualityFilter[] } | null {\n const indexes = TABLE_INDEX_MAP[convexTable];\n if (!indexes || filters.length === 0) return null;\n\n const filtersByField = new Map<string, EqualityFilter>();\n for (const f of filters) {\n filtersByField.set(f.field, f);\n }\n\n let best: { indexName: string; indexedFilters: EqualityFilter[]; prefixLength: number } | null = null;\n\n for (const index of indexes) {\n let prefixLength = 0;\n const indexedFilters: EqualityFilter[] = [];\n\n for (const field of index.fields) {\n const filter = filtersByField.get(field);\n if (filter) {\n prefixLength++;\n indexedFilters.push(filter);\n } else {\n break;\n }\n }\n\n if (prefixLength > 0 && (!best || prefixLength > best.prefixLength)) {\n best = { indexName: index.name, indexedFilters, prefixLength };\n }\n }\n\n return best ? { indexName: best.indexName, indexedFilters: best.indexedFilters } : null;\n}\n","import {\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_MESSAGES,\n TABLE_THREADS,\n TABLE_RESOURCES,\n TABLE_SCORERS,\n} from '@mastra/core/storage/constants';\nimport type { GenericMutationCtx as MutationCtx } from 'convex/server';\nimport { mutationGeneric } from 'convex/server';\nimport type { GenericId } from 'convex/values';\n\nimport type { StorageRequest, StorageResponse } from '../storage/types';\nimport { findBestIndex } from './index-map';\n\n// Vector-specific table names (not in @mastra/core)\nconst TABLE_VECTOR_INDEXES = 'mastra_vector_indexes';\nconst VECTOR_TABLE_PREFIX = 'mastra_vector_';\nconst CONVEX_TABLE_WORKFLOW_SNAPSHOTS = 'mastra_workflow_snapshots';\nconst STORAGE_MUTATION_BATCH_SIZE = 25;\n\ntype ConvexDocWithId = { _id: GenericId<string> };\ntype StorageRecord = Record<string, unknown> & { id?: unknown };\n\nasync function mapInBatches<TInput, TOutput>(\n inputs: TInput[],\n batchSize: number,\n mapper: (input: TInput) => Promise<TOutput>,\n): Promise<TOutput[]> {\n const results: TOutput[] = [];\n for (let index = 0; index < inputs.length; index += batchSize) {\n results.push(...(await Promise.all(inputs.slice(index, index + batchSize).map(mapper))));\n }\n return results;\n}\n\nasync function deleteDocs(ctx: MutationCtx<any>, docs: ConvexDocWithId[]): Promise<void> {\n await mapInBatches(docs, STORAGE_MUTATION_BATCH_SIZE, doc => ctx.db.delete(doc._id));\n}\n\nasync function findExistingDocsByIds(\n ids: string[],\n findDoc: (id: string) => Promise<ConvexDocWithId | null | undefined>,\n): Promise<ConvexDocWithId[]> {\n const docs = await mapInBatches([...new Set(ids)], STORAGE_MUTATION_BATCH_SIZE, findDoc);\n return docs.filter((doc): doc is ConvexDocWithId => Boolean(doc));\n}\n\nfunction coalesceTypedRecordsForBatchInsert(records: StorageRecord[]): StorageRecord[] {\n const recordsById = new Map<string, StorageRecord>();\n for (const record of records) {\n const id = record.id;\n if (!id) continue;\n\n const key = String(id);\n recordsById.set(key, { ...(recordsById.get(key) ?? {}), ...record });\n }\n return [...recordsById.values()];\n}\n\nfunction coalesceLastRecordById(records: StorageRecord[]): StorageRecord[] {\n const recordsById = new Map<string, StorageRecord>();\n for (const record of records) {\n const id = record.id;\n if (!id) continue;\n recordsById.set(String(id), record);\n }\n return [...recordsById.values()];\n}\n\n/**\n * Determines which Convex table to use based on the logical table name.\n * Returns the Convex table name and whether it's a typed table or fallback.\n */\nfunction resolveTable(tableName: string): { convexTable: string; isTyped: boolean } {\n switch (tableName) {\n case TABLE_THREADS:\n return { convexTable: 'mastra_threads', isTyped: true };\n case TABLE_MESSAGES:\n return { convexTable: 'mastra_messages', isTyped: true };\n case TABLE_RESOURCES:\n return { convexTable: 'mastra_resources', isTyped: true };\n case TABLE_WORKFLOW_SNAPSHOT:\n return { convexTable: CONVEX_TABLE_WORKFLOW_SNAPSHOTS, isTyped: true };\n case TABLE_SCORERS:\n return { convexTable: 'mastra_scorers', isTyped: true };\n case TABLE_VECTOR_INDEXES:\n return { convexTable: 'mastra_vector_indexes', isTyped: true };\n default:\n // Check if it's a vector data table\n if (tableName.startsWith(VECTOR_TABLE_PREFIX)) {\n return { convexTable: 'mastra_vectors', isTyped: true };\n }\n // Fallback to generic documents table for unknown tables\n return { convexTable: 'mastra_documents', isTyped: false };\n }\n}\n\n/**\n * Main storage mutation handler.\n * Routes operations to the appropriate typed table.\n */\nexport const mastraStorage = mutationGeneric(async (ctx, request: StorageRequest): Promise<StorageResponse> => {\n try {\n const { convexTable, isTyped } = resolveTable(request.tableName);\n\n // Handle vector data tables specially (but NOT vector_indexes which is a typed table)\n if (request.tableName.startsWith(VECTOR_TABLE_PREFIX) && request.tableName !== TABLE_VECTOR_INDEXES) {\n return handleVectorOperation(ctx, request);\n }\n\n // Handle typed tables\n if (isTyped) {\n return handleTypedOperation(ctx, convexTable, request);\n }\n\n // Fallback to generic table for unknown tables\n return handleGenericOperation(ctx, request);\n } catch (error) {\n const err = error as Error;\n return {\n ok: false,\n error: err.message,\n };\n }\n});\n\n/**\n * Handle operations on typed tables (threads, messages, etc.)\n * Records are stored with their `id` field as a regular field (not _id).\n * We query by the `id` field to find/update records.\n */\nexport async function handleTypedOperation(\n ctx: MutationCtx<any>,\n convexTable: string,\n request: StorageRequest,\n): Promise<StorageResponse> {\n switch (request.op) {\n case 'insert': {\n const record = request.record;\n const id = record.id;\n if (!id) {\n throw new Error(`Record is missing an id`);\n }\n\n // Find existing record by id field using index\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_record_id', (q: any) => q.eq('id', id))\n .unique();\n\n if (existing) {\n // Update existing - don't include id in patch (it's already set)\n const { id: _, ...updateData } = record;\n await ctx.db.patch(existing._id, updateData);\n } else {\n // Insert new - include id as a regular field\n await ctx.db.insert(convexTable, record);\n }\n return { ok: true };\n }\n\n case 'batchInsert': {\n const records = coalesceTypedRecordsForBatchInsert(request.records);\n await mapInBatches(records, STORAGE_MUTATION_BATCH_SIZE, async record => {\n const id = record.id;\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_record_id', (q: any) => q.eq('id', id))\n .unique();\n\n if (existing) {\n const { id: _, ...updateData } = record;\n await ctx.db.patch(existing._id, updateData);\n } else {\n await ctx.db.insert(convexTable, record);\n }\n });\n return { ok: true };\n }\n\n case 'load': {\n const keys = request.keys;\n if (keys.id) {\n // Find by id field using index\n const doc = await ctx.db\n .query(convexTable)\n .withIndex('by_record_id', (q: any) => q.eq('id', keys.id))\n .unique();\n return { ok: true, result: doc || null };\n }\n\n if (\n convexTable === CONVEX_TABLE_WORKFLOW_SNAPSHOTS &&\n typeof keys.workflow_name === 'string' &&\n typeof keys.run_id === 'string'\n ) {\n const doc = await ctx.db\n .query(convexTable)\n .withIndex('by_workflow_run', (q: any) => q.eq('workflow_name', keys.workflow_name).eq('run_id', keys.run_id))\n .unique();\n return { ok: true, result: doc || null };\n }\n\n // Query by other fields - use take() to avoid 32k limit\n const docs = await ctx.db.query(convexTable).take(10000);\n const match = docs.find((doc: any) => Object.entries(keys).every(([key, value]) => doc[key] === value));\n return { ok: true, result: match || null };\n }\n\n case 'queryTable': {\n // Use take() to avoid hitting Convex's 32k document limit\n const maxDocs = request.limit ? Math.min(request.limit * 2, 10000) : 10000;\n\n // Build query with index if hint provided for efficient filtering\n let docs: any[];\n if (request.indexHint) {\n const hint = request.indexHint;\n if (hint.index === 'by_workflow') {\n docs = await ctx.db\n .query(convexTable)\n .withIndex('by_workflow', (q: any) => q.eq('workflow_name', hint.workflowName))\n .take(maxDocs);\n } else if (hint.index === 'by_workflow_run') {\n docs = await ctx.db\n .query(convexTable)\n .withIndex('by_workflow_run', (q: any) => q.eq('workflow_name', hint.workflowName).eq('run_id', hint.runId))\n .take(maxDocs);\n } else {\n docs = await ctx.db.query(convexTable).take(maxDocs);\n }\n } else if (request.filters && request.filters.length > 0) {\n const match = findBestIndex(convexTable, request.filters);\n if (match) {\n docs = await ctx.db\n .query(convexTable)\n .withIndex(match.indexName, (q: any) => {\n let builder = q;\n for (const filter of match.indexedFilters) {\n builder = builder.eq(filter.field, filter.value);\n }\n return builder;\n })\n .take(maxDocs);\n } else {\n docs = await ctx.db.query(convexTable).take(maxDocs);\n }\n } else {\n docs = await ctx.db.query(convexTable).take(maxDocs);\n }\n\n // Apply additional filters if provided\n if (request.filters && request.filters.length > 0) {\n docs = docs.filter((doc: any) => request.filters!.every(filter => doc[filter.field] === filter.value));\n }\n\n // Apply limit if provided\n if (request.limit) {\n docs = docs.slice(0, request.limit);\n }\n\n return { ok: true, result: docs };\n }\n\n case 'clearTable':\n case 'dropTable': {\n // Delete a small batch per call to stay within Convex's 1-second mutation timeout.\n // Client must call repeatedly until hasMore is false.\n const docs = await ctx.db.query(convexTable).take(STORAGE_MUTATION_BATCH_SIZE + 1);\n const hasMore = docs.length > STORAGE_MUTATION_BATCH_SIZE;\n const docsToDelete = hasMore ? docs.slice(0, STORAGE_MUTATION_BATCH_SIZE) : docs;\n\n await deleteDocs(ctx, docsToDelete);\n return { ok: true, hasMore };\n }\n\n case 'deleteMany': {\n const docsToDelete = await findExistingDocsByIds(request.ids, id =>\n ctx.db\n .query(convexTable)\n .withIndex('by_record_id', (q: any) => q.eq('id', id))\n .unique(),\n );\n await deleteDocs(ctx, docsToDelete);\n return { ok: true };\n }\n\n default:\n return { ok: false, error: `Unsupported operation ${(request as any).op}` };\n }\n}\n\n/**\n * Handle operations on the vectors table.\n * Vectors are stored with indexName to support multiple indexes.\n */\nasync function handleVectorOperation(ctx: MutationCtx<any>, request: StorageRequest): Promise<StorageResponse> {\n // Extract the index name from the table name (e.g., \"mastra_vector_myindex\" -> \"myindex\")\n const indexName = request.tableName.replace(VECTOR_TABLE_PREFIX, '');\n const convexTable = 'mastra_vectors';\n\n switch (request.op) {\n case 'insert': {\n const record = request.record;\n const id = record.id;\n if (!id) {\n throw new Error(`Vector record is missing an id`);\n }\n\n // Find existing by composite key (indexName, id) to scope per index\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_index_id', (q: any) => q.eq('indexName', indexName).eq('id', id))\n .unique();\n\n if (existing) {\n await ctx.db.patch(existing._id, {\n embedding: record.embedding,\n metadata: record.metadata,\n });\n } else {\n await ctx.db.insert(convexTable, {\n id,\n indexName,\n embedding: record.embedding,\n metadata: record.metadata,\n });\n }\n return { ok: true };\n }\n\n case 'batchInsert': {\n const records = coalesceLastRecordById(request.records);\n await mapInBatches(records, STORAGE_MUTATION_BATCH_SIZE, async record => {\n const id = record.id;\n\n // Find existing by composite key (indexName, id) to scope per index\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_index_id', (q: any) => q.eq('indexName', indexName).eq('id', id))\n .unique();\n\n if (existing) {\n await ctx.db.patch(existing._id, {\n embedding: record.embedding,\n metadata: record.metadata,\n });\n } else {\n await ctx.db.insert(convexTable, {\n id,\n indexName,\n embedding: record.embedding,\n metadata: record.metadata,\n });\n }\n });\n return { ok: true };\n }\n\n case 'load': {\n const keys = request.keys;\n if (keys.id) {\n // Use composite key (indexName, id) to scope lookup per index\n const doc = await ctx.db\n .query(convexTable)\n .withIndex('by_index_id', (q: any) => q.eq('indexName', indexName).eq('id', keys.id))\n .unique();\n return { ok: true, result: doc || null };\n }\n return { ok: true, result: null };\n }\n\n case 'queryTable': {\n // Use take() to avoid hitting Convex's 32k document limit\n const maxDocs = request.limit ? Math.min(request.limit * 2, 10000) : 10000;\n let docs = await ctx.db\n .query(convexTable)\n .withIndex('by_index', (q: any) => q.eq('indexName', indexName))\n .take(maxDocs);\n\n // Apply filters if provided\n if (request.filters && request.filters.length > 0) {\n docs = docs.filter((doc: any) => request.filters!.every(filter => doc[filter.field] === filter.value));\n }\n\n // Apply limit if provided\n if (request.limit) {\n docs = docs.slice(0, request.limit);\n }\n\n return { ok: true, result: docs };\n }\n\n case 'clearTable':\n case 'dropTable': {\n // Delete a small batch per call to stay within Convex's 1-second mutation timeout.\n // Client must call repeatedly until hasMore is false.\n const docs = await ctx.db\n .query(convexTable)\n .withIndex('by_index', (q: any) => q.eq('indexName', indexName))\n .take(STORAGE_MUTATION_BATCH_SIZE + 1);\n const hasMore = docs.length > STORAGE_MUTATION_BATCH_SIZE;\n const docsToDelete = hasMore ? docs.slice(0, STORAGE_MUTATION_BATCH_SIZE) : docs;\n\n await deleteDocs(ctx, docsToDelete);\n return { ok: true, hasMore };\n }\n\n case 'deleteMany': {\n const docsToDelete = await findExistingDocsByIds(request.ids, id =>\n // Use composite key (indexName, id) to scope deletion per index\n ctx.db\n .query(convexTable)\n .withIndex('by_index_id', (q: any) => q.eq('indexName', indexName).eq('id', id))\n .unique(),\n );\n await deleteDocs(ctx, docsToDelete);\n return { ok: true };\n }\n\n default:\n return { ok: false, error: `Unsupported operation ${(request as any).op}` };\n }\n}\n\n/**\n * Handle operations on the generic documents table.\n * Used as fallback for unknown table names.\n */\nasync function handleGenericOperation(ctx: MutationCtx<any>, request: StorageRequest): Promise<StorageResponse> {\n const tableName = request.tableName;\n const convexTable = 'mastra_documents';\n\n switch (request.op) {\n case 'insert': {\n const record = request.record;\n if (!record.id) {\n throw new Error(`Record for table ${tableName} is missing an id`);\n }\n const primaryKey = String(record.id);\n\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_table_primary', (q: any) => q.eq('table', tableName).eq('primaryKey', primaryKey))\n .unique();\n\n if (existing) {\n await ctx.db.patch(existing._id, { record });\n } else {\n await ctx.db.insert(convexTable, {\n table: tableName,\n primaryKey,\n record,\n });\n }\n return { ok: true };\n }\n\n case 'batchInsert': {\n const records = coalesceLastRecordById(request.records);\n await mapInBatches(records, STORAGE_MUTATION_BATCH_SIZE, async record => {\n const primaryKey = String(record.id);\n\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_table_primary', (q: any) => q.eq('table', tableName).eq('primaryKey', primaryKey))\n .unique();\n\n if (existing) {\n await ctx.db.patch(existing._id, { record });\n } else {\n await ctx.db.insert(convexTable, {\n table: tableName,\n primaryKey,\n record,\n });\n }\n });\n return { ok: true };\n }\n\n case 'load': {\n const keys = request.keys;\n if (keys.id) {\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_table_primary', (q: any) => q.eq('table', tableName).eq('primaryKey', String(keys.id)))\n .unique();\n return { ok: true, result: existing ? existing.record : null };\n }\n\n const docs = await ctx.db\n .query(convexTable)\n .withIndex('by_table', (q: any) => q.eq('table', tableName))\n .take(10000);\n const match = docs.find((doc: any) => Object.entries(keys).every(([key, value]) => doc.record?.[key] === value));\n return { ok: true, result: match ? match.record : null };\n }\n\n case 'queryTable': {\n // Use take() to avoid hitting Convex's 32k document limit\n const maxDocs = request.limit ? Math.min(request.limit * 2, 10000) : 10000;\n const docs = await ctx.db\n .query(convexTable)\n .withIndex('by_table', (q: any) => q.eq('table', tableName))\n .take(maxDocs);\n\n let records = docs.map((doc: any) => doc.record);\n\n if (request.filters && request.filters.length > 0) {\n records = records.filter((record: any) =>\n request.filters!.every(filter => record?.[filter.field] === filter.value),\n );\n }\n\n if (request.limit) {\n records = records.slice(0, request.limit);\n }\n\n return { ok: true, result: records };\n }\n\n case 'clearTable':\n case 'dropTable': {\n // Delete a small batch per call to stay within Convex's 1-second mutation timeout.\n // Client must call repeatedly until hasMore is false.\n const docs = await ctx.db\n .query(convexTable)\n .withIndex('by_table', (q: any) => q.eq('table', tableName))\n .take(STORAGE_MUTATION_BATCH_SIZE + 1);\n const hasMore = docs.length > STORAGE_MUTATION_BATCH_SIZE;\n const docsToDelete = hasMore ? docs.slice(0, STORAGE_MUTATION_BATCH_SIZE) : docs;\n\n await deleteDocs(ctx, docsToDelete);\n return { ok: true, hasMore };\n }\n\n case 'deleteMany': {\n const docsToDelete = await findExistingDocsByIds(request.ids, id =>\n ctx.db\n .query(convexTable)\n .withIndex('by_table_primary', (q: any) => q.eq('table', tableName).eq('primaryKey', String(id)))\n .unique(),\n );\n await deleteDocs(ctx, docsToDelete);\n return { ok: true };\n }\n\n default:\n return { ok: false, error: `Unsupported operation ${(request as any).op}` };\n }\n}\n","import { actionGeneric, mutationGeneric, queryGeneric } from 'convex/server';\nimport { v } from 'convex/values';\nimport type { GenericId } from 'convex/values';\n\ntype NativeVectorFilterValue = string | number | boolean | null;\ntype NativeVectorFilterClause = {\n field: string;\n value: NativeVectorFilterValue;\n};\ntype NativeVectorFilter = NativeVectorFilterClause | { $or: NativeVectorFilterClause[] };\n\ntype NativeVectorIndexConfig = {\n tableName: string;\n vectorIndexName: string;\n dimension?: number;\n idField?: string;\n idIndexName?: string;\n vectorField?: string;\n metadataField?: string;\n filterFields?: string[];\n};\n\ntype NativeVectorDocument = Record<string, any> & {\n _id?: GenericId<string>;\n};\n\nconst DEFAULT_ID_FIELD = 'id';\nconst DEFAULT_ID_INDEX = 'by_record_id';\nconst DEFAULT_VECTOR_FIELD = 'embedding';\nconst DEFAULT_METADATA_FIELD = 'metadata';\nconst NATIVE_VECTOR_BATCH_SIZE = 25;\nconst MAX_CONVEX_VECTOR_RESULTS = 256;\n\nconst nativeVectorFilterValueValidator = v.union(v.string(), v.number(), v.boolean(), v.null());\nconst nativeVectorFilterClauseValidator = v.object({\n field: v.string(),\n value: nativeVectorFilterValueValidator,\n});\nconst nativeVectorFilterValidator = v.union(\n nativeVectorFilterClauseValidator,\n v.object({ $or: v.array(nativeVectorFilterClauseValidator) }),\n);\nconst nativeVectorIndexConfigValidator = v.object({\n tableName: v.string(),\n vectorIndexName: v.string(),\n dimension: v.optional(v.number()),\n idField: v.optional(v.string()),\n idIndexName: v.optional(v.string()),\n vectorField: v.optional(v.string()),\n metadataField: v.optional(v.string()),\n filterFields: v.optional(v.array(v.string())),\n});\n\nfunction idField(config: NativeVectorIndexConfig): string {\n return config.idField ?? DEFAULT_ID_FIELD;\n}\n\nfunction idIndexName(config: NativeVectorIndexConfig): string {\n return config.idIndexName ?? DEFAULT_ID_INDEX;\n}\n\nfunction vectorField(config: NativeVectorIndexConfig): string {\n return config.vectorField ?? DEFAULT_VECTOR_FIELD;\n}\n\nfunction metadataField(config: NativeVectorIndexConfig): string {\n return config.metadataField ?? DEFAULT_METADATA_FIELD;\n}\n\nfunction asTableName(tableName: string): any {\n return tableName as any;\n}\n\nfunction asConvexId(id: string): GenericId<string> {\n return id as GenericId<string>;\n}\n\nfunction pickFilterFields(metadata: Record<string, any> | undefined, filterFields: string[] | undefined) {\n const fields: Record<string, any> = {};\n if (!metadata || !filterFields) return fields;\n\n for (const field of filterFields) {\n const value = metadata[field];\n if (value !== undefined) {\n fields[field] = value;\n }\n }\n\n return fields;\n}\n\nfunction isMetadataRecord(value: unknown): value is Record<string, any> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction validateMetadataArray(metadata: unknown, idsLength: number): Array<Record<string, any>> | undefined {\n if (metadata === undefined) return undefined;\n if (!Array.isArray(metadata)) {\n throw new Error('Native vector upsert: metadata must be an array matching ids when provided');\n }\n if (metadata.length !== idsLength) {\n throw new Error(`Native vector upsert: metadata length (${metadata.length}) must match ids length (${idsLength})`);\n }\n if (!metadata.every(isMetadataRecord)) {\n throw new Error('Native vector upsert: metadata entries must be objects when provided');\n }\n return metadata;\n}\n\nfunction validateMetadataRecord(metadata: unknown): Record<string, any> | undefined {\n if (metadata === undefined) return undefined;\n if (!isMetadataRecord(metadata)) {\n throw new Error('Native vector update: metadata must be an object when provided');\n }\n return metadata;\n}\n\nfunction clearMissingFilterFields(\n patch: Record<string, any>,\n metadata: Record<string, any>,\n filterFields: string[] | undefined,\n) {\n if (!filterFields) return;\n\n for (const field of filterFields) {\n if (metadata[field] === undefined) {\n patch[field] = undefined;\n }\n }\n}\n\nfunction omitVectorField(doc: NativeVectorDocument, config: NativeVectorIndexConfig): NativeVectorDocument {\n const { [vectorField(config)]: _, ...docWithoutVector } = doc;\n return docWithoutVector;\n}\n\nfunction buildRecord({\n config,\n id,\n vector,\n metadata,\n}: {\n config: NativeVectorIndexConfig;\n id: string;\n vector: number[];\n metadata?: Record<string, any>;\n}) {\n return {\n [idField(config)]: id,\n [vectorField(config)]: vector,\n ...(metadata !== undefined ? { [metadataField(config)]: metadata } : {}),\n ...pickFilterFields(metadata, config.filterFields),\n };\n}\n\nasync function findByRecordId(\n ctx: any,\n config: NativeVectorIndexConfig,\n id: string,\n): Promise<NativeVectorDocument | null> {\n return ctx.db\n .query(asTableName(config.tableName))\n .withIndex(idIndexName(config), (q: any) => q.eq(idField(config), id))\n .unique();\n}\n\nasync function mapInBatches<TInput, TOutput>(\n inputs: TInput[],\n mapper: (input: TInput, index: number) => Promise<TOutput>,\n): Promise<TOutput[]> {\n const results: TOutput[] = [];\n for (let index = 0; index < inputs.length; index += NATIVE_VECTOR_BATCH_SIZE) {\n results.push(\n ...(await Promise.all(\n inputs\n .slice(index, index + NATIVE_VECTOR_BATCH_SIZE)\n .map((input, batchIndex) => mapper(input, index + batchIndex)),\n )),\n );\n }\n return results;\n}\n\nfunction buildVectorFilter(q: any, filter?: NativeVectorFilter) {\n if (!filter) return undefined;\n\n if ('$or' in filter) {\n return q.or(...filter.$or.map(clause => q.eq(clause.field, clause.value)));\n }\n\n return q.eq(filter.field, filter.value);\n}\n\nexport const mastraNativeVectorAction = actionGeneric({\n args: {\n config: nativeVectorIndexConfigValidator,\n vector: v.array(v.number()),\n limit: v.optional(v.number()),\n filter: v.optional(nativeVectorFilterValidator),\n },\n handler: async (ctx, args: any) => {\n const config = args.config as NativeVectorIndexConfig;\n const limit = args.limit as number | undefined;\n const filter = args.filter as NativeVectorFilter | undefined;\n\n if (limit !== undefined && (!Number.isInteger(limit) || limit < 1 || limit > MAX_CONVEX_VECTOR_RESULTS)) {\n throw new Error(`Native vector query: limit must be an integer between 1 and ${MAX_CONVEX_VECTOR_RESULTS}`);\n }\n\n const results = await ctx.vectorSearch(asTableName(config.tableName), config.vectorIndexName as any, {\n vector: args.vector,\n ...(limit !== undefined ? { limit } : {}),\n ...(filter ? { filter: (q: any) => buildVectorFilter(q, filter) } : {}),\n });\n\n return results.map(result => ({\n id: String(result._id),\n score: result._score,\n }));\n },\n});\n\nexport const mastraNativeVectorQuery = queryGeneric({\n args: {\n op: v.union(v.literal('getByConvexIds'), v.literal('describe'), v.literal('listByIds')),\n config: nativeVectorIndexConfigValidator,\n ids: v.optional(v.array(v.string())),\n includeVector: v.optional(v.boolean()),\n countLimit: v.optional(v.number()),\n },\n handler: async (ctx, args: any) => {\n const config = args.config as NativeVectorIndexConfig;\n\n switch (args.op as string) {\n case 'getByConvexIds': {\n const ids = args.ids as string[];\n if (!ids) {\n throw new Error('Native vector query: ids are required');\n }\n const includeVector = args.includeVector === true;\n const docs = await mapInBatches(ids, id => ctx.db.get(asConvexId(id)));\n return docs\n .filter((doc): doc is NativeVectorDocument => Boolean(doc))\n .map(doc => (includeVector ? doc : omitVectorField(doc, config)));\n }\n\n case 'describe': {\n const limit = Math.max(1, Math.min(args.countLimit ?? 10000, 10000));\n const docs = await ctx.db.query(asTableName(config.tableName)).take(limit + 1);\n return {\n count: Math.min(docs.length, limit),\n countIsLimited: docs.length > limit,\n };\n }\n\n case 'listByIds': {\n const ids = args.ids as string[];\n if (!ids) {\n throw new Error('Native vector query: ids are required');\n }\n return mapInBatches(ids, id => findByRecordId(ctx, config, id));\n }\n\n default:\n throw new Error(`Unsupported native vector query operation: ${args.op}`);\n }\n },\n});\n\nexport const mastraNativeVectorMutation = mutationGeneric({\n args: {\n op: v.union(v.literal('upsert'), v.literal('updateById'), v.literal('deleteByIds')),\n config: nativeVectorIndexConfigValidator,\n ids: v.optional(v.array(v.string())),\n vectors: v.optional(v.array(v.array(v.number()))),\n metadata: v.optional(v.any()),\n id: v.optional(v.string()),\n vector: v.optional(v.array(v.number())),\n },\n handler: async (ctx, args: any) => {\n const config = args.config as NativeVectorIndexConfig;\n\n switch (args.op as string) {\n case 'upsert': {\n const ids = args.ids as string[];\n const vectors = args.vectors as number[][];\n\n if (!ids || !vectors) {\n throw new Error('Native vector upsert: ids and vectors are required');\n }\n if (vectors.length !== ids.length) {\n throw new Error(\n `Native vector upsert: vectors length (${vectors.length}) must match ids length (${ids.length})`,\n );\n }\n const metadata = validateMetadataArray(args.metadata, ids.length);\n if (new Set(ids).size !== ids.length) {\n throw new Error('Native vector upsert: ids must be unique');\n }\n\n await mapInBatches(ids, async (id, index) => {\n const record = buildRecord({\n config,\n id,\n vector: vectors[index]!,\n metadata: metadata?.[index],\n });\n const existing = await findByRecordId(ctx, config, id);\n if (existing?._id) {\n const { _id: _, _creationTime: __, ...patch } = record as NativeVectorDocument;\n if (metadata?.[index] !== undefined) {\n clearMissingFilterFields(patch, metadata[index]!, config.filterFields);\n }\n await ctx.db.patch(existing._id, patch);\n } else {\n await ctx.db.insert(asTableName(config.tableName), record);\n }\n });\n return { ok: true };\n }\n\n case 'updateById': {\n if (!args.id) {\n throw new Error('Native vector update: id is required');\n }\n const existing = await findByRecordId(ctx, config, args.id);\n if (!existing?._id) return { ok: true };\n\n const patch: Record<string, any> = {};\n if (args.vector) patch[vectorField(config)] = args.vector;\n const metadata = validateMetadataRecord(args.metadata);\n if (metadata !== undefined) {\n const existingMetadata = isMetadataRecord(existing[metadataField(config)])\n ? existing[metadataField(config)]\n : {};\n patch[metadataField(config)] = { ...existingMetadata, ...metadata };\n Object.assign(patch, pickFilterFields(patch[metadataField(config)], config.filterFields));\n }\n\n if (Object.keys(patch).length > 0) {\n await ctx.db.patch(existing._id, patch);\n }\n return { ok: true };\n }\n\n case 'deleteByIds': {\n const ids = args.ids as string[];\n if (!ids) {\n throw new Error('Native vector deleteByIds: ids are required');\n }\n const docs = await mapInBatches(ids, id => findByRecordId(ctx, config, id));\n await mapInBatches(\n docs.filter((doc): doc is NativeVectorDocument & { _id: GenericId<string> } => Boolean(doc?._id)),\n doc => ctx.db.delete(doc._id),\n );\n return { ok: true };\n }\n\n default:\n throw new Error(`Unsupported native vector mutation operation: ${args.op}`);\n }\n },\n});\n"]}
@@ -68,6 +68,45 @@ var mastraVectorsTable = defineTable({
68
68
  embedding: v.array(v.float64()),
69
69
  metadata: v.optional(v.any())
70
70
  }).index("by_index_id", ["indexName", "id"]).index("by_index", ["indexName"]);
71
+ function defineMastraNativeVectorTable({
72
+ dimensions,
73
+ vectorIndexName = "by_embedding",
74
+ staged = false
75
+ }) {
76
+ if (!Number.isInteger(dimensions) || dimensions < 2 || dimensions > 4096) {
77
+ throw new Error("defineMastraNativeVectorTable: dimensions must be an integer between 2 and 4096.");
78
+ }
79
+ const table = defineTable({
80
+ id: v.string(),
81
+ embedding: v.array(v.float64()),
82
+ metadata: v.optional(v.any())
83
+ }).index("by_record_id", ["id"]);
84
+ if (staged) {
85
+ return table.vectorIndex(vectorIndexName, {
86
+ vectorField: "embedding",
87
+ dimensions,
88
+ staged: true
89
+ });
90
+ }
91
+ return table.vectorIndex(vectorIndexName, {
92
+ vectorField: "embedding",
93
+ dimensions
94
+ });
95
+ }
96
+ var mastraCacheTable = defineTable({
97
+ key: v.string(),
98
+ keyPrefix: v.string(),
99
+ kind: v.union(v.literal("value"), v.literal("list"), v.literal("counter"), v.literal("deleted")),
100
+ value: v.optional(v.string()),
101
+ counter: v.optional(v.number()),
102
+ expiresAt: v.union(v.number(), v.null())
103
+ }).index("by_key", ["key"]).index("by_key_prefix", ["keyPrefix"]);
104
+ var mastraCacheListItemsTable = defineTable({
105
+ key: v.string(),
106
+ keyPrefix: v.string(),
107
+ index: v.number(),
108
+ value: v.string()
109
+ }).index("by_key_prefix", ["keyPrefix"]).index("by_key_index", ["key", "index"]);
71
110
  var mastraDocumentsTable = defineTable({
72
111
  table: v.string(),
73
112
  primaryKey: v.string(),
@@ -77,6 +116,6 @@ var TABLE_VECTOR_INDEXES = "mastra_vector_indexes";
77
116
  var TABLE_VECTORS = "mastra_vectors";
78
117
  var TABLE_DOCUMENTS = "mastra_documents";
79
118
 
80
- export { TABLE_DOCUMENTS, TABLE_VECTORS, TABLE_VECTOR_INDEXES, mastraDocumentsTable, mastraMessagesTable, mastraResourcesTable, mastraScoresTable, mastraThreadsTable, mastraVectorIndexesTable, mastraVectorsTable, mastraWorkflowSnapshotsTable };
81
- //# sourceMappingURL=chunk-G5FLGAPE.js.map
82
- //# sourceMappingURL=chunk-G5FLGAPE.js.map
119
+ export { TABLE_DOCUMENTS, TABLE_VECTORS, TABLE_VECTOR_INDEXES, defineMastraNativeVectorTable, mastraCacheListItemsTable, mastraCacheTable, mastraDocumentsTable, mastraMessagesTable, mastraResourcesTable, mastraScoresTable, mastraThreadsTable, mastraVectorIndexesTable, mastraVectorsTable, mastraWorkflowSnapshotsTable };
120
+ //# sourceMappingURL=chunk-JPWDG4L3.js.map
121
+ //# sourceMappingURL=chunk-JPWDG4L3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema.ts"],"names":[],"mappings":"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","file":"chunk-JPWDG4L3.js","sourcesContent":["/**\n * Convex schema definitions for Mastra tables.\n *\n * This file dynamically builds Convex table definitions from the canonical\n * TABLE_SCHEMAS in @mastra/core/storage/constants to ensure they stay in sync.\n *\n * The import path @mastra/core/storage/constants is specifically designed to\n * avoid pulling in Node.js dependencies, making it safe to use in Convex's\n * sandboxed schema evaluation environment.\n */\nimport {\n TABLE_SCHEMAS,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_MESSAGES,\n TABLE_THREADS,\n TABLE_RESOURCES,\n TABLE_SCORERS,\n} from '@mastra/core/storage/constants';\nimport { defineTable } from 'convex/server';\nimport { v } from 'convex/values';\n\n/**\n * Helper to convert Mastra StorageColumn type to Convex validator\n */\nfunction columnToValidator(column: { type: string; nullable?: boolean }) {\n let validator;\n switch (column.type) {\n case 'text':\n validator = v.string();\n break;\n case 'integer':\n case 'float':\n validator = v.number();\n break;\n case 'bigint':\n validator = v.int64();\n break;\n case 'boolean':\n validator = v.boolean();\n break;\n case 'timestamp':\n validator = v.string(); // Store as ISO string\n break;\n case 'jsonb':\n case 'json':\n validator = v.any();\n break;\n default:\n validator = v.any();\n }\n return column.nullable ? v.optional(validator) : validator;\n}\n\n/**\n * Build Convex table definition from Mastra schema.\n * Includes the `id` field as a regular field (Convex auto-generates _id).\n */\nfunction buildTableFromSchema(schema: Record<string, { type: string; nullable?: boolean; primaryKey?: boolean }>) {\n const fields: Record<string, any> = {};\n for (const [key, column] of Object.entries(schema)) {\n fields[key] = columnToValidator(column);\n }\n return fields;\n}\n\n// ============================================================================\n// Table Definitions - Built from @mastra/core TABLE_SCHEMAS\n// ============================================================================\n\n/**\n * Threads table - stores conversation threads\n * Schema: TABLE_SCHEMAS[TABLE_THREADS]\n */\nexport const mastraThreadsTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_THREADS]))\n .index('by_record_id', ['id'])\n .index('by_resource', ['resourceId'])\n .index('by_created', ['createdAt'])\n .index('by_updated', ['updatedAt']);\n\n/**\n * Messages table - stores conversation messages\n * Schema: TABLE_SCHEMAS[TABLE_MESSAGES]\n */\nexport const mastraMessagesTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_MESSAGES]))\n .index('by_record_id', ['id'])\n .index('by_thread', ['thread_id'])\n .index('by_thread_created', ['thread_id', 'createdAt'])\n .index('by_resource', ['resourceId']);\n\n/**\n * Resources table - stores resource/user working memory\n * Schema: TABLE_SCHEMAS[TABLE_RESOURCES]\n */\nexport const mastraResourcesTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_RESOURCES]))\n .index('by_record_id', ['id'])\n .index('by_updated', ['updatedAt']);\n\n/**\n * Workflow snapshots table - stores workflow execution state\n * Schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT]\n *\n * Note: The `id` field is added explicitly for Convex's by_record_id index.\n * The core schema uses (workflow_name, run_id) as a composite key, but Convex\n * requires a single-column index. The id value is generated at runtime as\n * `${workflow_name}-${run_id}` by the Convex storage adapter's normalizeRecord().\n *\n * Fields are defined explicitly (not using buildTableFromSchema) because TypeScript's\n * type inference doesn't work well with spread operators in Convex's defineTable.\n */\nexport const mastraWorkflowSnapshotsTable = defineTable({\n id: v.optional(v.string()), // Synthetic ID for Convex index, generated at runtime\n workflow_name: v.string(),\n run_id: v.string(),\n resourceId: v.optional(v.string()),\n snapshot: v.any(),\n createdAt: v.string(),\n updatedAt: v.string(),\n})\n .index('by_record_id', ['id'])\n .index('by_workflow_run', ['workflow_name', 'run_id'])\n .index('by_workflow', ['workflow_name'])\n .index('by_resource', ['resourceId'])\n .index('by_created', ['createdAt']);\n\n/**\n * Scores table - stores evaluation scores\n * Schema: TABLE_SCHEMAS[TABLE_SCORERS]\n */\nexport const mastraScoresTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_SCORERS]))\n .index('by_record_id', ['id'])\n .index('by_scorer', ['scorerId'])\n .index('by_entity', ['entityId', 'entityType'])\n .index('by_run', ['runId'])\n .index('by_created', ['createdAt']);\n\n// ============================================================================\n// Vector Tables - Not in core schemas (vector-specific)\n// ============================================================================\n\n/**\n * Vector indexes table - stores metadata about vector indexes\n */\nexport const mastraVectorIndexesTable = defineTable({\n id: v.string(), // Mastra record ID (same as indexName)\n indexName: v.string(),\n dimension: v.number(),\n metric: v.string(),\n createdAt: v.string(),\n})\n .index('by_record_id', ['id'])\n .index('by_name', ['indexName']);\n\n/**\n * Vectors table - stores vector embeddings\n * Uses indexName field to support multiple indexes with different dimensions\n */\nexport const mastraVectorsTable = defineTable({\n id: v.string(), // Mastra record ID\n indexName: v.string(),\n embedding: v.array(v.float64()),\n metadata: v.optional(v.any()),\n})\n .index('by_index_id', ['indexName', 'id']) // Composite for scoped lookups per index\n .index('by_index', ['indexName']);\n\nexport type MastraNativeVectorTableConfig = {\n /**\n * Vector dimensions for the deployed Convex vector index.\n */\n dimensions: number;\n /**\n * Convex vector index name.\n *\n * @default 'by_embedding'\n */\n vectorIndexName?: string;\n /**\n * Stage the vector index for a later backfill.\n *\n * @default false\n */\n staged?: boolean;\n};\n\n/**\n * Defines a dedicated Convex table for native vector search with the default\n * `ConvexNativeVector` field names.\n *\n * Use a custom `defineTable()` when you need native vector `filterFields`,\n * because filter fields must also be declared in the table schema.\n */\nexport function defineMastraNativeVectorTable({\n dimensions,\n vectorIndexName = 'by_embedding',\n staged = false,\n}: MastraNativeVectorTableConfig) {\n if (!Number.isInteger(dimensions) || dimensions < 2 || dimensions > 4096) {\n throw new Error('defineMastraNativeVectorTable: dimensions must be an integer between 2 and 4096.');\n }\n\n const table = defineTable({\n id: v.string(),\n embedding: v.array(v.float64()),\n metadata: v.optional(v.any()),\n }).index('by_record_id', ['id']);\n\n if (staged) {\n return table.vectorIndex(vectorIndexName, {\n vectorField: 'embedding',\n dimensions,\n staged: true,\n });\n }\n\n return table.vectorIndex(vectorIndexName, {\n vectorField: 'embedding',\n dimensions,\n });\n}\n\n// ============================================================================\n// Server Cache Tables - Used by ConvexServerCache\n// ============================================================================\n\n/**\n * Cache metadata table - stores scalar cache values, list counters, and numeric\n * counters used by ConvexServerCache.\n */\nexport const mastraCacheTable = defineTable({\n key: v.string(),\n keyPrefix: v.string(),\n kind: v.union(v.literal('value'), v.literal('list'), v.literal('counter'), v.literal('deleted')),\n value: v.optional(v.string()),\n counter: v.optional(v.number()),\n expiresAt: v.union(v.number(), v.null()),\n})\n .index('by_key', ['key'])\n .index('by_key_prefix', ['keyPrefix']);\n\n/**\n * Cache list item table - stores each list entry as its own row so replay\n * history does not grow into a single large Convex document.\n */\nexport const mastraCacheListItemsTable = defineTable({\n key: v.string(),\n keyPrefix: v.string(),\n index: v.number(),\n value: v.string(),\n})\n .index('by_key_prefix', ['keyPrefix'])\n .index('by_key_index', ['key', 'index']);\n\n// ============================================================================\n// Fallback Table - For unknown/custom tables\n// ============================================================================\n\n/**\n * Generic documents table - fallback for unknown table types\n */\nexport const mastraDocumentsTable = defineTable({\n table: v.string(),\n primaryKey: v.string(),\n record: v.any(),\n})\n .index('by_table', ['table'])\n .index('by_table_primary', ['table', 'primaryKey']);\n\n// ============================================================================\n// Re-export table name constants for convenience\n// ============================================================================\n\nexport { TABLE_WORKFLOW_SNAPSHOT, TABLE_MESSAGES, TABLE_THREADS, TABLE_RESOURCES, TABLE_SCORERS };\n\n// Additional table name constants for vector tables (not in core)\nexport const TABLE_VECTOR_INDEXES = 'mastra_vector_indexes';\nexport const TABLE_VECTORS = 'mastra_vectors';\nexport const TABLE_DOCUMENTS = 'mastra_documents';\n"]}
@@ -3,7 +3,7 @@ name: mastra-convex
3
3
  description: Documentation for @mastra/convex. Use when working with @mastra/convex APIs, configuration, or implementation.
4
4
  metadata:
5
5
  package: "@mastra/convex"
6
- version: "1.0.11"
6
+ version: "1.1.0"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,62 +1,91 @@
1
1
  {
2
- "version": "1.0.11",
2
+ "version": "1.1.0",
3
3
  "package": "@mastra/convex",
4
4
  "exports": {
5
+ "mastraCache": {
6
+ "types": "dist/index.d.ts",
7
+ "implementation": "dist/chunk-FZDLZ4S3.js"
8
+ },
9
+ "mastraNativeVectorAction": {
10
+ "types": "dist/index.d.ts",
11
+ "implementation": "dist/chunk-FZDLZ4S3.js"
12
+ },
13
+ "mastraNativeVectorMutation": {
14
+ "types": "dist/index.d.ts",
15
+ "implementation": "dist/chunk-FZDLZ4S3.js"
16
+ },
17
+ "mastraNativeVectorQuery": {
18
+ "types": "dist/index.d.ts",
19
+ "implementation": "dist/chunk-FZDLZ4S3.js"
20
+ },
5
21
  "mastraStorage": {
6
22
  "types": "dist/index.d.ts",
7
- "implementation": "dist/chunk-NXNW2MK5.js"
23
+ "implementation": "dist/chunk-FZDLZ4S3.js"
8
24
  },
9
25
  "TABLE_MESSAGES": {
10
26
  "types": "dist/index.d.ts",
11
- "implementation": "dist/chunk-G5FLGAPE.js"
27
+ "implementation": "dist/chunk-JPWDG4L3.js"
12
28
  },
13
29
  "TABLE_RESOURCES": {
14
30
  "types": "dist/index.d.ts",
15
- "implementation": "dist/chunk-G5FLGAPE.js"
31
+ "implementation": "dist/chunk-JPWDG4L3.js"
16
32
  },
17
33
  "TABLE_SCORERS": {
18
34
  "types": "dist/index.d.ts",
19
- "implementation": "dist/chunk-G5FLGAPE.js"
35
+ "implementation": "dist/chunk-JPWDG4L3.js"
20
36
  },
21
37
  "TABLE_THREADS": {
22
38
  "types": "dist/index.d.ts",
23
- "implementation": "dist/chunk-G5FLGAPE.js"
39
+ "implementation": "dist/chunk-JPWDG4L3.js"
24
40
  },
25
41
  "TABLE_WORKFLOW_SNAPSHOT": {
26
42
  "types": "dist/index.d.ts",
27
- "implementation": "dist/chunk-G5FLGAPE.js"
43
+ "implementation": "dist/chunk-JPWDG4L3.js"
44
+ },
45
+ "defineMastraNativeVectorTable": {
46
+ "types": "dist/index.d.ts",
47
+ "implementation": "dist/chunk-JPWDG4L3.js",
48
+ "line": 71
49
+ },
50
+ "mastraCacheListItemsTable": {
51
+ "types": "dist/index.d.ts",
52
+ "implementation": "dist/chunk-JPWDG4L3.js"
53
+ },
54
+ "mastraCacheTable": {
55
+ "types": "dist/index.d.ts",
56
+ "implementation": "dist/chunk-JPWDG4L3.js"
28
57
  },
29
58
  "mastraDocumentsTable": {
30
59
  "types": "dist/index.d.ts",
31
- "implementation": "dist/chunk-G5FLGAPE.js"
60
+ "implementation": "dist/chunk-JPWDG4L3.js"
32
61
  },
33
62
  "mastraMessagesTable": {
34
63
  "types": "dist/index.d.ts",
35
- "implementation": "dist/chunk-G5FLGAPE.js"
64
+ "implementation": "dist/chunk-JPWDG4L3.js"
36
65
  },
37
66
  "mastraResourcesTable": {
38
67
  "types": "dist/index.d.ts",
39
- "implementation": "dist/chunk-G5FLGAPE.js"
68
+ "implementation": "dist/chunk-JPWDG4L3.js"
40
69
  },
41
70
  "mastraScoresTable": {
42
71
  "types": "dist/index.d.ts",
43
- "implementation": "dist/chunk-G5FLGAPE.js"
72
+ "implementation": "dist/chunk-JPWDG4L3.js"
44
73
  },
45
74
  "mastraThreadsTable": {
46
75
  "types": "dist/index.d.ts",
47
- "implementation": "dist/chunk-G5FLGAPE.js"
76
+ "implementation": "dist/chunk-JPWDG4L3.js"
48
77
  },
49
78
  "mastraVectorIndexesTable": {
50
79
  "types": "dist/index.d.ts",
51
- "implementation": "dist/chunk-G5FLGAPE.js"
80
+ "implementation": "dist/chunk-JPWDG4L3.js"
52
81
  },
53
82
  "mastraVectorsTable": {
54
83
  "types": "dist/index.d.ts",
55
- "implementation": "dist/chunk-G5FLGAPE.js"
84
+ "implementation": "dist/chunk-JPWDG4L3.js"
56
85
  },
57
86
  "mastraWorkflowSnapshotsTable": {
58
87
  "types": "dist/index.d.ts",
59
- "implementation": "dist/chunk-G5FLGAPE.js"
88
+ "implementation": "dist/chunk-JPWDG4L3.js"
60
89
  }
61
90
  },
62
91
  "modules": {}
@@ -34,7 +34,7 @@ bun add @mastra/convex@latest
34
34
 
35
35
  ## Convex setup
36
36
 
37
- Before using `ConvexStore`, you need to set up the Convex schema and storage handler in your Convex project.
37
+ Before using `ConvexStore`, set up the Convex schema and storage handler in your Convex project. The schema example below includes the full `ConvexStore` and `ConvexServerCache` setup. If you only use `ConvexStore`, omit `mastraCacheTable` and `mastraCacheListItemsTable`; if you use `ConvexServerCache`, include those tables and create the cache handler.
38
38
 
39
39
  ### 1. Set up Convex Schema
40
40
 
@@ -50,6 +50,8 @@ import {
50
50
  mastraScoresTable,
51
51
  mastraVectorIndexesTable,
52
52
  mastraVectorsTable,
53
+ mastraCacheTable,
54
+ mastraCacheListItemsTable,
53
55
  mastraDocumentsTable,
54
56
  } from '@mastra/convex/schema'
55
57
 
@@ -61,6 +63,8 @@ export default defineSchema({
61
63
  mastra_scorers: mastraScoresTable,
62
64
  mastra_vector_indexes: mastraVectorIndexesTable,
63
65
  mastra_vectors: mastraVectorsTable,
66
+ mastra_cache: mastraCacheTable,
67
+ mastra_cache_list_items: mastraCacheListItemsTable,
64
68
  mastra_documents: mastraDocumentsTable,
65
69
  })
66
70
  ```
@@ -75,6 +79,14 @@ import { mastraStorage } from '@mastra/convex/server'
75
79
  export const handle = mastraStorage
76
80
  ```
77
81
 
82
+ If you use `ConvexServerCache`, create `convex/mastra/cache.ts`:
83
+
84
+ ```typescript
85
+ import { mastraCache } from '@mastra/convex/server'
86
+
87
+ export const handle = mastraCache
88
+ ```
89
+
78
90
  ### 3. Deploy to Convex
79
91
 
80
92
  ```bash
@@ -86,16 +98,21 @@ npx convex deploy
86
98
  ## Usage
87
99
 
88
100
  ```typescript
89
- import { ConvexStore } from '@mastra/convex'
101
+ import { ConvexServerCache, ConvexStore } from '@mastra/convex'
90
102
 
91
103
  const storage = new ConvexStore({
92
104
  id: 'convex-storage',
93
105
  deploymentUrl: process.env.CONVEX_URL!,
94
106
  adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
95
107
  })
108
+
109
+ const cache = new ConvexServerCache({
110
+ deploymentUrl: process.env.CONVEX_URL!,
111
+ adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
112
+ })
96
113
  ```
97
114
 
98
- ## Parameters
115
+ ## ConvexStore parameters
99
116
 
100
117
  **deploymentUrl** (`string`): Convex deployment URL (e.g., https\://your-project.convex.cloud)
101
118
 
@@ -103,10 +120,24 @@ const storage = new ConvexStore({
103
120
 
104
121
  **storageFunction** (`string`): Path to the storage mutation function (default: 'mastra/storage:handle') (Default: `mastra/storage:handle`)
105
122
 
123
+ ## ConvexServerCache parameters
124
+
125
+ **deploymentUrl** (`string`): Convex deployment URL (e.g., https\://your-project.convex.cloud)
126
+
127
+ **adminAuthToken** (`string`): Convex admin authentication token for backend access
128
+
129
+ **cacheFunction** (`string`): Path to the cache mutation function for ConvexServerCache (default: 'mastra/cache:handle') (Default: `mastra/cache:handle`)
130
+
131
+ **requestTimeoutMs** (`number`): Timeout for Convex cache mutation requests in milliseconds. Set to 0 to disable the client-side timeout. (Default: `30000`)
132
+
133
+ **keyPrefix** (`string`): Prefix applied to ConvexServerCache keys. clear() removes rows whose stored prefix exactly matches this value. (Default: `mastra:cache:`)
134
+
135
+ **ttlMs** (`number`): Default ConvexServerCache TTL in milliseconds. Set to 0 to disable expiry. (Default: `300000`)
136
+
106
137
  ## Constructor examples
107
138
 
108
139
  ```ts
109
- import { ConvexStore } from '@mastra/convex'
140
+ import { ConvexServerCache, ConvexStore } from '@mastra/convex'
110
141
 
111
142
  // Basic configuration
112
143
  const store = new ConvexStore({
@@ -122,22 +153,53 @@ const storeCustom = new ConvexStore({
122
153
  adminAuthToken: 'your-admin-token',
123
154
  storageFunction: 'custom/path:handler',
124
155
  })
156
+
157
+ // Server cache for durable stream replay and response caching
158
+ const cache = new ConvexServerCache({
159
+ deploymentUrl: 'https://your-project.convex.cloud',
160
+ adminAuthToken: 'your-admin-token',
161
+ cacheFunction: 'mastra/cache:handle',
162
+ })
125
163
  ```
126
164
 
165
+ ## Server cache
166
+
167
+ `ConvexServerCache` implements Mastra's server cache contract with Convex. Use it when you want durable cache state for features such as resumable durable-agent streams, workflow stream replay, or response caching.
168
+
169
+ `ConvexServerCache` stores list entries as separate Convex documents. This avoids growing a stream replay list inside one document and helps stay within Convex's record size limit.
170
+
171
+ Each scalar cache value and each list item is stored as one Convex row and must stay within Convex's row-size limits. Very large lists are still bounded by Convex query limits when replaying a range.
172
+
173
+ Cache cleanup and `clear()` run in bounded batches. A single client call can loop through up to 1,000 Convex mutations, with each mutation handling up to 25 list items. While `clear()` is cleaning a key, reads for that key can return empty results until cleanup finishes.
174
+
175
+ For very large cache namespaces, clear incrementally or use narrower prefixes to avoid long-running cleanup operations.
176
+
177
+ During batched cleanup, cache metadata can temporarily use an internal `deleted` state. The next cleanup pass removes those rows. Avoid writing new values with the same prefix until `clear()` finishes.
178
+
179
+ `clear()` only removes rows whose stored `keyPrefix` exactly matches the configured `keyPrefix`. It does not clear nested prefixes by string prefix matching. Each `listPush()` refreshes the list TTL using the cache's configured `ttlMs`.
180
+
181
+ Use a non-empty `keyPrefix` unless you intentionally want `clear()` to remove every cache key in the deployment. Expired list rows are reclaimed incrementally during reads and writes; `clear()` removes all rows for the prefix.
182
+
183
+ `ConvexServerCache` works best for durable replay of moderate-frequency events. For high-frequency token streams, prefer batching events or using a lower-latency cache backend.
184
+
185
+ `ConvexServerCache` does not replace a distributed pub/sub transport. If your app needs live cross-process event delivery, configure a production pub/sub backend separately.
186
+
127
187
  ## Additional notes
128
188
 
129
189
  ### Schema Management
130
190
 
131
191
  The storage implementation uses typed Convex tables for each Mastra domain:
132
192
 
133
- | Domain | Convex Table | Purpose |
134
- | --------- | --------------------------- | -------------------- |
135
- | Threads | `mastra_threads` | Conversation threads |
136
- | Messages | `mastra_messages` | Chat messages |
137
- | Resources | `mastra_resources` | User working memory |
138
- | Workflows | `mastra_workflow_snapshots` | Workflow state |
139
- | Scorers | `mastra_scorers` | Evaluation data |
140
- | Fallback | `mastra_documents` | Unknown tables |
193
+ | Domain | Convex Table | Purpose |
194
+ | ----------- | --------------------------- | ----------------------------------------- |
195
+ | Threads | `mastra_threads` | Conversation threads |
196
+ | Messages | `mastra_messages` | Chat messages |
197
+ | Resources | `mastra_resources` | User working memory |
198
+ | Workflows | `mastra_workflow_snapshots` | Workflow state |
199
+ | Scorers | `mastra_scorers` | Evaluation data |
200
+ | Cache | `mastra_cache` | Cache values, counters, and list metadata |
201
+ | Cache Items | `mastra_cache_list_items` | Cache list entries |
202
+ | Fallback | `mastra_documents` | Unknown tables |
141
203
 
142
204
  ### Architecture
143
205