@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 +36 -0
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/index.cjs +29 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +29 -18
- package/dist/index.js.map +1 -1
- package/dist/storage/domains/memory/index.d.ts +7 -0
- package/dist/storage/domains/memory/index.d.ts.map +1 -1
- package/package.json +5 -5
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
|
package/dist/docs/SKILL.md
CHANGED
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 }) {
|