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

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/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkMECAZ6GY_cjs = require('./chunk-MECAZ6GY.cjs');
3
+ var chunkZFDTGYKC_cjs = require('./chunk-ZFDTGYKC.cjs');
4
4
  var chunkSFRHJGSM_cjs = require('./chunk-SFRHJGSM.cjs');
5
5
  var cache = require('@mastra/core/cache');
6
6
  var storage = require('@mastra/core/storage');
@@ -227,7 +227,8 @@ var ConvexAdminClient = class {
227
227
  }
228
228
  return {
229
229
  result: storageResponse.result,
230
- hasMore: storageResponse.hasMore
230
+ hasMore: storageResponse.hasMore,
231
+ continuationCursor: storageResponse.continuationCursor
231
232
  };
232
233
  }
233
234
  async callStorage(request) {
@@ -355,6 +356,38 @@ var ConvexDB = class extends base.MastraBase {
355
356
  record: this.normalizePatch(record)
356
357
  });
357
358
  }
359
+ async updateThread({
360
+ id,
361
+ title,
362
+ metadata,
363
+ updatedAt
364
+ }) {
365
+ return this.client.callStorage({
366
+ op: "updateThread",
367
+ tableName: storage.TABLE_THREADS,
368
+ id,
369
+ title,
370
+ metadata,
371
+ updatedAt: updatedAt.toISOString()
372
+ });
373
+ }
374
+ async updateResource({
375
+ resourceId,
376
+ workingMemory,
377
+ metadata,
378
+ createdAt,
379
+ updatedAt
380
+ }) {
381
+ return this.client.callStorage({
382
+ op: "updateResource",
383
+ tableName: storage.TABLE_RESOURCES,
384
+ resourceId,
385
+ ...workingMemory !== void 0 ? { workingMemory } : {},
386
+ ...metadata !== void 0 ? { metadata } : {},
387
+ createdAt: createdAt.toISOString(),
388
+ updatedAt: updatedAt.toISOString()
389
+ });
390
+ }
358
391
  async load({ tableName, keys }) {
359
392
  const result = await this.client.callStorage({
360
393
  op: "load",
@@ -841,6 +874,23 @@ var ChannelsConvex = class extends storage.ChannelsStorage {
841
874
  await this.#db.deleteMany(storage.TABLE_CHANNEL_CONFIG, [platform]);
842
875
  }
843
876
  };
877
+ function parseStoredThread(row) {
878
+ return {
879
+ ...row,
880
+ metadata: typeof row.metadata === "string" ? storage.safelyParseJSON(row.metadata) : row.metadata,
881
+ createdAt: new Date(row.createdAt),
882
+ updatedAt: new Date(row.updatedAt)
883
+ };
884
+ }
885
+ function parseStoredResource(record) {
886
+ const metadata = typeof record.metadata === "string" ? storage.safelyParseJSON(record.metadata) : record.metadata;
887
+ return {
888
+ ...record,
889
+ metadata: metadata ?? {},
890
+ createdAt: new Date(record.createdAt),
891
+ updatedAt: new Date(record.updatedAt)
892
+ };
893
+ }
844
894
  var MemoryConvex = class extends storage.MemoryStorage {
845
895
  #db;
846
896
  constructor(config) {
@@ -864,12 +914,7 @@ var MemoryConvex = class extends storage.MemoryStorage {
864
914
  keys: { id: threadId }
865
915
  });
866
916
  if (!row || resourceId !== void 0 && row.resourceId !== resourceId) return null;
867
- return {
868
- ...row,
869
- metadata: typeof row.metadata === "string" ? JSON.parse(row.metadata) : row.metadata,
870
- createdAt: new Date(row.createdAt),
871
- updatedAt: new Date(row.updatedAt)
872
- };
917
+ return parseStoredThread(row);
873
918
  }
874
919
  async saveThread({ thread }) {
875
920
  await this.#db.insert({
@@ -886,8 +931,13 @@ var MemoryConvex = class extends storage.MemoryStorage {
886
931
  title,
887
932
  metadata
888
933
  }) {
889
- const existing = await this.getThreadById({ threadId: id });
890
- if (!existing) {
934
+ const updated = await this.#db.updateThread({
935
+ id,
936
+ title,
937
+ metadata,
938
+ updatedAt: /* @__PURE__ */ new Date()
939
+ });
940
+ if (!updated) {
891
941
  throw new error.MastraError({
892
942
  id: storage.createStorageErrorId("CONVEX", "UPDATE_THREAD", "THREAD_NOT_FOUND"),
893
943
  domain: error.ErrorDomain.STORAGE,
@@ -895,17 +945,7 @@ var MemoryConvex = class extends storage.MemoryStorage {
895
945
  text: `Thread ${id} not found`
896
946
  });
897
947
  }
898
- const updated = {
899
- ...existing,
900
- title,
901
- metadata: {
902
- ...existing.metadata,
903
- ...metadata
904
- },
905
- updatedAt: /* @__PURE__ */ new Date()
906
- };
907
- await this.saveThread({ thread: updated });
908
- return updated;
948
+ return parseStoredThread(updated);
909
949
  }
910
950
  async deleteThread({ threadId }) {
911
951
  const messages = await this.#db.queryTable(storage.TABLE_MESSAGES, [
@@ -933,6 +973,19 @@ var MemoryConvex = class extends storage.MemoryStorage {
933
973
  );
934
974
  }
935
975
  const perPage = storage.normalizePerPage(perPageInput, 100);
976
+ try {
977
+ this.validateMetadataKeys(filter?.metadata);
978
+ } catch (error$1) {
979
+ throw new error.MastraError(
980
+ {
981
+ id: storage.createStorageErrorId("CONVEX", "LIST_THREADS", "INVALID_METADATA_KEY"),
982
+ domain: error.ErrorDomain.STORAGE,
983
+ category: error.ErrorCategory.USER,
984
+ details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(", ") : "" }
985
+ },
986
+ error$1 instanceof Error ? error$1 : new Error("Invalid metadata key")
987
+ );
988
+ }
936
989
  const { field, direction } = this.parseOrderBy(orderBy);
937
990
  const { offset, perPage: perPageForResponse } = storage.calculatePagination(page, perPageInput, perPage);
938
991
  const queryFilters = [];
@@ -940,15 +993,10 @@ var MemoryConvex = class extends storage.MemoryStorage {
940
993
  queryFilters.push({ field: "resourceId", value: filter.resourceId });
941
994
  }
942
995
  const rows = await this.#db.queryTable(storage.TABLE_THREADS, queryFilters);
943
- let threads = rows.map((row) => ({
944
- ...row,
945
- metadata: typeof row.metadata === "string" ? JSON.parse(row.metadata) : row.metadata,
946
- createdAt: new Date(row.createdAt),
947
- updatedAt: new Date(row.updatedAt)
948
- }));
996
+ let threads = rows.map((row) => parseStoredThread(row));
949
997
  if (filter?.metadata && Object.keys(filter.metadata).length > 0) {
950
998
  threads = threads.filter((thread) => {
951
- if (!thread.metadata) return false;
999
+ if (!thread.metadata || typeof thread.metadata !== "object" || Array.isArray(thread.metadata)) return false;
952
1000
  return Object.entries(filter.metadata).every(([key, value]) => thread.metadata[key] === value);
953
1001
  });
954
1002
  }
@@ -1085,19 +1133,11 @@ var MemoryConvex = class extends storage.MemoryStorage {
1085
1133
  const threadIds = [...new Set(messages.map((m) => m.threadId).filter(Boolean))];
1086
1134
  const now = /* @__PURE__ */ new Date();
1087
1135
  for (const threadId of threadIds) {
1088
- const thread = await this.getThreadById({ threadId });
1089
- if (thread) {
1090
- await this.#db.insert({
1091
- tableName: storage.TABLE_THREADS,
1092
- record: {
1093
- ...thread,
1094
- id: thread.id,
1095
- updatedAt: now.toISOString(),
1096
- createdAt: thread.createdAt instanceof Date ? thread.createdAt.toISOString() : thread.createdAt,
1097
- metadata: thread.metadata ?? {}
1098
- }
1099
- });
1100
- }
1136
+ await this.#db.patch({
1137
+ tableName: storage.TABLE_THREADS,
1138
+ id: threadId,
1139
+ record: { updatedAt: now.toISOString() }
1140
+ });
1101
1141
  }
