@mastra/redis 1.0.2 → 1.1.0

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,229 @@
1
1
  # @mastra/redis
2
2
 
3
+ ## 1.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Update peer dependencies to match core package version bump (1.0.5) ([#12557](https://github.com/mastra-ai/mastra/pull/12557))
8
+
9
+ ### Patch Changes
10
+
11
+ - Add durable agents with resumable streams ([#12557](https://github.com/mastra-ai/mastra/pull/12557))
12
+
13
+ Durable agents make agent execution resilient to disconnections, crashes, and long-running operations.
14
+
15
+ ### The Problem
16
+
17
+ Standard agent streaming has two fragility points:
18
+ 1. **Connection drops** - If a client disconnects mid-stream (network blip, browser refresh, mobile app backgrounded), all subsequent events are lost. The client has no way to "catch up" on what they missed.
19
+ 2. **Long-running operations** - Agent loops with tool calls can take minutes. Holding an HTTP connection open that long is unreliable. If the server restarts or the connection times out, the work is lost.
20
+
21
+ ### The Solution
22
+
23
+ **Resumable streams** solve connection drops. Every event is cached with a sequential index. If a client disconnects at event 5, they can reconnect and request events starting from index 6. They receive cached events immediately, then continue with live events as they arrive.
24
+
25
+ **Durable execution** solves long-running operations. Instead of executing the agent loop directly in the HTTP request, execution happens in a workflow engine (built-in evented engine or Inngest). The HTTP request just subscribes to events. If the connection drops, execution continues. The client can reconnect anytime to observe progress.
26
+
27
+ ### Usage
28
+
29
+ Wrap any existing `Agent` with durability using factory functions:
30
+
31
+ ```typescript
32
+ import { Agent } from '@mastra/core/agent';
33
+ import { createDurableAgent } from '@mastra/core/agent/durable';
34
+
35
+ const agent = new Agent({
36
+ id: 'my-agent',
37
+ model: openai('gpt-4'),
38
+ instructions: 'You are helpful',
39
+ });
40
+
41
+ const durableAgent = createDurableAgent({ agent });
42
+ ```
43
+
44
+ **Factory functions for different execution strategies:**
45
+
46
+ | Factory | Execution | Use Case |
47
+ | ---------------------------------------- | ----------------------------------- | ------------------------------- |
48
+ | `createDurableAgent({ agent })` | Local, synchronous | Development, simple deployments |
49
+ | `createEventedAgent({ agent })` | Fire-and-forget via workflow engine | Long-running operations |
50
+ | `createInngestAgent({ agent, inngest })` | Inngest-powered | Production, distributed systems |
51
+
52
+ ### Resumable Streams
53
+
54
+ ```typescript
55
+ // Start streaming
56
+ const { runId, output } = await durableAgent.stream('Analyze this data...');
57
+
58
+ // Client disconnects at event 5...
59
+
60
+ // Reconnect and resume from where we left off
61
+ const { output: resumed } = await durableAgent.observe(runId, { offset: 6 });
62
+ // Receives events 6, 7, 8... from cache, then continues with live events
63
+ ```
64
+
65
+ ### PubSub and Cache
66
+
67
+ Durable agents use two infrastructure components:
68
+
69
+ | Component | Purpose | Default |
70
+ | ---------- | ----------------------------------------- | --------------------- |
71
+ | **PubSub** | Real-time event delivery during streaming | `EventEmitterPubSub` |
72
+ | **Cache** | Stores events for replay on reconnection | `InMemoryServerCache` |
73
+
74
+ When `stream()` is called, events flow through pubsub in real-time. The cache stores each event with a sequential index. When `observe()` is called, missed events replay from cache before continuing with live events.
75
+
76
+ **Configure via Mastra instance (recommended):**
77
+
78
+ ```typescript
79
+ const mastra = new Mastra({
80
+ cache: new RedisServerCache({ url: 'redis://...' }),
81
+ pubsub: new RedisPubSub({ url: 'redis://...' }),
82
+ agents: {
83
+ // Inherits cache and pubsub from Mastra
84
+ myAgent: createDurableAgent({ agent }),
85
+ },
86
+ });
87
+ ```
88
+
89
+ **Configure per-agent (overrides Mastra):**
90
+
91
+ ```typescript
92
+ const durableAgent = createDurableAgent({
93
+ agent,
94
+ cache: new RedisServerCache({ url: 'redis://...' }),
95
+ pubsub: new RedisPubSub({ url: 'redis://...' }),
96
+ });
97
+ ```
98
+
99
+ **Disable caching (streams won't be resumable):**
100
+
101
+ ```typescript
102
+ const durableAgent = createDurableAgent({ agent, cache: false });
103
+ ```
104
+
105
+ For single-instance deployments, the defaults work fine. For multi-instance deployments (load balancer, horizontal scaling), use Redis-backed implementations so any instance can serve reconnection requests.
106
+
107
+ ### Class Hierarchy
108
+ - `DurableAgent` extends `Agent` - base class with resumable streams
109
+ - `EventedAgent` extends `DurableAgent` - fire-and-forget execution
110
+ - `InngestAgent` extends `DurableAgent` - Inngest-powered execution
111
+
112
+ - Updated dependencies [[`920c757`](https://github.com/mastra-ai/mastra/commit/920c75799c6bd71787d86deaf654a35af4c839ca), [`d587199`](https://github.com/mastra-ai/mastra/commit/d5871993c0371bde2b0717d6b47194755baa1443), [`1fe2533`](https://github.com/mastra-ai/mastra/commit/1fe2533c4382ca6858aac7c4b63e888c2eac6541), [`f8694b6`](https://github.com/mastra-ai/mastra/commit/f8694b6fa0b7a5cde71d794c3bbef4957c55bcb8)]:
113
+ - @mastra/core@1.30.0
114
+
115
+ ## 1.1.0-alpha.0
116
+
117
+ ### Minor Changes
118
+
119
+ - Update peer dependencies to match core package version bump (1.0.5) ([#12557](https://github.com/mastra-ai/mastra/pull/12557))
120
+
121
+ ### Patch Changes
122
+
123
+ - Add durable agents with resumable streams ([#12557](https://github.com/mastra-ai/mastra/pull/12557))
124
+
125
+ Durable agents make agent execution resilient to disconnections, crashes, and long-running operations.
126
+
127
+ ### The Problem
128
+
129
+ Standard agent streaming has two fragility points:
130
+ 1. **Connection drops** - If a client disconnects mid-stream (network blip, browser refresh, mobile app backgrounded), all subsequent events are lost. The client has no way to "catch up" on what they missed.
131
+ 2. **Long-running operations** - Agent loops with tool calls can take minutes. Holding an HTTP connection open that long is unreliable. If the server restarts or the connection times out, the work is lost.
132
+
133
+ ### The Solution
134
+
135
+ **Resumable streams** solve connection drops. Every event is cached with a sequential index. If a client disconnects at event 5, they can reconnect and request events starting from index 6. They receive cached events immediately, then continue with live events as they arrive.
136
+
137
+ **Durable execution** solves long-running operations. Instead of executing the agent loop directly in the HTTP request, execution happens in a workflow engine (built-in evented engine or Inngest). The HTTP request just subscribes to events. If the connection drops, execution continues. The client can reconnect anytime to observe progress.
138
+
139
+ ### Usage
140
+
141
+ Wrap any existing `Agent` with durability using factory functions:
142
+
143
+ ```typescript
144
+ import { Agent } from '@mastra/core/agent';
145
+ import { createDurableAgent } from '@mastra/core/agent/durable';
146
+
147
+ const agent = new Agent({
148
+ id: 'my-agent',
149
+ model: openai('gpt-4'),
150
+ instructions: 'You are helpful',
151
+ });
152
+
153
+ const durableAgent = createDurableAgent({ agent });
154
+ ```
155
+
156
+ **Factory functions for different execution strategies:**
157
+
158
+ | Factory | Execution | Use Case |
159
+ | ---------------------------------------- | ----------------------------------- | ------------------------------- |
160
+ | `createDurableAgent({ agent })` | Local, synchronous | Development, simple deployments |
161
+ | `createEventedAgent({ agent })` | Fire-and-forget via workflow engine | Long-running operations |
162
+ | `createInngestAgent({ agent, inngest })` | Inngest-powered | Production, distributed systems |
163
+
164
+ ### Resumable Streams
165
+
166
+ ```typescript
167
+ // Start streaming
168
+ const { runId, output } = await durableAgent.stream('Analyze this data...');
169
+
170
+ // Client disconnects at event 5...
171
+
172
+ // Reconnect and resume from where we left off
173
+ const { output: resumed } = await durableAgent.observe(runId, { offset: 6 });
174
+ // Receives events 6, 7, 8... from cache, then continues with live events
175
+ ```
176
+
177
+ ### PubSub and Cache
178
+
179
+ Durable agents use two infrastructure components:
180
+
181
+ | Component | Purpose | Default |
182
+ | ---------- | ----------------------------------------- | --------------------- |
183
+ | **PubSub** | Real-time event delivery during streaming | `EventEmitterPubSub` |
184
+ | **Cache** | Stores events for replay on reconnection | `InMemoryServerCache` |
185
+
186
+ When `stream()` is called, events flow through pubsub in real-time. The cache stores each event with a sequential index. When `observe()` is called, missed events replay from cache before continuing with live events.
187
+
188
+ **Configure via Mastra instance (recommended):**
189
+
190
+ ```typescript
191
+ const mastra = new Mastra({
192
+ cache: new RedisServerCache({ url: 'redis://...' }),
193
+ pubsub: new RedisPubSub({ url: 'redis://...' }),
194
+ agents: {
195
+ // Inherits cache and pubsub from Mastra
196
+ myAgent: createDurableAgent({ agent }),
197
+ },
198
+ });
199
+ ```
200
+
201
+ **Configure per-agent (overrides Mastra):**
202
+
203
+ ```typescript
204
+ const durableAgent = createDurableAgent({
205
+ agent,
206
+ cache: new RedisServerCache({ url: 'redis://...' }),
207
+ pubsub: new RedisPubSub({ url: 'redis://...' }),
208
+ });
209
+ ```
210
+
211
+ **Disable caching (streams won't be resumable):**
212
+
213
+ ```typescript
214
+ const durableAgent = createDurableAgent({ agent, cache: false });
215
+ ```
216
+
217
+ For single-instance deployments, the defaults work fine. For multi-instance deployments (load balancer, horizontal scaling), use Redis-backed implementations so any instance can serve reconnection requests.
218
+
219
+ ### Class Hierarchy
220
+ - `DurableAgent` extends `Agent` - base class with resumable streams
221
+ - `EventedAgent` extends `DurableAgent` - fire-and-forget execution
222
+ - `InngestAgent` extends `DurableAgent` - Inngest-powered execution
223
+
224
+ - Updated dependencies [[`920c757`](https://github.com/mastra-ai/mastra/commit/920c75799c6bd71787d86deaf654a35af4c839ca), [`1fe2533`](https://github.com/mastra-ai/mastra/commit/1fe2533c4382ca6858aac7c4b63e888c2eac6541), [`f8694b6`](https://github.com/mastra-ai/mastra/commit/f8694b6fa0b7a5cde71d794c3bbef4957c55bcb8)]:
225
+ - @mastra/core@1.30.0-alpha.1
226
+
3
227
  ## 1.0.2
4
228
 
5
229
  ### Patch Changes
@@ -0,0 +1,42 @@
1
+ import { MastraServerCache } from '@mastra/core/cache';
2
+ export interface RedisClient {
3
+ get(key: string): Promise<unknown>;
4
+ set(key: string, value: unknown, ...args: unknown[]): Promise<unknown>;
5
+ llen(key: string): Promise<number>;
6
+ rpush(key: string, ...values: unknown[]): Promise<number>;
7
+ lrange(key: string, start: number, stop: number): Promise<unknown[]>;
8
+ del(...keys: string[]): Promise<number>;
9
+ expire(key: string, seconds: number): Promise<number | boolean>;
10
+ scan(cursor: string | number, ...args: unknown[]): Promise<[string | number, string[]]>;
11
+ incr(key: string): Promise<number>;
12
+ }
13
+ export interface RedisServerCacheOptions {
14
+ keyPrefix?: string;
15
+ ttlSeconds?: number;
16
+ setWithExpiry?: (client: RedisClient, key: string, value: unknown, seconds: number) => Promise<unknown>;
17
+ scanKeys?: (client: RedisClient, cursor: string | number, pattern: string, count: number) => Promise<[string | number, string[]]>;
18
+ }
19
+ export declare class RedisServerCache extends MastraServerCache {
20
+ private client;
21
+ private keyPrefix;
22
+ private ttlSeconds;
23
+ private setWithExpiry;
24
+ private scanKeys;
25
+ constructor(config: {
26
+ client: RedisClient;
27
+ }, options?: RedisServerCacheOptions);
28
+ private getKey;
29
+ private serialize;
30
+ private deserialize;
31
+ get(key: string): Promise<unknown>;
32
+ set(key: string, value: unknown): Promise<void>;
33
+ listLength(key: string): Promise<number>;
34
+ listPush(key: string, value: unknown): Promise<void>;
35
+ listFromTo(key: string, from: number, to?: number): Promise<unknown[]>;
36
+ delete(key: string): Promise<void>;
37
+ clear(): Promise<void>;
38
+ increment(key: string): Promise<number>;
39
+ }
40
+ export declare const upstashPreset: Pick<RedisServerCacheOptions, 'setWithExpiry' | 'scanKeys'>;
41
+ export declare const nodeRedisPreset: Pick<RedisServerCacheOptions, 'setWithExpiry' | 'scanKeys'>;
42
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
@@ -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.0.2"
6
+ version: "1.1.0"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.2",
2
+ "version": "1.1.0",
3
3
  "package": "@mastra/redis",
4
4
  "exports": {},
5
5
  "modules": {}
package/dist/index.cjs CHANGED
@@ -6,6 +6,7 @@ var storage = require('@mastra/core/storage');
6
6
  var crypto2 = require('crypto');
7
7
  var evals = require('@mastra/core/evals');
8
8
  var redis = require('redis');
9
+ var cache = require('@mastra/core/cache');
9
10
 
10
11
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
12
 
@@ -1795,10 +1796,111 @@ var RedisStore = class extends storage.MastraStorage {
1795
1796
  return `redis://${config.host}:${config.port || 6379}/${config.db || 0}`;
1796
1797
  }
1797
1798
  };
1799
+ var defaultSetWithExpiry = (client, key, value, seconds) => {
1800
+ return client.set(key, value, "EX", seconds);
1801
+ };
1802
+ var defaultScanKeys = (client, cursor, pattern, count) => {
1803
+ return client.scan(cursor, "MATCH", pattern, "COUNT", count);
1804
+ };
1805
+ var RedisServerCache = class extends cache.MastraServerCache {
1806
+ client;
1807
+ keyPrefix;
1808
+ ttlSeconds;
1809
+ setWithExpiry;
1810
+ scanKeys;
1811
+ constructor(config, options = {}) {
1812
+ super({ name: "RedisServerCache" });
1813
+ this.client = config.client;
1814
+ this.keyPrefix = options.keyPrefix ?? "mastra:cache:";
1815
+ this.ttlSeconds = options.ttlSeconds ?? 300;
1816
+ this.setWithExpiry = options.setWithExpiry ?? defaultSetWithExpiry;
1817
+ this.scanKeys = options.scanKeys ?? defaultScanKeys;
1818
+ }
1819
+ getKey(key) {
1820
+ return `${this.keyPrefix}${key}`;
1821
+ }
1822
+ serialize(value) {
1823
+ return JSON.stringify(value);
1824
+ }
1825
+ deserialize(value) {
1826
+ if (typeof value === "string") {
1827
+ try {
1828
+ return JSON.parse(value);
1829
+ } catch {
1830
+ return value;
1831
+ }
1832
+ }
1833
+ return value;
1834
+ }
1835
+ async get(key) {
1836
+ const fullKey = this.getKey(key);
1837
+ const value = await this.client.get(fullKey);
1838
+ if (value === null) {
1839
+ return null;
1840
+ }
1841
+ return this.deserialize(value);
1842
+ }
1843
+ async set(key, value) {
1844
+ const fullKey = this.getKey(key);
1845
+ const serialized = this.serialize(value);
1846
+ if (this.ttlSeconds > 0) {
1847
+ await this.setWithExpiry(this.client, fullKey, serialized, this.ttlSeconds);
1848
+ } else {
1849
+ await this.client.set(fullKey, serialized);
1850
+ }
1851
+ }
1852
+ async listLength(key) {
1853
+ const fullKey = this.getKey(key);
1854
+ return this.client.llen(fullKey);
1855
+ }
1856
+ async listPush(key, value) {
1857
+ const fullKey = this.getKey(key);
1858
+ const serialized = this.serialize(value);
1859
+ await this.client.rpush(fullKey, serialized);
1860
+ if (this.ttlSeconds > 0) {
1861
+ await this.client.expire(fullKey, this.ttlSeconds);
1862
+ }
1863
+ }
1864
+ async listFromTo(key, from, to = -1) {
1865
+ const fullKey = this.getKey(key);
1866
+ const values = await this.client.lrange(fullKey, from, to);
1867
+ return values.map((v) => this.deserialize(v));
1868
+ }
1869
+ async delete(key) {
1870
+ const fullKey = this.getKey(key);
1871
+ await this.client.del(fullKey);
1872
+ }
1873
+ async clear() {
1874
+ const pattern = `${this.keyPrefix}*`;
1875
+ let cursor = "0";
1876
+ do {
1877
+ const [nextCursor, keys] = await this.scanKeys(this.client, cursor, pattern, 100);
1878
+ if (keys.length > 0) {
1879
+ await this.client.del(...keys);
1880
+ }
1881
+ cursor = nextCursor;
1882
+ } while (cursor !== "0" && cursor !== 0);
1883
+ }
1884
+ async increment(key) {
1885
+ const fullKey = this.getKey(key);
1886
+ return this.client.incr(fullKey);
1887
+ }
1888
+ };
1889
+ var upstashPreset = {
1890
+ setWithExpiry: (client, key, value, seconds) => client.set(key, value, { ex: seconds }),
1891
+ scanKeys: (client, cursor, pattern, count) => client.scan(cursor, { match: pattern, count })
1892
+ };
1893
+ var nodeRedisPreset = {
1894
+ setWithExpiry: (client, key, value, seconds) => client.set(key, value, { EX: seconds }),
1895
+ scanKeys: (client, cursor, pattern, count) => client.scan(cursor, { MATCH: pattern, COUNT: count })
1896
+ };
1798
1897
 
1898
+ exports.RedisServerCache = RedisServerCache;
1799
1899
  exports.RedisStore = RedisStore;
1800
1900
  exports.ScoresRedis = ScoresRedis;
1801
1901
  exports.StoreMemoryRedis = StoreMemoryRedis;
1802
1902
  exports.WorkflowsRedis = WorkflowsRedis;
1903
+ exports.nodeRedisPreset = nodeRedisPreset;
1904
+ exports.upstashPreset = upstashPreset;
1803
1905
  //# sourceMappingURL=index.cjs.map
1804
1906
  //# sourceMappingURL=index.cjs.map