@mastra/redis 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,41 @@
1
1
  # @mastra/redis
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), [`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.4.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
+ - 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)]:
37
+ - @mastra/core@1.58.0-alpha.1
38
+
3
39
  ## 1.3.1
4
40
 
5
41
  ### Patch Changes
@@ -3,7 +3,7 @@ name: mastra-redis
3
3
  description: Documentation for @mastra/redis. Use when working with @mastra/redis APIs, configuration, or implementation.
4
4
  metadata:
5
5
  package: "@mastra/redis"
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/redis",
4
4
  "exports": {},
5
5
  "modules": {}
package/dist/index.cjs CHANGED
@@ -264,6 +264,7 @@ var StoreMemoryRedis = class extends _mastra_core_storage.MemoryStorage {
264
264
  hasMore: perPageInput === false ? false : end < total
265
265
  };
266
266
  } catch (error) {
267
+ if (error instanceof _mastra_core_error.MastraError && error.category === _mastra_core_error.ErrorCategory.USER) throw error;
267
268
  const mastraError = new _mastra_core_error.MastraError({
268
269
  id: (0, _mastra_core_storage.createStorageErrorId)("REDIS", "LIST_THREADS", "FAILED"),
269
270
  domain: _mastra_core_error.ErrorDomain.STORAGE,
@@ -277,13 +278,7 @@ var StoreMemoryRedis = class extends _mastra_core_storage.MemoryStorage {
277
278
  }, error);
278
279
  this.logger.trackException(mastraError);
279
280
  this.logger.error(mastraError.toString());
280
- return {
281
- threads: [],
282
- total: 0,
283
- page,
284
- perPage: perPageForResponse,
285
- hasMore: false
286
- };
281
+ throw mastraError;
287
282
  }
288
283
  }
289
284
  async saveThread({ thread }) {
@@ -437,16 +432,36 @@ var StoreMemoryRedis = class extends _mastra_core_storage.MemoryStorage {
437
432
  if (message.threadId) await this.client.set(getMessageIndexKey(messageId), message.threadId);
438
433
  return message.threadId || null;
439
434
  }
440
- async getIncludedMessages(include) {
435
+ /**
436
+ * Fetches the messages named by `include` together with their surrounding context.
437
+ *
438
+ * @param include - Message ids to pin, each with an optional before/after window.
439
+ * @param resourceId - When set, drops any pinned or context message owned by another
440
+ * resource so an id from another resource returns nothing.
441
+ */
442
+ async getIncludedMessages(include, resourceId) {
441
443
  if (!include?.length) return [];
442
444
  const messageIds = /* @__PURE__ */ new Set();
443
445
  const messageIdToThreadIds = {};
444
446
  for (const item of include) {
445
447
  const itemThreadId = await this.getThreadIdForMessage(item.id);
446
448
  if (!itemThreadId) continue;
449
+ const itemThreadMessagesKey = getThreadMessagesKey(itemThreadId);
450
+ if (resourceId !== void 0) {
451
+ const threadMessageIds = await this.client.zRange(itemThreadMessagesKey, 0, -1);
452
+ const threadMessages = (await this.client.mGet(threadMessageIds.map((id) => getMessageKey(itemThreadId, id)))).filter((data) => data !== null).map((data) => JSON.parse(data)).filter((message) => message.resourceId === resourceId);
453
+ const targetIndex = threadMessages.findIndex((message) => message.id === item.id);
454
+ if (targetIndex === -1) continue;
455
+ const start = Math.max(0, targetIndex - (item.withPreviousMessages ?? 0));
456
+ const end = Math.min(threadMessages.length, targetIndex + (item.withNextMessages ?? 0) + 1);
457
+ for (const message of threadMessages.slice(start, end)) {
458
+ messageIds.add(message.id);
459
+ messageIdToThreadIds[message.id] = itemThreadId;
460
+ }
461
+ continue;
462
+ }
447
463
  messageIds.add(item.id);
448
464
  messageIdToThreadIds[item.id] = itemThreadId;
449
- const itemThreadMessagesKey = getThreadMessagesKey(itemThreadId);
450
465
  const rank = await this.client.zRank(itemThreadMessagesKey, item.id);
451
466
  if (rank === null) continue;
452
467
  if (item.withPreviousMessages) {
@@ -463,7 +478,8 @@ var StoreMemoryRedis = class extends _mastra_core_storage.MemoryStorage {
463
478
  }
464
479
  if (messageIds.size === 0) return [];
465
480
  const keysToFetch = Array.from(messageIds).map((id) => getMessageKey(messageIdToThreadIds[id], id));
466
- return (await this.client.mGet(keysToFetch)).filter((data) => data !== null).map((data) => JSON.parse(data));
481
+ const includedMessages = (await this.client.mGet(keysToFetch)).filter((data) => data !== null).map((data) => JSON.parse(data));
482
+ return resourceId ? includedMessages.filter((message) => message.resourceId === resourceId) : includedMessages;
467
483
  }
468
484
  parseStoredMessage(storedMessage) {
469
485
  const defaultMessageContent = {
@@ -567,7 +583,7 @@ var StoreMemoryRedis = class extends _mastra_core_storage.MemoryStorage {
567
583
  hasMore: false
568
584
  };
569
585
  let includedMessages = [];
570
- if (include && include.length > 0) includedMessages = (await this.getIncludedMessages(include)).map(this.parseStoredMessage);
586
+ if (include && include.length > 0) includedMessages = (await this.getIncludedMessages(include, resourceId)).map(this.parseStoredMessage);
571
587
  if (perPage === 0 && include && include.length > 0) return {
572
588
  messages: new _mastra_core_agent.MessageList().add(includedMessages, "memory").get.all.db().sort((a, b) => {
573
589
  const aValue = getFieldValue(a);
@@ -637,6 +653,7 @@ var StoreMemoryRedis = class extends _mastra_core_storage.MemoryStorage {
637
653
  hasMore
638
654
  };
639
655
  } catch (error) {
656
+ if (error instanceof _mastra_core_error.MastraError && error.category === _mastra_core_error.ErrorCategory.USER) throw error;
640
657
  const mastraError = new _mastra_core_error.MastraError({
641
658
  id: (0, _mastra_core_storage.createStorageErrorId)("REDIS", "LIST_MESSAGES", "FAILED"),
642
659
  domain: _mastra_core_error.ErrorDomain.STORAGE,
@@ -648,13 +665,7 @@ var StoreMemoryRedis = class extends _mastra_core_storage.MemoryStorage {
648
665
  }, error);
649
666
  this.logger.error(mastraError.toString());
650
667
  this.logger.trackException(mastraError);
651
- return {
652
- messages: [],
653
- total: 0,
654
- page,
655
- perPage: perPageForResponse,
656
- hasMore: false
657
- };
668
+ throw mastraError;
658
669
  }
659
670
  }
660
671
  async getResourceById({ resourceId }) {