@falai/agent 0.3.12 → 0.3.21

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.
Files changed (69) hide show
  1. package/README.md +74 -0
  2. package/dist/adapters/MemoryAdapter.d.ts +47 -0
  3. package/dist/adapters/MemoryAdapter.d.ts.map +1 -0
  4. package/dist/adapters/MemoryAdapter.js +178 -0
  5. package/dist/adapters/MemoryAdapter.js.map +1 -0
  6. package/dist/adapters/MongoAdapter.d.ts +97 -0
  7. package/dist/adapters/MongoAdapter.d.ts.map +1 -0
  8. package/dist/adapters/MongoAdapter.js +163 -0
  9. package/dist/adapters/MongoAdapter.js.map +1 -0
  10. package/dist/adapters/PostgreSQLAdapter.d.ts +71 -0
  11. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  12. package/dist/adapters/PostgreSQLAdapter.js +256 -0
  13. package/dist/adapters/PostgreSQLAdapter.js.map +1 -0
  14. package/dist/adapters/RedisAdapter.d.ts +71 -0
  15. package/dist/adapters/RedisAdapter.d.ts.map +1 -0
  16. package/dist/adapters/RedisAdapter.js +226 -0
  17. package/dist/adapters/RedisAdapter.js.map +1 -0
  18. package/dist/adapters/SQLiteAdapter.d.ts +69 -0
  19. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -0
  20. package/dist/adapters/SQLiteAdapter.js +307 -0
  21. package/dist/adapters/SQLiteAdapter.js.map +1 -0
  22. package/dist/adapters/index.d.ts +9 -0
  23. package/dist/adapters/index.d.ts.map +1 -1
  24. package/dist/adapters/index.js +5 -0
  25. package/dist/adapters/index.js.map +1 -1
  26. package/dist/cjs/adapters/MemoryAdapter.d.ts +47 -0
  27. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -0
  28. package/dist/cjs/adapters/MemoryAdapter.js +182 -0
  29. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -0
  30. package/dist/cjs/adapters/MongoAdapter.d.ts +97 -0
  31. package/dist/cjs/adapters/MongoAdapter.d.ts.map +1 -0
  32. package/dist/cjs/adapters/MongoAdapter.js +167 -0
  33. package/dist/cjs/adapters/MongoAdapter.js.map +1 -0
  34. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +71 -0
  35. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  36. package/dist/cjs/adapters/PostgreSQLAdapter.js +260 -0
  37. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -0
  38. package/dist/cjs/adapters/RedisAdapter.d.ts +71 -0
  39. package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -0
  40. package/dist/cjs/adapters/RedisAdapter.js +230 -0
  41. package/dist/cjs/adapters/RedisAdapter.js.map +1 -0
  42. package/dist/cjs/adapters/SQLiteAdapter.d.ts +69 -0
  43. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -0
  44. package/dist/cjs/adapters/SQLiteAdapter.js +311 -0
  45. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -0
  46. package/dist/cjs/adapters/index.d.ts +9 -0
  47. package/dist/cjs/adapters/index.d.ts.map +1 -1
  48. package/dist/cjs/adapters/index.js +11 -1
  49. package/dist/cjs/adapters/index.js.map +1 -1
  50. package/dist/cjs/index.d.ts +9 -0
  51. package/dist/cjs/index.d.ts.map +1 -1
  52. package/dist/cjs/index.js +11 -1
  53. package/dist/cjs/index.js.map +1 -1
  54. package/dist/index.d.ts +9 -0
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +5 -0
  57. package/dist/index.js.map +1 -1
  58. package/docs/ADAPTERS.md +151 -0
  59. package/docs/API_REFERENCE.md +448 -0
  60. package/docs/PERSISTENCE.md +176 -6
  61. package/examples/redis-persistence.ts +89 -0
  62. package/package.json +26 -2
  63. package/src/adapters/MemoryAdapter.ts +245 -0
  64. package/src/adapters/MongoAdapter.ts +295 -0
  65. package/src/adapters/PostgreSQLAdapter.ts +417 -0
  66. package/src/adapters/RedisAdapter.ts +365 -0
  67. package/src/adapters/SQLiteAdapter.ts +449 -0
  68. package/src/adapters/index.ts +27 -0
  69. package/src/index.ts +22 -0
