@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 +38 -0
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/index.cjs +31 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +31 -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 +6 -6
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
|
package/dist/docs/SKILL.md
CHANGED
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 }) {
|