@mastra/convex 1.2.1-alpha.0 → 1.2.1-alpha.2

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.
@@ -297,7 +297,17 @@ function findBestIndex(convexTable, filters) {
297
297
  // src/server/workflow-snapshot.ts
298
298
  var PENDING_MARKER_KEY = "__mastra_pending__";
299
299
  function isPendingMarker(val) {
300
- return val !== null && typeof val === "object" && PENDING_MARKER_KEY in val && val[PENDING_MARKER_KEY] === true;
300
+ return val !== null && typeof val === "object" && Object.prototype.hasOwnProperty.call(val, PENDING_MARKER_KEY) && val[PENDING_MARKER_KEY] === true && Object.keys(val).length === 1;
301
+ }
302
+ function isSuspendedStepResult(val) {
303
+ const result = val;
304
+ return val !== null && typeof val === "object" && "status" in val && result?.status === "suspended" && ("suspendPayload" in val || "suspendedAt" in val);
305
+ }
306
+ function canResetWithPendingMarker(val) {
307
+ if (val == null || isPendingMarker(val)) {
308
+ return true;
309
+ }
310
+ return isSuspendedStepResult(val);
301
311
  }
302
312
  function createEmptyWorkflowSnapshot(runId) {
303
313
  return {
@@ -328,12 +338,15 @@ function mergeWorkflowStepResult({
328
338
  const existingOutput = existingResult.output;
329
339
  const newOutput = result.output;
330
340
  const mergedOutput = [...existingOutput];
341
+ const hasPendingMarker = newOutput.some(isPendingMarker);
331
342
  for (let i = 0; i < Math.max(existingOutput.length, newOutput.length); i++) {
332
343
  if (i < newOutput.length) {
333
344
  const newVal = newOutput[i];
334
345
  if (isPendingMarker(newVal)) {
335
- mergedOutput[i] = null;
336
- } else if (newVal !== null) {
346
+ if (i >= existingOutput.length || canResetWithPendingMarker(existingOutput[i])) {
347
+ mergedOutput[i] = null;
348
+ }
349
+ } else if (newVal !== null && newVal !== void 0 && !hasPendingMarker) {
337
350
  mergedOutput[i] = newVal;
338
351
  } else if (i >= existingOutput.length) {
339
352
  mergedOutput[i] = null;
@@ -342,7 +355,9 @@ function mergeWorkflowStepResult({
342
355
  }
343
356
  snapshot.context[stepId] = {
344
357
  ...existingResult,
345
- ...result,
358
+ // Pending-marker writes are reset commands built from an earlier snapshot,
359
+ // so keep existing step-level fields and ignore sibling values they carry.
360
+ ...hasPendingMarker ? {} : result,
346
361
  output: mergedOutput
347
362
  };
348
363
  } else {
@@ -359,6 +374,7 @@ var CONVEX_TABLE_WORKFLOW_SNAPSHOTS = "mastra_workflow_snapshots";
359
374
  var CONVEX_TABLE_BACKGROUND_TASKS = "mastra_background_tasks";
360
375
  var CONVEX_TABLE_DOCUMENTS = "mastra_documents";
361
376
  var STORAGE_MUTATION_BATCH_SIZE = 25;
377
+ var LOAD_MANY_MAX_IDS_PER_REQUEST = 10;
362
378
  var DEFAULT_SCHEDULE_QUERY_LIMIT = 100;
363
379
  var BACKGROUND_TASK_FIELD_ALIASES = {
364
380
  tool_call_id: "toolCallId",
@@ -386,6 +402,12 @@ function normalizeScheduleQueryLimit(limit) {
386
402
  if (limit == null || !Number.isFinite(limit)) return DEFAULT_SCHEDULE_QUERY_LIMIT;
387
403
  return Math.max(0, Math.floor(limit));
388
404
  }
405
+ function normalizeLoadManyIds(ids) {
406
+ if (ids.length > LOAD_MANY_MAX_IDS_PER_REQUEST) {
407
+ throw new Error(`loadMany supports at most ${LOAD_MANY_MAX_IDS_PER_REQUEST} ids per request`);
408
+ }
409
+ return [...new Set(ids)];
410
+ }
389
411
  function applyConvexEqualityFilters(query, filters, indexedFields = /* @__PURE__ */ new Set()) {
390
412
  const remainingFilters = filters?.filter((filter) => !indexedFields.has(filter.field));
391
413
  if (!remainingFilters?.length) return query;
@@ -514,7 +536,7 @@ var mastraStorage = mutationGeneric(async (ctx, request) => {
514
536
  try {
515
537
  const { convexTable, isTyped } = resolveTable(request.tableName);
516
538
  if (request.tableName.startsWith(VECTOR_TABLE_PREFIX) && request.tableName !== TABLE_VECTOR_INDEXES) {
517
- return handleVectorOperation(ctx, request);
539
+ return await handleVectorOperation(ctx, request);
518
540
  }
519
541
  if (isTyped) {
520
542
  if (isBackgroundTasksTable(convexTable, request)) {
@@ -540,6 +562,27 @@ function parseStoredSnapshot(stored, runId) {
540
562
  if (typeof stored === "string") return JSON.parse(stored);
541
563
  return JSON.parse(JSON.stringify(stored ?? createEmptyWorkflowSnapshot(runId)));
542
564
  }
565
+ function parseMetadataForMerge(metadata) {
566
+ if (metadata == null) return {};
567
+ if (typeof metadata === "string") {
568
+ try {
569
+ const parsed = JSON.parse(metadata);
570
+ return parseMetadataForMerge(parsed);
571
+ } catch {
572
+ return {};
573
+ }
574
+ }
575
+ if (typeof metadata === "object" && !Array.isArray(metadata)) {
576
+ return metadata;
577
+ }
578
+ return {};
579
+ }
580
+ function mergeMetadata(existing, update) {
581
+ return {
582
+ ...parseMetadataForMerge(existing),
583
+ ...update ?? {}
584
+ };
585
+ }
543
586
  async function handleTypedOperation(ctx, convexTable, request) {
544
587
  switch (request.op) {
545
588
  case "createSchedule": {
@@ -665,6 +708,50 @@ async function handleTypedOperation(ctx, convexTable, request) {
665
708
  });
666
709
  return { ok: true };
667
710
  }
711
+ case "updateThread": {
712
+ if (convexTable !== "mastra_threads") {
713
+ return { ok: false, error: `Unsupported operation ${request.op} for table ${request.tableName}` };
714
+ }
715
+ const existing = await ctx.db.query(convexTable).withIndex("by_record_id", (q) => q.eq("id", request.id)).unique();
716
+ if (!existing) {
717
+ return { ok: true, result: null };
718
+ }
719
+ const patchRecord = {
720
+ title: request.title,
721
+ metadata: mergeMetadata(existing.metadata, request.metadata),
722
+ updatedAt: request.updatedAt
723
+ };
724
+ await ctx.db.patch(existing._id, patchRecord);
725
+ return { ok: true, result: { ...existing, ...patchRecord } };
726
+ }
727
+ case "updateResource": {
728
+ if (convexTable !== "mastra_resources") {
729
+ return { ok: false, error: `Unsupported operation ${request.op} for table ${request.tableName}` };
730
+ }
731
+ const existing = await ctx.db.query(convexTable).withIndex("by_record_id", (q) => q.eq("id", request.resourceId)).unique();
732
+ if (!existing) {
733
+ const record = {
734
+ id: request.resourceId,
735
+ ...request.workingMemory !== void 0 ? { workingMemory: request.workingMemory } : {},
736
+ metadata: request.metadata ?? {},
737
+ createdAt: request.createdAt,
738
+ updatedAt: request.updatedAt
739
+ };
740
+ await ctx.db.insert(convexTable, record);
741
+ return { ok: true, result: record };
742
+ }
743
+ const patchRecord = {
744
+ updatedAt: request.updatedAt
745
+ };
746
+ if (request.workingMemory !== void 0) {
747
+ patchRecord.workingMemory = request.workingMemory;
748
+ }
749
+ if (request.metadata !== void 0) {
750
+ patchRecord.metadata = mergeMetadata(existing.metadata, request.metadata);
751
+ }
752
+ await ctx.db.patch(existing._id, patchRecord);
753
+ return { ok: true, result: { ...existing, ...patchRecord } };
754
+ }
668
755
  case "patch": {
669
756
  const patchRecord = stripPatchKeys(request.record, ["id"]);
670
757
  const existing = await ctx.db.query(convexTable).withIndex("by_record_id", (q) => q.eq("id", request.id)).unique();
@@ -705,6 +792,31 @@ async function handleTypedOperation(ctx, convexTable, request) {
705
792
  const match = docs.find((doc) => Object.entries(keys).every(([key, value]) => doc[key] === value));
706
793
  return { ok: true, result: match || null };
707
794
  }
795
+ case "loadMany": {
796
+ const ids = normalizeLoadManyIds(request.ids);
797
+ const docs = await mapInBatches(
798
+ ids,
799
+ STORAGE_MUTATION_BATCH_SIZE,
800
+ (id) => ctx.db.query(convexTable).withIndex("by_record_id", (q) => q.eq("id", id)).unique()
801
+ );
802
+ const typedDocs = docs.filter(Boolean);
803
+ if (!isBackgroundTasksTable(convexTable, request)) {
804
+ return { ok: true, result: typedDocs };
805
+ }
806
+ const typedDocsById = new Map(typedDocs.map((doc) => [String(doc.id), doc]));
807
+ const legacyDocs = await mapInBatches(
808
+ ids.filter((id) => !typedDocsById.has(id)),
809
+ STORAGE_MUTATION_BATCH_SIZE,
810
+ (id) => findGenericDocumentById(ctx, request.tableName, id)
811
+ );
812
+ const legacyRecordsById = new Map(
813
+ legacyDocs.filter((doc) => Boolean(doc)).map((doc) => [String(doc.record.id), doc.record])
814
+ );
815
+ return {
816
+ ok: true,
817
+ result: ids.map((id) => typedDocsById.get(id) ?? legacyRecordsById.get(id)).filter(Boolean)
818
+ };
819
+ }
708
820
  case "queryTable": {
709
821
  const maxDocs = request.limit ? Math.min(request.limit * 2, 1e4) : 1e4;
710
822
  let query;
@@ -899,7 +1011,36 @@ async function handleVectorOperation(ctx, request) {
899
1011
  }
900
1012
  return { ok: true, result: null };
901
1013
  }
1014
+ case "loadMany": {
1015
+ const docs = await findExistingDocsByIds(
1016
+ normalizeLoadManyIds(request.ids),
1017
+ (id) => ctx.db.query(convexTable).withIndex("by_index_id", (q) => q.eq("indexName", indexName).eq("id", id)).unique()
1018
+ );
1019
+ return { ok: true, result: docs };
1020
+ }
902
1021
  case "queryTable": {
1022
+ if (request.cursor !== void 0 && request.pageSize === void 0) {
1023
+ throw new Error("queryTable cursor requires pageSize");
1024
+ }
1025
+ if (request.pageSize !== void 0) {
1026
+ if (!Number.isInteger(request.pageSize) || request.pageSize <= 0) {
1027
+ throw new Error("queryTable pageSize must be a positive integer");
1028
+ }
1029
+ if (request.limit !== void 0) {
1030
+ throw new Error("queryTable limit cannot be combined with pageSize");
1031
+ }
1032
+ const page = await ctx.db.query(convexTable).withIndex("by_index", (q) => q.eq("indexName", indexName)).paginate({ cursor: request.cursor ?? null, numItems: request.pageSize });
1033
+ let docs2 = page.page;
1034
+ if (request.filters && request.filters.length > 0) {
1035
+ docs2 = docs2.filter((doc) => request.filters.every((filter) => doc[filter.field] === filter.value));
1036
+ }
1037
+ return {
1038
+ ok: true,
1039
+ result: docs2,
1040
+ hasMore: !page.isDone,
1041
+ continuationCursor: page.continueCursor
1042
+ };
1043
+ }
903
1044
  const maxDocs = request.limit ? Math.min(request.limit * 2, 1e4) : 1e4;
904
1045
  let docs = await ctx.db.query(convexTable).withIndex("by_index", (q) => q.eq("indexName", indexName)).take(maxDocs);
905
1046
  if (request.filters && request.filters.length > 0) {
@@ -993,6 +1134,17 @@ async function handleGenericOperation(ctx, request) {
993
1134
  const match = docs.find((doc) => Object.entries(keys).every(([key, value]) => doc.record?.[key] === value));
994
1135
  return { ok: true, result: match ? match.record : null };
995
1136
  }
1137
+ case "loadMany": {
1138
+ const docs = await mapInBatches(
1139
+ normalizeLoadManyIds(request.ids),
1140
+ STORAGE_MUTATION_BATCH_SIZE,
1141
+ (id) => findGenericDocumentById(ctx, tableName, id)
1142
+ );
1143
+ return {
1144
+ ok: true,
1145
+ result: docs.filter((doc) => Boolean(doc)).map((doc) => doc.record)
1146
+ };
1147
+ }
996
1148
  case "queryTable": {
997
1149
  const maxDocs = request.limit ? Math.min(request.limit * 2, 1e4) : 1e4;
998
1150
  const docs = await ctx.db.query(convexTable).withIndex("by_table", (q) => q.eq("table", tableName)).take(maxDocs);
@@ -1301,5 +1453,5 @@ var mastraNativeVectorMutation = mutationGeneric({
1301
1453
  });
1302
1454
 
1303
1455
  export { mastraCache, mastraNativeVectorAction, mastraNativeVectorMutation, mastraNativeVectorQuery, mastraStorage };
1304
- //# sourceMappingURL=chunk-5T45UI6I.js.map
1305
- //# sourceMappingURL=chunk-5T45UI6I.js.map
1456
+ //# sourceMappingURL=chunk-77UWNT5X.js.map
1457
+ //# sourceMappingURL=chunk-77UWNT5X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/cache.ts","../src/server/index-map.ts","../src/server/workflow-snapshot.ts","../src/server/storage.ts","../src/server/native-vector.ts"],"names":["cleanup","mutationGeneric","docs","mapInBatches"],"mappings":"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","file":"chunk-77UWNT5X.js","sourcesContent":["import type { GenericMutationCtx as MutationCtx } from 'convex/server';\nimport { mutationGeneric } from 'convex/server';\nimport type { GenericId } from 'convex/values';\n\nimport type { CacheRequest, CacheResponse } from '../cache/types';\n\nconst CACHE_TABLE = 'mastra_cache';\nconst CACHE_LIST_TABLE = 'mastra_cache_list_items';\nconst CACHE_MUTATION_BATCH_SIZE = 25;\n\ntype CacheKind = 'value' | 'list' | 'counter' | 'deleted';\ntype CacheDoc = {\n _id: GenericId<string>;\n key: string;\n keyPrefix: string;\n kind: CacheKind;\n value?: string;\n counter?: number;\n expiresAt: number | null;\n};\ntype CacheListItem = {\n _id: GenericId<string>;\n key: string;\n keyPrefix: string;\n index: number;\n value: string;\n};\ntype DeleteBatchResult = {\n hasMore: boolean;\n};\n\nfunction encodeValue(value: unknown): string {\n // The cache wire format stores JSON strings; undefined is represented as null.\n return JSON.stringify(value === undefined ? null : value);\n}\n\nfunction decodeValue(value: string): unknown {\n return JSON.parse(value);\n}\n\nfunction isExpired(doc: { expiresAt: number | null }, now: number): boolean {\n return doc.expiresAt !== null && doc.expiresAt <= now;\n}\n\nfunction normalizeListRange(from: number, to: number, length: number): { from: number; to: number } | null {\n const normalizedFrom = from < 0 ? Math.max(length + from, 0) : from;\n const normalizedTo = to < 0 ? length + to : to;\n if (normalizedTo < normalizedFrom || normalizedFrom >= length) return null;\n return { from: normalizedFrom, to: normalizedTo };\n}\n\nasync function findCacheDoc(ctx: MutationCtx<any>, key: string): Promise<CacheDoc | null> {\n return (await ctx.db\n .query(CACHE_TABLE)\n .withIndex('by_key', (q: any) => q.eq('key', key))\n .first()) as CacheDoc | null;\n}\n\nasync function deleteCacheKey(ctx: MutationCtx<any>, key: string): Promise<DeleteBatchResult> {\n const [doc, listItems] = await Promise.all([\n findCacheDoc(ctx, key),\n ctx.db\n .query(CACHE_LIST_TABLE)\n .withIndex('by_key_index', (q: any) => q.eq('key', key))\n .take(CACHE_MUTATION_BATCH_SIZE + 1),\n ]);\n\n if (doc && doc.kind !== 'deleted') {\n await ctx.db.patch(doc._id, { kind: 'deleted' });\n }\n\n for (const item of listItems.slice(0, CACHE_MUTATION_BATCH_SIZE) as CacheListItem[]) {\n await ctx.db.delete(item._id);\n }\n\n const hasMore = listItems.length > CACHE_MUTATION_BATCH_SIZE;\n if (doc && !hasMore) {\n await ctx.db.delete(doc._id);\n }\n\n return {\n hasMore,\n };\n}\n\nasync function getLiveCacheDoc(\n ctx: MutationCtx<any>,\n key: string,\n now: number,\n): Promise<{ doc: CacheDoc | null; hasMore: boolean }> {\n const doc = await findCacheDoc(ctx, key);\n if (!doc) return { doc: null, hasMore: false };\n if (doc.kind === 'deleted') {\n const cleanup = await deleteCacheKey(ctx, key);\n return { doc: null, hasMore: cleanup.hasMore };\n }\n if (!isExpired(doc, now)) return { doc, hasMore: false };\n\n const cleanup = await deleteCacheKey(ctx, key);\n return { doc: null, hasMore: cleanup.hasMore };\n}\n\nasync function writeCacheDoc(\n ctx: MutationCtx<any>,\n key: string,\n existing: CacheDoc | null,\n patch: Omit<CacheDoc, '_id' | 'key'>,\n): Promise<CacheDoc> {\n if (existing) {\n await ctx.db.patch(existing._id, patch);\n return { ...existing, ...patch };\n }\n\n const _id = await ctx.db.insert(CACHE_TABLE, { key, ...patch });\n return { _id, key, ...patch };\n}\n\nasync function clearPrefix(ctx: MutationCtx<any>, keyPrefix: string): Promise<boolean> {\n const [docs, orphanListItems] = await Promise.all([\n ctx.db\n .query(CACHE_TABLE)\n .withIndex('by_key_prefix', (q: any) => q.eq('keyPrefix', keyPrefix))\n .take(CACHE_MUTATION_BATCH_SIZE + 1),\n ctx.db\n .query(CACHE_LIST_TABLE)\n .withIndex('by_key_prefix', (q: any) => q.eq('keyPrefix', keyPrefix))\n .take(1),\n ]);\n\n if (docs.length > 0) {\n for (const doc of docs.slice(0, CACHE_MUTATION_BATCH_SIZE) as CacheDoc[]) {\n if (doc.kind === 'list' || doc.kind === 'deleted') {\n const cleanup = await deleteCacheKey(ctx, doc.key);\n return cleanup.hasMore || docs.length > 1 || orphanListItems.length > 0;\n }\n\n await ctx.db.delete(doc._id);\n }\n\n return docs.length > CACHE_MUTATION_BATCH_SIZE || orphanListItems.length > 0;\n }\n\n const listItems = (await ctx.db\n .query(CACHE_LIST_TABLE)\n .withIndex('by_key_prefix', (q: any) => q.eq('keyPrefix', keyPrefix))\n .take(CACHE_MUTATION_BATCH_SIZE + 1)) as CacheListItem[];\n\n for (const item of listItems.slice(0, CACHE_MUTATION_BATCH_SIZE)) {\n await ctx.db.delete(item._id);\n }\n\n return listItems.length > CACHE_MUTATION_BATCH_SIZE;\n}\n\nexport async function handleCacheOperation(ctx: MutationCtx<any>, request: CacheRequest): Promise<CacheResponse> {\n const now = Date.now();\n\n switch (request.op) {\n case 'get': {\n const { doc, hasMore } = await getLiveCacheDoc(ctx, request.key, now);\n if (hasMore) return { ok: true, result: null, hasMore: true };\n if (!doc || doc.kind !== 'value') return { ok: true, result: null };\n return { ok: true, result: decodeValue(doc.value ?? 'null') };\n }\n\n case 'set': {\n let existing = await findCacheDoc(ctx, request.key);\n if (existing && (isExpired(existing, now) || existing.kind !== 'value')) {\n const cleanup = await deleteCacheKey(ctx, request.key);\n if (cleanup.hasMore) {\n return { ok: true, hasMore: true };\n }\n existing = null;\n }\n\n await writeCacheDoc(ctx, request.key, existing, {\n keyPrefix: request.keyPrefix,\n kind: 'value',\n value: encodeValue(request.value),\n expiresAt: request.expiresAt,\n });\n return { ok: true };\n }\n\n case 'listLength': {\n const { doc, hasMore } = await getLiveCacheDoc(ctx, request.key, now);\n if (hasMore) return { ok: true, result: 0, hasMore: true };\n if (!doc) return { ok: true, result: 0 };\n if (doc.kind !== 'list') return { ok: false, error: `${request.key} exists but is not an array` };\n\n return { ok: true, result: doc.counter ?? 0 };\n }\n\n case 'listPush': {\n let existing = await findCacheDoc(ctx, request.key);\n if (existing && (isExpired(existing, now) || existing.kind === 'deleted')) {\n const cleanup = await deleteCacheKey(ctx, request.key);\n if (cleanup.hasMore) {\n return { ok: true, hasMore: true };\n }\n existing = null;\n }\n if (existing && existing.kind !== 'list') {\n return { ok: false, error: `${request.key} exists but is not an array` };\n }\n\n const doc = existing\n ? await writeCacheDoc(ctx, request.key, existing, {\n kind: 'list',\n keyPrefix: request.keyPrefix,\n counter: (existing.counter ?? 0) + 1,\n expiresAt: request.expiresAt,\n })\n : await writeCacheDoc(ctx, request.key, null, {\n kind: 'list',\n keyPrefix: request.keyPrefix,\n counter: 1,\n expiresAt: request.expiresAt,\n });\n\n await ctx.db.insert(CACHE_LIST_TABLE, {\n key: request.key,\n keyPrefix: request.keyPrefix,\n index: (doc.counter ?? 1) - 1,\n value: encodeValue(request.value),\n });\n\n return { ok: true };\n }\n\n case 'listFromTo': {\n const { doc, hasMore } = await getLiveCacheDoc(ctx, request.key, now);\n if (hasMore) return { ok: true, result: [], hasMore: true };\n if (!doc || doc.kind !== 'list') return { ok: true, result: [] };\n\n const range = normalizeListRange(request.from, request.to, doc.counter ?? 0);\n if (!range) return { ok: true, result: [] };\n\n const query = ctx.db.query(CACHE_LIST_TABLE).withIndex('by_key_index', (q: any) => {\n return q.eq('key', request.key).gte('index', range.from).lte('index', range.to);\n });\n const items = (await query.collect()) as CacheListItem[];\n\n return { ok: true, result: items.map(item => decodeValue(item.value)) };\n }\n\n case 'delete': {\n const cleanup = await deleteCacheKey(ctx, request.key);\n return { ok: true, hasMore: cleanup.hasMore };\n }\n\n case 'clear': {\n const hasMore = await clearPrefix(ctx, request.keyPrefix);\n return { ok: true, hasMore };\n }\n\n case 'increment': {\n let existing = await findCacheDoc(ctx, request.key);\n if (existing && (isExpired(existing, now) || existing.kind === 'deleted')) {\n const cleanup = await deleteCacheKey(ctx, request.key);\n if (cleanup.hasMore) {\n return { ok: true, hasMore: true };\n }\n existing = null;\n }\n if (existing && existing.kind !== 'counter') {\n return { ok: false, error: `${request.key} exists but is not a number` };\n }\n\n const nextCounter = (existing?.counter ?? 0) + 1;\n await writeCacheDoc(ctx, request.key, existing, {\n kind: 'counter',\n keyPrefix: request.keyPrefix,\n counter: nextCounter,\n expiresAt: request.expiresAt,\n });\n\n return { ok: true, result: nextCounter };\n }\n }\n\n return { ok: false, error: `Unsupported operation ${(request as any).op}` };\n}\n\nexport const mastraCache = mutationGeneric(\n async (ctx, request: CacheRequest): Promise<CacheResponse> => handleCacheOperation(ctx, request),\n);\n","/**\n * Index definitions for automatic query optimization.\n *\n * Maps each typed Convex table to its available indexes and their field lists.\n * Indexes with more fields are listed first so the best (most specific) match\n * is preferred during selection.\n *\n * These must stay in sync with the index definitions in schema.ts.\n */\nimport type { EqualityFilter } from '../storage/types';\n\nexport const TABLE_INDEX_MAP: Record<string, Array<{ name: string; fields: string[] }>> = {\n mastra_messages: [\n { name: 'by_thread_created', fields: ['thread_id', 'createdAt'] },\n { name: 'by_thread', fields: ['thread_id'] },\n { name: 'by_resource', fields: ['resourceId'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n mastra_threads: [\n { name: 'by_resource', fields: ['resourceId'] },\n { name: 'by_created', fields: ['createdAt'] },\n { name: 'by_updated', fields: ['updatedAt'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n mastra_resources: [\n { name: 'by_updated', fields: ['updatedAt'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n mastra_workflow_snapshots: [\n { name: 'by_workflow_run', fields: ['workflow_name', 'run_id'] },\n { name: 'by_workflow', fields: ['workflow_name'] },\n { name: 'by_resource', fields: ['resourceId'] },\n { name: 'by_created', fields: ['createdAt'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n mastra_scorers: [\n { name: 'by_entity', fields: ['entityId', 'entityType'] },\n { name: 'by_scorer', fields: ['scorerId'] },\n { name: 'by_run', fields: ['runId'] },\n { name: 'by_created', fields: ['createdAt'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n mastra_schedules: [\n { name: 'by_workflow_status', fields: ['workflow_id', 'status'] },\n { name: 'by_workflow_id', fields: ['workflow_id'] },\n { name: 'by_owner', fields: ['owner_type', 'owner_id'] },\n { name: 'by_owner_id', fields: ['owner_id'] },\n { name: 'by_status_next_fire_at', fields: ['status', 'next_fire_at'] },\n { name: 'by_created', fields: ['created_at'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n mastra_schedule_triggers: [\n { name: 'by_schedule_actual', fields: ['schedule_id', 'actual_fire_at'] },\n { name: 'by_parent_trigger', fields: ['parent_trigger_id'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n mastra_channel_installations: [\n { name: 'by_platform_agent', fields: ['platform', 'agentId'] },\n { name: 'by_webhook', fields: ['webhookId'] },\n { name: 'by_platform', fields: ['platform'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n mastra_channel_config: [\n { name: 'by_platform', fields: ['platform'] },\n { name: 'by_record_id', fields: ['id'] },\n ],\n mastra_background_tasks: [\n { name: 'by_agent_status', fields: ['agent_id', 'status'] },\n { name: 'by_status_created', fields: ['status', 'createdAt'] },\n { name: 'by_run', fields: ['run_id'] },\n { name: 'by_tool_call', fields: ['tool_call_id'] },\n { name: 'by_thread', fields: ['thread_id'] },\n { name: 'by_resource', fields: ['resource_id'] },\n { name: 'by_tool', fields: ['tool_name'] },\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","// NOTE: This mirrors packages/core/src/storage/workflow-snapshot.ts. The Convex\n// server runtime can't import @mastra/core, so keep both copies in sync.\nconst PENDING_MARKER_KEY = '__mastra_pending__';\n\nfunction isPendingMarker(val: unknown): boolean {\n return (\n val !== null &&\n typeof val === 'object' &&\n Object.prototype.hasOwnProperty.call(val, PENDING_MARKER_KEY) &&\n (val as Record<string, unknown>)[PENDING_MARKER_KEY] === true &&\n Object.keys(val).length === 1\n );\n}\n\n// Suspended forEach iteration results may come from multiple engines. Treat\n// StepResult-shaped suspended entries as resettable without relying only on\n// evented __workflow_meta, but avoid matching plain user outputs with only\n// status/payload fields.\nfunction isSuspendedStepResult(val: unknown): boolean {\n const result = val as Record<string, unknown> | null;\n\n return (\n val !== null &&\n typeof val === 'object' &&\n 'status' in val &&\n result?.status === 'suspended' &&\n ('suspendPayload' in val || 'suspendedAt' in val)\n );\n}\n\nfunction canResetWithPendingMarker(val: unknown): boolean {\n if (val == null || isPendingMarker(val)) {\n return true;\n }\n\n return isSuspendedStepResult(val);\n}\n\nexport function createEmptyWorkflowSnapshot(runId: string): Record<string, any> {\n return {\n context: {},\n activePaths: [],\n activeStepsPath: {},\n timestamp: Date.now(),\n suspendedPaths: {},\n resumeLabels: {},\n serializedStepGraph: [],\n value: {},\n waitingPaths: {},\n status: 'pending',\n runId,\n };\n}\n\nexport function mergeWorkflowStepResult({\n snapshot,\n stepId,\n result,\n requestContext,\n}: {\n snapshot: Record<string, any>;\n stepId: string;\n result: Record<string, any>;\n requestContext: Record<string, any>;\n}): Record<string, any> {\n if (!snapshot?.context) {\n throw new Error(`Snapshot context not found for runId ${snapshot?.runId}`);\n }\n\n const existingResult = snapshot.context[stepId];\n if (\n existingResult &&\n 'output' in existingResult &&\n Array.isArray(existingResult.output) &&\n result &&\n typeof result === 'object' &&\n 'output' in result &&\n Array.isArray(result.output)\n ) {\n const existingOutput = existingResult.output as unknown[];\n const newOutput = result.output as unknown[];\n const mergedOutput = [...existingOutput];\n const hasPendingMarker = newOutput.some(isPendingMarker);\n for (let i = 0; i < Math.max(existingOutput.length, newOutput.length); i++) {\n if (i < newOutput.length) {\n const newVal = newOutput[i];\n if (isPendingMarker(newVal)) {\n if (i >= existingOutput.length || canResetWithPendingMarker(existingOutput[i])) {\n mergedOutput[i] = null;\n }\n } else if (newVal !== null && newVal !== undefined && !hasPendingMarker) {\n mergedOutput[i] = newVal;\n } else if (i >= existingOutput.length) {\n mergedOutput[i] = null;\n }\n }\n }\n snapshot.context[stepId] = {\n ...existingResult,\n // Pending-marker writes are reset commands built from an earlier snapshot,\n // so keep existing step-level fields and ignore sibling values they carry.\n ...(hasPendingMarker ? {} : result),\n output: mergedOutput,\n };\n } else {\n snapshot.context[stepId] = result;\n }\n\n snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };\n return JSON.parse(JSON.stringify(snapshot.context));\n}\n","import {\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_MESSAGES,\n TABLE_THREADS,\n TABLE_RESOURCES,\n TABLE_SCORERS,\n TABLE_SCHEDULES,\n TABLE_SCHEDULE_TRIGGERS,\n TABLE_CHANNEL_INSTALLATIONS,\n TABLE_CHANNEL_CONFIG,\n TABLE_BACKGROUND_TASKS,\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 { EqualityFilter, StorageRequest, StorageResponse } from '../storage/types';\nimport { findBestIndex } from './index-map';\nimport { createEmptyWorkflowSnapshot, mergeWorkflowStepResult } from './workflow-snapshot';\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 CONVEX_TABLE_BACKGROUND_TASKS = 'mastra_background_tasks';\nconst CONVEX_TABLE_DOCUMENTS = 'mastra_documents';\nconst STORAGE_MUTATION_BATCH_SIZE = 25;\n// Keep this in sync with ConvexDB's loadMany client chunk size. The low cap\n// bounds full-doc responses per request; individual document size still matters.\nconst LOAD_MANY_MAX_IDS_PER_REQUEST = 10;\nconst DEFAULT_SCHEDULE_QUERY_LIMIT = 100;\n\ntype ConvexDocWithId = { _id: GenericId<string> };\ntype GenericDocumentDoc = ConvexDocWithId & { record: Record<string, unknown> };\ntype StorageRecord = Record<string, unknown> & { id?: unknown };\nconst BACKGROUND_TASK_FIELD_ALIASES: Record<string, string> = {\n tool_call_id: 'toolCallId',\n toolCallId: 'tool_call_id',\n tool_name: 'toolName',\n toolName: 'tool_name',\n agent_id: 'agentId',\n agentId: 'agent_id',\n run_id: 'runId',\n runId: 'run_id',\n thread_id: 'threadId',\n threadId: 'thread_id',\n resource_id: 'resourceId',\n resourceId: 'resource_id',\n suspend_payload: 'suspendPayload',\n suspendPayload: 'suspend_payload',\n retry_count: 'retryCount',\n retryCount: 'retry_count',\n max_retries: 'maxRetries',\n maxRetries: 'max_retries',\n timeout_ms: 'timeoutMs',\n timeoutMs: 'timeout_ms',\n};\n\nfunction normalizeScheduleQueryLimit(limit: number | undefined): number {\n if (limit == null || !Number.isFinite(limit)) return DEFAULT_SCHEDULE_QUERY_LIMIT;\n return Math.max(0, Math.floor(limit));\n}\n\nfunction normalizeLoadManyIds(ids: string[]): string[] {\n if (ids.length > LOAD_MANY_MAX_IDS_PER_REQUEST) {\n throw new Error(`loadMany supports at most ${LOAD_MANY_MAX_IDS_PER_REQUEST} ids per request`);\n }\n return [...new Set(ids)];\n}\n\nfunction applyConvexEqualityFilters(\n query: any,\n filters: EqualityFilter[] | undefined,\n indexedFields = new Set<string>(),\n) {\n const remainingFilters = filters?.filter(filter => !indexedFields.has(filter.field));\n if (!remainingFilters?.length) return query;\n\n return query.filter((q: any) => {\n const predicates = remainingFilters.map(filter => q.eq(q.field(filter.field), filter.value));\n return predicates.length === 1 ? predicates[0] : q.and(...predicates);\n });\n}\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 isBackgroundTasksTable(convexTable: string, request: StorageRequest): boolean {\n return convexTable === CONVEX_TABLE_BACKGROUND_TASKS && request.tableName === TABLE_BACKGROUND_TASKS;\n}\n\nfunction matchesFilters(record: Record<string, unknown>, filters: EqualityFilter[]): boolean {\n return filters.every(filter => {\n if (record[filter.field] === filter.value) return true;\n const alternateField = BACKGROUND_TASK_FIELD_ALIASES[filter.field];\n return alternateField ? record[alternateField] === filter.value : false;\n });\n}\n\nfunction mergeLegacyRecord(record: Record<string, unknown>, patch: Record<string, unknown>): Record<string, unknown> {\n const merged = { ...record };\n for (const [field, value] of Object.entries(patch)) {\n const alternateField = BACKGROUND_TASK_FIELD_ALIASES[field];\n if (alternateField) delete merged[alternateField];\n merged[field] = value;\n }\n return merged;\n}\n\nfunction stripPatchKeys(record: Record<string, unknown>, keys: string[]): Record<string, unknown> {\n const stripped = { ...record };\n for (const key of keys) delete stripped[key];\n return stripped;\n}\n\nfunction dedupeByRecordId(records: any[]): any[] {\n const seen = new Set<string>();\n return records.filter(record => {\n if (record?.id == null) return true;\n\n const id = String(record.id);\n if (seen.has(id)) return false;\n seen.add(id);\n return true;\n });\n}\n\nfunction isMissingBackgroundTaskSchemaError(error: unknown): boolean {\n const message = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();\n return (\n message.includes(CONVEX_TABLE_BACKGROUND_TASKS) &&\n (message.includes('does not exist') ||\n message.includes('not found') ||\n message.includes('not defined') ||\n message.includes('no such'))\n );\n}\n\nasync function findGenericDocumentById(\n ctx: MutationCtx<any>,\n tableName: string,\n id: string,\n): Promise<GenericDocumentDoc | null> {\n return await ctx.db\n .query(CONVEX_TABLE_DOCUMENTS)\n .withIndex('by_table_primary', (q: any) => q.eq('table', tableName).eq('primaryKey', String(id)))\n .unique();\n}\n\nasync function findGenericDocumentsByTable(\n ctx: MutationCtx<any>,\n tableName: string,\n limit: number,\n): Promise<GenericDocumentDoc[]> {\n return await ctx.db\n .query(CONVEX_TABLE_DOCUMENTS)\n .withIndex('by_table', (q: any) => q.eq('table', tableName))\n .take(limit);\n}\n\nasync function filterLegacyRecordsWithoutTypedCopy(\n ctx: MutationCtx<any>,\n convexTable: string,\n legacyRecords: Record<string, unknown>[],\n): Promise<Record<string, unknown>[]> {\n const records = await mapInBatches(legacyRecords, STORAGE_MUTATION_BATCH_SIZE, async record => {\n if (record.id == null) return record;\n\n const typedDoc = await ctx.db\n .query(convexTable)\n .withIndex('by_record_id', (q: any) => q.eq('id', String(record.id)))\n .unique();\n return typedDoc ? null : record;\n });\n\n return records.filter((record): record is Record<string, unknown> => Boolean(record));\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_SCHEDULES:\n return { convexTable: 'mastra_schedules', isTyped: true };\n case TABLE_SCHEDULE_TRIGGERS:\n return { convexTable: 'mastra_schedule_triggers', isTyped: true };\n case TABLE_CHANNEL_INSTALLATIONS:\n return { convexTable: 'mastra_channel_installations', isTyped: true };\n case TABLE_CHANNEL_CONFIG:\n return { convexTable: 'mastra_channel_config', isTyped: true };\n case TABLE_BACKGROUND_TASKS:\n return { convexTable: CONVEX_TABLE_BACKGROUND_TASKS, 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 await handleVectorOperation(ctx, request);\n }\n\n // Handle typed tables\n if (isTyped) {\n if (isBackgroundTasksTable(convexTable, request)) {\n try {\n return await handleTypedOperation(ctx, convexTable, request);\n } catch (error) {\n if (!isMissingBackgroundTaskSchemaError(error)) throw error;\n return handleGenericOperation(ctx, request);\n }\n }\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\nfunction parseStoredSnapshot(stored: unknown, runId: string): Record<string, any> {\n if (typeof stored === 'string') return JSON.parse(stored);\n return JSON.parse(JSON.stringify(stored ?? createEmptyWorkflowSnapshot(runId)));\n}\n\nfunction parseMetadataForMerge(metadata: unknown): Record<string, unknown> {\n if (metadata == null) return {};\n if (typeof metadata === 'string') {\n try {\n const parsed = JSON.parse(metadata);\n return parseMetadataForMerge(parsed);\n } catch {\n return {};\n }\n }\n if (typeof metadata === 'object' && !Array.isArray(metadata)) {\n return metadata as Record<string, unknown>;\n }\n return {};\n}\n\nfunction mergeMetadata(existing: unknown, update: Record<string, unknown> | undefined): Record<string, unknown> {\n return {\n ...parseMetadataForMerge(existing),\n ...(update ?? {}),\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 'createSchedule': {\n if (convexTable !== 'mastra_schedules') {\n throw new Error(`createSchedule is only supported for mastra_schedules`);\n }\n const record = request.record;\n const id = record.id;\n if (!id) {\n throw new Error(`Schedule is missing an id`);\n }\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 throw new Error(`Schedule with id \"${id}\" already exists`);\n }\n\n await ctx.db.insert(convexTable, record);\n return { ok: true };\n }\n\n case 'recordScheduleTrigger': {\n if (convexTable !== 'mastra_schedule_triggers') {\n throw new Error(`recordScheduleTrigger is only supported for mastra_schedule_triggers`);\n }\n const record = request.record;\n const id = record.id;\n if (!id) {\n throw new Error(`Schedule trigger is missing an id`);\n }\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 throw new Error(`Schedule trigger with id \"${id}\" already exists`);\n }\n\n await ctx.db.insert(convexTable, record);\n return { ok: true };\n }\n\n case 'listDueSchedules': {\n if (convexTable !== 'mastra_schedules') {\n throw new Error(`listDueSchedules is only supported for mastra_schedules`);\n }\n const query = ctx.db\n .query(convexTable)\n .withIndex('by_status_next_fire_at', (q: any) => q.eq('status', 'active').lte('next_fire_at', request.now));\n const docs = await query.take(normalizeScheduleQueryLimit(request.limit));\n return { ok: true, result: docs };\n }\n\n case 'updateScheduleNextFire': {\n if (convexTable !== 'mastra_schedules') {\n throw new Error(`updateScheduleNextFire is only supported for mastra_schedules`);\n }\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_record_id', (q: any) => q.eq('id', request.id))\n .unique();\n\n if (!existing || existing.status !== 'active' || existing.next_fire_at !== request.expectedNextFireAt) {\n return { ok: true, result: false };\n }\n\n await ctx.db.patch(existing._id, {\n next_fire_at: request.newNextFireAt,\n last_fire_at: request.lastFireAt,\n last_run_id: request.lastRunId,\n updated_at: Date.now(),\n });\n\n return { ok: true, result: true };\n }\n\n case 'updateSchedule': {\n if (convexTable !== 'mastra_schedules') {\n throw new Error(`updateSchedule is only supported for mastra_schedules`);\n }\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_record_id', (q: any) => q.eq('id', request.id))\n .unique();\n\n if (!existing) {\n throw new Error(`Schedule ${request.id} not found`);\n }\n\n await ctx.db.patch(existing._id, request.patch);\n return { ok: true, result: { ...existing, ...request.patch } };\n }\n\n case 'listScheduleTriggers': {\n if (convexTable !== 'mastra_schedule_triggers') {\n throw new Error(`listScheduleTriggers is only supported for mastra_schedule_triggers`);\n }\n\n const query = ctx.db\n .query(convexTable)\n .withIndex('by_schedule_actual', (q: any) => {\n let builder = q.eq('schedule_id', request.scheduleId);\n if (request.fromActualFireAt != null) {\n builder = builder.gte('actual_fire_at', request.fromActualFireAt);\n }\n if (request.toActualFireAt != null) {\n builder = builder.lt('actual_fire_at', request.toActualFireAt);\n }\n return builder;\n })\n .order('desc');\n const docs = await query.take(normalizeScheduleQueryLimit(request.limit));\n return { ok: true, result: docs };\n }\n\n case 'deleteScheduleTriggers': {\n if (convexTable !== 'mastra_schedule_triggers') {\n throw new Error(`deleteScheduleTriggers is only supported for mastra_schedule_triggers`);\n }\n\n const docs = await ctx.db\n .query(convexTable)\n .withIndex('by_schedule_actual', (q: any) => q.eq('schedule_id', request.scheduleId))\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 '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 'updateThread': {\n if (convexTable !== 'mastra_threads') {\n return { ok: false, error: `Unsupported operation ${request.op} for table ${request.tableName}` };\n }\n\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_record_id', (q: any) => q.eq('id', request.id))\n .unique();\n\n if (!existing) {\n return { ok: true, result: null };\n }\n\n const patchRecord = {\n title: request.title,\n metadata: mergeMetadata(existing.metadata, request.metadata),\n updatedAt: request.updatedAt,\n };\n await ctx.db.patch(existing._id, patchRecord);\n return { ok: true, result: { ...existing, ...patchRecord } };\n }\n\n case 'updateResource': {\n if (convexTable !== 'mastra_resources') {\n return { ok: false, error: `Unsupported operation ${request.op} for table ${request.tableName}` };\n }\n\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_record_id', (q: any) => q.eq('id', request.resourceId))\n .unique();\n\n if (!existing) {\n const record = {\n id: request.resourceId,\n ...(request.workingMemory !== undefined ? { workingMemory: request.workingMemory } : {}),\n metadata: request.metadata ?? {},\n createdAt: request.createdAt,\n updatedAt: request.updatedAt,\n };\n await ctx.db.insert(convexTable, record);\n return { ok: true, result: record };\n }\n\n const patchRecord: Record<string, unknown> = {\n updatedAt: request.updatedAt,\n };\n if (request.workingMemory !== undefined) {\n patchRecord.workingMemory = request.workingMemory;\n }\n if (request.metadata !== undefined) {\n patchRecord.metadata = mergeMetadata(existing.metadata, request.metadata);\n }\n\n await ctx.db.patch(existing._id, patchRecord);\n return { ok: true, result: { ...existing, ...patchRecord } };\n }\n\n case 'patch': {\n const patchRecord = stripPatchKeys(request.record, ['id']);\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_record_id', (q: any) => q.eq('id', request.id))\n .unique();\n\n if (!existing) {\n if (isBackgroundTasksTable(convexTable, request)) {\n const legacy = await findGenericDocumentById(ctx, request.tableName, request.id);\n if (legacy) {\n await ctx.db.patch(legacy._id, { record: mergeLegacyRecord(legacy.record, patchRecord) });\n return { ok: true, result: true };\n }\n }\n return { ok: true, result: false };\n }\n\n await ctx.db.patch(existing._id, patchRecord);\n if (isBackgroundTasksTable(convexTable, request)) {\n const legacy = await findGenericDocumentById(ctx, request.tableName, request.id);\n if (legacy) {\n await ctx.db.delete(legacy._id);\n }\n }\n return { ok: true, result: 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 if (!doc && isBackgroundTasksTable(convexTable, request)) {\n const legacy = await findGenericDocumentById(ctx, request.tableName, String(keys.id));\n return { ok: true, result: legacy?.record ?? null };\n }\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 'loadMany': {\n const ids = normalizeLoadManyIds(request.ids);\n const docs = await mapInBatches(ids, STORAGE_MUTATION_BATCH_SIZE, id =>\n ctx.db\n .query(convexTable)\n .withIndex('by_record_id', (q: any) => q.eq('id', id))\n .unique(),\n );\n const typedDocs = docs.filter(Boolean);\n\n if (!isBackgroundTasksTable(convexTable, request)) {\n return { ok: true, result: typedDocs };\n }\n\n const typedDocsById = new Map(typedDocs.map(doc => [String((doc as Record<string, unknown>).id), doc]));\n const legacyDocs = await mapInBatches(\n ids.filter(id => !typedDocsById.has(id)),\n STORAGE_MUTATION_BATCH_SIZE,\n id => findGenericDocumentById(ctx, request.tableName, id),\n );\n const legacyRecordsById = new Map(\n legacyDocs\n .filter((doc): doc is GenericDocumentDoc => Boolean(doc))\n .map(doc => [String(doc.record.id), doc.record]),\n );\n return {\n ok: true,\n result: ids.map(id => typedDocsById.get(id) ?? legacyRecordsById.get(id)).filter(Boolean),\n };\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 query: any;\n let indexedFields = new Set<string>();\n if (request.indexHint) {\n const hint = request.indexHint;\n if (hint.index === 'by_workflow') {\n query = ctx.db\n .query(convexTable)\n .withIndex('by_workflow', (q: any) => q.eq('workflow_name', hint.workflowName));\n } else if (hint.index === 'by_workflow_run') {\n query = ctx.db\n .query(convexTable)\n .withIndex('by_workflow_run', (q: any) =>\n q.eq('workflow_name', hint.workflowName).eq('run_id', hint.runId),\n );\n } else {\n query = ctx.db.query(convexTable);\n }\n } else if (request.filters && request.filters.length > 0) {\n const match = findBestIndex(convexTable, request.filters);\n if (match) {\n query = ctx.db.query(convexTable).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 indexedFields = new Set(match.indexedFilters.map(filter => filter.field));\n } else {\n query = ctx.db.query(convexTable);\n }\n } else {\n query = ctx.db.query(convexTable);\n }\n\n let docs = await applyConvexEqualityFilters(query, request.filters, indexedFields).take(maxDocs);\n\n if (isBackgroundTasksTable(convexTable, request)) {\n const legacyDocs = await findGenericDocumentsByTable(ctx, request.tableName, maxDocs);\n let legacyRecords = legacyDocs.map(doc => doc.record);\n if (request.filters && request.filters.length > 0) {\n legacyRecords = legacyRecords.filter(record => matchesFilters(record, request.filters!));\n }\n legacyRecords = await filterLegacyRecordsWithoutTypedCopy(ctx, convexTable, legacyRecords);\n docs.push(...legacyRecords);\n docs = dedupeByRecordId(docs);\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 let docsToDelete = hasMore ? docs.slice(0, STORAGE_MUTATION_BATCH_SIZE) : docs;\n let legacyHasMore = false;\n\n if (\n !hasMore &&\n docsToDelete.length < STORAGE_MUTATION_BATCH_SIZE &&\n isBackgroundTasksTable(convexTable, request)\n ) {\n const remainingBatchSize = STORAGE_MUTATION_BATCH_SIZE - docsToDelete.length;\n const legacyDocs = await findGenericDocumentsByTable(ctx, request.tableName, remainingBatchSize + 1);\n legacyHasMore = legacyDocs.length > remainingBatchSize;\n docsToDelete = docsToDelete.concat(legacyHasMore ? legacyDocs.slice(0, remainingBatchSize) : legacyDocs);\n }\n\n await deleteDocs(ctx, docsToDelete);\n return { ok: true, hasMore: hasMore || legacyHasMore };\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 if (isBackgroundTasksTable(convexTable, request)) {\n docsToDelete.push(\n ...(await findExistingDocsByIds(request.ids, id => findGenericDocumentById(ctx, request.tableName, id))),\n );\n }\n await deleteDocs(ctx, docsToDelete);\n return { ok: true };\n }\n\n case 'mergeWorkflowStepResult': {\n if (convexTable !== CONVEX_TABLE_WORKFLOW_SNAPSHOTS) {\n return { ok: false, error: `Unsupported operation ${request.op} for table ${request.tableName}` };\n }\n\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_workflow_run', (q: any) =>\n q.eq('workflow_name', request.workflowName).eq('run_id', request.runId),\n )\n .unique();\n\n if (!existing) {\n return { ok: false, error: `Workflow snapshot not found for runId ${request.runId}` };\n }\n\n const snapshot = parseStoredSnapshot(existing.snapshot, request.runId);\n if (!snapshot.context) {\n return { ok: false, error: `Snapshot for runId ${request.runId} is missing or has invalid context` };\n }\n\n const context = mergeWorkflowStepResult({\n snapshot,\n stepId: request.stepId,\n result: JSON.parse(request.result),\n requestContext: JSON.parse(request.requestContext),\n });\n\n await ctx.db.patch(existing._id, {\n snapshot: JSON.stringify(snapshot),\n updatedAt: new Date().toISOString(),\n });\n\n return { ok: true, result: JSON.stringify(context) };\n }\n\n case 'mergeWorkflowState': {\n if (convexTable !== CONVEX_TABLE_WORKFLOW_SNAPSHOTS) {\n return { ok: false, error: `Unsupported operation ${request.op} for table ${request.tableName}` };\n }\n\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_workflow_run', (q: any) =>\n q.eq('workflow_name', request.workflowName).eq('run_id', request.runId),\n )\n .unique();\n\n if (!existing) {\n return { ok: false, error: `Workflow snapshot not found for runId ${request.runId}` };\n }\n\n const snapshot = parseStoredSnapshot(existing.snapshot, request.runId);\n if (!snapshot.context) {\n return { ok: false, error: `Snapshot for runId ${request.runId} is missing or has invalid context` };\n }\n\n const mergedSnapshot = { ...snapshot, ...JSON.parse(request.opts) };\n await ctx.db.patch(existing._id, {\n snapshot: JSON.stringify(mergedSnapshot),\n updatedAt: new Date().toISOString(),\n });\n\n return { ok: true, result: JSON.stringify(mergedSnapshot) };\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 'patch': {\n const patchRecord = stripPatchKeys(request.record, ['id', 'indexName']);\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_index_id', (q: any) => q.eq('indexName', indexName).eq('id', request.id))\n .unique();\n\n if (!existing) {\n return { ok: true, result: false };\n }\n\n await ctx.db.patch(existing._id, patchRecord);\n return { ok: true, result: 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 'loadMany': {\n const docs = await findExistingDocsByIds(normalizeLoadManyIds(request.ids), id =>\n ctx.db\n .query(convexTable)\n .withIndex('by_index_id', (q: any) => q.eq('indexName', indexName).eq('id', id))\n .unique(),\n );\n return { ok: true, result: docs };\n }\n\n case 'queryTable': {\n if (request.cursor !== undefined && request.pageSize === undefined) {\n throw new Error('queryTable cursor requires pageSize');\n }\n\n if (request.pageSize !== undefined) {\n if (!Number.isInteger(request.pageSize) || request.pageSize <= 0) {\n throw new Error('queryTable pageSize must be a positive integer');\n }\n if (request.limit !== undefined) {\n throw new Error('queryTable limit cannot be combined with pageSize');\n }\n\n const page = await ctx.db\n .query(convexTable)\n .withIndex('by_index', (q: any) => q.eq('indexName', indexName))\n .paginate({ cursor: request.cursor ?? null, numItems: request.pageSize });\n\n let docs = page.page;\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 return {\n ok: true,\n result: docs,\n hasMore: !page.isDone,\n continuationCursor: page.continueCursor,\n };\n }\n\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 'patch': {\n const patchRecord = stripPatchKeys(request.record, ['id']);\n const existing = await ctx.db\n .query(convexTable)\n .withIndex('by_table_primary', (q: any) => q.eq('table', tableName).eq('primaryKey', String(request.id)))\n .unique();\n\n if (!existing) {\n return { ok: true, result: false };\n }\n\n await ctx.db.patch(existing._id, {\n record:\n tableName === TABLE_BACKGROUND_TASKS\n ? mergeLegacyRecord(existing.record, patchRecord)\n : { ...existing.record, ...patchRecord },\n });\n return { ok: true, result: 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 'loadMany': {\n const docs = await mapInBatches(normalizeLoadManyIds(request.ids), STORAGE_MUTATION_BATCH_SIZE, id =>\n findGenericDocumentById(ctx, tableName, id),\n );\n return {\n ok: true,\n result: docs.filter((doc): doc is GenericDocumentDoc => Boolean(doc)).map(doc => doc.record),\n };\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 tableName === TABLE_BACKGROUND_TASKS\n ? matchesFilters(record, request.filters!)\n : request.filters!.every(filter => record?.[filter.field] === filter.value),\n );\n }\n\n if (request.limit) {\n records = records.slice(0, request.limit);\n }\n\n return { ok: true, result: records };\n }\n\n case 'clearTable':\n case 'dropTable': {\n // Delete a small batch per call to stay within Convex's 1-second mutation timeout.\n // Client must call repeatedly until hasMore is false.\n const docs = await ctx.db\n .query(convexTable)\n .withIndex('by_table', (q: any) => q.eq('table', tableName))\n .take(STORAGE_MUTATION_BATCH_SIZE + 1);\n const hasMore = docs.length > STORAGE_MUTATION_BATCH_SIZE;\n const docsToDelete = hasMore ? docs.slice(0, STORAGE_MUTATION_BATCH_SIZE) : docs;\n\n await deleteDocs(ctx, docsToDelete);\n return { ok: true, hasMore };\n }\n\n case 'deleteMany': {\n const docsToDelete = await findExistingDocsByIds(request.ids, id =>\n ctx.db\n .query(convexTable)\n .withIndex('by_table_primary', (q: any) => q.eq('table', tableName).eq('primaryKey', String(id)))\n .unique(),\n );\n await deleteDocs(ctx, docsToDelete);\n return { ok: true };\n }\n\n default:\n return { ok: false, error: `Unsupported operation ${(request as any).op}` };\n }\n}\n","import { actionGeneric, mutationGeneric, queryGeneric } from 'convex/server';\nimport { v } from 'convex/values';\nimport type { GenericId } from 'convex/values';\n\ntype NativeVectorFilterValue = string | number | boolean | null;\ntype NativeVectorFilterClause = {\n field: string;\n value: NativeVectorFilterValue;\n};\ntype NativeVectorFilter = NativeVectorFilterClause | { $or: NativeVectorFilterClause[] };\n\ntype NativeVectorIndexConfig = {\n tableName: string;\n vectorIndexName: string;\n dimension?: number;\n idField?: string;\n idIndexName?: string;\n vectorField?: string;\n metadataField?: string;\n filterFields?: string[];\n};\n\ntype NativeVectorDocument = Record<string, any> & {\n _id?: GenericId<string>;\n};\n\nconst DEFAULT_ID_FIELD = 'id';\nconst DEFAULT_ID_INDEX = 'by_record_id';\nconst DEFAULT_VECTOR_FIELD = 'embedding';\nconst DEFAULT_METADATA_FIELD = 'metadata';\nconst NATIVE_VECTOR_BATCH_SIZE = 25;\nconst MAX_CONVEX_VECTOR_RESULTS = 256;\n\nconst nativeVectorFilterValueValidator = v.union(v.string(), v.number(), v.boolean(), v.null());\nconst nativeVectorFilterClauseValidator = v.object({\n field: v.string(),\n value: nativeVectorFilterValueValidator,\n});\nconst nativeVectorFilterValidator = v.union(\n nativeVectorFilterClauseValidator,\n v.object({ $or: v.array(nativeVectorFilterClauseValidator) }),\n);\nconst nativeVectorIndexConfigValidator = v.object({\n tableName: v.string(),\n vectorIndexName: v.string(),\n dimension: v.optional(v.number()),\n idField: v.optional(v.string()),\n idIndexName: v.optional(v.string()),\n vectorField: v.optional(v.string()),\n metadataField: v.optional(v.string()),\n filterFields: v.optional(v.array(v.string())),\n});\n\nfunction idField(config: NativeVectorIndexConfig): string {\n return config.idField ?? DEFAULT_ID_FIELD;\n}\n\nfunction idIndexName(config: NativeVectorIndexConfig): string {\n return config.idIndexName ?? DEFAULT_ID_INDEX;\n}\n\nfunction vectorField(config: NativeVectorIndexConfig): string {\n return config.vectorField ?? DEFAULT_VECTOR_FIELD;\n}\n\nfunction metadataField(config: NativeVectorIndexConfig): string {\n return config.metadataField ?? DEFAULT_METADATA_FIELD;\n}\n\nfunction asTableName(tableName: string): any {\n return tableName as any;\n}\n\nfunction asConvexId(id: string): GenericId<string> {\n return id as GenericId<string>;\n}\n\nfunction pickFilterFields(metadata: Record<string, any> | undefined, filterFields: string[] | undefined) {\n const fields: Record<string, any> = {};\n if (!metadata || !filterFields) return fields;\n\n for (const field of filterFields) {\n const value = metadata[field];\n if (value !== undefined) {\n fields[field] = value;\n }\n }\n\n return fields;\n}\n\nfunction isMetadataRecord(value: unknown): value is Record<string, any> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction validateMetadataArray(metadata: unknown, idsLength: number): Array<Record<string, any>> | undefined {\n if (metadata === undefined) return undefined;\n if (!Array.isArray(metadata)) {\n throw new Error('Native vector upsert: metadata must be an array matching ids when provided');\n }\n if (metadata.length !== idsLength) {\n throw new Error(`Native vector upsert: metadata length (${metadata.length}) must match ids length (${idsLength})`);\n }\n if (!metadata.every(isMetadataRecord)) {\n throw new Error('Native vector upsert: metadata entries must be objects when provided');\n }\n return metadata;\n}\n\nfunction validateMetadataRecord(metadata: unknown): Record<string, any> | undefined {\n if (metadata === undefined) return undefined;\n if (!isMetadataRecord(metadata)) {\n throw new Error('Native vector update: metadata must be an object when provided');\n }\n return metadata;\n}\n\nfunction clearMissingFilterFields(\n patch: Record<string, any>,\n metadata: Record<string, any>,\n filterFields: string[] | undefined,\n) {\n if (!filterFields) return;\n\n for (const field of filterFields) {\n if (metadata[field] === undefined) {\n patch[field] = undefined;\n }\n }\n}\n\nfunction omitVectorField(doc: NativeVectorDocument, config: NativeVectorIndexConfig): NativeVectorDocument {\n const { [vectorField(config)]: _, ...docWithoutVector } = doc;\n return docWithoutVector;\n}\n\nfunction buildRecord({\n config,\n id,\n vector,\n metadata,\n}: {\n config: NativeVectorIndexConfig;\n id: string;\n vector: number[];\n metadata?: Record<string, any>;\n}) {\n return {\n [idField(config)]: id,\n [vectorField(config)]: vector,\n ...(metadata !== undefined ? { [metadataField(config)]: metadata } : {}),\n ...pickFilterFields(metadata, config.filterFields),\n };\n}\n\nasync function findByRecordId(\n ctx: any,\n config: NativeVectorIndexConfig,\n id: string,\n): Promise<NativeVectorDocument | null> {\n return ctx.db\n .query(asTableName(config.tableName))\n .withIndex(idIndexName(config), (q: any) => q.eq(idField(config), id))\n .unique();\n}\n\nasync function mapInBatches<TInput, TOutput>(\n inputs: TInput[],\n mapper: (input: TInput, index: number) => Promise<TOutput>,\n): Promise<TOutput[]> {\n const results: TOutput[] = [];\n for (let index = 0; index < inputs.length; index += NATIVE_VECTOR_BATCH_SIZE) {\n results.push(\n ...(await Promise.all(\n inputs\n .slice(index, index + NATIVE_VECTOR_BATCH_SIZE)\n .map((input, batchIndex) => mapper(input, index + batchIndex)),\n )),\n );\n }\n return results;\n}\n\nfunction buildVectorFilter(q: any, filter?: NativeVectorFilter) {\n if (!filter) return undefined;\n\n if ('$or' in filter) {\n return q.or(...filter.$or.map(clause => q.eq(clause.field, clause.value)));\n }\n\n return q.eq(filter.field, filter.value);\n}\n\nexport const mastraNativeVectorAction = actionGeneric({\n args: {\n config: nativeVectorIndexConfigValidator,\n vector: v.array(v.number()),\n limit: v.optional(v.number()),\n filter: v.optional(nativeVectorFilterValidator),\n },\n handler: async (ctx, args: any) => {\n const config = args.config as NativeVectorIndexConfig;\n const limit = args.limit as number | undefined;\n const filter = args.filter as NativeVectorFilter | undefined;\n\n if (limit !== undefined && (!Number.isInteger(limit) || limit < 1 || limit > MAX_CONVEX_VECTOR_RESULTS)) {\n throw new Error(`Native vector query: limit must be an integer between 1 and ${MAX_CONVEX_VECTOR_RESULTS}`);\n }\n\n const results = await ctx.vectorSearch(asTableName(config.tableName), config.vectorIndexName as any, {\n vector: args.vector,\n ...(limit !== undefined ? { limit } : {}),\n ...(filter ? { filter: (q: any) => buildVectorFilter(q, filter) } : {}),\n });\n\n return results.map(result => ({\n id: String(result._id),\n score: result._score,\n }));\n },\n});\n\nexport const mastraNativeVectorQuery = queryGeneric({\n args: {\n op: v.union(v.literal('getByConvexIds'), v.literal('describe'), v.literal('listByIds')),\n config: nativeVectorIndexConfigValidator,\n ids: v.optional(v.array(v.string())),\n includeVector: v.optional(v.boolean()),\n countLimit: v.optional(v.number()),\n },\n handler: async (ctx, args: any) => {\n const config = args.config as NativeVectorIndexConfig;\n\n switch (args.op as string) {\n case 'getByConvexIds': {\n const ids = args.ids as string[];\n if (!ids) {\n throw new Error('Native vector query: ids are required');\n }\n const includeVector = args.includeVector === true;\n const docs = await mapInBatches(ids, id => ctx.db.get(asConvexId(id)));\n return docs\n .filter((doc): doc is NativeVectorDocument => Boolean(doc))\n .map(doc => (includeVector ? doc : omitVectorField(doc, config)));\n }\n\n case 'describe': {\n const limit = Math.max(1, Math.min(args.countLimit ?? 10000, 10000));\n const docs = await ctx.db.query(asTableName(config.tableName)).take(limit + 1);\n return {\n count: Math.min(docs.length, limit),\n countIsLimited: docs.length > limit,\n };\n }\n\n case 'listByIds': {\n const ids = args.ids as string[];\n if (!ids) {\n throw new Error('Native vector query: ids are required');\n }\n return mapInBatches(ids, id => findByRecordId(ctx, config, id));\n }\n\n default:\n throw new Error(`Unsupported native vector query operation: ${args.op}`);\n }\n },\n});\n\nexport const mastraNativeVectorMutation = mutationGeneric({\n args: {\n op: v.union(v.literal('upsert'), v.literal('updateById'), v.literal('deleteByIds')),\n config: nativeVectorIndexConfigValidator,\n ids: v.optional(v.array(v.string())),\n vectors: v.optional(v.array(v.array(v.number()))),\n metadata: v.optional(v.any()),\n id: v.optional(v.string()),\n vector: v.optional(v.array(v.number())),\n },\n handler: async (ctx, args: any) => {\n const config = args.config as NativeVectorIndexConfig;\n\n switch (args.op as string) {\n case 'upsert': {\n const ids = args.ids as string[];\n const vectors = args.vectors as number[][];\n\n if (!ids || !vectors) {\n throw new Error('Native vector upsert: ids and vectors are required');\n }\n if (vectors.length !== ids.length) {\n throw new Error(\n `Native vector upsert: vectors length (${vectors.length}) must match ids length (${ids.length})`,\n );\n }\n const metadata = validateMetadataArray(args.metadata, ids.length);\n if (new Set(ids).size !== ids.length) {\n throw new Error('Native vector upsert: ids must be unique');\n }\n\n await mapInBatches(ids, async (id, index) => {\n const record = buildRecord({\n config,\n id,\n vector: vectors[index]!,\n metadata: metadata?.[index],\n });\n const existing = await findByRecordId(ctx, config, id);\n if (existing?._id) {\n const { _id: _, _creationTime: __, ...patch } = record as NativeVectorDocument;\n if (metadata?.[index] !== undefined) {\n clearMissingFilterFields(patch, metadata[index]!, config.filterFields);\n }\n await ctx.db.patch(existing._id, patch);\n } else {\n await ctx.db.insert(asTableName(config.tableName), record);\n }\n });\n return { ok: true };\n }\n\n case 'updateById': {\n if (!args.id) {\n throw new Error('Native vector update: id is required');\n }\n const existing = await findByRecordId(ctx, config, args.id);\n if (!existing?._id) return { ok: true };\n\n const patch: Record<string, any> = {};\n if (args.vector) patch[vectorField(config)] = args.vector;\n const metadata = validateMetadataRecord(args.metadata);\n if (metadata !== undefined) {\n const existingMetadata = isMetadataRecord(existing[metadataField(config)])\n ? existing[metadataField(config)]\n : {};\n patch[metadataField(config)] = { ...existingMetadata, ...metadata };\n Object.assign(patch, pickFilterFields(patch[metadataField(config)], config.filterFields));\n }\n\n if (Object.keys(patch).length > 0) {\n await ctx.db.patch(existing._id, patch);\n }\n return { ok: true };\n }\n\n case 'deleteByIds': {\n const ids = args.ids as string[];\n if (!ids) {\n throw new Error('Native vector deleteByIds: ids are required');\n }\n const docs = await mapInBatches(ids, id => findByRecordId(ctx, config, id));\n await mapInBatches(\n docs.filter((doc): doc is NativeVectorDocument & { _id: GenericId<string> } => Boolean(doc?._id)),\n doc => ctx.db.delete(doc._id),\n );\n return { ok: true };\n }\n\n default:\n throw new Error(`Unsupported native vector mutation operation: ${args.op}`);\n }\n },\n});\n"]}
@@ -3,7 +3,7 @@ name: mastra-convex
3
3
  description: Documentation for @mastra/convex. Use when working with @mastra/convex APIs, configuration, or implementation.
4
4
  metadata:
5
5
  package: "@mastra/convex"
6
- version: "1.2.1-alpha.0"
6
+ version: "1.2.1-alpha.2"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,26 +1,26 @@
1
1
  {
2
- "version": "1.2.1-alpha.0",
2
+ "version": "1.2.1-alpha.2",
3
3
  "package": "@mastra/convex",
4
4
  "exports": {
5
5
  "mastraCache": {
6
6
  "types": "dist/index.d.ts",
7
- "implementation": "dist/chunk-5T45UI6I.js"
7
+ "implementation": "dist/chunk-77UWNT5X.js"
8
8
  },
9
9
  "mastraNativeVectorAction": {
10
10
  "types": "dist/index.d.ts",
11
- "implementation": "dist/chunk-5T45UI6I.js"
11
+ "implementation": "dist/chunk-77UWNT5X.js"
12
12
  },
13
13
  "mastraNativeVectorMutation": {
14
14
  "types": "dist/index.d.ts",
15
- "implementation": "dist/chunk-5T45UI6I.js"
15
+ "implementation": "dist/chunk-77UWNT5X.js"
16
16
  },
17
17
  "mastraNativeVectorQuery": {
18
18
  "types": "dist/index.d.ts",
19
- "implementation": "dist/chunk-5T45UI6I.js"
19
+ "implementation": "dist/chunk-77UWNT5X.js"
20
20
  },
21
21
  "mastraStorage": {
22
22
  "types": "dist/index.d.ts",
23
- "implementation": "dist/chunk-5T45UI6I.js"
23
+ "implementation": "dist/chunk-77UWNT5X.js"
24
24
  },
25
25
  "TABLE_BACKGROUND_TASKS": {
26
26
  "types": "dist/index.d.ts",