@@ -0,0 +1,256 @@
1
+ /**
2
+ * PostgreSQL adapter for persistence
3
+ * Raw SQL adapter for PostgreSQL with custom schemas
4
+ */
5
+ /**
6
+ * PostgreSQL Adapter - Provider-style API for PostgreSQL persistence
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { Client } from 'pg';
11
+ * import { Agent, PostgreSQLAdapter } from '@falai/agent';
12
+ *
13
+ * const client = new Client({
14
+ * host: 'localhost',
15
+ * port: 5432,
16
+ * database: 'myapp',
17
+ * user: 'postgres',
18
+ * password: 'password',
19
+ * });
20
+ * await client.connect();
21
+ *
22
+ * const agent = new Agent({
23
+ * name: "My Agent",
24
+ * ai: provider,
25
+ * persistence: {
26
+ * adapter: new PostgreSQLAdapter({ client }),
27
+ * userId: "user_123",
28
+ * },
29
+ * });
30
+ * ```
31
+ */
32
+ export class PostgreSQLAdapter {
33
+ constructor(options) {
34
+ this.client = options.client;
35
+ const sessionTable = options.tables?.sessions || "agent_sessions";
36
+ const messageTable = options.tables?.messages || "agent_messages";
37
+ this.sessionRepository = new PostgreSQLSessionRepository(this.client, sessionTable);
38
+ this.messageRepository = new PostgreSQLMessageRepository(this.client, messageTable);
39
+ }
40
+ async initialize() {
41
+ // Create tables if they don't exist
42
+ const sessionTable = "agent_sessions";
43
+ const messageTable = "agent_messages";
44
+ await this.client.query(`
45
+ CREATE TABLE IF NOT EXISTS ${sessionTable} (
46
+ id VARCHAR(255) PRIMARY KEY,
47
+ user_id VARCHAR(255),
48
+ agent_name VARCHAR(255),
49
+ status VARCHAR(50) DEFAULT 'active',
50
+ current_route VARCHAR(255),
51
+ current_state VARCHAR(255),
52
+ collected_data JSONB,
53
+ message_count INTEGER DEFAULT 0,
54
+ last_message_at TIMESTAMP,
55
+ completed_at TIMESTAMP,
56
+ created_at TIMESTAMP DEFAULT NOW(),
57
+ updated_at TIMESTAMP DEFAULT NOW()
58
+ )
59
+ `);
60
+ await this.client.query(`
61
+ CREATE INDEX IF NOT EXISTS idx_sessions_user_id ON ${sessionTable}(user_id);
62
+ CREATE INDEX IF NOT EXISTS idx_sessions_status ON ${sessionTable}(status);
63
+ `);
64
+ await this.client.query(`
65
+ CREATE TABLE IF NOT EXISTS ${messageTable} (
66
+ id VARCHAR(255) PRIMARY KEY,
67
+ session_id VARCHAR(255) NOT NULL,
68
+ user_id VARCHAR(255),
69
+ role VARCHAR(50) NOT NULL,
70
+ content TEXT NOT NULL,
71
+ route VARCHAR(255),
72
+ state VARCHAR(255),
73
+ tool_calls JSONB,
74
+ event JSONB,
75
+ created_at TIMESTAMP DEFAULT NOW(),
76
+ FOREIGN KEY (session_id) REFERENCES ${sessionTable}(id) ON DELETE CASCADE
77
+ )
78
+ `);
79
+ await this.client.query(`
80
+ CREATE INDEX IF NOT EXISTS idx_messages_session_id ON ${messageTable}(session_id);
81
+ CREATE INDEX IF NOT EXISTS idx_messages_user_id ON ${messageTable}(user_id);
82
+ `);
83
+ }
84
+ async disconnect() {
85
+ await this.client.end();
86
+ }
87
+ }
88
+ /**
89
+ * PostgreSQL Session Repository
90
+ */
91
+ class PostgreSQLSessionRepository {
92
+ constructor(client, tableName) {
93
+ this.client = client;
94
+ this.tableName = tableName;
95
+ }
96
+ async create(data) {
97
+ const id = `session_${Date.now()}_${Math.random().toString(36).slice(2)}`;
98
+ const now = new Date();
99
+ const result = await this.client.query(`INSERT INTO ${this.tableName}
100
+ (id, user_id, agent_name, status, collected_data, message_count, created_at, updated_at)
101
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
102
+ RETURNING *`, [
103
+ id,
104
+ data.userId || null,
105
+ data.agentName || null,
106
+ data.status || "active",
107
+ JSON.stringify(data.collectedData || {}),
108
+ data.messageCount || 0,
109
+ now,
110
+ now,
111
+ ]);
112
+ return result.rows[0];
113
+ }
114
+ async findById(id) {
115
+ const result = await this.client.query(`SELECT * FROM ${this.tableName} WHERE id = $1`, [id]);
116
+ return result.rows[0] || null;
117
+ }
118
+ async findActiveByUserId(userId) {
119
+ const result = await this.client.query(`SELECT * FROM ${this.tableName}
120
+ WHERE user_id = $1 AND status = 'active'
121
+ ORDER BY created_at DESC
122
+ LIMIT 1`, [userId]);
123
+ return result.rows[0] || null;
124
+ }
125
+ async findByUserId(userId, limit = 100) {
126
+ const result = await this.client.query(`SELECT * FROM ${this.tableName}
127
+ WHERE user_id = $1
128
+ ORDER BY created_at DESC
129
+ LIMIT $2`, [userId, limit]);
130
+ return result.rows;
131
+ }
132
+ async update(id, data) {
133
+ const fields = [];
134
+ const values = [];
135
+ let paramIndex = 1;
136
+ if (data.status !== undefined) {
137
+ fields.push(`status = $${paramIndex++}`);
138
+ values.push(data.status);
139
+ }
140
+ if (data.collectedData !== undefined) {
141
+ fields.push(`collected_data = $${paramIndex++}`);
142
+ values.push(JSON.stringify(data.collectedData));
143
+ }
144
+ if (data.currentRoute !== undefined) {
145
+ fields.push(`current_route = $${paramIndex++}`);
146
+ values.push(data.currentRoute);
147
+ }
148
+ if (data.currentState !== undefined) {
149
+ fields.push(`current_state = $${paramIndex++}`);
150
+ values.push(data.currentState);
151
+ }
152
+ if (data.messageCount !== undefined) {
153
+ fields.push(`message_count = $${paramIndex++}`);
154
+ values.push(data.messageCount);
155
+ }
156
+ if (data.lastMessageAt !== undefined) {
157
+ fields.push(`last_message_at = $${paramIndex++}`);
158
+ values.push(data.lastMessageAt);
159
+ }
160
+ if (data.completedAt !== undefined) {
161
+ fields.push(`completed_at = $${paramIndex++}`);
162
+ values.push(data.completedAt);
163
+ }
164
+ fields.push(`updated_at = $${paramIndex++}`);
165
+ values.push(new Date());
166
+ values.push(id);
167
+ const result = await this.client.query(`UPDATE ${this.tableName}
168
+ SET ${fields.join(", ")}
169
+ WHERE id = $${paramIndex}
170
+ RETURNING *`, values);
171
+ return result.rows[0] || null;
172
+ }
173
+ async updateStatus(id, status, completedAt) {
174
+ return await this.update(id, { status, completedAt });
175
+ }
176
+ async updateCollectedData(id, collectedData) {
177
+ return await this.update(id, { collectedData });
178
+ }
179
+ async updateRouteState(id, route, state) {
180
+ return await this.update(id, {
181
+ currentRoute: route,
182
+ currentState: state,
183
+ });
184
+ }
185
+ async incrementMessageCount(id) {
186
+ const result = await this.client.query(`UPDATE ${this.tableName}
187
+ SET message_count = message_count + 1,
188
+ last_message_at = NOW(),
189
+ updated_at = NOW()
190
+ WHERE id = $1
191
+ RETURNING *`, [id]);
192
+ return result.rows[0] || null;
193
+ }
194
+ async delete(id) {
195
+ const result = await this.client.query(`DELETE FROM ${this.tableName} WHERE id = $1`, [id]);
196
+ return result.rowCount > 0;
197
+ }
198
+ }
199
+ /**
200
+ * PostgreSQL Message Repository
201
+ */
202
+ class PostgreSQLMessageRepository {
203
+ constructor(client, tableName) {
204
+ this.client = client;
205
+ this.tableName = tableName;
206
+ }
207
+ async create(data) {
208
+ const id = `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`;
209
+ const result = await this.client.query(`INSERT INTO ${this.tableName}
210
+ (id, session_id, user_id, role, content, route, state, tool_calls, event, created_at)
211
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, NOW())
212
+ RETURNING *`, [
213
+ id,
214
+ data.sessionId,
215
+ data.userId || null,
216
+ data.role,
217
+ data.content,
218
+ data.route || null,
219
+ data.state || null,
220
+ JSON.stringify(data.toolCalls || null),
221
+ JSON.stringify(data.event || null),
222
+ ]);
223
+ return result.rows[0];
224
+ }
225
+ async findById(id) {
226
+ const result = await this.client.query(`SELECT * FROM ${this.tableName} WHERE id = $1`, [id]);
227
+ return result.rows[0] || null;
228
+ }
229
+ async findBySessionId(sessionId, limit = 1000) {
230
+ const result = await this.client.query(`SELECT * FROM ${this.tableName}
231
+ WHERE session_id = $1
232
+ ORDER BY created_at ASC
233
+ LIMIT $2`, [sessionId, limit]);
234
+ return result.rows;
235
+ }
236
+ async findByUserId(userId, limit = 100) {
237
+ const result = await this.client.query(`SELECT * FROM ${this.tableName}
238
+ WHERE user_id = $1
239
+ ORDER BY created_at DESC
240
+ LIMIT $2`, [userId, limit]);
241
+ return result.rows;
242
+ }
243
+ async delete(id) {
244
+ const result = await this.client.query(`DELETE FROM ${this.tableName} WHERE id = $1`, [id]);
245
+ return result.rowCount > 0;
246
+ }
247
+ async deleteBySessionId(sessionId) {
248
+ const result = await this.client.query(`DELETE FROM ${this.tableName} WHERE session_id = $1`, [sessionId]);
249
+ return result.rowCount;
250
+ }
251
+ async deleteByUserId(userId) {
252
+ const result = await this.client.query(`DELETE FROM ${this.tableName} WHERE user_id = $1`, [userId]);
253
+ return result.rowCount;
254
+ }
255
+ }
256
+ //# sourceMappingURL=PostgreSQLAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgreSQLAdapter.js","sourceRoot":"","sources":["../../src/adapters/PostgreSQLAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Redis adapter for persistence
3
+ * Uses Redis for fast session/message storage
4
+ */
5
+ import type { SessionRepository, MessageRepository, PersistenceAdapter } from "../types/persistence";
6
+ /**
7
+ * Redis client interface - matches ioredis/redis clients
8
+ */
9
+ export interface RedisClient {
10
+ get(key: string): Promise<string | null>;
11
+ set(key: string, value: string): Promise<string | null>;
12
+ setex(key: string, seconds: number, value: string): Promise<string>;
13
+ del(...keys: string[]): Promise<number>;
14
+ keys(pattern: string): Promise<string[]>;
15
+ hgetall(key: string): Promise<Record<string, string>>;
16
+ hset(key: string, field: string, value: string): Promise<number>;
17
+ expire(key: string, seconds: number): Promise<number>;
18
+ quit(): Promise<string>;
19
+ }
20
+ /**
21
+ * Options for Redis adapter
22
+ */
23
+ export interface RedisAdapterOptions {
24
+ /**
25
+ * Redis client instance (ioredis or node-redis)
26
+ */
27
+ redis: RedisClient;
28
+ /**
29
+ * Key prefix for all keys (default: "agent:")
30
+ */
31
+ keyPrefix?: string;
32
+ /**
33
+ * TTL in seconds for sessions (default: 7 days)
34
+ */
35
+ sessionTTL?: number;
36
+ /**
37
+ * TTL in seconds for messages (default: 30 days)
38
+ */
39
+ messageTTL?: number;
40
+ }
41
+ /**
42
+ * Redis Adapter - Provider-style API for Redis persistence
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * import Redis from 'ioredis';
47
+ * import { Agent, RedisAdapter } from '@falai/agent';
48
+ *
49
+ * const redis = new Redis();
50
+ *
51
+ * const agent = new Agent({
52
+ * name: "My Agent",
53
+ * ai: provider,
54
+ * persistence: {
55
+ * adapter: new RedisAdapter({ redis }),
56
+ * userId: "user_123",
57
+ * },
58
+ * });
59
+ * ```
60
+ */
61
+ export declare class RedisAdapter implements PersistenceAdapter {
62
+ readonly sessionRepository: SessionRepository;
63
+ readonly messageRepository: MessageRepository;
64
+ private redis;
65
+ private keyPrefix;
66
+ private sessionTTL;
67
+ private messageTTL;
68
+ constructor(options: RedisAdapterOptions);
69
+ disconnect(): Promise<void>;
70
+ }
71
+ //# sourceMappingURL=RedisAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/RedisAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAIjB,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpE,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,KAAK,EAAE,WAAW,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAa,YAAW,kBAAkB;IACrD,SAAgB,iBAAiB,EAAE,iBAAiB,CAAC;IACrD,SAAgB,iBAAiB,EAAE,iBAAiB,CAAC;IACrD,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,mBAAmB;IAmBlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Redis adapter for persistence
3
+ * Uses Redis for fast session/message storage
4
+ */
5
+ /**
6
+ * Redis Adapter - Provider-style API for Redis persistence
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import Redis from 'ioredis';
11
+ * import { Agent, RedisAdapter } from '@falai/agent';
12
+ *
13
+ * const redis = new Redis();
14
+ *
15
+ * const agent = new Agent({
16
+ * name: "My Agent",
17
+ * ai: provider,
18
+ * persistence: {
19
+ * adapter: new RedisAdapter({ redis }),
20
+ * userId: "user_123",
21
+ * },
22
+ * });
23
+ * ```
24
+ */
25
+ export class RedisAdapter {
26
+ constructor(options) {
27
+ this.redis = options.redis;
28
+ this.keyPrefix = options.keyPrefix || "agent:";
29
+ this.sessionTTL = options.sessionTTL || 7 * 24 * 60 * 60; // 7 days
30
+ this.messageTTL = options.messageTTL || 30 * 24 * 60 * 60; // 30 days
31
+ this.sessionRepository = new RedisSessionRepository(this.redis, this.keyPrefix, this.sessionTTL);
32
+ this.messageRepository = new RedisMessageRepository(this.redis, this.keyPrefix, this.messageTTL);
33
+ }
34
+ async disconnect() {
35
+ await this.redis.quit();
36
+ }
37
+ }
38
+ /**
39
+ * Redis Session Repository
40
+ */
41
+ class RedisSessionRepository {
42
+ constructor(redis, keyPrefix, ttl) {
43
+ this.redis = redis;
44
+ this.keyPrefix = keyPrefix;
45
+ this.ttl = ttl;
46
+ }
47
+ getKey(id) {
48
+ return `${this.keyPrefix}session:${id}`;
49
+ }
50
+ getUserKey(userId) {
51
+ return `${this.keyPrefix}user:${userId}:sessions`;
52
+ }
53
+ async create(data) {
54
+ const id = `session_${Date.now()}_${Math.random().toString(36).slice(2)}`;
55
+ const now = new Date();
56
+ const session = {
57
+ ...data,
58
+ id,
59
+ createdAt: now,
60
+ updatedAt: now,
61
+ status: data.status || "active",
62
+ messageCount: data.messageCount || 0,
63
+ };
64
+ await this.redis.setex(this.getKey(id), this.ttl, JSON.stringify(session));
65
+ // Add to user's session list
66
+ if (data.userId) {
67
+ await this.redis.hset(this.getUserKey(data.userId), id, now.toISOString());
68
+ }
69
+ return session;
70
+ }
71
+ async findById(id) {
72
+ const data = await this.redis.get(this.getKey(id));
73
+ if (!data)
74
+ return null;
75
+ try {
76
+ return JSON.parse(data);
77
+ }
78
+ catch (error) {
79
+ console.error(`Error parsing session data for id ${id}:`, error);
80
+ return null;
81
+ }
82
+ }
83
+ async findActiveByUserId(userId) {
84
+ const sessionIds = await this.redis.hgetall(this.getUserKey(userId));
85
+ for (const sessionId of Object.keys(sessionIds)) {
86
+ const session = await this.findById(sessionId);
87
+ if (session && session.status === "active") {
88
+ return session;
89
+ }
90
+ }
91
+ return null;
92
+ }
93
+ async findByUserId(userId, limit = 100) {
94
+ const sessionIds = await this.redis.hgetall(this.getUserKey(userId));
95
+ const sessions = [];
96
+ for (const sessionId of Object.keys(sessionIds).slice(0, limit)) {
97
+ const session = await this.findById(sessionId);
98
+ if (session) {
99
+ sessions.push(session);
100
+ }
101
+ }
102
+ return sessions.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
103
+ }
104
+ async update(id, data) {
105
+ const existing = await this.findById(id);
106
+ if (!existing)
107
+ return null;
108
+ const updated = {
109
+ ...existing,
110
+ ...data,
111
+ updatedAt: new Date(),
112
+ };
113
+ await this.redis.setex(this.getKey(id), this.ttl, JSON.stringify(updated));
114
+ return updated;
115
+ }
116
+ async updateStatus(id, status, completedAt) {
117
+ return this.update(id, { status, completedAt });
118
+ }
119
+ async updateCollectedData(id, collectedData) {
120
+ return this.update(id, { collectedData });
121
+ }
122
+ async updateRouteState(id, route, state) {
123
+ return this.update(id, { currentRoute: route, currentState: state });
124
+ }
125
+ async incrementMessageCount(id) {
126
+ const session = await this.findById(id);
127
+ if (!session)
128
+ return null;
129
+ return this.update(id, {
130
+ messageCount: (session.messageCount || 0) + 1,
131
+ lastMessageAt: new Date(),
132
+ });
133
+ }
134
+ async delete(id) {
135
+ const result = await this.redis.del(this.getKey(id));
136
+ return result > 0;
137
+ }
138
+ }
139
+ /**
140
+ * Redis Message Repository
141
+ */
142
+ class RedisMessageRepository {
143
+ constructor(redis, keyPrefix, ttl) {
144
+ this.redis = redis;
145
+ this.keyPrefix = keyPrefix;
146
+ this.ttl = ttl;
147
+ }
148
+ getKey(id) {
149
+ return `${this.keyPrefix}message:${id}`;
150
+ }
151
+ getSessionKey(sessionId) {
152
+ return `${this.keyPrefix}session:${sessionId}:messages`;
153
+ }
154
+ async create(data) {
155
+ const id = `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`;
156
+ const message = {
157
+ ...data,
158
+ id,
159
+ createdAt: new Date(),
160
+ };
161
+ await this.redis.setex(this.getKey(id), this.ttl, JSON.stringify(message));
162
+ await this.redis.hset(this.getSessionKey(data.sessionId), id, message.createdAt.toISOString());
163
+ return message;
164
+ }
165
+ async findById(id) {
166
+ const data = await this.redis.get(this.getKey(id));
167
+ if (!data)
168
+ return null;
169
+ try {
170
+ return JSON.parse(data);
171
+ }
172
+ catch (error) {
173
+ console.error(`Error parsing message data for id ${id}:`, error);
174
+ return null;
175
+ }
176
+ }
177
+ async findBySessionId(sessionId, limit = 1000) {
178
+ const messageIds = await this.redis.hgetall(this.getSessionKey(sessionId));
179
+ const messages = [];
180
+ for (const messageId of Object.keys(messageIds).slice(0, limit)) {
181
+ const message = await this.findById(messageId);
182
+ if (message) {
183
+ messages.push(message);
184
+ }
185
+ }
186
+ return messages.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
187
+ }
188
+ async findByUserId(userId, limit = 100) {
189
+ // Redis doesn't have efficient user-level querying
190
+ // This would require additional indexing
191
+ const pattern = `${this.keyPrefix}message:*`;
192
+ const keys = await this.redis.keys(pattern);
193
+ const messages = [];
194
+ for (const key of keys.slice(0, limit)) {
195
+ const data = await this.redis.get(key);
196
+ if (data) {
197
+ const message = JSON.parse(data);
198
+ if (message.userId === userId) {
199
+ messages.push(message);
200
+ }
201
+ }
202
+ }
203
+ return messages.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
204
+ }
205
+ async delete(id) {
206
+ const result = await this.redis.del(this.getKey(id));
207
+ return result > 0;
208
+ }
209
+ async deleteBySessionId(sessionId) {
210
+ const messageIds = await this.redis.hgetall(this.getSessionKey(sessionId));
211
+ const keys = Object.keys(messageIds).map((id) => this.getKey(id));
212
+ if (keys.length === 0)
213
+ return 0;
214
+ const result = await this.redis.del(...keys);
215
+ await this.redis.del(this.getSessionKey(sessionId));
216
+ return result;
217
+ }
218
+ async deleteByUserId(userId) {
219
+ const messages = await this.findByUserId(userId);
220
+ const keys = messages.map((m) => this.getKey(m.id));
221
+ if (keys.length === 0)
222
+ return 0;
223
+ return await this.redis.del(...keys);
224
+ }
225
+ }
226
+ //# sourceMappingURL=RedisAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisAdapter.js","sourceRoot":"","sources":["../../src/adapters/RedisAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * SQLite adapter for persistence
3
+ * Lightweight, file-based database perfect for local development
4
+ */
5
+ import type { SessionRepository, MessageRepository, PersistenceAdapter } from "../types/persistence";
6
+ /**
7
+ * SQLite database interface - matches better-sqlite3
8
+ */
9
+ export interface SqliteDatabase {
10
+ prepare(sql: string): SqliteStatement;
11
+ exec(sql: string): void;
12
+ close(): void;
13
+ }
14
+ /**
15
+ * SQLite statement interface
16
+ */
17
+ export interface SqliteStatement {
18
+ run(...params: unknown[]): {
19
+ changes: number;
20
+ lastInsertRowid: number;
21
+ };
22
+ get(...params: unknown[]): Record<string, unknown> | undefined;
23
+ all(...params: unknown[]): Array<Record<string, unknown>>;
24
+ }
25
+ /**
26
+ * Options for SQLite adapter
27
+ */
28
+ export interface SQLiteAdapterOptions {
29
+ /**
30
+ * SQLite database instance (better-sqlite3)
31
+ */
32
+ db: SqliteDatabase;
33
+ /**
34
+ * Table names (default: "agent_sessions" and "agent_messages")
35
+ */
36
+ tables?: {
37
+ sessions?: string;
38
+ messages?: string;
39
+ };
40
+ }
41
+ /**
42
+ * SQLite Adapter - Provider-style API for SQLite persistence
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * import Database from 'better-sqlite3';
47
+ * import { Agent, SQLiteAdapter } from '@falai/agent';
48
+ *
49
+ * const db = new Database('agent.db');
50
+ *
51
+ * const agent = new Agent({
52
+ * name: "My Agent",
53
+ * ai: provider,
54
+ * persistence: {
55
+ * adapter: new SQLiteAdapter({ db }),
56
+ * userId: "user_123",
57
+ * },
58
+ * });
59
+ * ```
60
+ */
61
+ export declare class SQLiteAdapter implements PersistenceAdapter {
62
+ readonly sessionRepository: SessionRepository;
63
+ readonly messageRepository: MessageRepository;
64
+ private db;
65
+ constructor(options: SQLiteAdapterOptions);
66
+ initialize(): Promise<void>;
67
+ disconnect(): Promise<void>;
68
+ }
69
+ //# sourceMappingURL=SQLiteAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLiteAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/SQLiteAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAIjB,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC;IACtC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC/D,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC3D;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,EAAE,EAAE,cAAc,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,aAAc,YAAW,kBAAkB;IACtD,SAAgB,iBAAiB,EAAE,iBAAiB,CAAC;IACrD,SAAgB,iBAAiB,EAAE,iBAAiB,CAAC;IACrD,OAAO,CAAC,EAAE,CAAiB;gBAEf,OAAO,EAAE,oBAAoB;IAUnC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD3B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAIlC"}