@mastra/convex 1.0.9 → 1.0.10-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/dist/{chunk-JTEA2WBP.cjs → chunk-C6QDNSBM.cjs} +75 -50
- package/dist/chunk-C6QDNSBM.cjs.map +1 -0
- package/dist/{chunk-ASKOKI4D.js → chunk-NXNW2MK5.js} +75 -50
- package/dist/chunk-NXNW2MK5.js.map +1 -0
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +2 -2
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/dist/server/index.cjs +2 -2
- package/dist/server/index.js +1 -1
- package/dist/server/storage.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-ASKOKI4D.js.map +0 -1
- package/dist/chunk-JTEA2WBP.cjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @mastra/convex
|
|
2
2
|
|
|
3
|
+
## 1.0.10-alpha.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Improved Convex bulk insert and delete throughput. ([#16149](https://github.com/mastra-ai/mastra/pull/16149))
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`86c0298`](https://github.com/mastra-ai/mastra/commit/86c0298e647306423c842f9d5ac827bd616bd13d), [`7fce309`](https://github.com/mastra-ai/mastra/commit/7fce30912b14170bfc41f0ac736cca0f39fe0cd4), [`7997c2e`](https://github.com/mastra-ai/mastra/commit/7997c2e55ddd121562a4098cd8d2b89c68433bf1), [`e97ccb9`](https://github.com/mastra-ai/mastra/commit/e97ccb900f8b7a390ce82c9f8eb8d6eb2c5e3777), [`c5daf48`](https://github.com/mastra-ai/mastra/commit/c5daf48556e98c46ae06caf00f92c249912007e9), [`cd96779`](https://github.com/mastra-ai/mastra/commit/cd9677937f113b2856dc8b9f3d4bdabcee58bb2e)]:
|
|
10
|
+
- @mastra/core@1.32.0-alpha.2
|
|
11
|
+
|
|
3
12
|
## 1.0.9
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
|
@@ -73,6 +73,40 @@ function findBestIndex(convexTable, filters) {
|
|
|
73
73
|
var TABLE_VECTOR_INDEXES = "mastra_vector_indexes";
|
|
74
74
|
var VECTOR_TABLE_PREFIX = "mastra_vector_";
|
|
75
75
|
var CONVEX_TABLE_WORKFLOW_SNAPSHOTS = "mastra_workflow_snapshots";
|
|
76
|
+
var STORAGE_MUTATION_BATCH_SIZE = 25;
|
|
77
|
+
async function mapInBatches(inputs, batchSize, mapper) {
|
|
78
|
+
const results = [];
|
|
79
|
+
for (let index = 0; index < inputs.length; index += batchSize) {
|
|
80
|
+
results.push(...await Promise.all(inputs.slice(index, index + batchSize).map(mapper)));
|
|
81
|
+
}
|
|
82
|
+
return results;
|
|
83
|
+
}
|
|
84
|
+
async function deleteDocs(ctx, docs) {
|
|
85
|
+
await mapInBatches(docs, STORAGE_MUTATION_BATCH_SIZE, (doc) => ctx.db.delete(doc._id));
|
|
86
|
+
}
|
|
87
|
+
async function findExistingDocsByIds(ids, findDoc) {
|
|
88
|
+
const docs = await mapInBatches([...new Set(ids)], STORAGE_MUTATION_BATCH_SIZE, findDoc);
|
|
89
|
+
return docs.filter((doc) => Boolean(doc));
|
|
90
|
+
}
|
|
91
|
+
function coalesceTypedRecordsForBatchInsert(records) {
|
|
92
|
+
const recordsById = /* @__PURE__ */ new Map();
|
|
93
|
+
for (const record of records) {
|
|
94
|
+
const id = record.id;
|
|
95
|
+
if (!id) continue;
|
|
96
|
+
const key = String(id);
|
|
97
|
+
recordsById.set(key, { ...recordsById.get(key) ?? {}, ...record });
|
|
98
|
+
}
|
|
99
|
+
return [...recordsById.values()];
|
|
100
|
+
}
|
|
101
|
+
function coalesceLastRecordById(records) {
|
|
102
|
+
const recordsById = /* @__PURE__ */ new Map();
|
|
103
|
+
for (const record of records) {
|
|
104
|
+
const id = record.id;
|
|
105
|
+
if (!id) continue;
|
|
106
|
+
recordsById.set(String(id), record);
|
|
107
|
+
}
|
|
108
|
+
return [...recordsById.values()];
|
|
109
|
+
}
|
|
76
110
|
function resolveTable(tableName) {
|
|
77
111
|
switch (tableName) {
|
|
78
112
|
case constants.TABLE_THREADS:
|
|
@@ -130,9 +164,9 @@ async function handleTypedOperation(ctx, convexTable, request) {
|
|
|
130
164
|
return { ok: true };
|
|
131
165
|
}
|
|
132
166
|
case "batchInsert": {
|
|
133
|
-
|
|
167
|
+
const records = coalesceTypedRecordsForBatchInsert(request.records);
|
|
168
|
+
await mapInBatches(records, STORAGE_MUTATION_BATCH_SIZE, async (record) => {
|
|
134
169
|
const id = record.id;
|
|
135
|
-
if (!id) continue;
|
|
136
170
|
const existing = await ctx.db.query(convexTable).withIndex("by_record_id", (q) => q.eq("id", id)).unique();
|
|
137
171
|
if (existing) {
|
|
138
172
|
const { id: _, ...updateData } = record;
|
|
@@ -140,7 +174,7 @@ async function handleTypedOperation(ctx, convexTable, request) {
|
|
|
140
174
|
} else {
|
|
141
175
|
await ctx.db.insert(convexTable, record);
|
|
142
176
|
}
|
|
143
|
-
}
|
|
177
|
+
});
|
|
144
178
|
return { ok: true };
|
|
145
179
|
}
|
|
146
180
|
case "load": {
|
|
@@ -195,22 +229,18 @@ async function handleTypedOperation(ctx, convexTable, request) {
|
|
|
195
229
|
}
|
|
196
230
|
case "clearTable":
|
|
197
231
|
case "dropTable": {
|
|
198
|
-
const
|
|
199
|
-
const
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
for (const doc of docsToDelete) {
|
|
203
|
-
await ctx.db.delete(doc._id);
|
|
204
|
-
}
|
|
232
|
+
const docs = await ctx.db.query(convexTable).take(STORAGE_MUTATION_BATCH_SIZE + 1);
|
|
233
|
+
const hasMore = docs.length > STORAGE_MUTATION_BATCH_SIZE;
|
|
234
|
+
const docsToDelete = hasMore ? docs.slice(0, STORAGE_MUTATION_BATCH_SIZE) : docs;
|
|
235
|
+
await deleteDocs(ctx, docsToDelete);
|
|
205
236
|
return { ok: true, hasMore };
|
|
206
237
|
}
|
|
207
238
|
case "deleteMany": {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
239
|
+
const docsToDelete = await findExistingDocsByIds(
|
|
240
|
+
request.ids,
|
|
241
|
+
(id) => ctx.db.query(convexTable).withIndex("by_record_id", (q) => q.eq("id", id)).unique()
|
|
242
|
+
);
|
|
243
|
+
await deleteDocs(ctx, docsToDelete);
|
|
214
244
|
return { ok: true };
|
|
215
245
|
}
|
|
216
246
|
default:
|
|
@@ -244,9 +274,9 @@ async function handleVectorOperation(ctx, request) {
|
|
|
244
274
|
return { ok: true };
|
|
245
275
|
}
|
|
246
276
|
case "batchInsert": {
|
|
247
|
-
|
|
277
|
+
const records = coalesceLastRecordById(request.records);
|
|
278
|
+
await mapInBatches(records, STORAGE_MUTATION_BATCH_SIZE, async (record) => {
|
|
248
279
|
const id = record.id;
|
|
249
|
-
if (!id) continue;
|
|
250
280
|
const existing = await ctx.db.query(convexTable).withIndex("by_index_id", (q) => q.eq("indexName", indexName).eq("id", id)).unique();
|
|
251
281
|
if (existing) {
|
|
252
282
|
await ctx.db.patch(existing._id, {
|
|
@@ -261,7 +291,7 @@ async function handleVectorOperation(ctx, request) {
|
|
|
261
291
|
metadata: record.metadata
|
|
262
292
|
});
|
|
263
293
|
}
|
|
264
|
-
}
|
|
294
|
+
});
|
|
265
295
|
return { ok: true };
|
|
266
296
|
}
|
|
267
297
|
case "load": {
|
|
@@ -285,22 +315,21 @@ async function handleVectorOperation(ctx, request) {
|
|
|
285
315
|
}
|
|
286
316
|
case "clearTable":
|
|
287
317
|
case "dropTable": {
|
|
288
|
-
const
|
|
289
|
-
const
|
|
290
|
-
const
|
|
291
|
-
|
|
292
|
-
for (const doc of docsToDelete) {
|
|
293
|
-
await ctx.db.delete(doc._id);
|
|
294
|
-
}
|
|
318
|
+
const docs = await ctx.db.query(convexTable).withIndex("by_index", (q) => q.eq("indexName", indexName)).take(STORAGE_MUTATION_BATCH_SIZE + 1);
|
|
319
|
+
const hasMore = docs.length > STORAGE_MUTATION_BATCH_SIZE;
|
|
320
|
+
const docsToDelete = hasMore ? docs.slice(0, STORAGE_MUTATION_BATCH_SIZE) : docs;
|
|
321
|
+
await deleteDocs(ctx, docsToDelete);
|
|
295
322
|
return { ok: true, hasMore };
|
|
296
323
|
}
|
|
297
324
|
case "deleteMany": {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
325
|
+
const docsToDelete = await findExistingDocsByIds(
|
|
326
|
+
request.ids,
|
|
327
|
+
(id) => (
|
|
328
|
+
// Use composite key (indexName, id) to scope deletion per index
|
|
329
|
+
ctx.db.query(convexTable).withIndex("by_index_id", (q) => q.eq("indexName", indexName).eq("id", id)).unique()
|
|
330
|
+
)
|
|
331
|
+
);
|
|
332
|
+
await deleteDocs(ctx, docsToDelete);
|
|
304
333
|
return { ok: true };
|
|
305
334
|
}
|
|
306
335
|
default:
|
|
@@ -330,8 +359,8 @@ async function handleGenericOperation(ctx, request) {
|
|
|
330
359
|
return { ok: true };
|
|
331
360
|
}
|
|
332
361
|
case "batchInsert": {
|
|
333
|
-
|
|
334
|
-
|
|
362
|
+
const records = coalesceLastRecordById(request.records);
|
|
363
|
+
await mapInBatches(records, STORAGE_MUTATION_BATCH_SIZE, async (record) => {
|
|
335
364
|
const primaryKey = String(record.id);
|
|
336
365
|
const existing = await ctx.db.query(convexTable).withIndex("by_table_primary", (q) => q.eq("table", tableName).eq("primaryKey", primaryKey)).unique();
|
|
337
366
|
if (existing) {
|
|
@@ -343,7 +372,7 @@ async function handleGenericOperation(ctx, request) {
|
|
|
343
372
|
record
|
|
344
373
|
});
|
|
345
374
|
}
|
|
346
|
-
}
|
|
375
|
+
});
|
|
347
376
|
return { ok: true };
|
|
348
377
|
}
|
|
349
378
|
case "load": {
|
|
@@ -372,22 +401,18 @@ async function handleGenericOperation(ctx, request) {
|
|
|
372
401
|
}
|
|
373
402
|
case "clearTable":
|
|
374
403
|
case "dropTable": {
|
|
375
|
-
const
|
|
376
|
-
const
|
|
377
|
-
const
|
|
378
|
-
|
|
379
|
-
for (const doc of docsToDelete) {
|
|
380
|
-
await ctx.db.delete(doc._id);
|
|
381
|
-
}
|
|
404
|
+
const docs = await ctx.db.query(convexTable).withIndex("by_table", (q) => q.eq("table", tableName)).take(STORAGE_MUTATION_BATCH_SIZE + 1);
|
|
405
|
+
const hasMore = docs.length > STORAGE_MUTATION_BATCH_SIZE;
|
|
406
|
+
const docsToDelete = hasMore ? docs.slice(0, STORAGE_MUTATION_BATCH_SIZE) : docs;
|
|
407
|
+
await deleteDocs(ctx, docsToDelete);
|
|
382
408
|
return { ok: true, hasMore };
|
|
383
409
|
}
|
|
384
410
|
case "deleteMany": {
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
}
|
|
411
|
+
const docsToDelete = await findExistingDocsByIds(
|
|
412
|
+
request.ids,
|
|
413
|
+
(id) => ctx.db.query(convexTable).withIndex("by_table_primary", (q) => q.eq("table", tableName).eq("primaryKey", String(id))).unique()
|
|
414
|
+
);
|
|
415
|
+
await deleteDocs(ctx, docsToDelete);
|
|
391
416
|
return { ok: true };
|
|
392
417
|
}
|
|
393
418
|
default:
|
|
@@ -396,5 +421,5 @@ async function handleGenericOperation(ctx, request) {
|
|
|
396
421
|
}
|
|
397
422
|
|
|
398
423
|
exports.mastraStorage = mastraStorage;
|
|
399
|
-
//# sourceMappingURL=chunk-
|
|
400
|
-
//# sourceMappingURL=chunk-
|
|
424
|
+
//# sourceMappingURL=chunk-C6QDNSBM.cjs.map
|
|
425
|
+
//# sourceMappingURL=chunk-C6QDNSBM.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/index-map.ts","../src/server/storage.ts"],"names":["TABLE_THREADS","TABLE_MESSAGES","TABLE_RESOURCES","TABLE_WORKFLOW_SNAPSHOT","TABLE_SCORERS","mutationGeneric"],"mappings":"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","file":"chunk-C6QDNSBM.cjs","sourcesContent":["/**\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"]}
|
|
@@ -71,6 +71,40 @@ function findBestIndex(convexTable, filters) {
|
|
|
71
71
|
var TABLE_VECTOR_INDEXES = "mastra_vector_indexes";
|
|
72
72
|
var VECTOR_TABLE_PREFIX = "mastra_vector_";
|
|
73
73
|
var CONVEX_TABLE_WORKFLOW_SNAPSHOTS = "mastra_workflow_snapshots";
|
|
74
|
+
var STORAGE_MUTATION_BATCH_SIZE = 25;
|
|
75
|
+
async function mapInBatches(inputs, batchSize, mapper) {
|
|
76
|
+
const results = [];
|
|
77
|
+
for (let index = 0; index < inputs.length; index += batchSize) {
|
|
78
|
+
results.push(...await Promise.all(inputs.slice(index, index + batchSize).map(mapper)));
|
|
79
|
+
}
|
|
80
|
+
return results;
|
|
81
|
+
}
|
|
82
|
+
async function deleteDocs(ctx, docs) {
|
|
83
|
+
await mapInBatches(docs, STORAGE_MUTATION_BATCH_SIZE, (doc) => ctx.db.delete(doc._id));
|
|
84
|
+
}
|
|
85
|
+
async function findExistingDocsByIds(ids, findDoc) {
|
|
86
|
+
const docs = await mapInBatches([...new Set(ids)], STORAGE_MUTATION_BATCH_SIZE, findDoc);
|
|
87
|
+
return docs.filter((doc) => Boolean(doc));
|
|
88
|
+
}
|
|
89
|
+
function coalesceTypedRecordsForBatchInsert(records) {
|
|
90
|
+
const recordsById = /* @__PURE__ */ new Map();
|
|
91
|
+
for (const record of records) {
|
|
92
|
+
const id = record.id;
|
|
93
|
+
if (!id) continue;
|
|
94
|
+
const key = String(id);
|
|
95
|
+
recordsById.set(key, { ...recordsById.get(key) ?? {}, ...record });
|
|
96
|
+
}
|
|
97
|
+
return [...recordsById.values()];
|
|
98
|
+
}
|
|
99
|
+
function coalesceLastRecordById(records) {
|
|
100
|
+
const recordsById = /* @__PURE__ */ new Map();
|
|
101
|
+
for (const record of records) {
|
|
102
|
+
const id = record.id;
|
|
103
|
+
if (!id) continue;
|
|
104
|
+
recordsById.set(String(id), record);
|
|
105
|
+
}
|
|
106
|
+
return [...recordsById.values()];
|
|
107
|
+
}
|
|
74
108
|
function resolveTable(tableName) {
|
|
75
109
|
switch (tableName) {
|
|
76
110
|
case TABLE_THREADS:
|
|
@@ -128,9 +162,9 @@ async function handleTypedOperation(ctx, convexTable, request) {
|
|
|
128
162
|
return { ok: true };
|
|
129
163
|
}
|
|
130
164
|
case "batchInsert": {
|
|
131
|
-
|
|
165
|
+
const records = coalesceTypedRecordsForBatchInsert(request.records);
|
|
166
|
+
await mapInBatches(records, STORAGE_MUTATION_BATCH_SIZE, async (record) => {
|
|
132
167
|
const id = record.id;
|
|
133
|
-
if (!id) continue;
|
|
134
168
|
const existing = await ctx.db.query(convexTable).withIndex("by_record_id", (q) => q.eq("id", id)).unique();
|
|
135
169
|
if (existing) {
|
|
136
170
|
const { id: _, ...updateData } = record;
|
|
@@ -138,7 +172,7 @@ async function handleTypedOperation(ctx, convexTable, request) {
|
|
|
138
172
|
} else {
|
|
139
173
|
await ctx.db.insert(convexTable, record);
|
|
140
174
|
}
|
|
141
|
-
}
|
|
175
|
+
});
|
|
142
176
|
return { ok: true };
|
|
143
177
|
}
|
|
144
178
|
case "load": {
|
|
@@ -193,22 +227,18 @@ async function handleTypedOperation(ctx, convexTable, request) {
|
|
|
193
227
|
}
|
|
194
228
|
case "clearTable":
|
|
195
229
|
case "dropTable": {
|
|
196
|
-
const
|
|
197
|
-
const
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
for (const doc of docsToDelete) {
|
|
201
|
-
await ctx.db.delete(doc._id);
|
|
202
|
-
}
|
|
230
|
+
const docs = await ctx.db.query(convexTable).take(STORAGE_MUTATION_BATCH_SIZE + 1);
|
|
231
|
+
const hasMore = docs.length > STORAGE_MUTATION_BATCH_SIZE;
|
|
232
|
+
const docsToDelete = hasMore ? docs.slice(0, STORAGE_MUTATION_BATCH_SIZE) : docs;
|
|
233
|
+
await deleteDocs(ctx, docsToDelete);
|
|
203
234
|
return { ok: true, hasMore };
|
|
204
235
|
}
|
|
205
236
|
case "deleteMany": {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
}
|
|
237
|
+
const docsToDelete = await findExistingDocsByIds(
|
|
238
|
+
request.ids,
|
|
239
|
+
(id) => ctx.db.query(convexTable).withIndex("by_record_id", (q) => q.eq("id", id)).unique()
|
|
240
|
+
);
|
|
241
|
+
await deleteDocs(ctx, docsToDelete);
|
|
212
242
|
return { ok: true };
|
|
213
243
|
}
|
|
214
244
|
default:
|
|
@@ -242,9 +272,9 @@ async function handleVectorOperation(ctx, request) {
|
|
|
242
272
|
return { ok: true };
|
|
243
273
|
}
|
|
244
274
|
case "batchInsert": {
|
|
245
|
-
|
|
275
|
+
const records = coalesceLastRecordById(request.records);
|
|
276
|
+
await mapInBatches(records, STORAGE_MUTATION_BATCH_SIZE, async (record) => {
|
|
246
277
|
const id = record.id;
|
|
247
|
-
if (!id) continue;
|
|
248
278
|
const existing = await ctx.db.query(convexTable).withIndex("by_index_id", (q) => q.eq("indexName", indexName).eq("id", id)).unique();
|
|
249
279
|
if (existing) {
|
|
250
280
|
await ctx.db.patch(existing._id, {
|
|
@@ -259,7 +289,7 @@ async function handleVectorOperation(ctx, request) {
|
|
|
259
289
|
metadata: record.metadata
|
|
260
290
|
});
|
|
261
291
|
}
|
|
262
|
-
}
|
|
292
|
+
});
|
|
263
293
|
return { ok: true };
|
|
264
294
|
}
|
|
265
295
|
case "load": {
|
|
@@ -283,22 +313,21 @@ async function handleVectorOperation(ctx, request) {
|
|
|
283
313
|
}
|
|
284
314
|
case "clearTable":
|
|
285
315
|
case "dropTable": {
|
|
286
|
-
const
|
|
287
|
-
const
|
|
288
|
-
const
|
|
289
|
-
|
|
290
|
-
for (const doc of docsToDelete) {
|
|
291
|
-
await ctx.db.delete(doc._id);
|
|
292
|
-
}
|
|
316
|
+
const docs = await ctx.db.query(convexTable).withIndex("by_index", (q) => q.eq("indexName", indexName)).take(STORAGE_MUTATION_BATCH_SIZE + 1);
|
|
317
|
+
const hasMore = docs.length > STORAGE_MUTATION_BATCH_SIZE;
|
|
318
|
+
const docsToDelete = hasMore ? docs.slice(0, STORAGE_MUTATION_BATCH_SIZE) : docs;
|
|
319
|
+
await deleteDocs(ctx, docsToDelete);
|
|
293
320
|
return { ok: true, hasMore };
|
|
294
321
|
}
|
|
295
322
|
case "deleteMany": {
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
323
|
+
const docsToDelete = await findExistingDocsByIds(
|
|
324
|
+
request.ids,
|
|
325
|
+
(id) => (
|
|
326
|
+
// Use composite key (indexName, id) to scope deletion per index
|
|
327
|
+
ctx.db.query(convexTable).withIndex("by_index_id", (q) => q.eq("indexName", indexName).eq("id", id)).unique()
|
|
328
|
+
)
|
|
329
|
+
);
|
|
330
|
+
await deleteDocs(ctx, docsToDelete);
|
|
302
331
|
return { ok: true };
|
|
303
332
|
}
|
|
304
333
|
default:
|
|
@@ -328,8 +357,8 @@ async function handleGenericOperation(ctx, request) {
|
|
|
328
357
|
return { ok: true };
|
|
329
358
|
}
|
|
330
359
|
case "batchInsert": {
|
|
331
|
-
|
|
332
|
-
|
|
360
|
+
const records = coalesceLastRecordById(request.records);
|
|
361
|
+
await mapInBatches(records, STORAGE_MUTATION_BATCH_SIZE, async (record) => {
|
|
333
362
|
const primaryKey = String(record.id);
|
|
334
363
|
const existing = await ctx.db.query(convexTable).withIndex("by_table_primary", (q) => q.eq("table", tableName).eq("primaryKey", primaryKey)).unique();
|
|
335
364
|
if (existing) {
|
|
@@ -341,7 +370,7 @@ async function handleGenericOperation(ctx, request) {
|
|
|
341
370
|
record
|
|
342
371
|
});
|
|
343
372
|
}
|
|
344
|
-
}
|
|
373
|
+
});
|
|
345
374
|
return { ok: true };
|
|
346
375
|
}
|
|
347
376
|
case "load": {
|
|
@@ -370,22 +399,18 @@ async function handleGenericOperation(ctx, request) {
|
|
|
370
399
|
}
|
|
371
400
|
case "clearTable":
|
|
372
401
|
case "dropTable": {
|
|
373
|
-
const
|
|
374
|
-
const
|
|
375
|
-
const
|
|
376
|
-
|
|
377
|
-
for (const doc of docsToDelete) {
|
|
378
|
-
await ctx.db.delete(doc._id);
|
|
379
|
-
}
|
|
402
|
+
const docs = await ctx.db.query(convexTable).withIndex("by_table", (q) => q.eq("table", tableName)).take(STORAGE_MUTATION_BATCH_SIZE + 1);
|
|
403
|
+
const hasMore = docs.length > STORAGE_MUTATION_BATCH_SIZE;
|
|
404
|
+
const docsToDelete = hasMore ? docs.slice(0, STORAGE_MUTATION_BATCH_SIZE) : docs;
|
|
405
|
+
await deleteDocs(ctx, docsToDelete);
|
|
380
406
|
return { ok: true, hasMore };
|
|
381
407
|
}
|
|
382
408
|
case "deleteMany": {
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
}
|
|
409
|
+
const docsToDelete = await findExistingDocsByIds(
|
|
410
|
+
request.ids,
|
|
411
|
+
(id) => ctx.db.query(convexTable).withIndex("by_table_primary", (q) => q.eq("table", tableName).eq("primaryKey", String(id))).unique()
|
|
412
|
+
);
|
|
413
|
+
await deleteDocs(ctx, docsToDelete);
|
|
389
414
|
return { ok: true };
|
|
390
415
|
}
|
|
391
416
|
default:
|
|
@@ -394,5 +419,5 @@ async function handleGenericOperation(ctx, request) {
|
|
|
394
419
|
}
|
|
395
420
|
|
|
396
421
|
export { mastraStorage };
|
|
397
|
-
//# sourceMappingURL=chunk-
|
|
398
|
-
//# sourceMappingURL=chunk-
|
|
422
|
+
//# sourceMappingURL=chunk-NXNW2MK5.js.map
|
|
423
|
+
//# sourceMappingURL=chunk-NXNW2MK5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/index-map.ts","../src/server/storage.ts"],"names":[],"mappings":"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","file":"chunk-NXNW2MK5.js","sourcesContent":["/**\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"]}
|
package/dist/docs/SKILL.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.0.
|
|
2
|
+
"version": "1.0.10-alpha.0",
|
|
3
3
|
"package": "@mastra/convex",
|
|
4
4
|
"exports": {
|
|
5
5
|
"mastraStorage": {
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
-
"implementation": "dist/chunk-
|
|
7
|
+
"implementation": "dist/chunk-NXNW2MK5.js"
|
|
8
8
|
},
|
|
9
9
|
"TABLE_MESSAGES": {
|
|
10
10
|
"types": "dist/index.d.ts",
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkC6QDNSBM_cjs = require('./chunk-C6QDNSBM.cjs');
|
|
4
4
|
var chunkFTVDAP6U_cjs = require('./chunk-FTVDAP6U.cjs');
|
|
5
5
|
var storage = require('@mastra/core/storage');
|
|
6
6
|
var crypto = require('crypto');
|
|
@@ -1386,7 +1386,7 @@ function cosineSimilarity(a, b) {
|
|
|
1386
1386
|
|
|
1387
1387
|
Object.defineProperty(exports, "mastraStorage", {
|
|
1388
1388
|
enumerable: true,
|
|
1389
|
-
get: function () { return
|
|
1389
|
+
get: function () { return chunkC6QDNSBM_cjs.mastraStorage; }
|
|
1390
1390
|
});
|
|
1391
1391
|
Object.defineProperty(exports, "TABLE_MESSAGES", {
|
|
1392
1392
|
enumerable: true,
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { mastraStorage } from './chunk-
|
|
1
|
+
export { mastraStorage } from './chunk-NXNW2MK5.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, createVectorErrorId, MemoryStorage, TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES, createStorageErrorId, normalizePerPage, calculatePagination, filterByDateRange, safelyParseJSON, WorkflowsStorage, TABLE_WORKFLOW_SNAPSHOT, ScoresStorage, TABLE_SCORERS, BackgroundTasksStorage, TABLE_BACKGROUND_TASKS } from '@mastra/core/storage';
|
|
4
4
|
import crypto from 'crypto';
|
package/dist/server/index.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkC6QDNSBM_cjs = require('../chunk-C6QDNSBM.cjs');
|
|
4
4
|
var chunkFTVDAP6U_cjs = require('../chunk-FTVDAP6U.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
Object.defineProperty(exports, "mastraStorage", {
|
|
9
9
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
10
|
+
get: function () { return chunkC6QDNSBM_cjs.mastraStorage; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "TABLE_MESSAGES", {
|
|
13
13
|
enumerable: true,
|
package/dist/server/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { mastraStorage } from '../chunk-
|
|
1
|
+
export { mastraStorage } from '../chunk-NXNW2MK5.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
|
//# sourceMappingURL=index.js.map
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AAIvE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAsFxE;;;GAGG;AACH,eAAO,MAAM,aAAa,gGAuBxB,CAAC;AAEH;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC,CA0J1B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/convex",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.10-alpha.0",
|
|
4
4
|
"description": "Convex provider for Mastra - includes both storage and vector adapters plus Convex server helpers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -51,10 +51,10 @@
|
|
|
51
51
|
"tsup": "^8.5.1",
|
|
52
52
|
"typescript": "^6.0.3",
|
|
53
53
|
"vitest": "4.1.5",
|
|
54
|
+
"@internal/types-builder": "0.0.65",
|
|
54
55
|
"@internal/lint": "0.0.90",
|
|
55
56
|
"@internal/storage-test-utils": "0.0.86",
|
|
56
|
-
"@mastra/core": "1.
|
|
57
|
-
"@internal/types-builder": "0.0.65"
|
|
57
|
+
"@mastra/core": "1.32.0-alpha.2"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"@mastra/core": ">=1.0.0-0 <2.0.0-0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/index-map.ts","../src/server/storage.ts"],"names":[],"mappings":"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","file":"chunk-ASKOKI4D.js","sourcesContent":["/**\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';\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';\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 for (const record of request.records) {\n const id = record.id;\n if (!id) continue;\n\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 BATCH_SIZE = 25;\n const docs = await ctx.db.query(convexTable).take(BATCH_SIZE + 1);\n const hasMore = docs.length > BATCH_SIZE;\n const docsToDelete = hasMore ? docs.slice(0, BATCH_SIZE) : docs;\n\n for (const doc of docsToDelete) {\n await ctx.db.delete(doc._id);\n }\n return { ok: true, hasMore };\n }\n\n case 'deleteMany': {\n for (const id of request.ids) {\n const doc = await ctx.db\n .query(convexTable)\n .withIndex('by_record_id', (q: any) => q.eq('id', id))\n .unique();\n if (doc) {\n await ctx.db.delete(doc._id);\n }\n }\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 for (const record of request.records) {\n const id = record.id;\n if (!id) continue;\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 BATCH_SIZE = 25;\n const docs = await ctx.db\n .query(convexTable)\n .withIndex('by_index', (q: any) => q.eq('indexName', indexName))\n .take(BATCH_SIZE + 1);\n const hasMore = docs.length > BATCH_SIZE;\n const docsToDelete = hasMore ? docs.slice(0, BATCH_SIZE) : docs;\n\n for (const doc of docsToDelete) {\n await ctx.db.delete(doc._id);\n }\n return { ok: true, hasMore };\n }\n\n case 'deleteMany': {\n for (const id of request.ids) {\n // Use composite key (indexName, id) to scope deletion per index\n const doc = await ctx.db\n .query(convexTable)\n .withIndex('by_index_id', (q: any) => q.eq('indexName', indexName).eq('id', id))\n .unique();\n if (doc) {\n await ctx.db.delete(doc._id);\n }\n }\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 for (const record of request.records) {\n if (!record.id) continue;\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 BATCH_SIZE = 25;\n const docs = await ctx.db\n .query(convexTable)\n .withIndex('by_table', (q: any) => q.eq('table', tableName))\n .take(BATCH_SIZE + 1);\n const hasMore = docs.length > BATCH_SIZE;\n const docsToDelete = hasMore ? docs.slice(0, BATCH_SIZE) : docs;\n\n for (const doc of docsToDelete) {\n await ctx.db.delete(doc._id);\n }\n return { ok: true, hasMore };\n }\n\n case 'deleteMany': {\n for (const id of request.ids) {\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_table_primary', (q: any) => q.eq('table', tableName).eq('primaryKey', String(id)))\n .unique();\n if (existing) {\n await ctx.db.delete(existing._id);\n }\n }\n return { ok: true };\n }\n\n default:\n return { ok: false, error: `Unsupported operation ${(request as any).op}` };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/index-map.ts","../src/server/storage.ts"],"names":["TABLE_THREADS","TABLE_MESSAGES","TABLE_RESOURCES","TABLE_WORKFLOW_SNAPSHOT","TABLE_SCORERS","mutationGeneric"],"mappings":"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","file":"chunk-JTEA2WBP.cjs","sourcesContent":["/**\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';\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';\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 for (const record of request.records) {\n const id = record.id;\n if (!id) continue;\n\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 BATCH_SIZE = 25;\n const docs = await ctx.db.query(convexTable).take(BATCH_SIZE + 1);\n const hasMore = docs.length > BATCH_SIZE;\n const docsToDelete = hasMore ? docs.slice(0, BATCH_SIZE) : docs;\n\n for (const doc of docsToDelete) {\n await ctx.db.delete(doc._id);\n }\n return { ok: true, hasMore };\n }\n\n case 'deleteMany': {\n for (const id of request.ids) {\n const doc = await ctx.db\n .query(convexTable)\n .withIndex('by_record_id', (q: any) => q.eq('id', id))\n .unique();\n if (doc) {\n await ctx.db.delete(doc._id);\n }\n }\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 for (const record of request.records) {\n const id = record.id;\n if (!id) continue;\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 BATCH_SIZE = 25;\n const docs = await ctx.db\n .query(convexTable)\n .withIndex('by_index', (q: any) => q.eq('indexName', indexName))\n .take(BATCH_SIZE + 1);\n const hasMore = docs.length > BATCH_SIZE;\n const docsToDelete = hasMore ? docs.slice(0, BATCH_SIZE) : docs;\n\n for (const doc of docsToDelete) {\n await ctx.db.delete(doc._id);\n }\n return { ok: true, hasMore };\n }\n\n case 'deleteMany': {\n for (const id of request.ids) {\n // Use composite key (indexName, id) to scope deletion per index\n const doc = await ctx.db\n .query(convexTable)\n .withIndex('by_index_id', (q: any) => q.eq('indexName', indexName).eq('id', id))\n .unique();\n if (doc) {\n await ctx.db.delete(doc._id);\n }\n }\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 for (const record of request.records) {\n if (!record.id) continue;\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 BATCH_SIZE = 25;\n const docs = await ctx.db\n .query(convexTable)\n .withIndex('by_table', (q: any) => q.eq('table', tableName))\n .take(BATCH_SIZE + 1);\n const hasMore = docs.length > BATCH_SIZE;\n const docsToDelete = hasMore ? docs.slice(0, BATCH_SIZE) : docs;\n\n for (const doc of docsToDelete) {\n await ctx.db.delete(doc._id);\n }\n return { ok: true, hasMore };\n }\n\n case 'deleteMany': {\n for (const id of request.ids) {\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_table_primary', (q: any) => q.eq('table', tableName).eq('primaryKey', String(id)))\n .unique();\n if (existing) {\n await ctx.db.delete(existing._id);\n }\n }\n return { ok: true };\n }\n\n default:\n return { ok: false, error: `Unsupported operation ${(request as any).op}` };\n }\n}\n"]}
|