@mastra/upstash 1.3.1 → 1.4.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,43 @@
1
1
  # @mastra/upstash
2
2
 
3
+ ## 1.4.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), [`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
+ - @mastra/redis@1.4.0-alpha.1
12
+
13
+ ## 1.4.0-alpha.0
14
+
15
+ ### Minor Changes
16
+
17
+ - Memory list reads now surface database errors instead of silently returning empty results. ([#17910](https://github.com/mastra-ai/mastra/pull/17910))
18
+
19
+ 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.
20
+
21
+ **Behavior change**
22
+
23
+ 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:
24
+
25
+ ```ts
26
+ try {
27
+ const { threads } = await storage.listThreads({ resourceId });
28
+ // ...use threads
29
+ } catch (error) {
30
+ // a real backend failure. Decide whether to retry, surface, or degrade.
31
+ // An empty thread list no longer hides here; it only means "no threads".
32
+ }
33
+ ```
34
+
35
+ ### Patch Changes
36
+
37
+ - 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), [`8627c23`](https://github.com/mastra-ai/mastra/commit/8627c23d794485fb97d533fc2a7a8323bfec2225), [`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)]:
38
+ - @mastra/core@1.58.0-alpha.1
39
+ - @mastra/redis@1.4.0-alpha.0
40
+
3
41
  ## 1.3.1
4
42
 
5
43
  ### Patch Changes
@@ -3,7 +3,7 @@ name: mastra-upstash
3
3
  description: Documentation for @mastra/upstash. Use when working with @mastra/upstash APIs, configuration, or implementation.
4
4
  metadata:
5
5
  package: "@mastra/upstash"
6
- version: "1.3.1"
6
+ version: "1.4.0-alpha.1"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.3.1",
2
+ "version": "1.4.0-alpha.1",
3
3
  "package": "@mastra/upstash",
4
4
  "exports": {},
5
5
  "modules": {}
package/dist/index.cjs CHANGED
@@ -437,6 +437,7 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
437
437
  hasMore: perPageInput === false ? false : end < total
438
438
  };
439
439
  } catch (error) {
440
+ if (error instanceof _mastra_core_error.MastraError && error.category === _mastra_core_error.ErrorCategory.USER) throw error;
440
441
  const mastraError = new _mastra_core_error.MastraError({
441
442
  id: (0, _mastra_core_storage.createStorageErrorId)("UPSTASH", "LIST_THREADS", "FAILED"),
442
443
  domain: _mastra_core_error.ErrorDomain.STORAGE,
@@ -450,13 +451,7 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
450
451
  }, error);
451
452
  this.logger?.trackException(mastraError);
452
453
  this.logger.error(mastraError.toString());
453
- return {
454
- threads: [],
455
- total: 0,
456
- page,
457
- perPage: perPageForResponse,
458
- hasMore: false
459
- };
454
+ throw mastraError;
460
455
  }
461
456
  }
462
457
  async saveThread({ thread }) {
@@ -663,16 +658,38 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
663
658
  return direction === "ASC" ? aValue - bValue : bValue - aValue;
664
659
  });
665
660
  }
666
- async _getIncludedMessages(include) {
661
+ /**
662
+ * Fetches the messages named by `include` together with their surrounding context.
663
+ *
664
+ * @param include - Message ids to pin, each with an optional before/after window.
665
+ * @param resourceId - When set, drops any pinned or context message owned by another
666
+ * resource so an id from another resource returns nothing.
667
+ */
668
+ async _getIncludedMessages(include, resourceId) {
667
669
  if (!include?.length) return [];
668
670
  const messageIds = /* @__PURE__ */ new Set();
669
671
  const messageIdToThreadIds = {};
670
672
  for (const item of include) {
671
673
  const itemThreadId = await this._getThreadIdForMessage(item.id);
672
674
  if (!itemThreadId) continue;
675
+ const itemThreadMessagesKey = getThreadMessagesKey(itemThreadId);
676
+ if (resourceId !== void 0) {
677
+ const threadMessageIds = await this.client.zrange(itemThreadMessagesKey, 0, -1);
678
+ const threadPipeline = this.client.pipeline();
679
+ threadMessageIds.forEach((id) => threadPipeline.get(getMessageKey(itemThreadId, id)));
680
+ const threadMessages = (await threadPipeline.exec()).filter((message) => message !== null).filter((message) => message.resourceId === resourceId);
681
+ const targetIndex = threadMessages.findIndex((message) => message.id === item.id);
682
+ if (targetIndex === -1) continue;
683
+ const start = Math.max(0, targetIndex - (item.withPreviousMessages ?? 0));
684
+ const end = Math.min(threadMessages.length, targetIndex + (item.withNextMessages ?? 0) + 1);
685
+ for (const message of threadMessages.slice(start, end)) {
686
+ messageIds.add(message.id);
687
+ messageIdToThreadIds[message.id] = itemThreadId;
688
+ }
689
+ continue;
690
+ }
673
691
  messageIds.add(item.id);
674
692
  messageIdToThreadIds[item.id] = itemThreadId;
675
- const itemThreadMessagesKey = getThreadMessagesKey(itemThreadId);
676
693
  const rank = await this.client.zrank(itemThreadMessagesKey, item.id);
677
694
  if (rank === null) continue;
678
695
  if (item.withPreviousMessages) {
@@ -693,7 +710,8 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
693
710
  const tId = messageIdToThreadIds[id];
694
711
  pipeline.get(getMessageKey(tId, id));
695
712
  });
696
- return (await pipeline.exec()).filter((result) => result !== null);
713
+ const includedMessages = (await pipeline.exec()).filter((result) => result !== null);
714
+ return resourceId ? includedMessages.filter((message) => message.resourceId === resourceId) : includedMessages;
697
715
  }
698
716
  parseStoredMessage(storedMessage) {
699
717
  const defaultMessageContent = {
@@ -787,7 +805,7 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
787
805
  hasMore: false
788
806
  };
789
807
  let includedMessages = [];
790
- if (include && include.length > 0) includedMessages = (await this._getIncludedMessages(include)).map(this.parseStoredMessage);
808
+ if (include && include.length > 0) includedMessages = (await this._getIncludedMessages(include, resourceId)).map(this.parseStoredMessage);
791
809
  if (perPage === 0 && include && include.length > 0) {
792
810
  const list = new _mastra_core_agent.MessageList().add(includedMessages, "memory");
793
811
  return {
@@ -848,6 +866,7 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
848
866
  hasMore
849
867
  };
850
868
  } catch (error) {
869
+ if (error instanceof _mastra_core_error.MastraError && error.category === _mastra_core_error.ErrorCategory.USER) throw error;
851
870
  const mastraError = new _mastra_core_error.MastraError({
852
871
  id: (0, _mastra_core_storage.createStorageErrorId)("UPSTASH", "LIST_MESSAGES", "FAILED"),
853
872
  domain: _mastra_core_error.ErrorDomain.STORAGE,
@@ -859,13 +878,7 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
859
878
  }, error);
860
879
  this.logger.error(mastraError.toString());
861
880
  this.logger?.trackException(mastraError);
862
- return {
863
- messages: [],
864
- total: 0,
865
- page,
866
- perPage: perPageForResponse,
867
- hasMore: false
868
- };
881
+ throw mastraError;
869
882
  }
870
883
  }
871
884
  async getResourceById({ resourceId }) {