@mastra/dynamodb 1.1.3 → 1.2.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,30 @@
1
1
  # @mastra/dynamodb
2
2
 
3
+ ## 1.2.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
+
3
28
  ## 1.1.3
4
29
 
5
30
  ### Patch Changes
@@ -3,7 +3,7 @@ name: mastra-dynamodb
3
3
  description: Documentation for @mastra/dynamodb. Use when working with @mastra/dynamodb APIs, configuration, or implementation.
4
4
  metadata:
5
5
  package: "@mastra/dynamodb"
6
- version: "1.1.3"
6
+ version: "1.2.0-alpha.0"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.3",
2
+ "version": "1.2.0-alpha.0",
3
3
  "package": "@mastra/dynamodb",
4
4
  "exports": {},
5
5
  "modules": {}
package/dist/index.cjs CHANGED
@@ -1749,6 +1749,7 @@ var MemoryStorageDynamoDB = class extends storage.MemoryStorage {
1749
1749
  }
1750
1750
  async listMessages(args) {
1751
1751
  const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;
1752
+ const metadataFilter = storage.validateStorageMetadataFilter(filter?.metadata);
1752
1753
  const threadIds = Array.isArray(threadId) ? threadId : [threadId];
1753
1754
  if (threadIds.length === 0 || threadIds.some((id) => !id.trim())) {
1754
1755
  throw new error.MastraError(
@@ -1838,19 +1839,24 @@ var MemoryStorageDynamoDB = class extends storage.MemoryStorage {
1838
1839
  let paginatedMessages = [];
1839
1840
  let total = 0;
1840
1841
  const filteredMessageIds = /* @__PURE__ */ new Set();
1841
- if (threadIds.length > 1) {
1842
+ if (threadIds.length > 1 || metadataFilter) {
1842
1843
  const threadResults = await Promise.all(
1843
1844
  threadIds.map(async (tid) => {
1844
1845
  const q = applyQueryFilters(
1845
1846
  this.service.entities.message.query.byThread({ entity: "message", threadId: tid })
1846
1847
  );
1847
- const countResult = await q.go({ pages: "all", attributes: ["id"] });
1848
1848
  const results = await q.go({ pages: "all", order });
1849
- return { ids: countResult.data.map((item) => item.id), messages: parseQueryMessages(results.data) };
1849
+ let messages = parseQueryMessages(results.data);
1850
+ if (metadataFilter) {
1851
+ messages = messages.filter(
1852
+ (message) => storage.storageMessageMatchesMetadataFilter(message.content, metadataFilter)
1853
+ );
1854
+ }
1855
+ return { ids: messages.map((message) => message.id), messages };
1850
1856
  })
1851
1857
  );
1852
- for (const r of threadResults) {
1853
- for (const id of r.ids) filteredMessageIds.add(id);
1858
+ for (const result of threadResults) {
1859
+ for (const id of result.ids) filteredMessageIds.add(id);
1854
1860
  }
1855
1861
  total = threadResults.reduce((sum, r) => sum + r.ids.length, 0);
1856
1862
  const merged = threadResults.flatMap((r) => r.messages);
@@ -1897,10 +1903,9 @@ var MemoryStorageDynamoDB = class extends storage.MemoryStorage {
1897
1903
  let finalMessages = list.get.all.db();
1898
1904
  finalMessages = this._sortMessages(finalMessages, field, direction);
1899
1905
  const returnedFilteredMessageIds = new Set(
1900
- finalMessages.filter((m) => filteredMessageIds.has(m.id)).map((m) => m.id)
1906
+ finalMessages.filter((message) => filteredMessageIds.has(message.id)).map((message) => message.id)
1901
1907
  );
1902
- const allFilteredMessagesReturned = returnedFilteredMessageIds.size >= total;
1903
- const hasMore = perPageInput !== false && !allFilteredMessagesReturned && offset + perPage < total;
1908
+ const hasMore = perPageInput !== false && (metadataFilter || returnedFilteredMessageIds.size < total) && offset + perPage < total;
1904
1909
  return {
1905
1910
  messages: finalMessages,
1906
1911
  total,