@ariaflowagents/redis-store 0.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/README.md +55 -0
- package/dist/RedisSessionStore.d.ts +51 -0
- package/dist/RedisSessionStore.d.ts.map +1 -0
- package/dist/RedisSessionStore.js +197 -0
- package/dist/RedisSessionStore.js.map +1 -0
- package/dist/adapters.d.ts +7 -0
- package/dist/adapters.d.ts.map +1 -0
- package/dist/adapters.js +6 -0
- package/dist/adapters.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# @ariaflowagents/redis-store
|
|
2
|
+
|
|
3
|
+
Redis-backed SessionStore for AriaFlow. Works with Upstash, node-redis, ioredis, or any client exposing compatible commands.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @ariaflowagents/redis-store
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage (Upstash)
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { Redis } from '@upstash/redis';
|
|
15
|
+
import { fromUpstash } from '@ariaflowagents/redis-store';
|
|
16
|
+
|
|
17
|
+
const redis = Redis.fromEnv();
|
|
18
|
+
const sessionStore = fromUpstash(redis, { prefix: 'ariaflow' });
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Usage (node-redis)
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { createClient } from 'redis';
|
|
25
|
+
import { fromNodeRedis } from '@ariaflowagents/redis-store';
|
|
26
|
+
|
|
27
|
+
const client = createClient({ url: process.env.REDIS_URL });
|
|
28
|
+
await client.connect();
|
|
29
|
+
|
|
30
|
+
const sessionStore = fromNodeRedis(client, { prefix: 'ariaflow' });
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Usage (ioredis)
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import Redis from 'ioredis';
|
|
37
|
+
import { fromIORedis } from '@ariaflowagents/redis-store';
|
|
38
|
+
|
|
39
|
+
const client = new Redis(process.env.REDIS_URL);
|
|
40
|
+
const sessionStore = fromIORedis(client, { prefix: 'ariaflow' });
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Options
|
|
44
|
+
|
|
45
|
+
- `prefix` (default: `ariaflow`): key namespace
|
|
46
|
+
- `sessionTtlSeconds`: optional TTL for session keys
|
|
47
|
+
- `enableCleanupIndex` (default: true): track updatedAt in a sorted set for cleanup
|
|
48
|
+
|
|
49
|
+
## Notes
|
|
50
|
+
|
|
51
|
+
- Sessions are stored as JSON at `${prefix}:session:{id}`.
|
|
52
|
+
- Index sets:
|
|
53
|
+
- `${prefix}:sessions` (all session IDs)
|
|
54
|
+
- `${prefix}:user:{userId}:sessions` (per user)
|
|
55
|
+
- `${prefix}:sessions:updated` (sorted set, for cleanup)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Session, SessionStore } from '@ariaflowagents/core';
|
|
2
|
+
type RedisResult<T = unknown> = T | null;
|
|
3
|
+
type RedisCommand = (...args: any[]) => Promise<RedisResult>;
|
|
4
|
+
export type RedisClientLike = {
|
|
5
|
+
get?: RedisCommand;
|
|
6
|
+
set?: RedisCommand;
|
|
7
|
+
del?: RedisCommand;
|
|
8
|
+
mget?: RedisCommand;
|
|
9
|
+
sadd?: RedisCommand;
|
|
10
|
+
srem?: RedisCommand;
|
|
11
|
+
smembers?: RedisCommand;
|
|
12
|
+
expire?: RedisCommand;
|
|
13
|
+
pexpire?: RedisCommand;
|
|
14
|
+
zadd?: RedisCommand;
|
|
15
|
+
zrem?: RedisCommand;
|
|
16
|
+
zrangebyscore?: RedisCommand;
|
|
17
|
+
zremrangebyscore?: RedisCommand;
|
|
18
|
+
sAdd?: RedisCommand;
|
|
19
|
+
sRem?: RedisCommand;
|
|
20
|
+
sMembers?: RedisCommand;
|
|
21
|
+
mGet?: RedisCommand;
|
|
22
|
+
pExpire?: RedisCommand;
|
|
23
|
+
zAdd?: RedisCommand;
|
|
24
|
+
zRem?: RedisCommand;
|
|
25
|
+
zRangeByScore?: RedisCommand;
|
|
26
|
+
zRemRangeByScore?: RedisCommand;
|
|
27
|
+
};
|
|
28
|
+
export type RedisStoreOptions = {
|
|
29
|
+
client: RedisClientLike;
|
|
30
|
+
prefix?: string;
|
|
31
|
+
sessionTtlSeconds?: number;
|
|
32
|
+
enableCleanupIndex?: boolean;
|
|
33
|
+
};
|
|
34
|
+
export declare class RedisSessionStore implements SessionStore {
|
|
35
|
+
private client;
|
|
36
|
+
private prefix;
|
|
37
|
+
private sessionTtlSeconds?;
|
|
38
|
+
private enableCleanupIndex;
|
|
39
|
+
constructor(options: RedisStoreOptions);
|
|
40
|
+
private sessionKey;
|
|
41
|
+
private sessionIndexKey;
|
|
42
|
+
private userIndexKey;
|
|
43
|
+
private updatedIndexKey;
|
|
44
|
+
get(id: string): Promise<Session | null>;
|
|
45
|
+
save(session: Session): Promise<void>;
|
|
46
|
+
delete(id: string): Promise<void>;
|
|
47
|
+
list(userId?: string): Promise<Session[]>;
|
|
48
|
+
cleanup(maxAgeMs: number): Promise<number>;
|
|
49
|
+
}
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=RedisSessionStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisSessionStore.d.ts","sourceRoot":"","sources":["../src/RedisSessionStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIlE,KAAK,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC;AAEzC,KAAK,YAAY,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAE7D,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAChC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,gBAAgB,CAAC,EAAE,YAAY,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAiJF,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAAC,CAAS;IACnC,OAAO,CAAC,kBAAkB,CAAU;gBAExB,OAAO,EAAE,iBAAiB;IAOtC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,eAAe;IAIjB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAiBxC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBrC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAoBzC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAgBjD"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
const defaultPrefix = 'ariaflow';
|
|
2
|
+
const reviveSession = (raw) => {
|
|
3
|
+
const session = { ...raw };
|
|
4
|
+
session.createdAt = new Date(session.createdAt);
|
|
5
|
+
session.updatedAt = new Date(session.updatedAt);
|
|
6
|
+
session.handoffHistory = (session.handoffHistory ?? []).map(record => ({
|
|
7
|
+
...record,
|
|
8
|
+
timestamp: new Date(record.timestamp),
|
|
9
|
+
}));
|
|
10
|
+
if (session.metadata) {
|
|
11
|
+
session.metadata = {
|
|
12
|
+
...session.metadata,
|
|
13
|
+
createdAt: new Date(session.metadata.createdAt),
|
|
14
|
+
lastActiveAt: new Date(session.metadata.lastActiveAt),
|
|
15
|
+
handoffHistory: (session.metadata.handoffHistory ?? []).map(record => ({
|
|
16
|
+
...record,
|
|
17
|
+
timestamp: new Date(record.timestamp),
|
|
18
|
+
})),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
session.agentStates = Object.fromEntries(Object.entries(session.agentStates ?? {}).map(([agentId, state]) => [
|
|
22
|
+
agentId,
|
|
23
|
+
{
|
|
24
|
+
...state,
|
|
25
|
+
lastActive: new Date(state.lastActive),
|
|
26
|
+
},
|
|
27
|
+
]));
|
|
28
|
+
return session;
|
|
29
|
+
};
|
|
30
|
+
const callCommand = async (client, names, ...args) => {
|
|
31
|
+
for (const name of names) {
|
|
32
|
+
const fn = client[name];
|
|
33
|
+
if (typeof fn === 'function') {
|
|
34
|
+
return (await fn.call(client, ...args));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
throw new Error(`Redis client missing command: ${names.join(', ')}`);
|
|
38
|
+
};
|
|
39
|
+
const getMembers = async (client, key) => {
|
|
40
|
+
return (await callCommand(client, ['smembers', 'sMembers'], key)) ?? [];
|
|
41
|
+
};
|
|
42
|
+
const addMembers = async (client, key, ...members) => {
|
|
43
|
+
if (members.length === 0)
|
|
44
|
+
return;
|
|
45
|
+
await callCommand(client, ['sadd', 'sAdd'], key, ...members);
|
|
46
|
+
};
|
|
47
|
+
const removeMembers = async (client, key, ...members) => {
|
|
48
|
+
if (members.length === 0)
|
|
49
|
+
return;
|
|
50
|
+
await callCommand(client, ['srem', 'sRem'], key, ...members);
|
|
51
|
+
};
|
|
52
|
+
const setExpiration = async (client, key, ttlSeconds) => {
|
|
53
|
+
if (!ttlSeconds)
|
|
54
|
+
return;
|
|
55
|
+
await callCommand(client, ['expire'], key, ttlSeconds);
|
|
56
|
+
};
|
|
57
|
+
const setScore = async (client, key, score, member) => {
|
|
58
|
+
if (typeof client.zAdd === 'function') {
|
|
59
|
+
await client.zAdd(key, [{ score, value: member }]);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (typeof client.zadd === 'function') {
|
|
63
|
+
try {
|
|
64
|
+
await client.zadd(key, { score, member });
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
await client.zadd(key, score, member);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
await callCommand(client, ['zadd', 'zAdd'], key, { score, member });
|
|
73
|
+
};
|
|
74
|
+
const removeScore = async (client, key, member) => {
|
|
75
|
+
await callCommand(client, ['zrem', 'zRem'], key, member);
|
|
76
|
+
};
|
|
77
|
+
const rangeByScore = async (client, key, min, max) => {
|
|
78
|
+
return (await callCommand(client, ['zrangebyscore', 'zRangeByScore'], key, min, max)) ?? [];
|
|
79
|
+
};
|
|
80
|
+
const removeByScore = async (client, key, min, max) => {
|
|
81
|
+
await callCommand(client, ['zremrangebyscore', 'zRemRangeByScore'], key, min, max);
|
|
82
|
+
};
|
|
83
|
+
const getMulti = async (client, keys) => {
|
|
84
|
+
if (keys.length === 0)
|
|
85
|
+
return [];
|
|
86
|
+
if (typeof client.mGet === 'function') {
|
|
87
|
+
const result = (await client.mGet(keys));
|
|
88
|
+
return result ?? [];
|
|
89
|
+
}
|
|
90
|
+
if (typeof client.mget === 'function') {
|
|
91
|
+
const result = (await client.mget(...keys));
|
|
92
|
+
return result ?? [];
|
|
93
|
+
}
|
|
94
|
+
const values = [];
|
|
95
|
+
for (const key of keys) {
|
|
96
|
+
const value = (await callCommand(client, ['get'], key)) ?? null;
|
|
97
|
+
values.push(value);
|
|
98
|
+
}
|
|
99
|
+
return values;
|
|
100
|
+
};
|
|
101
|
+
export class RedisSessionStore {
|
|
102
|
+
client;
|
|
103
|
+
prefix;
|
|
104
|
+
sessionTtlSeconds;
|
|
105
|
+
enableCleanupIndex;
|
|
106
|
+
constructor(options) {
|
|
107
|
+
this.client = options.client;
|
|
108
|
+
this.prefix = options.prefix ?? defaultPrefix;
|
|
109
|
+
this.sessionTtlSeconds = options.sessionTtlSeconds;
|
|
110
|
+
this.enableCleanupIndex = options.enableCleanupIndex ?? true;
|
|
111
|
+
}
|
|
112
|
+
sessionKey(id) {
|
|
113
|
+
return `${this.prefix}:session:${id}`;
|
|
114
|
+
}
|
|
115
|
+
sessionIndexKey() {
|
|
116
|
+
return `${this.prefix}:sessions`;
|
|
117
|
+
}
|
|
118
|
+
userIndexKey(userId) {
|
|
119
|
+
return `${this.prefix}:user:${userId}:sessions`;
|
|
120
|
+
}
|
|
121
|
+
updatedIndexKey() {
|
|
122
|
+
return `${this.prefix}:sessions:updated`;
|
|
123
|
+
}
|
|
124
|
+
async get(id) {
|
|
125
|
+
const data = (await callCommand(this.client, ['get'], this.sessionKey(id)));
|
|
126
|
+
if (!data)
|
|
127
|
+
return null;
|
|
128
|
+
try {
|
|
129
|
+
return reviveSession(JSON.parse(data));
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
console.error('Failed to parse session data from Redis', error);
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async save(session) {
|
|
137
|
+
session.updatedAt = new Date();
|
|
138
|
+
const key = this.sessionKey(session.id);
|
|
139
|
+
const payload = JSON.stringify(session);
|
|
140
|
+
await callCommand(this.client, ['set'], key, payload);
|
|
141
|
+
await setExpiration(this.client, key, this.sessionTtlSeconds);
|
|
142
|
+
await addMembers(this.client, this.sessionIndexKey(), session.id);
|
|
143
|
+
if (session.userId) {
|
|
144
|
+
await addMembers(this.client, this.userIndexKey(session.userId), session.id);
|
|
145
|
+
}
|
|
146
|
+
if (this.enableCleanupIndex) {
|
|
147
|
+
const score = session.updatedAt.getTime();
|
|
148
|
+
await setScore(this.client, this.updatedIndexKey(), score, session.id);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async delete(id) {
|
|
152
|
+
const session = await this.get(id);
|
|
153
|
+
await callCommand(this.client, ['del'], this.sessionKey(id));
|
|
154
|
+
await removeMembers(this.client, this.sessionIndexKey(), id);
|
|
155
|
+
if (session?.userId) {
|
|
156
|
+
await removeMembers(this.client, this.userIndexKey(session.userId), id);
|
|
157
|
+
}
|
|
158
|
+
if (this.enableCleanupIndex) {
|
|
159
|
+
await removeScore(this.client, this.updatedIndexKey(), id);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async list(userId) {
|
|
163
|
+
const indexKey = userId ? this.userIndexKey(userId) : this.sessionIndexKey();
|
|
164
|
+
const ids = await getMembers(this.client, indexKey);
|
|
165
|
+
if (ids.length === 0)
|
|
166
|
+
return [];
|
|
167
|
+
const keys = ids.map(id => this.sessionKey(id));
|
|
168
|
+
const results = await getMulti(this.client, keys);
|
|
169
|
+
return results
|
|
170
|
+
.map(raw => {
|
|
171
|
+
if (!raw)
|
|
172
|
+
return null;
|
|
173
|
+
try {
|
|
174
|
+
return reviveSession(JSON.parse(raw));
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
})
|
|
180
|
+
.filter((session) => session !== null);
|
|
181
|
+
}
|
|
182
|
+
async cleanup(maxAgeMs) {
|
|
183
|
+
if (!this.enableCleanupIndex) {
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
|
186
|
+
const cutoff = Date.now() - maxAgeMs;
|
|
187
|
+
const expiredIds = await rangeByScore(this.client, this.updatedIndexKey(), 0, cutoff);
|
|
188
|
+
if (expiredIds.length === 0)
|
|
189
|
+
return 0;
|
|
190
|
+
for (const id of expiredIds) {
|
|
191
|
+
await this.delete(id);
|
|
192
|
+
}
|
|
193
|
+
await removeByScore(this.client, this.updatedIndexKey(), 0, cutoff);
|
|
194
|
+
return expiredIds.length;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=RedisSessionStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisSessionStore.js","sourceRoot":"","sources":["../src/RedisSessionStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { RedisSessionStore } from './RedisSessionStore.js';
|
|
2
|
+
import type { RedisClientLike, RedisStoreOptions } from './RedisSessionStore.js';
|
|
3
|
+
export type RedisAdapterOptions = Omit<RedisStoreOptions, 'client'>;
|
|
4
|
+
export declare const fromUpstash: (client: RedisClientLike, options?: RedisAdapterOptions) => RedisSessionStore;
|
|
5
|
+
export declare const fromNodeRedis: (client: RedisClientLike, options?: RedisAdapterOptions) => RedisSessionStore;
|
|
6
|
+
export declare const fromIORedis: (client: RedisClientLike, options?: RedisAdapterOptions) => RedisSessionStore;
|
|
7
|
+
//# sourceMappingURL=adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEjF,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;AAKpE,eAAO,MAAM,WAAW,GAAI,QAAQ,eAAe,EAAE,UAAU,mBAAmB,sBACpD,CAAC;AAE/B,eAAO,MAAM,aAAa,GAAI,QAAQ,eAAe,EAAE,UAAU,mBAAmB,sBACtD,CAAC;AAE/B,eAAO,MAAM,WAAW,GAAI,QAAQ,eAAe,EAAE,UAAU,mBAAmB,sBACpD,CAAC"}
|
package/dist/adapters.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { RedisSessionStore } from './RedisSessionStore.js';
|
|
2
|
+
const createStore = (client, options) => new RedisSessionStore({ client, ...(options ?? {}) });
|
|
3
|
+
export const fromUpstash = (client, options) => createStore(client, options);
|
|
4
|
+
export const fromNodeRedis = (client, options) => createStore(client, options);
|
|
5
|
+
export const fromIORedis = (client, options) => createStore(client, options);
|
|
6
|
+
//# sourceMappingURL=adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,MAAM,WAAW,GAAG,CAAC,MAAuB,EAAE,OAA6B,EAAE,EAAE,CAC7E,IAAI,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAExD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAuB,EAAE,OAA6B,EAAE,EAAE,CACpF,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE/B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAuB,EAAE,OAA6B,EAAE,EAAE,CACtF,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE/B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAuB,EAAE,OAA6B,EAAE,EAAE,CACpF,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { RedisSessionStore } from './RedisSessionStore.js';
|
|
2
|
+
export type { RedisClientLike, RedisStoreOptions } from './RedisSessionStore.js';
|
|
3
|
+
export { fromUpstash, fromNodeRedis, fromIORedis } from './adapters.js';
|
|
4
|
+
export type { RedisAdapterOptions } from './adapters.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACxE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ariaflowagents/redis-store",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Redis-backed SessionStore for AriaFlow (supports Upstash and common Redis clients)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"peerDependencies": {
|
|
15
|
+
"@ariaflowagents/core": "^0.1.0"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@ai-sdk/openai": "^3.0.0",
|
|
19
|
+
"@ariaflowagents/core": "file:../ariaflow-core",
|
|
20
|
+
"@types/node": "^20.11.0",
|
|
21
|
+
"ai": "^6.0.0",
|
|
22
|
+
"dotenv": "^16.4.0",
|
|
23
|
+
"redis": "^4.7.0",
|
|
24
|
+
"tsx": "^4.7.0",
|
|
25
|
+
"typescript": "^5.3.0"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsc -p tsconfig.json",
|
|
29
|
+
"dev:local": "tsx examples/local-redis/test.ts",
|
|
30
|
+
"dev:multi": "tsx examples/local-redis/multi-turn.ts",
|
|
31
|
+
"clean": "rm -rf dist",
|
|
32
|
+
"prepublishOnly": "npm run build"
|
|
33
|
+
},
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist",
|
|
39
|
+
"README.md"
|
|
40
|
+
]
|
|
41
|
+
}
|