1102
1142
  const list = new agent.MessageList().add(messages, "memory");
1103
1143
  return { messages: list.get.all.db() };
@@ -1143,19 +1183,11 @@ var MemoryConvex = class extends storage.MemoryStorage {
1143
1183
  }
1144
1184
  const now = /* @__PURE__ */ new Date();
1145
1185
  for (const threadId of affectedThreadIds) {
1146
- const thread = await this.getThreadById({ threadId });
1147
- if (thread) {
1148
- await this.#db.insert({
1149
- tableName: storage.TABLE_THREADS,
1150
- record: {
1151
- ...thread,
1152
- id: thread.id,
1153
- updatedAt: now.toISOString(),
1154
- createdAt: thread.createdAt instanceof Date ? thread.createdAt.toISOString() : thread.createdAt,
1155
- metadata: thread.metadata ?? {}
1156
- }
1157
- });
1158
- }
1186
+ await this.#db.patch({
1187
+ tableName: storage.TABLE_THREADS,
1188
+ id: threadId,
1189
+ record: { updatedAt: now.toISOString() }
1190
+ });
1159
1191
  }
1160
1192
  return updated;
1161
1193
  }
@@ -1183,41 +1215,22 @@ var MemoryConvex = class extends storage.MemoryStorage {
1183
1215
  keys: { id: resourceId }
1184
1216
  });
