@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.
- package/README.md +18 -6
- package/dist/adapters/MemoryAdapter.d.ts +47 -0
- package/dist/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/adapters/MemoryAdapter.js +178 -0
- package/dist/adapters/MemoryAdapter.js.map +1 -0
- package/dist/adapters/OpenSearchAdapter.d.ts +169 -0
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/adapters/OpenSearchAdapter.js +457 -0
- package/dist/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/adapters/SQLiteAdapter.d.ts +69 -0
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/adapters/SQLiteAdapter.js +307 -0
- package/dist/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.d.ts +47 -0
- package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/cjs/adapters/MemoryAdapter.js +182 -0
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -0
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts +169 -0
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/cjs/adapters/OpenSearchAdapter.js +461 -0
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/cjs/adapters/SQLiteAdapter.d.ts +69 -0
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/cjs/adapters/SQLiteAdapter.js +311 -0
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/cjs/adapters/index.d.ts +5 -0
- package/dist/cjs/adapters/index.d.ts.map +1 -1
- package/dist/cjs/adapters/index.js +7 -1
- package/dist/cjs/adapters/index.js.map +1 -1
- package/dist/cjs/index.d.ts +5 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +7 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/docs/ADAPTERS.md +39 -3
- package/docs/API_REFERENCE.md +179 -0
- package/docs/PERSISTENCE.md +154 -7
- package/docs/README.md +27 -2
- package/examples/opensearch-persistence.ts +175 -0
- package/package.json +10 -2
- package/src/adapters/MemoryAdapter.ts +245 -0
- package/src/adapters/OpenSearchAdapter.ts +666 -0
- package/src/adapters/SQLiteAdapter.ts +449 -0
- package/src/adapters/index.ts +15 -0
- 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
|
+
}
|