@falai/agent 0.3.20 → 0.3.22

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 (52) hide show
  1. package/README.md +18 -6
  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/OpenSearchAdapter.d.ts +169 -0
  7. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -0
  8. package/dist/adapters/OpenSearchAdapter.js +457 -0
  9. package/dist/adapters/OpenSearchAdapter.js.map +1 -0
  10. package/dist/adapters/SQLiteAdapter.d.ts +69 -0
  11. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -0
  12. package/dist/adapters/SQLiteAdapter.js +307 -0
  13. package/dist/adapters/SQLiteAdapter.js.map +1 -0
  14. package/dist/adapters/index.d.ts +5 -0
  15. package/dist/adapters/index.d.ts.map +1 -1
  16. package/dist/adapters/index.js +3 -0
  17. package/dist/adapters/index.js.map +1 -1
  18. package/dist/cjs/adapters/MemoryAdapter.d.ts +47 -0
  19. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -0
  20. package/dist/cjs/adapters/MemoryAdapter.js +182 -0
  21. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -0
  22. package/dist/cjs/adapters/OpenSearchAdapter.d.ts +169 -0
  23. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -0
  24. package/dist/cjs/adapters/OpenSearchAdapter.js +461 -0
  25. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -0
  26. package/dist/cjs/adapters/SQLiteAdapter.d.ts +69 -0
  27. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -0
  28. package/dist/cjs/adapters/SQLiteAdapter.js +311 -0
  29. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -0
  30. package/dist/cjs/adapters/index.d.ts +5 -0
  31. package/dist/cjs/adapters/index.d.ts.map +1 -1
  32. package/dist/cjs/adapters/index.js +7 -1
  33. package/dist/cjs/adapters/index.js.map +1 -1
  34. package/dist/cjs/index.d.ts +5 -0
  35. package/dist/cjs/index.d.ts.map +1 -1
  36. package/dist/cjs/index.js +7 -1
  37. package/dist/cjs/index.js.map +1 -1
  38. package/dist/index.d.ts +5 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +3 -0
  41. package/dist/index.js.map +1 -1
  42. package/docs/ADAPTERS.md +39 -3
  43. package/docs/API_REFERENCE.md +179 -0
  44. package/docs/PERSISTENCE.md +154 -7
  45. package/docs/README.md +27 -2
  46. package/examples/opensearch-persistence.ts +175 -0
  47. package/package.json +10 -2
  48. package/src/adapters/MemoryAdapter.ts +245 -0
  49. package/src/adapters/OpenSearchAdapter.ts +666 -0
  50. package/src/adapters/SQLiteAdapter.ts +449 -0
  51. package/src/adapters/index.ts +15 -0
  52. package/src/index.ts +12 -0
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Memory adapter for persistence
3
+ * In-memory storage for testing and development (no database required)
4
+ */
5
+
6
+ import type {
7
+ SessionRepository,
8
+ MessageRepository,
9
+ SessionData,
10
+ MessageData,
11
+ SessionStatus,
12
+ PersistenceAdapter,
13
+ } from "../types/persistence";
14
+
15
+ /**
16
+ * Memory Adapter - Provider-style API for in-memory persistence
17
+ *
18
+ * Perfect for:
19
+ * - Testing
20
+ * - Development
21
+ * - Prototyping
22
+ * - No database setup required
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * import { Agent, MemoryAdapter } from '@falai/agent';
27
+ *
28
+ * const agent = new Agent({
29
+ * name: "My Agent",
30
+ * ai: provider,
31
+ * persistence: {
32
+ * adapter: new MemoryAdapter(),
33
+ * userId: "user_123",
34
+ * },
35
+ * });
36
+ * ```
37
+ */
38
+ export class MemoryAdapter implements PersistenceAdapter {
39
+ public readonly sessionRepository: SessionRepository;
40
+ public readonly messageRepository: MessageRepository;
41
+ private sessions: Map<string, SessionData>;
42
+ private messages: Map<string, MessageData>;
43
+
44
+ constructor() {
45
+ this.sessions = new Map();
46
+ this.messages = new Map();
47
+
48
+ this.sessionRepository = new MemorySessionRepository(this.sessions);
49
+ this.messageRepository = new MemoryMessageRepository(this.messages);
50
+ }
51
+
52
+ /**
53
+ * Clear all data (useful for testing)
54
+ */
55
+ clear(): void {
56
+ this.sessions.clear();
57
+ this.messages.clear();
58
+ }
59
+
60
+ /**
61
+ * Get data snapshot (useful for debugging)
62
+ */
63
+ getSnapshot(): {
64
+ sessions: SessionData[];
65
+ messages: MessageData[];
66
+ } {
67
+ return {
68
+ sessions: Array.from(this.sessions.values()),
69
+ messages: Array.from(this.messages.values()),
70
+ };
71
+ }
72
+ }
73
+
74
+ /**
75
+ * Memory Session Repository
76
+ */
77
+ class MemorySessionRepository implements SessionRepository {
78
+ constructor(private sessions: Map<string, SessionData>) {}
79
+
80
+ async create(
81
+ data: Omit<SessionData, "id" | "createdAt" | "updatedAt">
82
+ ): Promise<SessionData> {
83
+ const id = `session_${Date.now()}_${Math.random().toString(36).slice(2)}`;
84
+ const now = new Date();
85
+
86
+ const session: SessionData = {
87
+ ...data,
88
+ id,
89
+ status: data.status || "active",
90
+ messageCount: data.messageCount || 0,
91
+ createdAt: now,
92
+ updatedAt: now,
93
+ };
94
+
95
+ this.sessions.set(id, session);
96
+ return Promise.resolve(session);
97
+ }
98
+
99
+ async findById(id: string): Promise<SessionData | null> {
100
+ const session = this.sessions.get(id) || null;
101
+ return Promise.resolve(session);
102
+ }
103
+
104
+ async findActiveByUserId(userId: string): Promise<SessionData | null> {
105
+ const sessions = Array.from(this.sessions.values())
106
+ .filter((s) => s.userId === userId && s.status === "active")
107
+ .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
108
+
109
+ return Promise.resolve(sessions[0] || null);
110
+ }
111
+
112
+ async findByUserId(userId: string, limit = 100): Promise<SessionData[]> {
113
+ const sessions = Array.from(this.sessions.values())
114
+ .filter((s) => s.userId === userId)
115
+ .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
116
+ .slice(0, limit);
117
+ return Promise.resolve(sessions);
118
+ }
119
+
120
+ async update(
121
+ id: string,
122
+ data: Partial<Omit<SessionData, "id" | "createdAt">>
123
+ ): Promise<SessionData | null> {
124
+ const existing = this.sessions.get(id);
125
+ if (!existing) return null;
126
+
127
+ const updated: SessionData = {
128
+ ...existing,
129
+ ...data,
130
+ updatedAt: new Date(),
131
+ };
132
+
133
+ this.sessions.set(id, updated);
134
+ return Promise.resolve(updated);
135
+ }
136
+
137
+ async updateStatus(
138
+ id: string,
139
+ status: SessionStatus,
140
+ completedAt?: Date
141
+ ): Promise<SessionData | null> {
142
+ return await this.update(id, { status, completedAt });
143
+ }
144
+
145
+ async updateCollectedData(
146
+ id: string,
147
+ collectedData: Record<string, unknown>
148
+ ): Promise<SessionData | null> {
149
+ return await this.update(id, { collectedData });
150
+ }
151
+
152
+ async updateRouteState(
153
+ id: string,
154
+ route?: string,
155
+ state?: string
156
+ ): Promise<SessionData | null> {
157
+ return await this.update(id, {
158
+ currentRoute: route,
159
+ currentState: state,
160
+ });
161
+ }
162
+
163
+ async incrementMessageCount(id: string): Promise<SessionData | null> {
164
+ const session = this.sessions.get(id);
165
+ if (!session) return null;
166
+
167
+ return await this.update(id, {
168
+ messageCount: (session.messageCount || 0) + 1,
169
+ lastMessageAt: new Date(),
170
+ });
171
+ }
172
+
173
+ async delete(id: string): Promise<boolean> {
174
+ const result = this.sessions.delete(id);
175
+ return Promise.resolve(result);
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Memory Message Repository
181
+ */
182
+ class MemoryMessageRepository implements MessageRepository {
183
+ constructor(private messages: Map<string, MessageData>) {}
184
+
185
+ async create(
186
+ data: Omit<MessageData, "id" | "createdAt">
187
+ ): Promise<MessageData> {
188
+ const id = `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`;
189
+ const message: MessageData = {
190
+ ...data,
191
+ id,
192
+ createdAt: new Date(),
193
+ };
194
+
195
+ this.messages.set(id, message);
196
+ return Promise.resolve(message);
197
+ }
198
+
199
+ async findById(id: string): Promise<MessageData | null> {
200
+ const message = this.messages.get(id) || null;
201
+ return Promise.resolve(message);
202
+ }
203
+
204
+ async findBySessionId(
205
+ sessionId: string,
206
+ limit = 1000
207
+ ): Promise<MessageData[]> {
208
+ const messages = Array.from(this.messages.values())
209
+ .filter((m) => m.sessionId === sessionId)
210
+ .sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())
211
+ .slice(0, limit);
212
+ return Promise.resolve(messages);
213
+ }
214
+
215
+ async findByUserId(userId: string, limit = 100): Promise<MessageData[]> {
216
+ const messages = Array.from(this.messages.values())
217
+ .filter((m) => m.userId === userId)
218
+ .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
219
+ .slice(0, limit);
220
+ return Promise.resolve(messages);
221
+ }
222
+
223
+ async delete(id: string): Promise<boolean> {
224
+ const result = this.messages.delete(id);
225
+ return Promise.resolve(result);
226
+ }
227
+
228
+ async deleteBySessionId(sessionId: string): Promise<number> {
229
+ const toDelete = Array.from(this.messages.values()).filter(
230
+ (m) => m.sessionId === sessionId
231
+ );
232
+
233
+ toDelete.forEach((m) => this.messages.delete(m.id));
234
+ return Promise.resolve(toDelete.length);
235
+ }
236
+
237
+ async deleteByUserId(userId: string): Promise<number> {
238
+ const toDelete = Array.from(this.messages.values()).filter(
239
+ (m) => m.userId === userId
240
+ );
241
+
242
+ toDelete.forEach((m) => this.messages.delete(m.id));
243
+ return Promise.resolve(toDelete.length);
244
+ }
245
+ }