@mastra/convex 1.4.0-alpha.0 → 1.5.0-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,68 @@
1
1
  # @mastra/convex
2
2
 
3
+ ## 1.5.0-alpha.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Added exact metadata filtering to message history queries across Memory APIs and supported storage providers. ([#19991](https://github.com/mastra-ai/mastra/pull/19991))
8
+
9
+ ```ts
10
+ const messages = await memory.recall({
11
+ threadId: 'thread-1',
12
+ filter: {
13
+ metadata: {
14
+ status: 'done',
15
+ priority: 'high',
16
+ },
17
+ },
18
+ });
19
+ ```
20
+
21
+ Multiple fields use AND semantics. Supported values are strings, finite numbers, booleans, and `null`.
22
+
23
+ ### Patch Changes
24
+
25
+ - Updated dependencies [[`0dca9d0`](https://github.com/mastra-ai/mastra/commit/0dca9d0b1356024a53b72ea6f040db528b126caa)]:
26
+ - @mastra/core@1.54.0-alpha.0
27
+
28
+ ## 1.4.0
29
+
30
+ ### Minor Changes
31
+
32
+ - Added Observational Memory support to the Convex storage adapter. Agents using `ConvexStore` can now enable `observationalMemory` in `@mastra/memory`, including async observation buffering and reflections. ([#19474](https://github.com/mastra-ai/mastra/pull/19474))
33
+
34
+ To enable it, add the new `mastraObservationalMemoryTable` to your Convex schema and redeploy:
35
+
36
+ ```ts title="convex/schema.ts"
37
+ import { defineSchema } from 'convex/server';
38
+ import {
39
+ mastraThreadsTable,
40
+ mastraMessagesTable,
41
+ mastraResourcesTable,
42
+ mastraObservationalMemoryTable,
43
+ // ...other Mastra tables
44
+ } from '@mastra/convex/schema';
45
+
46
+ export default defineSchema({
47
+ mastra_threads: mastraThreadsTable,
48
+ mastra_messages: mastraMessagesTable,
49
+ mastra_resources: mastraResourcesTable,
50
+ mastra_observational_memory: mastraObservationalMemoryTable,
51
+ // ...other Mastra tables
52
+ });
53
+ ```
54
+
55
+ Then run `npx convex deploy` (or `npx convex dev`) so the new table and storage operations are live. All observational memory writes run inside the deployed Convex storage mutation, so buffered-observation swaps and reflection generations are atomic.
56
+
57
+ ### Patch Changes
58
+
59
+ - Improved type safety of the Convex storage layer. Table names accepted by the internal ConvexDB are now a closed union (core storage tables plus the observational memory table) instead of any string, so table-name typos are caught at compile time instead of silently routing records to the mastra_documents fallback table. The internal observational memory operations no longer take a table-name argument. ([#19485](https://github.com/mastra-ai/mastra/pull/19485))
60
+
61
+ - Removed the Convex adapters' only Node builtin dependency. ConvexStore, the vector adapters, and the storage domains now use the Web Crypto API (crypto.randomUUID) instead of importing node:crypto, so @mastra/convex itself no longer requires the Node.js runtime ("use node") to bundle inside a Convex project. ([#19498](https://github.com/mastra-ai/mastra/pull/19498))
62
+
63
+ - Updated dependencies [[`ec857fc`](https://github.com/mastra-ai/mastra/commit/ec857fc79c264b53b38e16478c789b7177f2ad59), [`d7385ad`](https://github.com/mastra-ai/mastra/commit/d7385ad9e88f9e4f33d15c0ec0bfebedde0cbc2e), [`41a5392`](https://github.com/mastra-ai/mastra/commit/41a5392d9f6c5e18d6b227f0fc0ddf49c50774e9), [`3d6e539`](https://github.com/mastra-ai/mastra/commit/3d6e539272eb2ea0407034605ee1906b3be06b39), [`1426af2`](https://github.com/mastra-ai/mastra/commit/1426af24975879c000d13ac75673f630fcc970c1), [`a40adeb`](https://github.com/mastra-ai/mastra/commit/a40adeb222b961a56a58af56a106106525721b74), [`8a0d145`](https://github.com/mastra-ai/mastra/commit/8a0d145aadbdf7278665aceaaec364b35dd9bd94), [`bd2f1d2`](https://github.com/mastra-ai/mastra/commit/bd2f1d274d05e60e2366f005ea0d94d5cea0d5ff), [`e1f2fae`](https://github.com/mastra-ai/mastra/commit/e1f2faebaf048c3d4c2e2c01d293767c195d5794), [`63aa799`](https://github.com/mastra-ai/mastra/commit/63aa799c6b44eacc7806cda6846b7c5bbee06b37), [`b7e79c3`](https://github.com/mastra-ai/mastra/commit/b7e79c3c02ac5cd415db34ba0975ceafc1464333), [`675fbff`](https://github.com/mastra-ai/mastra/commit/675fbff84d3274391b33e852f76083c38a5514e5), [`da009e1`](https://github.com/mastra-ai/mastra/commit/da009e1aacd89ed94b8d1b2af09c9d4fe7c4db49), [`3b77e77`](https://github.com/mastra-ai/mastra/commit/3b77e7704936522e4769d29de1b5ea6901f302bd), [`c7d30cd`](https://github.com/mastra-ai/mastra/commit/c7d30cd86009c407df91105591f03cd6e3d2854d), [`21a0eb8`](https://github.com/mastra-ai/mastra/commit/21a0eb86746ba0b703acea360d4f84c6a5a493f2), [`8b20926`](https://github.com/mastra-ai/mastra/commit/8b20926cd59e2ba3d66458e062fa0e6e2ada3e68), [`975295d`](https://github.com/mastra-ai/mastra/commit/975295d418552f0d46a59edfef4c3ee555f9930a), [`73db8db`](https://github.com/mastra-ai/mastra/commit/73db8db90d69ab6153c7942749f624db0d96952d), [`6b1bf3b`](https://github.com/mastra-ai/mastra/commit/6b1bf3b9494bd51aa8f654c68c9355d6046fa2a1), [`35c2181`](https://github.com/mastra-ai/mastra/commit/35c2181e6a50e47c90ba36260db7c9723d54696f), [`0a2c22c`](https://github.com/mastra-ai/mastra/commit/0a2c22c902604439ec490319e14c17f331e0c84c), [`4cfdd64`](https://github.com/mastra-ai/mastra/commit/4cfdd645794feaea0c4ea711e70ecdfbef0c5b8e), [`b75d749`](https://github.com/mastra-ai/mastra/commit/b75d749621ff5d17e86bcb4ee809d301fb4f7cf3), [`821648b`](https://github.com/mastra-ai/mastra/commit/821648bf2871ef840100c7bacbecf676010bd12a), [`de86fd7`](https://github.com/mastra-ai/mastra/commit/de86fd7119f0438381d1a642e3d258143c0b9c29), [`2745031`](https://github.com/mastra-ai/mastra/commit/2745031d1d4a4978f037092da371428c32e2842a), [`b4b7ea8`](https://github.com/mastra-ai/mastra/commit/b4b7ea8733f033fc441ea47ed03f6afb17ec2248), [`3a8024c`](https://github.com/mastra-ai/mastra/commit/3a8024ce615f8aa89479c0d71fe61d10bb0040be), [`35865a5`](https://github.com/mastra-ai/mastra/commit/35865a53e194aa9634d6a70a97010e7a6b9d58b1), [`74faf8b`](https://github.com/mastra-ai/mastra/commit/74faf8bd9c1018f2492653c06b1e25fc8300e9e6), [`ef03fbc`](https://github.com/mastra-ai/mastra/commit/ef03fbcc556bcbc04c9b3d06fab88771ecaa043c), [`675fbff`](https://github.com/mastra-ai/mastra/commit/675fbff84d3274391b33e852f76083c38a5514e5), [`70687f7`](https://github.com/mastra-ai/mastra/commit/70687f7e495a322a02070b4a67cb0c77a5ca91ec), [`1fadac4`](https://github.com/mastra-ai/mastra/commit/1fadac44537caeefe81f9f775ae2f2f3d94e9069), [`73db8db`](https://github.com/mastra-ai/mastra/commit/73db8db90d69ab6153c7942749f624db0d96952d), [`76b7181`](https://github.com/mastra-ai/mastra/commit/76b71810366e6d90b9d3973149d1c7ba3659ffb9), [`792ec9a`](https://github.com/mastra-ai/mastra/commit/792ec9a0869bab8274cf5e0ed2840738737a1607), [`712b864`](https://github.com/mastra-ai/mastra/commit/712b864aa1ed12b14c54390ec17b69de163c37f7), [`85e4fb5`](https://github.com/mastra-ai/mastra/commit/85e4fb50087a81c74df3a762f53b56373db0b912), [`0c0e8d7`](https://github.com/mastra-ai/mastra/commit/0c0e8d7becd4d1445c656b78d5d845f606c1ff9d), [`a7bbe77`](https://github.com/mastra-ai/mastra/commit/a7bbe773577f60bc4761b534ef7ec6b476332dad), [`72e437c`](https://github.com/mastra-ai/mastra/commit/72e437c515942c80b9def5b026e0bdee61b469d9), [`8f7a5de`](https://github.com/mastra-ai/mastra/commit/8f7a5dedc246cdc938bb65516703cf9b27b03756), [`a7bbe77`](https://github.com/mastra-ai/mastra/commit/a7bbe773577f60bc4761b534ef7ec6b476332dad), [`11f6cd9`](https://github.com/mastra-ai/mastra/commit/11f6cd96fe42582403416608beb212cc1a2cc79e), [`ef03c0c`](https://github.com/mastra-ai/mastra/commit/ef03c0cfc62367a458e4cc56462e2148b35681c5), [`4fb4d88`](https://github.com/mastra-ai/mastra/commit/4fb4d881bc107acee13890ad4d78661016c510ed), [`4e68363`](https://github.com/mastra-ai/mastra/commit/4e683634f94ebd062d26a3bb6093a8dfc7263d37), [`c328769`](https://github.com/mastra-ai/mastra/commit/c3287698ff8ef98dba86d415faa566fa3e5f4d56), [`9f7c67a`](https://github.com/mastra-ai/mastra/commit/9f7c67abeeb52c41c51a9b5edee60b62afe7cd8d), [`3b65e68`](https://github.com/mastra-ai/mastra/commit/3b65e68d7f1c771c7a70eea42d83fefdd28cad88), [`4eba27a`](https://github.com/mastra-ai/mastra/commit/4eba27adcf60f991df0e62f94b3e75b4e67f3b4b), [`c701be3`](https://github.com/mastra-ai/mastra/commit/c701be32d7d9aa94a66da8c6cc38dcac6856f464), [`db650ce`](https://github.com/mastra-ai/mastra/commit/db650ce490348914e85b93651d83acdf8f2a4c31), [`232fcbc`](https://github.com/mastra-ai/mastra/commit/232fcbc14fce625dd672ba043329c0b732c62be2), [`6354eeb`](https://github.com/mastra-ai/mastra/commit/6354eeb32efa9f5f68f51dda394e90e2ee76f1fb), [`a8799bb`](https://github.com/mastra-ai/mastra/commit/a8799bb8e44f4a60d01e4e2acd3448ff80bf14f8), [`3d6e539`](https://github.com/mastra-ai/mastra/commit/3d6e539272eb2ea0407034605ee1906b3be06b39), [`e3868e2`](https://github.com/mastra-ai/mastra/commit/e3868e22babfffd0133771669ca724501c2dd58e), [`9251370`](https://github.com/mastra-ai/mastra/commit/9251370ad413af464aa22d7566338bec5613e8de), [`3491666`](https://github.com/mastra-ai/mastra/commit/34916663c4fdd43b48c21f4ab2d5fb6dcccc94f9), [`c0bec73`](https://github.com/mastra-ai/mastra/commit/c0bec732c93d1a22ae5e51ed66cf8cacca8bd6a6)]:
64
+ - @mastra/core@1.52.0
65
+
3
66
  ## 1.4.0-alpha.0
4
67
 
5
68
  ### Minor Changes
@@ -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.4.0-alpha.0"
6
+ version: "1.5.0-alpha.0"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.4.0-alpha.0",
2
+ "version": "1.5.0-alpha.0",
3
3
  "package": "@mastra/convex",
4
4
  "exports": {
5
5
  "mastraCache": {
package/dist/index.cjs CHANGED
@@ -1163,6 +1163,7 @@ var MemoryConvex = class extends storage.MemoryStorage {
1163
1163
  }
1164
1164
  async listMessages(args) {
1165
1165
  const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;
1166
+ const metadataFilter = storage.validateStorageMetadataFilter(filter?.metadata);
1166
1167
  const threadIds = Array.isArray(threadId) ? threadId : [threadId];
1167
1168
  if (threadIds.length === 0 || threadIds.some((id) => !id.trim())) {
1168
1169
  throw new error.MastraError(
@@ -1201,6 +1202,7 @@ var MemoryConvex = class extends storage.MemoryStorage {
1201
1202
  rows = rows.filter((row) => row.resourceId === resourceId);
1202
1203
  }
1203
1204
  rows = storage.filterByDateRange(rows, (row) => new Date(row.createdAt), filter?.dateRange);
1205
+ rows = rows.filter((row) => storage.storageMessageMatchesMetadataFilter(row.content, metadataFilter));
1204
1206
  rows.sort((a, b) => {
1205
1207
  const aValue = field === "createdAt" || field === "updatedAt" ? new Date(a[field]).getTime() : a[field];
1206
1208
  const bValue = field === "createdAt" || field === "updatedAt" ? new Date(b[field]).getTime() : b[field];
@@ -1215,7 +1217,7 @@ var MemoryConvex = class extends storage.MemoryStorage {
1215
1217
  const messageIds = new Set(messages.map((msg) => msg.id));
1216
1218
  if (include && include.length > 0) {
1217
1219
  const preloadedThreads = /* @__PURE__ */ new Map();
1218
- if (!resourceId && !filter?.dateRange) {
1220
+ if (!resourceId && !filter?.dateRange && !metadataFilter) {
1219
1221
  for (const tid of threadIds) {
1220
1222
  preloadedThreads.set(
1221
1223
  tid,
@@ -1232,7 +1234,7 @@ var MemoryConvex = class extends storage.MemoryStorage {
1232
1234
  }
1233
1235
  }
1234
1236
  messages = this._sortMessages(messages, field, direction);
1235
- const hasMore = include && include.length > 0 ? new Set(messages.filter((m) => m.threadId === threadId).map((m) => m.id)).size < totalThreadMessages : perPageInput === false ? false : offset + perPage < totalThreadMessages;
1237
+ const hasMore = metadataFilter ? perPageInput !== false && offset + perPage < totalThreadMessages : include && include.length > 0 ? new Set(messages.filter((m) => m.threadId === threadId).map((m) => m.id)).size < totalThreadMessages : perPageInput === false ? false : offset + perPage < totalThreadMessages;
1236
1238
  return {
1237
1239
  messages,
1238
1240
  total: totalThreadMessages,
@@ -1243,6 +1245,7 @@ var MemoryConvex = class extends storage.MemoryStorage {
1243
1245
  }
1244
1246
  async listMessagesByResourceId(args) {
1245
1247
  const { resourceId, filter, perPage: perPageInput, page = 0, orderBy } = args;
1248
+ const metadataFilter = storage.validateStorageMetadataFilter(filter?.metadata);
1246
1249
  const { field, direction } = this.parseOrderBy(orderBy, "ASC");
1247
1250
  const perPage = storage.normalizePerPage(perPageInput, 40);
1248
1251
  if (page < 0) {
@@ -1271,6 +1274,7 @@ var MemoryConvex = class extends storage.MemoryStorage {
1271
1274
  const { offset, perPage: perPageForResponse } = storage.calculatePagination(page, perPageInput, perPage);
1272
1275
  let rows = await this.#db.queryTable(storage.TABLE_MESSAGES, [{ field: "resourceId", value: resourceId }]);
1273
1276
  rows = storage.filterByDateRange(rows, (row) => new Date(row.createdAt), filter?.dateRange);
1277
+ rows = rows.filter((row) => storage.storageMessageMatchesMetadataFilter(row.content, metadataFilter));
1274
1278
  rows = this._sortStoredMessages(rows, field, direction);
1275
1279
  const total = rows.length;
1276
1280
  const paginatedRows = rows.slice(offset, offset + perPage);