@falai/agent 1.1.0 → 1.1.1
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/dist/adapters/MemoryAdapter.d.ts.map +1 -1
- package/dist/adapters/MemoryAdapter.js +2 -1
- package/dist/adapters/MemoryAdapter.js.map +1 -1
- package/dist/adapters/MongoAdapter.d.ts.map +1 -1
- package/dist/adapters/MongoAdapter.js +2 -1
- package/dist/adapters/MongoAdapter.js.map +1 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenSearchAdapter.js +2 -1
- package/dist/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.js +2 -1
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/adapters/PrismaAdapter.d.ts.map +1 -1
- package/dist/adapters/PrismaAdapter.js +2 -1
- package/dist/adapters/PrismaAdapter.js.map +1 -1
- package/dist/adapters/RedisAdapter.d.ts.map +1 -1
- package/dist/adapters/RedisAdapter.js.map +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.js +2 -1
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.js +2 -1
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js +2 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js +2 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.js +2 -1
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/core/BatchExecutor.d.ts.map +1 -1
- package/dist/cjs/core/BatchExecutor.js +1 -4
- package/dist/cjs/core/BatchExecutor.js.map +1 -1
- package/dist/cjs/core/SessionManager.d.ts.map +1 -1
- package/dist/cjs/core/SessionManager.js +4 -11
- package/dist/cjs/core/SessionManager.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +3 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/utils/session.d.ts +6 -0
- package/dist/cjs/utils/session.d.ts.map +1 -1
- package/dist/cjs/utils/session.js +26 -8
- package/dist/cjs/utils/session.js.map +1 -1
- package/dist/core/BatchExecutor.d.ts.map +1 -1
- package/dist/core/BatchExecutor.js +2 -5
- package/dist/core/BatchExecutor.js.map +1 -1
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +4 -11
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/session.d.ts +6 -0
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +26 -8
- package/dist/utils/session.js.map +1 -1
- package/docs/api/README.md +31 -2
- package/docs/api/overview.md +8 -4
- package/docs/core/conversation-flows/data-collection.md +7 -1
- package/docs/core/conversation-flows/route-dsl.md +8 -1
- package/docs/core/persistence/session-storage.md +12 -0
- package/examples/integrations/database-integration.ts +10 -9
- package/examples/persistence/custom-adapter.ts +12 -15
- package/package.json +1 -1
- package/src/adapters/MemoryAdapter.ts +6 -8
- package/src/adapters/MongoAdapter.ts +6 -8
- package/src/adapters/OpenSearchAdapter.ts +6 -8
- package/src/adapters/PostgreSQLAdapter.ts +6 -8
- package/src/adapters/PrismaAdapter.ts +4 -6
- package/src/adapters/RedisAdapter.ts +4 -7
- package/src/adapters/SQLiteAdapter.ts +6 -9
- package/src/core/BatchExecutor.ts +124 -127
- package/src/core/SessionManager.ts +4 -13
- package/src/index.ts +11 -11
- package/src/utils/session.ts +48 -10
|
@@ -481,8 +481,15 @@ const hasRequirements = step.hasRequires(collectedData);
|
|
|
481
481
|
### Route Testing
|
|
482
482
|
|
|
483
483
|
```typescript
|
|
484
|
-
// Simulate route execution
|
|
484
|
+
// Simulate route execution — classic signature
|
|
485
485
|
const mockSession = createSession();
|
|
486
|
+
|
|
487
|
+
// Or pre-populate with known data using partial state overload
|
|
488
|
+
const prepopSession = createSession({
|
|
489
|
+
data: { name: "Test User" },
|
|
490
|
+
history: [{ role: "user", content: "Hello" }],
|
|
491
|
+
});
|
|
492
|
+
|
|
486
493
|
const mockHistory = [
|
|
487
494
|
{
|
|
488
495
|
role: "user",
|
|
@@ -154,12 +154,24 @@ model AgentMessage {
|
|
|
154
154
|
While sessions are managed automatically, you can perform manual operations when needed:
|
|
155
155
|
|
|
156
156
|
```typescript
|
|
157
|
+
import { createSession, createSessionId } from "@falai/agent";
|
|
158
|
+
|
|
157
159
|
// Access session manager directly
|
|
158
160
|
const sessionManager = agent.session;
|
|
159
161
|
|
|
160
162
|
// Create session with specific ID
|
|
161
163
|
await sessionManager.getOrCreate("custom-session-id");
|
|
162
164
|
|
|
165
|
+
// Generate a session ID without creating a session object
|
|
166
|
+
const id = createSessionId();
|
|
167
|
+
|
|
168
|
+
// Create a pre-populated session using the partial state overload
|
|
169
|
+
const restoredSession = createSession<MyDataType>({
|
|
170
|
+
id: "custom-session-id",
|
|
171
|
+
data: { userName: "John" },
|
|
172
|
+
history: previousHistory,
|
|
173
|
+
});
|
|
174
|
+
|
|
163
175
|
// Session data management
|
|
164
176
|
await sessionManager.setData({
|
|
165
177
|
userName: "John",
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
SessionState,
|
|
18
18
|
END_ROUTE,
|
|
19
19
|
History,
|
|
20
|
+
createSessionId,
|
|
20
21
|
} from "../../src";
|
|
21
22
|
|
|
22
23
|
/**
|
|
@@ -64,7 +65,7 @@ class CustomDatabase {
|
|
|
64
65
|
data: Omit<CustomDatabaseSession, "id" | "createdAt" | "updatedAt">
|
|
65
66
|
): CustomDatabaseSession {
|
|
66
67
|
const session: CustomDatabaseSession = {
|
|
67
|
-
id:
|
|
68
|
+
id: createSessionId(),
|
|
68
69
|
...data,
|
|
69
70
|
createdAt: new Date(),
|
|
70
71
|
updatedAt: new Date(),
|
|
@@ -266,7 +267,7 @@ async function example() {
|
|
|
266
267
|
* Simulate conversation with automatic sync
|
|
267
268
|
*/
|
|
268
269
|
console.log("\n--- Turn 1 ---");
|
|
269
|
-
|
|
270
|
+
|
|
270
271
|
// Add user message to SessionManager
|
|
271
272
|
await agent.session.addMessage("user", "Hi! I'm John Smith and my email is john@acme.com", "User");
|
|
272
273
|
|
|
@@ -286,7 +287,7 @@ async function example() {
|
|
|
286
287
|
|
|
287
288
|
// Turn 2: User provides company
|
|
288
289
|
console.log("\n--- Turn 2 ---");
|
|
289
|
-
|
|
290
|
+
|
|
290
291
|
await agent.session.addMessage("user", "I work for Acme Corporation", "User");
|
|
291
292
|
|
|
292
293
|
const response2 = await agent.respond({
|
|
@@ -312,7 +313,7 @@ async function example() {
|
|
|
312
313
|
* Demonstrate session recovery with new Agent instance
|
|
313
314
|
*/
|
|
314
315
|
console.log("\n--- Session Recovery (New Agent Instance) ---");
|
|
315
|
-
|
|
316
|
+
|
|
316
317
|
// Create new agent instance (simulating app restart)
|
|
317
318
|
const newAgent = new Agent({
|
|
318
319
|
name: "Onboarding Assistant",
|
|
@@ -360,11 +361,11 @@ async function example() {
|
|
|
360
361
|
|
|
361
362
|
// Continue conversation with recovered session
|
|
362
363
|
await newAgent.session.addMessage("user", "Can you confirm my details?");
|
|
363
|
-
|
|
364
|
+
|
|
364
365
|
const confirmResponse = await newAgent.respond({
|
|
365
366
|
history: newAgent.session.getHistory(),
|
|
366
367
|
});
|
|
367
|
-
|
|
368
|
+
|
|
368
369
|
console.log("🤖 Confirmation:", confirmResponse.message);
|
|
369
370
|
await newAgent.session.addMessage("assistant", confirmResponse.message);
|
|
370
371
|
|
|
@@ -414,7 +415,7 @@ async function syncSessionToDatabase(
|
|
|
414
415
|
/**
|
|
415
416
|
* Mock function to simulate processing the completed onboarding data.
|
|
416
417
|
*/
|
|
417
|
-
async function processOnboarding(data) {
|
|
418
|
+
async function processOnboarding(data: Partial<OnboardingData>) {
|
|
418
419
|
console.log("\n🚀 Processing onboarding data...");
|
|
419
420
|
console.log(
|
|
420
421
|
` - Creating account for ${data?.fullName} at ${data?.companyName}`
|
|
@@ -542,7 +543,7 @@ async function serverEndpointExample() {
|
|
|
542
543
|
});
|
|
543
544
|
|
|
544
545
|
// Load or create session
|
|
545
|
-
const effectiveSessionId = sessionId ||
|
|
546
|
+
const effectiveSessionId = sessionId || createSessionId();
|
|
546
547
|
await agent.session.getOrCreate(effectiveSessionId);
|
|
547
548
|
|
|
548
549
|
// Try to load from database if session exists
|
|
@@ -571,7 +572,7 @@ async function serverEndpointExample() {
|
|
|
571
572
|
|
|
572
573
|
// Add user message and respond
|
|
573
574
|
await agent.session.addMessage("user", message);
|
|
574
|
-
|
|
575
|
+
|
|
575
576
|
const response = await agent.respond({
|
|
576
577
|
history: agent.session.getHistory(),
|
|
577
578
|
});
|
|
@@ -22,7 +22,7 @@ import type {
|
|
|
22
22
|
SessionStatus,
|
|
23
23
|
CollectedStateData,
|
|
24
24
|
} from "../../src/types";
|
|
25
|
-
import { Agent, GeminiProvider } from "../../src";
|
|
25
|
+
import { Agent, GeminiProvider, createSessionId } from "../../src";
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* Simple in-memory storage for demonstration
|
|
@@ -40,7 +40,7 @@ class InMemoryStorage {
|
|
|
40
40
|
}
|
|
41
41
|
): SessionData {
|
|
42
42
|
const id =
|
|
43
|
-
data.id ||
|
|
43
|
+
data.id || createSessionId();
|
|
44
44
|
const session: SessionData = {
|
|
45
45
|
...data,
|
|
46
46
|
id,
|
|
@@ -249,9 +249,8 @@ class InMemoryStorage {
|
|
|
249
249
|
* Custom Session Repository implementation
|
|
250
250
|
*/
|
|
251
251
|
class CustomSessionRepository<TData = Record<string, unknown>>
|
|
252
|
-
implements SessionRepository<TData>
|
|
253
|
-
{
|
|
254
|
-
constructor(private storage: InMemoryStorage) {}
|
|
252
|
+
implements SessionRepository<TData> {
|
|
253
|
+
constructor(private storage: InMemoryStorage) { }
|
|
255
254
|
|
|
256
255
|
async create(
|
|
257
256
|
data: Omit<SessionData<TData>, "createdAt" | "updatedAt"> & {
|
|
@@ -263,7 +262,7 @@ class CustomSessionRepository<TData = Record<string, unknown>>
|
|
|
263
262
|
...data,
|
|
264
263
|
id:
|
|
265
264
|
data.id ||
|
|
266
|
-
|
|
265
|
+
createSessionId(),
|
|
267
266
|
}) as SessionData<TData>
|
|
268
267
|
);
|
|
269
268
|
}
|
|
@@ -278,7 +277,7 @@ class CustomSessionRepository<TData = Record<string, unknown>>
|
|
|
278
277
|
const sessions = this.storage.getSessionsByUserId(userId);
|
|
279
278
|
return Promise.resolve(
|
|
280
279
|
(sessions.find((s) => s.status === "active") as SessionData<TData>) ||
|
|
281
|
-
|
|
280
|
+
null
|
|
282
281
|
);
|
|
283
282
|
}
|
|
284
283
|
|
|
@@ -354,7 +353,7 @@ class CustomSessionRepository<TData = Record<string, unknown>>
|
|
|
354
353
|
* Custom Message Repository implementation
|
|
355
354
|
*/
|
|
356
355
|
class CustomMessageRepository implements MessageRepository {
|
|
357
|
-
constructor(private storage: InMemoryStorage) {}
|
|
356
|
+
constructor(private storage: InMemoryStorage) { }
|
|
358
357
|
|
|
359
358
|
async create(
|
|
360
359
|
data: Omit<MessageData, "id" | "createdAt">
|
|
@@ -398,9 +397,7 @@ class CustomMessageRepository implements MessageRepository {
|
|
|
398
397
|
* This adapter demonstrates how to implement a custom persistence layer.
|
|
399
398
|
* Replace the InMemoryStorage with actual database calls for production use.
|
|
400
399
|
*/
|
|
401
|
-
export class CustomAdapter<TData = Record<string, unknown>>
|
|
402
|
-
implements PersistenceAdapter<TData>
|
|
403
|
-
{
|
|
400
|
+
export class CustomAdapter<TData = Record<string, unknown>> implements PersistenceAdapter<TData> {
|
|
404
401
|
private storage = new InMemoryStorage();
|
|
405
402
|
|
|
406
403
|
readonly sessionRepository: SessionRepository<TData>;
|
|
@@ -479,9 +476,9 @@ async function demonstrateCustomAdapter() {
|
|
|
479
476
|
|
|
480
477
|
// First interaction
|
|
481
478
|
console.log("\n💬 First interaction:");
|
|
482
|
-
|
|
479
|
+
|
|
483
480
|
await agent.session.addMessage("user", "Hi, I need help booking a flight", "Alice");
|
|
484
|
-
|
|
481
|
+
|
|
485
482
|
const response1 = await agent.respond({
|
|
486
483
|
history: agent.session.getHistory(),
|
|
487
484
|
});
|
|
@@ -493,9 +490,9 @@ async function demonstrateCustomAdapter() {
|
|
|
493
490
|
|
|
494
491
|
// Second interaction
|
|
495
492
|
console.log("\n💬 Second interaction:");
|
|
496
|
-
|
|
493
|
+
|
|
497
494
|
await agent.session.addMessage("user", "I want to fly to Paris next week", "Alice");
|
|
498
|
-
|
|
495
|
+
|
|
499
496
|
const response2 = await agent.respond({
|
|
500
497
|
history: agent.session.getHistory(),
|
|
501
498
|
});
|
package/package.json
CHANGED
|
@@ -14,6 +14,7 @@ import type {
|
|
|
14
14
|
CreateSessionData,
|
|
15
15
|
} from "../types";
|
|
16
16
|
import { cloneDeep } from "../utils/clone";
|
|
17
|
+
import { createSessionId } from "../utils";
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* Memory Adapter - Provider-style API for in-memory persistence
|
|
@@ -38,9 +39,7 @@ import { cloneDeep } from "../utils/clone";
|
|
|
38
39
|
* });
|
|
39
40
|
* ```
|
|
40
41
|
*/
|
|
41
|
-
export class MemoryAdapter<TData = Record<string, unknown>>
|
|
42
|
-
implements PersistenceAdapter<TData>
|
|
43
|
-
{
|
|
42
|
+
export class MemoryAdapter<TData = Record<string, unknown>> implements PersistenceAdapter<TData> {
|
|
44
43
|
public readonly sessionRepository: SessionRepository<TData>;
|
|
45
44
|
public readonly messageRepository: MessageRepository;
|
|
46
45
|
private sessions: Map<string, SessionData<TData>>;
|
|
@@ -80,13 +79,12 @@ export class MemoryAdapter<TData = Record<string, unknown>>
|
|
|
80
79
|
* Memory Session Repository
|
|
81
80
|
*/
|
|
82
81
|
class MemorySessionRepository<TData = Record<string, unknown>>
|
|
83
|
-
implements SessionRepository<TData>
|
|
84
|
-
{
|
|
85
|
-
constructor(private sessions: Map<string, SessionData<TData>>) {}
|
|
82
|
+
implements SessionRepository<TData> {
|
|
83
|
+
constructor(private sessions: Map<string, SessionData<TData>>) { }
|
|
86
84
|
|
|
87
85
|
create(data: CreateSessionData<TData>): Promise<SessionData<TData>> {
|
|
88
86
|
const id =
|
|
89
|
-
data.id ||
|
|
87
|
+
data.id || createSessionId();
|
|
90
88
|
const now = new Date();
|
|
91
89
|
|
|
92
90
|
const session: SessionData<TData> = {
|
|
@@ -208,7 +206,7 @@ class MemorySessionRepository<TData = Record<string, unknown>>
|
|
|
208
206
|
* Memory Message Repository
|
|
209
207
|
*/
|
|
210
208
|
class MemoryMessageRepository implements MessageRepository {
|
|
211
|
-
constructor(private messages: Map<string, MessageData>) {}
|
|
209
|
+
constructor(private messages: Map<string, MessageData>) { }
|
|
212
210
|
|
|
213
211
|
async create(
|
|
214
212
|
data: Omit<MessageData, "id" | "createdAt">
|
|
@@ -13,6 +13,7 @@ import type {
|
|
|
13
13
|
CollectedStateData,
|
|
14
14
|
CreateSessionData,
|
|
15
15
|
} from "../types";
|
|
16
|
+
import { createSessionId } from "../utils";
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
19
|
* MongoDB collection interface - matches mongodb driver
|
|
@@ -100,9 +101,7 @@ export interface MongoAdapterOptions {
|
|
|
100
101
|
* });
|
|
101
102
|
* ```
|
|
102
103
|
*/
|
|
103
|
-
export class MongoAdapter<TData = Record<string, unknown>>
|
|
104
|
-
implements PersistenceAdapter<TData>
|
|
105
|
-
{
|
|
104
|
+
export class MongoAdapter<TData = Record<string, unknown>> implements PersistenceAdapter<TData> {
|
|
106
105
|
public readonly sessionRepository: SessionRepository<TData>;
|
|
107
106
|
public readonly messageRepository: MessageRepository;
|
|
108
107
|
private client: MongoClient;
|
|
@@ -133,9 +132,8 @@ export class MongoAdapter<TData = Record<string, unknown>>
|
|
|
133
132
|
* MongoDB Session Repository
|
|
134
133
|
*/
|
|
135
134
|
class MongoSessionRepository<TData = Record<string, unknown>>
|
|
136
|
-
implements SessionRepository<TData>
|
|
137
|
-
{
|
|
138
|
-
constructor(private collection: MongoCollection<SessionData<TData>>) {}
|
|
135
|
+
implements SessionRepository<TData> {
|
|
136
|
+
constructor(private collection: MongoCollection<SessionData<TData>>) { }
|
|
139
137
|
|
|
140
138
|
async create(data: CreateSessionData<TData>): Promise<SessionData<TData>> {
|
|
141
139
|
const now = new Date();
|
|
@@ -143,7 +141,7 @@ class MongoSessionRepository<TData = Record<string, unknown>>
|
|
|
143
141
|
...data,
|
|
144
142
|
id:
|
|
145
143
|
data.id ||
|
|
146
|
-
|
|
144
|
+
createSessionId(),
|
|
147
145
|
status: data.status || "active",
|
|
148
146
|
messageCount: data.messageCount || 0,
|
|
149
147
|
createdAt: now,
|
|
@@ -249,7 +247,7 @@ class MongoSessionRepository<TData = Record<string, unknown>>
|
|
|
249
247
|
* MongoDB Message Repository
|
|
250
248
|
*/
|
|
251
249
|
class MongoMessageRepository implements MessageRepository {
|
|
252
|
-
constructor(private collection: MongoCollection<MessageData>) {}
|
|
250
|
+
constructor(private collection: MongoCollection<MessageData>) { }
|
|
253
251
|
|
|
254
252
|
async create(
|
|
255
253
|
data: Omit<MessageData, "id" | "createdAt">
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
*/
|
|
34
34
|
|
|
35
35
|
import { cloneDeep } from "../utils/clone";
|
|
36
|
+
import { createSessionId } from "../utils";
|
|
36
37
|
import type {
|
|
37
38
|
PersistenceAdapter,
|
|
38
39
|
SessionRepository,
|
|
@@ -140,9 +141,7 @@ export interface OpenSearchAdapterOptions {
|
|
|
140
141
|
* Stores sessions and messages as documents in OpenSearch indices.
|
|
141
142
|
* Compatible with OpenSearch 1.x, 2.x and Elasticsearch 7.x.
|
|
142
143
|
*/
|
|
143
|
-
export class OpenSearchAdapter<TData = Record<string, unknown>>
|
|
144
|
-
implements PersistenceAdapter<TData>
|
|
145
|
-
{
|
|
144
|
+
export class OpenSearchAdapter<TData = Record<string, unknown>> implements PersistenceAdapter<TData> {
|
|
146
145
|
readonly sessionRepository: SessionRepository<TData>;
|
|
147
146
|
readonly messageRepository: MessageRepository;
|
|
148
147
|
|
|
@@ -248,17 +247,16 @@ export class OpenSearchAdapter<TData = Record<string, unknown>>
|
|
|
248
247
|
* OpenSearch-based session repository implementation
|
|
249
248
|
*/
|
|
250
249
|
class OpenSearchSessionRepository<TData = Record<string, unknown>>
|
|
251
|
-
implements SessionRepository<TData>
|
|
252
|
-
{
|
|
250
|
+
implements SessionRepository<TData> {
|
|
253
251
|
constructor(
|
|
254
252
|
private client: OpenSearchClient,
|
|
255
253
|
private index: string,
|
|
256
254
|
private refresh: boolean | "wait_for"
|
|
257
|
-
) {}
|
|
255
|
+
) { }
|
|
258
256
|
|
|
259
257
|
async create(data: CreateSessionData<TData>): Promise<SessionData<TData>> {
|
|
260
258
|
const id =
|
|
261
|
-
data.id ||
|
|
259
|
+
data.id || createSessionId();
|
|
262
260
|
const now = new Date();
|
|
263
261
|
|
|
264
262
|
const session: SessionData<TData> = {
|
|
@@ -514,7 +512,7 @@ class OpenSearchMessageRepository implements MessageRepository {
|
|
|
514
512
|
private client: OpenSearchClient,
|
|
515
513
|
private index: string,
|
|
516
514
|
private refresh: boolean | "wait_for"
|
|
517
|
-
) {}
|
|
515
|
+
) { }
|
|
518
516
|
|
|
519
517
|
async create(
|
|
520
518
|
data: Omit<MessageData, "id" | "createdAt">
|
|
@@ -12,6 +12,7 @@ import type {
|
|
|
12
12
|
SessionStatus,
|
|
13
13
|
PersistenceAdapter,
|
|
14
14
|
} from "../types";
|
|
15
|
+
import { createSessionId } from "../utils";
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
18
|
* PostgreSQL query result interface
|
|
@@ -77,9 +78,7 @@ export interface PostgreSQLAdapterOptions {
|
|
|
77
78
|
* });
|
|
78
79
|
* ```
|
|
79
80
|
*/
|
|
80
|
-
export class PostgreSQLAdapter<TData = Record<string, unknown>>
|
|
81
|
-
implements PersistenceAdapter<TData>
|
|
82
|
-
{
|
|
81
|
+
export class PostgreSQLAdapter<TData = Record<string, unknown>> implements PersistenceAdapter<TData> {
|
|
83
82
|
public readonly sessionRepository: SessionRepository<TData>;
|
|
84
83
|
public readonly messageRepository: MessageRepository;
|
|
85
84
|
private client: PgClient;
|
|
@@ -159,9 +158,8 @@ export class PostgreSQLAdapter<TData = Record<string, unknown>>
|
|
|
159
158
|
* PostgreSQL Session Repository
|
|
160
159
|
*/
|
|
161
160
|
class PostgreSQLSessionRepository<TData = Record<string, unknown>>
|
|
162
|
-
implements SessionRepository<TData>
|
|
163
|
-
{
|
|
164
|
-
constructor(private client: PgClient, private tableName: string) {}
|
|
161
|
+
implements SessionRepository<TData> {
|
|
162
|
+
constructor(private client: PgClient, private tableName: string) { }
|
|
165
163
|
|
|
166
164
|
async create(
|
|
167
165
|
data: Omit<SessionData<TData>, "createdAt" | "updatedAt"> & {
|
|
@@ -169,7 +167,7 @@ class PostgreSQLSessionRepository<TData = Record<string, unknown>>
|
|
|
169
167
|
}
|
|
170
168
|
): Promise<SessionData<TData>> {
|
|
171
169
|
const id =
|
|
172
|
-
data.id ||
|
|
170
|
+
data.id || createSessionId();
|
|
173
171
|
const now = new Date();
|
|
174
172
|
|
|
175
173
|
const result = await this.client.query<SessionData<TData>>(
|
|
@@ -335,7 +333,7 @@ class PostgreSQLSessionRepository<TData = Record<string, unknown>>
|
|
|
335
333
|
* PostgreSQL Message Repository
|
|
336
334
|
*/
|
|
337
335
|
class PostgreSQLMessageRepository implements MessageRepository {
|
|
338
|
-
constructor(private client: PgClient, private tableName: string) {}
|
|
336
|
+
constructor(private client: PgClient, private tableName: string) { }
|
|
339
337
|
|
|
340
338
|
async create(
|
|
341
339
|
data: Omit<MessageData, "id" | "createdAt">
|
|
@@ -16,6 +16,7 @@ import type {
|
|
|
16
16
|
CreateSessionData,
|
|
17
17
|
} from "../types";
|
|
18
18
|
import { logger } from '../utils'
|
|
19
|
+
import { createSessionId } from '../utils';
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* Prisma model operations
|
|
@@ -120,9 +121,7 @@ export interface PrismaAdapterOptions {
|
|
|
120
121
|
* });
|
|
121
122
|
* ```
|
|
122
123
|
*/
|
|
123
|
-
export class PrismaAdapter<TData = Record<string, unknown>>
|
|
124
|
-
implements PersistenceAdapter<TData>
|
|
125
|
-
{
|
|
124
|
+
export class PrismaAdapter<TData = Record<string, unknown>> implements PersistenceAdapter<TData> {
|
|
126
125
|
public readonly sessionRepository: SessionRepository<TData>;
|
|
127
126
|
public readonly messageRepository: MessageRepository;
|
|
128
127
|
private prisma: PrismaClient;
|
|
@@ -199,8 +198,7 @@ export class PrismaAdapter<TData = Record<string, unknown>>
|
|
|
199
198
|
* Internal implementation - users should use PrismaAdapter instead
|
|
200
199
|
*/
|
|
201
200
|
class PrismaSessionRepository<TData = Record<string, unknown>>
|
|
202
|
-
implements SessionRepository<TData>
|
|
203
|
-
{
|
|
201
|
+
implements SessionRepository<TData> {
|
|
204
202
|
private prisma: PrismaClient;
|
|
205
203
|
private tableName: string;
|
|
206
204
|
private fieldMap: Partial<Record<keyof SessionData<TData>, string>>;
|
|
@@ -270,7 +268,7 @@ class PrismaSessionRepository<TData = Record<string, unknown>>
|
|
|
270
268
|
...data,
|
|
271
269
|
id:
|
|
272
270
|
data.id ||
|
|
273
|
-
|
|
271
|
+
createSessionId(),
|
|
274
272
|
});
|
|
275
273
|
const result = await this.getModel().create({
|
|
276
274
|
data: mapped,
|
|
@@ -74,9 +74,7 @@ export interface RedisAdapterOptions {
|
|
|
74
74
|
* });
|
|
75
75
|
* ```
|
|
76
76
|
*/
|
|
77
|
-
export class RedisAdapter<TData = Record<string, unknown>>
|
|
78
|
-
implements PersistenceAdapter<TData>
|
|
79
|
-
{
|
|
77
|
+
export class RedisAdapter<TData = Record<string, unknown>> implements PersistenceAdapter<TData> {
|
|
80
78
|
public readonly sessionRepository: SessionRepository<TData>;
|
|
81
79
|
public readonly messageRepository: MessageRepository;
|
|
82
80
|
private redis: RedisClient;
|
|
@@ -112,13 +110,12 @@ export class RedisAdapter<TData = Record<string, unknown>>
|
|
|
112
110
|
* Redis Session Repository
|
|
113
111
|
*/
|
|
114
112
|
class RedisSessionRepository<TData = Record<string, unknown>>
|
|
115
|
-
implements SessionRepository<TData>
|
|
116
|
-
{
|
|
113
|
+
implements SessionRepository<TData> {
|
|
117
114
|
constructor(
|
|
118
115
|
private redis: RedisClient,
|
|
119
116
|
private keyPrefix: string,
|
|
120
117
|
private ttl: number
|
|
121
|
-
) {}
|
|
118
|
+
) { }
|
|
122
119
|
|
|
123
120
|
private getKey(id: string): string {
|
|
124
121
|
return `${this.keyPrefix}session:${id}`;
|
|
@@ -267,7 +264,7 @@ class RedisMessageRepository implements MessageRepository {
|
|
|
267
264
|
private redis: RedisClient,
|
|
268
265
|
private keyPrefix: string,
|
|
269
266
|
private ttl: number
|
|
270
|
-
) {}
|
|
267
|
+
) { }
|
|
271
268
|
|
|
272
269
|
private getKey(id: string): string {
|
|
273
270
|
return `${this.keyPrefix}message:${id}`;
|
|
@@ -71,9 +71,7 @@ export interface SQLiteAdapterOptions {
|
|
|
71
71
|
* });
|
|
72
72
|
* ```
|
|
73
73
|
*/
|
|
74
|
-
export class SQLiteAdapter<TData = Record<string, unknown>>
|
|
75
|
-
implements PersistenceAdapter<TData>
|
|
76
|
-
{
|
|
74
|
+
export class SQLiteAdapter<TData = Record<string, unknown>> implements PersistenceAdapter<TData> {
|
|
77
75
|
public readonly sessionRepository: SessionRepository<TData>;
|
|
78
76
|
public readonly messageRepository: MessageRepository;
|
|
79
77
|
private db: SqliteDatabase;
|
|
@@ -154,9 +152,8 @@ export class SQLiteAdapter<TData = Record<string, unknown>>
|
|
|
154
152
|
* SQLite Session Repository
|
|
155
153
|
*/
|
|
156
154
|
class SQLiteSessionRepository<TData = Record<string, unknown>>
|
|
157
|
-
implements SessionRepository<TData>
|
|
158
|
-
{
|
|
159
|
-
constructor(private db: SqliteDatabase, private tableName: string) {}
|
|
155
|
+
implements SessionRepository<TData> {
|
|
156
|
+
constructor(private db: SqliteDatabase, private tableName: string) { }
|
|
160
157
|
|
|
161
158
|
create(data: CreateSessionData<TData>): Promise<SessionData<TData>> {
|
|
162
159
|
const id = data.id || createSessionId();
|
|
@@ -332,8 +329,8 @@ class SQLiteSessionRepository<TData = Record<string, unknown>>
|
|
|
332
329
|
currentStep: (row.current_step as string) || undefined,
|
|
333
330
|
collectedData: row.collected_data
|
|
334
331
|
? (JSON.parse(
|
|
335
|
-
|
|
336
|
-
|
|
332
|
+
row.collected_data as string
|
|
333
|
+
) as CollectedStateData<TData>)
|
|
337
334
|
: undefined,
|
|
338
335
|
messageCount: (row.message_count as number) || 0,
|
|
339
336
|
lastMessageAt: row.last_message_at
|
|
@@ -352,7 +349,7 @@ class SQLiteSessionRepository<TData = Record<string, unknown>>
|
|
|
352
349
|
* SQLite Message Repository
|
|
353
350
|
*/
|
|
354
351
|
class SQLiteMessageRepository implements MessageRepository {
|
|
355
|
-
constructor(private db: SqliteDatabase, private tableName: string) {}
|
|
352
|
+
constructor(private db: SqliteDatabase, private tableName: string) { }
|
|
356
353
|
|
|
357
354
|
create(data: Omit<MessageData, "id" | "createdAt">): Promise<MessageData> {
|
|
358
355
|
const id = `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|