@mastra/convex 1.2.0-alpha.0 → 1.2.1-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 CHANGED
@@ -1,5 +1,74 @@
1
1
  # @mastra/convex
2
2
 
3
+ ## 1.2.1-alpha.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Fixed Convex workflow storage to save concurrent workflow updates atomically. ([#16641](https://github.com/mastra-ai/mastra/pull/16641))
8
+
9
+ - Updated dependencies [[`d779de3`](https://github.com/mastra-ai/mastra/commit/d779de3cd9d2e7ed8110547190e2f15e786a0e41), [`1750c97`](https://github.com/mastra-ai/mastra/commit/1750c975d6179fbf6db2813b15229d4f8f23fc55), [`0e32507`](https://github.com/mastra-ai/mastra/commit/0e32507962cdfa5569b7bda5bc6fb3dd34e40b03), [`3a081c1`](https://github.com/mastra-ai/mastra/commit/3a081c1255c5ae8c99f6dad91cc612934ef6f2bd), [`fe9eacd`](https://github.com/mastra-ai/mastra/commit/fe9eacd9545a0a9d64aad31c9fa90294a425289e), [`db79c86`](https://github.com/mastra-ai/mastra/commit/db79c86c60723d57e02f9636ca2611bd4515f194)]:
10
+ - @mastra/core@1.38.0-alpha.2
11
+
12
+ ## 1.2.0
13
+
14
+ ### Minor Changes
15
+
16
+ - Convex can now persist channel installations and provider configuration. ([#16718](https://github.com/mastra-ai/mastra/pull/16718))
17
+
18
+ ```ts
19
+ import { ConvexStore } from '@mastra/convex';
20
+
21
+ const storage = new ConvexStore({
22
+ id: 'app-storage',
23
+ deploymentUrl: process.env.CONVEX_URL!,
24
+ adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
25
+ });
26
+
27
+ const channels = await storage.getStore('channels');
28
+
29
+ await channels?.saveInstallation({
30
+ id: 'slack-agent-1',
31
+ platform: 'slack',
32
+ agentId: 'agent-1',
33
+ status: 'active',
34
+ webhookId: 'webhook-1',
35
+ data: { teamId: 'T123', botUserId: 'U123' },
36
+ createdAt: new Date(),
37
+ updatedAt: new Date(),
38
+ });
39
+ ```
40
+
41
+ - Workflow schedules can now be stored in Convex. ([#16710](https://github.com/mastra-ai/mastra/pull/16710))
42
+
43
+ ```ts
44
+ import { ConvexStore } from '@mastra/convex';
45
+
46
+ const storage = new ConvexStore({
47
+ id: 'app-storage',
48
+ deploymentUrl: process.env.CONVEX_URL!,
49
+ adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
50
+ });
51
+
52
+ const schedules = await storage.getStore('schedules');
53
+
54
+ await schedules?.createSchedule({
55
+ id: 'daily-summary',
56
+ target: { type: 'workflow', workflowId: 'summary-workflow' },
57
+ cron: '0 9 * * *',
58
+ status: 'active',
59
+ nextFireAt: Date.now(),
60
+ createdAt: Date.now(),
61
+ updatedAt: Date.now(),
62
+ });
63
+ ```
64
+
65
+ ### Patch Changes
66
+
67
+ - Improved Convex background task reliability with safer lifecycle updates, faster filtering, and smoother upgrades from older storage rows. ([#16724](https://github.com/mastra-ai/mastra/pull/16724))
68
+
69
+ - Updated dependencies [[`cfa2e3a`](https://github.com/mastra-ai/mastra/commit/cfa2e3a5292322f48bb28b4d257d631da7f9d3cc), [`0cbece9`](https://github.com/mastra-ai/mastra/commit/0cbece9d832cb134a74cdbf3682d390a058215a4), [`2f5f58a`](https://github.com/mastra-ai/mastra/commit/2f5f58a9a8bb13bcdc6789db221eef7c9bf1ff02), [`7dfe1bc`](https://github.com/mastra-ai/mastra/commit/7dfe1bcfe71d261a6fd6bbf29b1dec49d78fb98f), [`ac442a4`](https://github.com/mastra-ai/mastra/commit/ac442a42fda0354ac2bcea772bf6691cb3e9dbb3), [`b7286f4`](https://github.com/mastra-ai/mastra/commit/b7286f4308267f5fd70e6bfee10dba9472640906), [`6096445`](https://github.com/mastra-ai/mastra/commit/60964459733f0ab384584d95e19c36607ffdf7b0), [`d72dc4b`](https://github.com/mastra-ai/mastra/commit/d72dc4b12d832546c05c20255fa96fe4eb515900), [`a481027`](https://github.com/mastra-ai/mastra/commit/a481027b549ba1018414990c8f045eaee7b9f413), [`1e5c067`](https://github.com/mastra-ai/mastra/commit/1e5c067d2e20a781af670578180d1ee249806d41), [`168fa09`](https://github.com/mastra-ai/mastra/commit/168fa09d6b39114cb8c13bd06f1dccb9bc81c6cd), [`df1947a`](https://github.com/mastra-ai/mastra/commit/df1947affa40f742067542251fac7ca759492ef4), [`ee59b74`](https://github.com/mastra-ai/mastra/commit/ee59b743ce73ad11784b4d9c6fbba8568edee1c8), [`a97b1a0`](https://github.com/mastra-ai/mastra/commit/a97b1a0abaed83946c3519d1e0f680d0815b8a67), [`008baaf`](https://github.com/mastra-ai/mastra/commit/008baafd8d851f831407045aebead5a2e3342eff), [`801baa0`](https://github.com/mastra-ai/mastra/commit/801baa07cccdbaec1d00942a92bdc831111744a2), [`8116436`](https://github.com/mastra-ai/mastra/commit/81164363eb225d774e41ff27da6a5ea611406688), [`c35b962`](https://github.com/mastra-ai/mastra/commit/c35b9625c7e854fcfdeee226a3338a750d0ff211), [`c27c4b9`](https://github.com/mastra-ai/mastra/commit/c27c4b9f137df5414fca4e45896aceccff6b0ed5), [`08b3b59`](https://github.com/mastra-ai/mastra/commit/08b3b590dd960dee6c9a6e39272f8927d803db6e), [`b3c3b18`](https://github.com/mastra-ai/mastra/commit/b3c3b189121489a3a51a8fd8204b569be9a89fe5), [`4084113`](https://github.com/mastra-ai/mastra/commit/408411370fc48a822e8b616b3b63f9409774e0e9), [`70cb714`](https://github.com/mastra-ai/mastra/commit/70cb7149c8f16f478e15b58498254a53181750a4), [`91cf0e0`](https://github.com/mastra-ai/mastra/commit/91cf0e027e511b871481a8576b56b7af83b15afd), [`7f9da22`](https://github.com/mastra-ai/mastra/commit/7f9da22efd5aa595e138a31de55a5f0f2f28b33d)]:
70
+ - @mastra/core@1.37.0
71
+
3
72
  ## 1.2.0-alpha.0
4
73
 
5
74
  ### Minor Changes
@@ -294,6 +294,64 @@ function findBestIndex(convexTable, filters) {
294
294
  return best ? { indexName: best.indexName, indexedFilters: best.indexedFilters } : null;
295
295
  }
296
296
 
297
+ // src/server/workflow-snapshot.ts
298
+ var PENDING_MARKER_KEY = "__mastra_pending__";
299
+ function isPendingMarker(val) {
300
+ return val !== null && typeof val === "object" && PENDING_MARKER_KEY in val && val[PENDING_MARKER_KEY] === true;
301
+ }
302
+ function createEmptyWorkflowSnapshot(runId) {
303
+ return {
304
+ context: {},
305
+ activePaths: [],
306
+ activeStepsPath: {},
307
+ timestamp: Date.now(),
308
+ suspendedPaths: {},
309
+ resumeLabels: {},
310
+ serializedStepGraph: [],
311
+ value: {},
312
+ waitingPaths: {},
313
+ status: "pending",
314
+ runId
315
+ };
316
+ }
317
+ function mergeWorkflowStepResult({
318
+ snapshot,
319
+ stepId,
320
+ result,
321
+ requestContext
322
+ }) {
323
+ if (!snapshot?.context) {
324
+ throw new Error(`Snapshot context not found for runId ${snapshot?.runId}`);
325
+ }
326
+ const existingResult = snapshot.context[stepId];
327
+ if (existingResult && "output" in existingResult && Array.isArray(existingResult.output) && result && typeof result === "object" && "output" in result && Array.isArray(result.output)) {
328
+ const existingOutput = existingResult.output;
329
+ const newOutput = result.output;
330
+ const mergedOutput = [...existingOutput];
331
+ for (let i = 0; i < Math.max(existingOutput.length, newOutput.length); i++) {
332
+ if (i < newOutput.length) {
333
+ const newVal = newOutput[i];
334
+ if (isPendingMarker(newVal)) {
335
+ mergedOutput[i] = null;
336
+ } else if (newVal !== null) {
337
+ mergedOutput[i] = newVal;
338
+ } else if (i >= existingOutput.length) {
339
+ mergedOutput[i] = null;
340
+ }
341
+ }
342
+ }
343
+ snapshot.context[stepId] = {
344
+ ...existingResult,
345
+ ...result,
346
+ output: mergedOutput
347
+ };
348
+ } else {
349
+ snapshot.context[stepId] = result;
350
+ }
351
+ snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };
352
+ return JSON.parse(JSON.stringify(snapshot.context));
353
+ }
354
+
297
355
  // src/server/storage.ts
298
356
  var TABLE_VECTOR_INDEXES = "mastra_vector_indexes";
299
357
  var VECTOR_TABLE_PREFIX = "mastra_vector_";
@@ -478,6 +536,10 @@ var mastraStorage = mutationGeneric(async (ctx, request) => {
478
536
  };
479
537
  }
480
538
  });
539
+ function parseStoredSnapshot(stored, runId) {
540
+ if (typeof stored === "string") return JSON.parse(stored);
541
+ return JSON.parse(JSON.stringify(stored ?? createEmptyWorkflowSnapshot(runId)));
542
+ }
481
543
  async function handleTypedOperation(ctx, convexTable, request) {
482
544
  switch (request.op) {
483
545
  case "createSchedule": {
@@ -720,6 +782,55 @@ async function handleTypedOperation(ctx, convexTable, request) {
720
782
  await deleteDocs(ctx, docsToDelete);
721
783
  return { ok: true };
722
784
  }
785
+ case "mergeWorkflowStepResult": {
786
+ if (convexTable !== CONVEX_TABLE_WORKFLOW_SNAPSHOTS) {
787
+ return { ok: false, error: `Unsupported operation ${request.op} for table ${request.tableName}` };
788
+ }
789
+ const existing = await ctx.db.query(convexTable).withIndex(
790
+ "by_workflow_run",
791
+ (q) => q.eq("workflow_name", request.workflowName).eq("run_id", request.runId)
792
+ ).unique();
793
+ if (!existing) {
794
+ return { ok: false, error: `Workflow snapshot not found for runId ${request.runId}` };
795
+ }
796
+ const snapshot = parseStoredSnapshot(existing.snapshot, request.runId);
797
+ if (!snapshot.context) {
798
+ return { ok: false, error: `Snapshot for runId ${request.runId} is missing or has invalid context` };
799
+ }
800
+ const context = mergeWorkflowStepResult({
801
+ snapshot,
802
+ stepId: request.stepId,
803
+ result: JSON.parse(request.result),
804
+ requestContext: JSON.parse(request.requestContext)
805
+ });
806
+ await ctx.db.patch(existing._id, {
807
+ snapshot: JSON.stringify(snapshot),
808
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
809
+ });
810
+ return { ok: true, result: JSON.stringify(context) };
811
+ }
812
+ case "mergeWorkflowState": {
813
+ if (convexTable !== CONVEX_TABLE_WORKFLOW_SNAPSHOTS) {
814
+ return { ok: false, error: `Unsupported operation ${request.op} for table ${request.tableName}` };
815
+ }
816
+ const existing = await ctx.db.query(convexTable).withIndex(
817
+ "by_workflow_run",
818
+ (q) => q.eq("workflow_name", request.workflowName).eq("run_id", request.runId)
819
+ ).unique();
820
+ if (!existing) {
821
+ return { ok: false, error: `Workflow snapshot not found for runId ${request.runId}` };
822
+ }
823
+ const snapshot = parseStoredSnapshot(existing.snapshot, request.runId);
824
+ if (!snapshot.context) {
825
+ return { ok: false, error: `Snapshot for runId ${request.runId} is missing or has invalid context` };
826
+ }
827
+ const mergedSnapshot = { ...snapshot, ...JSON.parse(request.opts) };
828
+ await ctx.db.patch(existing._id, {
829
+ snapshot: JSON.stringify(mergedSnapshot),
830
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
831
+ });
832
+ return { ok: true, result: JSON.stringify(mergedSnapshot) };
833
+ }
723
834
  default:
724
835
  return { ok: false, error: `Unsupported operation ${request.op}` };
725
836
  }
@@ -1190,5 +1301,5 @@ var mastraNativeVectorMutation = mutationGeneric({
1190
1301
  });
1191
1302
 
1192
1303
  export { mastraCache, mastraNativeVectorAction, mastraNativeVectorMutation, mastraNativeVectorQuery, mastraStorage };
1193
- //# sourceMappingURL=chunk-AJFME2ZF.js.map
1194
- //# sourceMappingURL=chunk-AJFME2ZF.js.map
1304
+ //# sourceMappingURL=chunk-5T45UI6I.js.map
1305
+ //# sourceMappingURL=chunk-5T45UI6I.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","mapInBatches"],"mappings":"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","file":"chunk-5T45UI6I.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","const PENDING_MARKER_KEY = '__mastra_pending__';\n\nfunction isPendingMarker(val: unknown): boolean {\n return (\n val !== null &&\n typeof val === 'object' &&\n PENDING_MARKER_KEY in val &&\n (val as Record<string, unknown>)[PENDING_MARKER_KEY] === true\n );\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 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 mergedOutput[i] = null;\n } else if (newVal !== null) {\n mergedOutput[i] = newVal;\n } else if (i >= existingOutput.length) {\n mergedOutput[i] = null;\n }\n }\n }\n snapshot.context[stepId] = {\n ...existingResult,\n ...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;\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 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 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\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 '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 '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 '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 '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 '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"]}