@mastra/upstash 1.4.0-alpha.0 → 1.4.0-alpha.2

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,35 @@
1
1
  # @mastra/upstash
2
2
 
3
+ ## 1.4.0-alpha.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Fixed generated thread titles being clobbered during a turn ([#21041](https://github.com/mastra-ai/mastra/pull/21041))
8
+
9
+ `updateThread` required both `title` and `metadata`, so callers that only needed to
10
+ change metadata (message persistence, working memory, observational memory, channel
11
+ subscriptions) had to read the thread and pass its title back. When title generation
12
+ finished between that read and the write, the freshly generated title was overwritten
13
+ with the stale one.
14
+
15
+ `title` and `metadata` are now independently optional: omitting one leaves that column
16
+ untouched. Callers that only change metadata no longer send a title, and message
17
+ persistence no longer rewrites a thread row it just read.
18
+
19
+ - Updated dependencies [[`1c75e32`](https://github.com/mastra-ai/mastra/commit/1c75e32f7fc0b9fb6f548b4407feaec8a1440212), [`c47165c`](https://github.com/mastra-ai/mastra/commit/c47165c983c87594c6952f1fd2fa51a90205034c), [`e08e789`](https://github.com/mastra-ai/mastra/commit/e08e789c1bf4cd2fe46363f7a4728536ceccc9bd), [`35cc901`](https://github.com/mastra-ai/mastra/commit/35cc90102cf834a84827acaf9eee0b6d6d1e2a3b), [`a8b4cf0`](https://github.com/mastra-ai/mastra/commit/a8b4cf02823cffebc4751a53337dfacf097c1ae1), [`f33264f`](https://github.com/mastra-ai/mastra/commit/f33264f517ae603279afd5c4251e2b40f6dd3618), [`689f2c4`](https://github.com/mastra-ai/mastra/commit/689f2c4b6c0835fe455702b01d21daa8abcd9331), [`eeae63e`](https://github.com/mastra-ai/mastra/commit/eeae63e7fbe8e1f237adc69bca6e2ac13c5ca907), [`4c186a0`](https://github.com/mastra-ai/mastra/commit/4c186a017275f45e6ed4c09de0f89550e2d09e8c), [`b0fa077`](https://github.com/mastra-ai/mastra/commit/b0fa077bcbc9b08551846fe372a0d3d15b71ed72)]:
20
+ - @mastra/core@1.58.0-alpha.8
21
+ - @mastra/redis@1.4.0-alpha.2
22
+
23
+ ## 1.4.0-alpha.1
24
+
25
+ ### Patch Changes
26
+
27
+ - Fixed resource-scoped message includes across storage adapters so included context cannot cross resource boundaries. ([#20984](https://github.com/mastra-ai/mastra/pull/20984))
28
+
29
+ - 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)]:
30
+ - @mastra/core@1.58.0-alpha.5
31
+ - @mastra/redis@1.4.0-alpha.1
32
+
3
33
  ## 1.4.0-alpha.0
4
34
 
5
35
  ### Minor 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.4.0-alpha.0"
6
+ version: "1.4.0-alpha.2"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.4.0-alpha.0",
2
+ "version": "1.4.0-alpha.2",
3
3
  "package": "@mastra/upstash",
4
4
  "exports": {},
5
5
  "modules": {}
@@ -129,6 +129,7 @@ Resource-scoped working memory requires specific storage adapters that support t
129
129
 
130
130
  - **libSQL** (`@mastra/libsql`)
131
131
  - **PostgreSQL** (`@mastra/pg`)
132
+ - **OracleDB** (`@mastra/oracledb`)
132
133
  - **Upstash** (`@mastra/upstash`)
133
134
  - **MongoDB** (`@mastra/mongodb`)
134
135
 
@@ -436,6 +436,23 @@ export const ragAgent = new Agent({
436
436
  })
437
437
  ```
438
438
 
439
+ **OracleDB**:
440
+
441
+ ```ts
442
+ import { ORACLEDB_PROMPT } from '@mastra/oracledb'
443
+
444
+ export const ragAgent = new Agent({
445
+ id: 'rag-agent',
446
+ name: 'RAG Agent',
447
+ model: 'openai/gpt-5.6-sol',
448
+ instructions: `
449
+ Process queries using the provided context. Structure responses to be concise and relevant.
450
+ ${ORACLEDB_PROMPT}
451
+ `,
452
+ tools: { vectorQueryTool },
453
+ })
454
+ ```
455
+
439
456
  **S3Vectors**:
440
457
 
441
458
  ```ts
@@ -78,6 +78,35 @@ await store.upsert({
78
78
 
79
79
  PostgreSQL with the pgvector extension is a good solution for teams already using PostgreSQL who want to minimize infrastructure complexity. For detailed setup instructions and best practices, see the [official pgvector repository](https://github.com/pgvector/pgvector).
80
80
 
81
+ **OracleDB**:
82
+
83
+ ```ts
84
+ import { OracleVector } from '@mastra/oracledb'
85
+
86
+ const store = new OracleVector({
87
+ id: 'oracle-vector',
88
+ user: process.env.ORACLE_DATABASE_USER,
89
+ password: process.env.ORACLE_DATABASE_PASSWORD,
90
+ connectString: process.env.ORACLE_DATABASE_CONNECT_STRING,
91
+ })
92
+
93
+ await store.createIndex({
94
+ indexName: 'myCollection',
95
+ dimension: 1536,
96
+ indexConfig: { type: 'none' },
97
+ })
98
+
99
+ await store.upsert({
100
+ indexName: 'myCollection',
101
+ vectors: embeddings,
102
+ metadata: chunks.map(chunk => ({ text: chunk.text })),
103
+ })
104
+ ```
105
+
106
+ ### Using Oracle Database Vector Search
107
+
108
+ OracleDB stores embeddings in native `VECTOR` columns and metadata in Oracle JSON. Exact search is the default; HNSW and IVF indexes can be configured for tuned deployments.
109
+
81
110
  **Pinecone**:
82
111
 
83
112
  ```ts
@@ -410,6 +439,18 @@ Index names must:
410
439
  - Example: `my_index_123` is valid
411
440
  - Example: `my-index` is not valid (contains hyphen)
412
441
 
442
+ **OracleDB**:
443
+
444
+ Index names are logical Mastra names. OracleDB maps each logical index to a physical Oracle table internally.
445
+
446
+ Logical index names must:
447
+
448
+ - Be non-empty
449
+ - Be 512 characters or fewer
450
+ - Be stable for the lifetime of the vector index
451
+ - Example: `my_collection_123` is valid
452
+ - Example: `customer-support/docs:v1` is valid and is mapped to a safe Oracle table name
453
+
413
454
  **Pinecone**:
414
455
 
415
456
  Index names must:
package/dist/index.cjs CHANGED
@@ -485,7 +485,7 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
485
485
  const now = /* @__PURE__ */ new Date();
486
486
  const updatedThread = {
487
487
  ...thread,
488
- title,
488
+ title: title ?? thread.title,
489
489
  metadata: {
490
490
  ...thread.metadata,
491
491
  ...metadata
@@ -658,16 +658,38 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
658
658
  return direction === "ASC" ? aValue - bValue : bValue - aValue;
659
659
  });
660
660
  }
661
- 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) {
662
669
  if (!include?.length) return [];
663
670
  const messageIds = /* @__PURE__ */ new Set();
664
671
  const messageIdToThreadIds = {};
665
672
  for (const item of include) {
666
673
  const itemThreadId = await this._getThreadIdForMessage(item.id);
667
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
+ }
668
691
  messageIds.add(item.id);
669
692
  messageIdToThreadIds[item.id] = itemThreadId;
670
- const itemThreadMessagesKey = getThreadMessagesKey(itemThreadId);
671
693
  const rank = await this.client.zrank(itemThreadMessagesKey, item.id);
672
694
  if (rank === null) continue;
673
695
  if (item.withPreviousMessages) {
@@ -688,7 +710,8 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
688
710
  const tId = messageIdToThreadIds[id];
689
711
  pipeline.get(getMessageKey(tId, id));
690
712
  });
691
- 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;
692
715
  }
693
716
  parseStoredMessage(storedMessage) {
694
717
  const defaultMessageContent = {
@@ -782,7 +805,7 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
782
805
  hasMore: false
783
806
  };
784
807
  let includedMessages = [];
785
- 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);
786
809
  if (perPage === 0 && include && include.length > 0) {
787
810
  const list = new _mastra_core_agent.MessageList().add(includedMessages, "memory");
788
811
  return {