1185
1217
  if (!record) return null;
1186
- return {
1187
- ...record,
1188
- metadata: typeof record.metadata === "string" ? storage.safelyParseJSON(record.metadata) : record.metadata,
1189
- createdAt: new Date(record.createdAt),
1190
- updatedAt: new Date(record.updatedAt)
1191
- };
1218
+ return parseStoredResource(record);
1192
1219
  }
1193
1220
  async updateResource({
1194
1221
  resourceId,
1195
1222
  workingMemory,
1196
1223
  metadata
1197
1224
  }) {
1198
- const existing = await this.getResourceById({ resourceId });
1199
1225
  const now = /* @__PURE__ */ new Date();
1200
- if (!existing) {
1201
- const created = {
1202
- id: resourceId,
1203
- workingMemory,
1204
- metadata: metadata ?? {},
1205
- createdAt: now,
1206
- updatedAt: now
1207
- };
1208
- return this.saveResource({ resource: created });
1209
- }
1210
- const updated = {
1211
- ...existing,
1212
- workingMemory: workingMemory ?? existing.workingMemory,
1213
- metadata: {
1214
- ...existing.metadata,
1215
- ...metadata
1216
- },
1226
+ const updated = await this.#db.updateResource({
1227
+ resourceId,
1228
+ workingMemory,
1229
+ metadata,
1230
+ createdAt: now,
1217
1231
  updatedAt: now
1218
- };
1219
- await this.saveResource({ resource: updated });
1220
- return updated;
1232
+ });
1233
+ return parseStoredResource(updated);
1221
1234
  }
