@mastra/dynamodb 1.2.2 → 1.3.0-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/CHANGELOG.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # @mastra/dynamodb
2
2
 
3
+ ## 1.3.0-alpha.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Fixed resource-scoped message includes across storage adapters so included context cannot cross resource boundaries. ([#20984](https://github.com/mastra-ai/mastra/pull/20984))
8
+
9
+ - Updated dependencies [[`6445eba`](https://github.com/mastra-ai/mastra/commit/6445eba6020abac681aba1cc9289f446cb400cbe), [`df31eb0`](https://github.com/mastra-ai/mastra/commit/df31eb0c7087d782a0d9346e467f9a4af4b0eef6), [`fcd0667`](https://github.com/mastra-ai/mastra/commit/fcd0667a4e378be35c9a1b1eb19cce78fbfd7282), [`bab06b1`](https://github.com/mastra-ai/mastra/commit/bab06b18923873a584bdfc71a6b4ec7fb4727fb7)]:
10
+ - @mastra/core@1.58.0-alpha.5
11
+
12
+ ## 1.3.0-alpha.0
13
+
14
+ ### Minor Changes
15
+
16
+ - Memory list reads now surface database errors instead of silently returning empty results. ([#17910](https://github.com/mastra-ai/mastra/pull/17910))
17
+
18
+ Previously, the paginated memory reads (`listThreads`, `listMessages`, `listMessagesByResourceId`, and `listMessagesById`) caught backend failures, logged them, and returned an empty payload like `{ threads: [], total: 0, hasMore: false }`. A transient outage (locked table, dropped connection) was therefore indistinguishable from a genuinely empty result, so an agent reading conversation history during a brief failure would treat it as "no history" and could overwrite real state. These methods now re-throw the failure as a `MastraError`. Validation (USER) errors and genuinely empty results are unchanged.
19
+
20
+ **Behavior change**
21
+
22
+ Callers that previously received an empty result on a backend failure will now receive a thrown `MastraError`. If you call these read methods directly (rather than through an agent, which already surfaces errors), wrap them so a transient outage doesn't crash the caller:
23
+
24
+ ```ts
25
+ try {
26
+ const { threads } = await storage.listThreads({ resourceId });
27
+ // ...use threads
28
+ } catch (error) {
29
+ // a real backend failure. Decide whether to retry, surface, or degrade.
30
+ // An empty thread list no longer hides here; it only means "no threads".
31
+ }
32
+ ```
33
+
34
+ ### Patch Changes
35
+
36
+ - dependencies updates: ([#20406](https://github.com/mastra-ai/mastra/pull/20406))
37
+ - Updated dependency [`@aws-sdk/client-dynamodb@^3.1095.0` ↗︎](https://www.npmjs.com/package/@aws-sdk/client-dynamodb/v/3.1095.0) (from `^3.1058.0`, in `dependencies`)
38
+ - Updated dependency [`@aws-sdk/lib-dynamodb@^3.1095.0` ↗︎](https://www.npmjs.com/package/@aws-sdk/lib-dynamodb/v/3.1095.0) (from `^3.1058.0`, in `dependencies`)
39
+ - Updated dependencies [[`e7109ee`](https://github.com/mastra-ai/mastra/commit/e7109ee6f731bacc79c885906f3c7dca8d8f013a), [`772c0c8`](https://github.com/mastra-ai/mastra/commit/772c0c897cec383258de2e6178147f8014767c7b), [`578bf2e`](https://github.com/mastra-ai/mastra/commit/578bf2e6a88e9d5b8bf502204e15a95dfbb679ae), [`06b2d87`](https://github.com/mastra-ai/mastra/commit/06b2d87e63bcdd0ed59215c6789692b9b12de376), [`ac01d63`](https://github.com/mastra-ai/mastra/commit/ac01d6355974aec73fdb8781449ed12bac582094), [`a810a05`](https://github.com/mastra-ai/mastra/commit/a810a058f62ad407cfc1701e0be36ae91145d7cf), [`f8da216`](https://github.com/mastra-ai/mastra/commit/f8da21633e7eb0e31c9ce0fc30567870d19416d3), [`6104347`](https://github.com/mastra-ai/mastra/commit/61043473ba6bfd0a25156824e853e13165562e6c), [`45bfb88`](https://github.com/mastra-ai/mastra/commit/45bfb88fd52f1dd3be20e2a38905777c96499c90), [`e3b9307`](https://github.com/mastra-ai/mastra/commit/e3b9307098daefbfae2a52ae2ef51bc9fc701190), [`d6834c5`](https://github.com/mastra-ai/mastra/commit/d6834c5a7866b16734d23900163c2414ed70d791), [`c52d346`](https://github.com/mastra-ai/mastra/commit/c52d3462ec831a5d95926ecd3d3373f5928ad2e5), [`0023e79`](https://github.com/mastra-ai/mastra/commit/0023e7919431078280abd11c89d1edeae35fcc69), [`c2ad51e`](https://github.com/mastra-ai/mastra/commit/c2ad51e2467f901eecba8c9f4a45e22a50bd7c18), [`3dc97ea`](https://github.com/mastra-ai/mastra/commit/3dc97ea415fad353b48a13095fad1835933cc12a), [`3d01cd3`](https://github.com/mastra-ai/mastra/commit/3d01cd387321b6f9c5cac31d487c84bf51b19c78), [`7bf3086`](https://github.com/mastra-ai/mastra/commit/7bf308663f0115ca74ad20554ade740f06640859), [`a8dd139`](https://github.com/mastra-ai/mastra/commit/a8dd1391a9fe9a6632c25809ef236980afa9a020), [`e5786be`](https://github.com/mastra-ai/mastra/commit/e5786be02bb903073082bd9d6da880ebaacc343f), [`2093fbd`](https://github.com/mastra-ai/mastra/commit/2093fbd53bb744bae19ec89f6d73db9a66fbe8a7), [`e7a5da4`](https://github.com/mastra-ai/mastra/commit/e7a5da4ef8e4dd452d2f232961b4e682a85ffe43), [`7b4393d`](https://github.com/mastra-ai/mastra/commit/7b4393d557411fdcf07b0e30e5acaf7cc85154ae)]:
40
+ - @mastra/core@1.58.0-alpha.1
41
+
3
42
  ## 1.2.2
4
43
 
5
44
  ### 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.2.2"
6
+ version: "1.3.0-alpha.1"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.2.2",
2
+ "version": "1.3.0-alpha.1",
3
3
  "package": "@mastra/dynamodb",
4
4
  "exports": {},
5
5
  "modules": {}
package/dist/index.cjs CHANGED
@@ -1746,7 +1746,10 @@ var MemoryStorageDynamoDB = class extends _mastra_core_storage.MemoryStorage {
1746
1746
  hasMore: false
1747
1747
  };
1748
1748
  if (perPage === 0 && include && include.length > 0) {
1749
- const includeMessages = await this._getIncludedMessages({ include });
1749
+ const includeMessages = await this._getIncludedMessages({
1750
+ include,
1751
+ resourceId
1752
+ });
1750
1753
  const list = new _mastra_core_agent.MessageList().add(includeMessages, "memory");
1751
1754
  return {
1752
1755
  messages: this._sortMessages(list.get.all.db(), field, direction),
@@ -1835,7 +1838,10 @@ var MemoryStorageDynamoDB = class extends _mastra_core_storage.MemoryStorage {
1835
1838
  const messageIds = new Set(paginatedMessages.map((m) => m.id));
1836
1839
  let includeMessages = [];
1837
1840
  if (include && include.length > 0) {
1838
- includeMessages = await this._getIncludedMessages({ include });
1841
+ includeMessages = await this._getIncludedMessages({
1842
+ include,
1843
+ resourceId
1844
+ });
1839
1845
  for (const includeMsg of includeMessages) if (!messageIds.has(includeMsg.id)) {
1840
1846
  paginatedMessages.push(includeMsg);
1841
1847
  messageIds.add(includeMsg.id);
@@ -1853,6 +1859,7 @@ var MemoryStorageDynamoDB = class extends _mastra_core_storage.MemoryStorage {
1853
1859
  hasMore
1854
1860
  };
1855
1861
  } catch (error) {
1862
+ if (error instanceof _mastra_core_error.MastraError && error.category === _mastra_core_error.ErrorCategory.USER) throw error;
1856
1863
  const mastraError = new _mastra_core_error.MastraError({
1857
1864
  id: (0, _mastra_core_storage.createStorageErrorId)("DYNAMODB", "LIST_MESSAGES", "FAILED"),
1858
1865
  domain: _mastra_core_error.ErrorDomain.STORAGE,
@@ -1864,13 +1871,7 @@ var MemoryStorageDynamoDB = class extends _mastra_core_storage.MemoryStorage {
1864
1871
  }, error);
1865
1872
  this.logger?.error?.(mastraError.toString());
1866
1873
  this.logger?.trackException?.(mastraError);
1867
- return {
1868
- messages: [],
1869
- total: 0,
1870
- page,
1871
- perPage: perPageForResponse,
1872
- hasMore: false
1873
- };
1874
+ throw mastraError;
1874
1875
  }
1875
1876
  }
1876
1877
  async saveMessages(args) {
@@ -1990,7 +1991,8 @@ var MemoryStorageDynamoDB = class extends _mastra_core_storage.MemoryStorage {
1990
1991
  hasMore: offset + perPage < total
1991
1992
  };
1992
1993
  } catch (error) {
1993
- throw new _mastra_core_error.MastraError({
1994
+ if (error instanceof _mastra_core_error.MastraError && error.category === _mastra_core_error.ErrorCategory.USER) throw error;
1995
+ const mastraError = new _mastra_core_error.MastraError({
1994
1996
  id: (0, _mastra_core_storage.createStorageErrorId)("DYNAMODB", "LIST_THREADS", "FAILED"),
1995
1997
  domain: _mastra_core_error.ErrorDomain.STORAGE,
1996
1998
  category: _mastra_core_error.ErrorCategory.THIRD_PARTY,
@@ -2001,6 +2003,9 @@ var MemoryStorageDynamoDB = class extends _mastra_core_storage.MemoryStorage {
2001
2003
  perPage: perPageForResponse
2002
2004
  }
2003
2005
  }, error);
2006
+ this.logger?.error?.(mastraError.toString());
2007
+ this.logger?.trackException?.(mastraError);
2008
+ throw mastraError;
2004
2009
  }
2005
2010
  }
2006
2011
  _sortMessages(messages, field, direction) {
@@ -2011,7 +2016,14 @@ var MemoryStorageDynamoDB = class extends _mastra_core_storage.MemoryStorage {
2011
2016
  return direction === "ASC" ? aValue - bValue : bValue - aValue;
2012
2017
  });
2013
2018
  }
2014
- async _getIncludedMessages({ include }) {
2019
+ /**
2020
+ * Fetches the messages named by `include` together with their surrounding context.
2021
+ *
2022
+ * @param include - Message ids to pin, each with an optional before/after window.
2023
+ * @param resourceId - When set, restricts both the pinned messages and their context
2024
+ * to that resource so an id from another resource returns nothing.
2025
+ */
2026
+ async _getIncludedMessages({ include, resourceId }) {
2015
2027
  if (!include?.length) return [];
2016
2028
  const targetResults = await Promise.all(include.map((inc) => this.service.entities.message.get({
2017
2029
  entity: "message",
@@ -2024,7 +2036,7 @@ var MemoryStorageDynamoDB = class extends _mastra_core_storage.MemoryStorage {
2024
2036
  data: null
2025
2037
  }))));
2026
2038
  const targetMap = /* @__PURE__ */ new Map();
2027
- for (const { id, data } of targetResults) if (data) {
2039
+ for (const { id, data } of targetResults) if (data && (!resourceId || data.resourceId === resourceId)) {
2028
2040
  const createdAt = typeof data.createdAt === "string" ? data.createdAt : new Date(data.createdAt).toISOString();
2029
2041
  targetMap.set(id, {
2030
2042
  threadId: data.threadId,
@@ -2032,7 +2044,7 @@ var MemoryStorageDynamoDB = class extends _mastra_core_storage.MemoryStorage {
2032
2044
  });
2033
2045
  }
2034
2046
  if (targetMap.size === 0) return [];
2035
- const parseQueryMessages = (data) => data.map((item) => this.parseMessageData(item)).filter((msg) => "content" in msg && typeof msg.content === "object");
2047
+ const parseQueryMessages = (data) => data.map((item) => this.parseMessageData(item)).filter((msg) => "content" in msg && typeof msg.content === "object").filter((msg) => !resourceId || msg.resourceId === resourceId);
2036
2048
  const includeMessages = [];
2037
2049
  for (const includeItem of include) {
2038
2050
  const { id, withPreviousMessages = 0, withNextMessages = 0 } = includeItem;