1222
1235
  _sortMessages(messages, field, direction) {
1223
1236
  return messages.sort((a, b) => {
@@ -1850,6 +1863,7 @@ var ConvexStore = class extends storage.MastraCompositeStore {
1850
1863
  }
1851
1864
  };
1852
1865
  var INDEX_METADATA_TABLE = "mastra_vector_indexes";
1866
+ var VECTOR_QUERY_PAGE_SIZE = 256;
1853
1867
  var ConvexVector = class extends vector.MastraVector {
1854
1868
  client;
1855
1869
  constructor(config) {
@@ -1902,10 +1916,7 @@ var ConvexVector = class extends vector.MastraVector {
1902
1916
  if (!index) {
1903
1917
  throw new Error(`Index ${indexName} not found`);
1904
1918
  }
1905
- const vectors = await this.callStorage({
1906
- op: "queryTable",
1907
- tableName: this.vectorTable(indexName)
1908
- });
1919
+ const vectors = await this.queryAllVectors(indexName);
1909
1920
  return {
1910
1921
  dimension: index.dimension,
1911
1922
  count: vectors.length,
@@ -1942,10 +1953,7 @@ var ConvexVector = class extends vector.MastraVector {
1942
1953
  details: { indexName }
1943
1954
  });
1944
1955
  }
1945
- const vectors = await this.callStorage({
1946
- op: "queryTable",
1947
- tableName: this.vectorTable(indexName)
1948
- });
1956
+ const vectors = await this.queryAllVectors(indexName);
1949
1957
  const filtered = filter && !this.isEmptyFilter(filter) ? vectors.filter((record) => this.matchesFilter(record.metadata, filter)) : vectors;
1950
1958
  const scored = filtered.map((record) => ({
1951
1959
  id: record.id,
@@ -1966,10 +1974,7 @@ var ConvexVector = class extends vector.MastraVector {
1966
1974
  if (this.isEmptyFilter(filter)) {
1967
1975
  throw new Error("ConvexVector.updateVector: cannot update with empty filter");
1968
1976
  }
1969
- const vectors = await this.callStorage({
1970
- op: "queryTable",
1971
- tableName: this.vectorTable(params.indexName)
1972
- });
1977
+ const vectors = await this.queryAllVectors(params.indexName);
1973
1978
  const matching = vectors.filter((record) => this.matchesFilter(record.metadata, filter));
1974
1979
  for (const existing2 of matching) {
1975
1980
  const updated2 = {
@@ -2038,10 +2043,7 @@ var ConvexVector = class extends vector.MastraVector {
2038
2043
  if (this.isEmptyFilter(filter)) {
2039
2044
  throw new Error("ConvexVector.deleteVectors: cannot delete with empty filter");
2040
2045
  }
2041
- const vectors = await this.callStorage({
2042
- op: "queryTable",
2043
- tableName: this.vectorTable(indexName)
2044
- });
2046
+ const vectors = await this.queryAllVectors(indexName);
2045
2047
  const matchingIds = vectors.filter((record) => this.matchesFilter(record.metadata, filter)).map((record) => record.id);
2046
2048
  if (matchingIds.length > 0) {
2047
2049
  await this.callStorage({
@@ -2129,6 +2131,27 @@ var ConvexVector = class extends vector.MastraVector {
2129
2131
  async callStorage(request) {
2130
2132
  return this.client.callStorage(request);
2131
2133
  }
2134
+ async queryAllVectors(indexName) {
2135
+ const vectors = [];
2136
+ let cursor = null;
2137
+ let hasMore = true;
2138
+ while (hasMore) {
2139
+ const response = await this.client.callStorageRaw({
2140
+ op: "queryTable",
2141
+ tableName: this.vectorTable(indexName),
2142
+ pageSize: VECTOR_QUERY_PAGE_SIZE,
2143
+ cursor
2144
+ });
2145
+ vectors.push(...response.result);
2146
+ const nextCursor = response.continuationCursor ?? null;
2147
+ hasMore = response.hasMore ?? false;
2148
+ if (hasMore && (!nextCursor || nextCursor === cursor)) {
2149
+ throw new Error("ConvexVector: paginated vector query did not return a valid continuation cursor");
2150
+ }
2151
+ cursor = nextCursor;
2152
+ }
2153
+ return vectors;
2154
+ }
2132
2155
  /**
2133
2156
  * Call storage repeatedly until hasMore is false.
2134
2157
  * Use for bulk operations like clearTable that may need multiple batches.
@@ -2406,23 +2429,23 @@ var ConvexNativeVector = class extends vector.MastraVector {
2406
2429
 
2407
2430
  Object.defineProperty(exports, "mastraCache", {
2408
2431
  enumerable: true,
2409
- get: function () { return chunkMECAZ6GY_cjs.mastraCache; }
2432
+ get: function () { return chunkZFDTGYKC_cjs.mastraCache; }
2410
2433
  });
2411
2434
  Object.defineProperty(exports, "mastraNativeVectorAction", {
2412
2435
  enumerable: true,
2413
- get: function () { return chunkMECAZ6GY_cjs.mastraNativeVectorAction; }
2436
+ get: function () { return chunkZFDTGYKC_cjs.mastraNativeVectorAction; }
2414
2437
  });
2415
2438
  Object.defineProperty(exports, "mastraNativeVectorMutation", {
2416
2439
  enumerable: true,
2417
- get: function () { return chunkMECAZ6GY_cjs.mastraNativeVectorMutation; }
2440
+ get: function () { return chunkZFDTGYKC_cjs.mastraNativeVectorMutation; }
2418
2441
  });
2419
2442
  Object.defineProperty(exports, "mastraNativeVectorQuery", {
2420
2443
  enumerable: true,
2421
- get: function () { return chunkMECAZ6GY_cjs.mastraNativeVectorQuery; }
2444
+ get: function () { return chunkZFDTGYKC_cjs.mastraNativeVectorQuery; }
2422
2445
  });
2423
2446
  Object.defineProperty(exports, "mastraStorage", {
2424
2447
  enumerable: true,
2425
- get: function () { return chunkMECAZ6GY_cjs.mastraStorage; }
2448
+ get: function () { return chunkZFDTGYKC_cjs.mastraStorage; }
2426
2449
  });
2427
2450
  Object.defineProperty(exports, "TABLE_BACKGROUND_TASKS", {
2428
2451
  enumerable: true,