@falai/agent 0.3.10 → 0.3.12
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 +192 -16
- package/dist/adapters/PrismaAdapter.d.ts +115 -0
- package/dist/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/adapters/PrismaAdapter.js +331 -0
- package/dist/adapters/PrismaAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +5 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/cjs/adapters/PrismaAdapter.d.ts +115 -0
- package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/cjs/adapters/PrismaAdapter.js +335 -0
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/adapters/index.d.ts +6 -0
- package/dist/cjs/adapters/index.d.ts.map +1 -0
- package/dist/cjs/adapters/index.js +9 -0
- package/dist/cjs/adapters/index.js.map +1 -0
- package/dist/cjs/core/Agent.d.ts +35 -0
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +153 -0
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/PersistenceManager.d.ts +77 -0
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -0
- package/dist/cjs/core/PersistenceManager.js +153 -0
- package/dist/cjs/core/PersistenceManager.js.map +1 -0
- package/dist/cjs/index.d.ts +6 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +8 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts +43 -0
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/cjs/providers/AnthropicProvider.js +328 -0
- package/dist/cjs/providers/AnthropicProvider.js.map +1 -0
- package/dist/cjs/providers/GeminiProvider.d.ts +4 -1
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +96 -0
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts +4 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.js +115 -0
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.d.ts +4 -1
- package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.js +115 -0
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
- package/dist/cjs/providers/index.d.ts +13 -0
- package/dist/cjs/providers/index.d.ts.map +1 -0
- package/dist/cjs/providers/index.js +16 -0
- package/dist/cjs/providers/index.js.map +1 -0
- package/dist/cjs/types/agent.d.ts +3 -0
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/agent.js.map +1 -1
- package/dist/cjs/types/ai.d.ts +28 -0
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/index.d.ts +1 -0
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/persistence.d.ts +194 -0
- package/dist/cjs/types/persistence.d.ts.map +1 -0
- package/dist/cjs/types/persistence.js +7 -0
- package/dist/cjs/types/persistence.js.map +1 -0
- package/dist/core/Agent.d.ts +35 -0
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +153 -0
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/PersistenceManager.d.ts +77 -0
- package/dist/core/PersistenceManager.d.ts.map +1 -0
- package/dist/core/PersistenceManager.js +149 -0
- package/dist/core/PersistenceManager.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts +43 -0
- package/dist/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/providers/AnthropicProvider.js +321 -0
- package/dist/providers/AnthropicProvider.js.map +1 -0
- package/dist/providers/GeminiProvider.d.ts +4 -1
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +96 -0
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/OpenAIProvider.d.ts +4 -1
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +115 -0
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/providers/OpenRouterProvider.d.ts +4 -1
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/OpenRouterProvider.js +115 -0
- package/dist/providers/OpenRouterProvider.js.map +1 -1
- package/dist/providers/index.d.ts +13 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +9 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/types/agent.d.ts +3 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js.map +1 -1
- package/dist/types/ai.d.ts +28 -0
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/persistence.d.ts +194 -0
- package/dist/types/persistence.d.ts.map +1 -0
- package/dist/types/persistence.js +6 -0
- package/dist/types/persistence.js.map +1 -0
- package/docs/API_REFERENCE.md +260 -2
- package/docs/PERSISTENCE.md +419 -0
- package/docs/PROVIDERS.md +139 -2
- package/examples/business-onboarding.ts +5 -4
- package/examples/declarative-agent.ts +1 -1
- package/examples/domain-scoping.ts +5 -4
- package/examples/healthcare-agent.ts +4 -4
- package/examples/openai-agent.ts +6 -4
- package/examples/prisma-persistence.ts +313 -0
- package/examples/prisma-schema.example.prisma +74 -0
- package/examples/rules-prohibitions.ts +4 -4
- package/examples/streaming-agent.ts +371 -0
- package/examples/travel-agent.ts +7 -4
- package/package.json +10 -1
- package/src/adapters/PrismaAdapter.ts +510 -0
- package/src/adapters/index.ts +10 -0
- package/src/core/Agent.ts +205 -0
- package/src/core/PersistenceManager.ts +222 -0
- package/src/index.ts +23 -0
- package/src/providers/AnthropicProvider.ts +467 -0
- package/src/providers/GeminiProvider.ts +135 -0
- package/src/providers/OpenAIProvider.ts +157 -0
- package/src/providers/OpenRouterProvider.ts +157 -0
- package/src/providers/index.ts +16 -0
- package/src/types/agent.ts +3 -0
- package/src/types/ai.ts +32 -0
- package/src/types/index.ts +14 -0
- package/src/types/persistence.ts +234 -0
package/src/core/Agent.ts
CHANGED
|
@@ -16,6 +16,7 @@ import { Route } from "./Route";
|
|
|
16
16
|
import { DomainRegistry } from "./DomainRegistry";
|
|
17
17
|
import { PromptBuilder } from "./PromptBuilder";
|
|
18
18
|
import { Observation } from "./Observation";
|
|
19
|
+
import { PersistenceManager } from "./PersistenceManager";
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* Main Agent class with generic context support
|
|
@@ -28,6 +29,7 @@ export class Agent<TContext = unknown> {
|
|
|
28
29
|
private observations: Observation[] = [];
|
|
29
30
|
private domainRegistry = new DomainRegistry();
|
|
30
31
|
private context: TContext | undefined;
|
|
32
|
+
private persistenceManager: PersistenceManager | undefined;
|
|
31
33
|
|
|
32
34
|
/**
|
|
33
35
|
* Dynamic domain property - populated via addDomain
|
|
@@ -50,6 +52,21 @@ export class Agent<TContext = unknown> {
|
|
|
50
52
|
// Initialize context if provided
|
|
51
53
|
this.context = options.context;
|
|
52
54
|
|
|
55
|
+
// Initialize persistence if configured
|
|
56
|
+
if (options.persistence) {
|
|
57
|
+
this.persistenceManager = new PersistenceManager(options.persistence);
|
|
58
|
+
|
|
59
|
+
// Initialize the adapter if it has an initialize method
|
|
60
|
+
if (options.persistence.adapter.initialize) {
|
|
61
|
+
options.persistence.adapter.initialize().catch((error) => {
|
|
62
|
+
console.error(
|
|
63
|
+
"[Agent] Persistence adapter initialization failed:",
|
|
64
|
+
error
|
|
65
|
+
);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
53
70
|
// Initialize from options
|
|
54
71
|
if (options.terms) {
|
|
55
72
|
this.terms = [...options.terms];
|
|
@@ -211,6 +228,180 @@ export class Agent<TContext = unknown> {
|
|
|
211
228
|
return this.context;
|
|
212
229
|
}
|
|
213
230
|
|
|
231
|
+
/**
|
|
232
|
+
* Generate a response based on history and context as a stream
|
|
233
|
+
*/
|
|
234
|
+
async *respondStream(params: {
|
|
235
|
+
history: Event[];
|
|
236
|
+
state?: StateRef;
|
|
237
|
+
contextOverride?: Partial<TContext>;
|
|
238
|
+
signal?: AbortSignal;
|
|
239
|
+
}): AsyncGenerator<{
|
|
240
|
+
delta: string;
|
|
241
|
+
accumulated: string;
|
|
242
|
+
done: boolean;
|
|
243
|
+
route?: { id: string; title: string } | null;
|
|
244
|
+
state?: { id: string; description?: string } | null;
|
|
245
|
+
toolCalls?: Array<{ toolName: string; arguments: Record<string, unknown> }>;
|
|
246
|
+
}> {
|
|
247
|
+
const { history, contextOverride, signal } = params;
|
|
248
|
+
|
|
249
|
+
// Get current context (may fetch from provider)
|
|
250
|
+
let currentContext = await this.getContext();
|
|
251
|
+
|
|
252
|
+
// Call beforeRespond hook if configured
|
|
253
|
+
if (this.options.hooks?.beforeRespond && currentContext !== undefined) {
|
|
254
|
+
currentContext = await this.options.hooks.beforeRespond(currentContext);
|
|
255
|
+
// Update stored context with the result from beforeRespond
|
|
256
|
+
this.context = currentContext;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Merge context with override
|
|
260
|
+
const effectiveContext = {
|
|
261
|
+
...(currentContext as Record<string, unknown>),
|
|
262
|
+
...(contextOverride as Record<string, unknown>),
|
|
263
|
+
} as TContext;
|
|
264
|
+
|
|
265
|
+
// Build prompt (same as respond method)
|
|
266
|
+
const promptBuilder = new PromptBuilder();
|
|
267
|
+
|
|
268
|
+
// Add agent identity
|
|
269
|
+
if (this.options.description) {
|
|
270
|
+
promptBuilder.addAgentIdentity({
|
|
271
|
+
name: this.options.name,
|
|
272
|
+
description: this.options.description,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Add interaction history
|
|
277
|
+
promptBuilder.addInteractionHistoryForMessageGeneration(history);
|
|
278
|
+
|
|
279
|
+
// Add glossary
|
|
280
|
+
if (this.terms.length > 0) {
|
|
281
|
+
promptBuilder.addGlossary(this.terms);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Add guidelines (convert to GuidelineMatch format, filter enabled only)
|
|
285
|
+
const enabledGuidelines = this.guidelines.filter(
|
|
286
|
+
(g) => g.enabled !== false
|
|
287
|
+
);
|
|
288
|
+
if (enabledGuidelines.length > 0) {
|
|
289
|
+
const guidelineMatches: GuidelineMatch[] = enabledGuidelines.map((g) => ({
|
|
290
|
+
guideline: g,
|
|
291
|
+
}));
|
|
292
|
+
promptBuilder.addGuidelinesForMessageGeneration(guidelineMatches);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// Add capabilities
|
|
296
|
+
if (this.capabilities.length > 0) {
|
|
297
|
+
promptBuilder.addCapabilitiesForMessageGeneration(this.capabilities);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Add observations
|
|
301
|
+
if (this.observations.length > 0) {
|
|
302
|
+
const observationsWithRoutes = this.observations
|
|
303
|
+
.map((obs) => ({
|
|
304
|
+
description: obs.description,
|
|
305
|
+
routes: obs.getRoutes().map((routeRef) => {
|
|
306
|
+
const route = this.routes.find((r) => r.id === routeRef.id);
|
|
307
|
+
return { title: route?.title || routeRef.id };
|
|
308
|
+
}),
|
|
309
|
+
}))
|
|
310
|
+
.filter((obs) => obs.routes.length > 0);
|
|
311
|
+
|
|
312
|
+
if (observationsWithRoutes.length > 0) {
|
|
313
|
+
promptBuilder.addObservations(observationsWithRoutes);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Add active routes with their rules and prohibitions
|
|
318
|
+
if (this.routes.length > 0) {
|
|
319
|
+
promptBuilder.addActiveRoutes(
|
|
320
|
+
this.routes.map((r) => ({
|
|
321
|
+
title: r.title,
|
|
322
|
+
description: r.description,
|
|
323
|
+
conditions: r.conditions,
|
|
324
|
+
domains: r.getDomains(),
|
|
325
|
+
rules: r.getRules(),
|
|
326
|
+
prohibitions: r.getProhibitions(),
|
|
327
|
+
}))
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Add domains (tools) information if any domains are registered
|
|
332
|
+
const allDomains = this.domainRegistry.all();
|
|
333
|
+
if (Object.keys(allDomains).length > 0) {
|
|
334
|
+
promptBuilder.addDomains(allDomains);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// Add JSON response schema instructions
|
|
338
|
+
promptBuilder.addJsonResponseSchema();
|
|
339
|
+
|
|
340
|
+
// Build final prompt
|
|
341
|
+
const prompt = promptBuilder.build();
|
|
342
|
+
|
|
343
|
+
// Generate message stream using AI provider with JSON mode enabled
|
|
344
|
+
const stream = this.options.ai.generateMessageStream({
|
|
345
|
+
prompt,
|
|
346
|
+
history,
|
|
347
|
+
context: effectiveContext,
|
|
348
|
+
signal,
|
|
349
|
+
parameters: {
|
|
350
|
+
jsonMode: true,
|
|
351
|
+
},
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
// Stream chunks to caller
|
|
355
|
+
for await (const chunk of stream) {
|
|
356
|
+
// Extract route and state from structured response on final chunk
|
|
357
|
+
let route: { id: string; title: string } | null = null;
|
|
358
|
+
let state: { id: string; description?: string } | null = null;
|
|
359
|
+
let toolCalls:
|
|
360
|
+
| Array<{ toolName: string; arguments: Record<string, unknown> }>
|
|
361
|
+
| undefined;
|
|
362
|
+
|
|
363
|
+
if (chunk.done && chunk.structured) {
|
|
364
|
+
// Find route by title
|
|
365
|
+
if (chunk.structured.route) {
|
|
366
|
+
const foundRoute = this.routes.find(
|
|
367
|
+
(r) => r.title === chunk.structured?.route
|
|
368
|
+
);
|
|
369
|
+
if (foundRoute) {
|
|
370
|
+
route = {
|
|
371
|
+
id: foundRoute.id,
|
|
372
|
+
title: foundRoute.title,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Create state reference if provided
|
|
378
|
+
if (chunk.structured.state) {
|
|
379
|
+
state = {
|
|
380
|
+
id: "dynamic_state",
|
|
381
|
+
description: chunk.structured.state,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// Extract tool calls
|
|
386
|
+
if (
|
|
387
|
+
chunk.structured.toolCalls &&
|
|
388
|
+
chunk.structured.toolCalls.length > 0
|
|
389
|
+
) {
|
|
390
|
+
toolCalls = chunk.structured.toolCalls;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
yield {
|
|
395
|
+
delta: chunk.delta,
|
|
396
|
+
accumulated: chunk.accumulated,
|
|
397
|
+
done: chunk.done,
|
|
398
|
+
route: route || undefined,
|
|
399
|
+
state: state || undefined,
|
|
400
|
+
toolCalls,
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
214
405
|
/**
|
|
215
406
|
* Generate a response based on history and context
|
|
216
407
|
*/
|
|
@@ -424,6 +615,20 @@ export class Agent<TContext = unknown> {
|
|
|
424
615
|
return this.domainRegistry;
|
|
425
616
|
}
|
|
426
617
|
|
|
618
|
+
/**
|
|
619
|
+
* Get the persistence manager (if configured)
|
|
620
|
+
*/
|
|
621
|
+
getPersistenceManager(): PersistenceManager | undefined {
|
|
622
|
+
return this.persistenceManager;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/**
|
|
626
|
+
* Check if persistence is enabled
|
|
627
|
+
*/
|
|
628
|
+
hasPersistence(): boolean {
|
|
629
|
+
return this.persistenceManager !== undefined;
|
|
630
|
+
}
|
|
631
|
+
|
|
427
632
|
/**
|
|
428
633
|
* Get allowed domains for a specific route
|
|
429
634
|
* @param routeId - Route ID to check
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence Manager
|
|
3
|
+
* Handles optional persistence of sessions and messages
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type {
|
|
7
|
+
PersistenceConfig,
|
|
8
|
+
SessionData,
|
|
9
|
+
MessageData,
|
|
10
|
+
CreateSessionOptions,
|
|
11
|
+
SaveMessageOptions,
|
|
12
|
+
SessionStatus,
|
|
13
|
+
SessionRepository,
|
|
14
|
+
MessageRepository,
|
|
15
|
+
} from "../types/persistence";
|
|
16
|
+
import type { Event } from "../types/history";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Manager for handling persistence operations
|
|
20
|
+
* Provides a clean interface for optional database persistence
|
|
21
|
+
*/
|
|
22
|
+
export class PersistenceManager {
|
|
23
|
+
private config: PersistenceConfig;
|
|
24
|
+
private sessionRepository: SessionRepository;
|
|
25
|
+
private messageRepository: MessageRepository;
|
|
26
|
+
|
|
27
|
+
constructor(config: PersistenceConfig) {
|
|
28
|
+
this.config = {
|
|
29
|
+
autoSave: true,
|
|
30
|
+
...config,
|
|
31
|
+
};
|
|
32
|
+
this.sessionRepository = config.adapter.sessionRepository;
|
|
33
|
+
this.messageRepository = config.adapter.messageRepository;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Create a new session
|
|
38
|
+
*/
|
|
39
|
+
async createSession(options: CreateSessionOptions): Promise<SessionData> {
|
|
40
|
+
const userId = options.userId || this.config.userId;
|
|
41
|
+
|
|
42
|
+
return await this.sessionRepository.create({
|
|
43
|
+
userId,
|
|
44
|
+
agentName: options.agentName,
|
|
45
|
+
status: "active",
|
|
46
|
+
collectedData: options.initialData || {},
|
|
47
|
+
messageCount: 0,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Get session by ID
|
|
53
|
+
*/
|
|
54
|
+
async getSession(sessionId: string): Promise<SessionData | null> {
|
|
55
|
+
return await this.sessionRepository.findById(sessionId);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Find active session for a user
|
|
60
|
+
*/
|
|
61
|
+
async findActiveSession(userId?: string): Promise<SessionData | null> {
|
|
62
|
+
const effectiveUserId = userId || this.config.userId;
|
|
63
|
+
if (!effectiveUserId) {
|
|
64
|
+
throw new Error(
|
|
65
|
+
"userId must be provided or configured in PersistenceConfig"
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
return await this.sessionRepository.findActiveByUserId(effectiveUserId);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Get all sessions for a user
|
|
73
|
+
*/
|
|
74
|
+
async getUserSessions(
|
|
75
|
+
userId?: string,
|
|
76
|
+
limit?: number
|
|
77
|
+
): Promise<SessionData[]> {
|
|
78
|
+
const effectiveUserId = userId || this.config.userId;
|
|
79
|
+
if (!effectiveUserId) {
|
|
80
|
+
throw new Error(
|
|
81
|
+
"userId must be provided or configured in PersistenceConfig"
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
return await this.sessionRepository.findByUserId(effectiveUserId, limit);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Update session status
|
|
89
|
+
*/
|
|
90
|
+
async updateSessionStatus(
|
|
91
|
+
sessionId: string,
|
|
92
|
+
status: SessionStatus,
|
|
93
|
+
completedAt?: Date
|
|
94
|
+
): Promise<SessionData | null> {
|
|
95
|
+
return await this.sessionRepository.updateStatus(
|
|
96
|
+
sessionId,
|
|
97
|
+
status,
|
|
98
|
+
completedAt
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Update collected data in session
|
|
104
|
+
*/
|
|
105
|
+
async updateCollectedData(
|
|
106
|
+
sessionId: string,
|
|
107
|
+
collectedData: Record<string, unknown>
|
|
108
|
+
): Promise<SessionData | null> {
|
|
109
|
+
return await this.sessionRepository.updateCollectedData(
|
|
110
|
+
sessionId,
|
|
111
|
+
collectedData
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Update current route and state
|
|
117
|
+
*/
|
|
118
|
+
async updateRouteState(
|
|
119
|
+
sessionId: string,
|
|
120
|
+
route?: string,
|
|
121
|
+
state?: string
|
|
122
|
+
): Promise<SessionData | null> {
|
|
123
|
+
return await this.sessionRepository.updateRouteState(
|
|
124
|
+
sessionId,
|
|
125
|
+
route,
|
|
126
|
+
state
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Save a message
|
|
132
|
+
*/
|
|
133
|
+
async saveMessage(options: SaveMessageOptions): Promise<MessageData> {
|
|
134
|
+
const userId = options.userId || this.config.userId;
|
|
135
|
+
|
|
136
|
+
const message = await this.messageRepository.create({
|
|
137
|
+
sessionId: options.sessionId,
|
|
138
|
+
userId,
|
|
139
|
+
role: options.role,
|
|
140
|
+
content: options.content,
|
|
141
|
+
route: options.route,
|
|
142
|
+
state: options.state,
|
|
143
|
+
toolCalls: options.toolCalls,
|
|
144
|
+
event: options.event,
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// Increment message count in session if autoSave is enabled
|
|
148
|
+
if (this.config.autoSave) {
|
|
149
|
+
await this.sessionRepository.incrementMessageCount(options.sessionId);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return message;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Get all messages for a session
|
|
157
|
+
*/
|
|
158
|
+
async getSessionMessages(
|
|
159
|
+
sessionId: string,
|
|
160
|
+
limit?: number
|
|
161
|
+
): Promise<MessageData[]> {
|
|
162
|
+
return await this.messageRepository.findBySessionId(sessionId, limit);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Get messages for a user
|
|
167
|
+
*/
|
|
168
|
+
async getUserMessages(
|
|
169
|
+
userId?: string,
|
|
170
|
+
limit?: number
|
|
171
|
+
): Promise<MessageData[]> {
|
|
172
|
+
const effectiveUserId = userId || this.config.userId;
|
|
173
|
+
if (!effectiveUserId) {
|
|
174
|
+
throw new Error(
|
|
175
|
+
"userId must be provided or configured in PersistenceConfig"
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
return await this.messageRepository.findByUserId(effectiveUserId, limit);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Delete a session and all its messages
|
|
183
|
+
*/
|
|
184
|
+
async deleteSession(sessionId: string): Promise<boolean> {
|
|
185
|
+
// Delete all messages first
|
|
186
|
+
await this.messageRepository.deleteBySessionId(sessionId);
|
|
187
|
+
|
|
188
|
+
// Then delete the session
|
|
189
|
+
return await this.sessionRepository.delete(sessionId);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Complete a session
|
|
194
|
+
*/
|
|
195
|
+
async completeSession(sessionId: string): Promise<SessionData | null> {
|
|
196
|
+
return await this.updateSessionStatus(sessionId, "completed", new Date());
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Abandon a session
|
|
201
|
+
*/
|
|
202
|
+
async abandonSession(sessionId: string): Promise<SessionData | null> {
|
|
203
|
+
return await this.updateSessionStatus(sessionId, "abandoned");
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Helper: Convert message data to Event format
|
|
208
|
+
*/
|
|
209
|
+
messageToEvent(message: MessageData): Event | undefined {
|
|
210
|
+
return message.event;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Helper: Load history from session messages
|
|
215
|
+
*/
|
|
216
|
+
async loadSessionHistory(sessionId: string): Promise<Event[]> {
|
|
217
|
+
const messages = await this.getSessionMessages(sessionId);
|
|
218
|
+
return messages
|
|
219
|
+
.map((m) => this.messageToEvent(m))
|
|
220
|
+
.filter((e): e is Event => e !== undefined);
|
|
221
|
+
}
|
|
222
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -16,6 +16,7 @@ export { adaptEvent, createMessageEvent, createToolEvent } from "./core/Events";
|
|
|
16
16
|
export { PromptBuilder } from "./core/PromptBuilder";
|
|
17
17
|
export type { Customer, AgentInfo } from "./core/PromptBuilder";
|
|
18
18
|
export { BuiltInSection } from "./core/PromptBuilder";
|
|
19
|
+
export { PersistenceManager } from "./core/PersistenceManager";
|
|
19
20
|
|
|
20
21
|
// Providers
|
|
21
22
|
export { GeminiProvider } from "./providers/GeminiProvider";
|
|
@@ -24,6 +25,16 @@ export { OpenAIProvider } from "./providers/OpenAIProvider";
|
|
|
24
25
|
export type { OpenAIProviderOptions } from "./providers/OpenAIProvider";
|
|
25
26
|
export { OpenRouterProvider } from "./providers/OpenRouterProvider";
|
|
26
27
|
export type { OpenRouterProviderOptions } from "./providers/OpenRouterProvider";
|
|
28
|
+
export { AnthropicProvider } from "./providers/AnthropicProvider";
|
|
29
|
+
export type { AnthropicProviderOptions } from "./providers/AnthropicProvider";
|
|
30
|
+
|
|
31
|
+
// Adapters
|
|
32
|
+
export { PrismaAdapter } from "./adapters/PrismaAdapter";
|
|
33
|
+
export type {
|
|
34
|
+
PrismaClient,
|
|
35
|
+
FieldMappings,
|
|
36
|
+
PrismaAdapterOptions,
|
|
37
|
+
} from "./adapters/PrismaAdapter";
|
|
27
38
|
|
|
28
39
|
// Constants
|
|
29
40
|
export { END_ROUTE } from "./constants";
|
|
@@ -92,3 +103,15 @@ export type {
|
|
|
92
103
|
Observation as IObservation,
|
|
93
104
|
ObservationOptions,
|
|
94
105
|
} from "./types/observation";
|
|
106
|
+
|
|
107
|
+
export type {
|
|
108
|
+
SessionData,
|
|
109
|
+
MessageData,
|
|
110
|
+
SessionStatus,
|
|
111
|
+
MessageRole,
|
|
112
|
+
SessionRepository,
|
|
113
|
+
MessageRepository,
|
|
114
|
+
PersistenceConfig,
|
|
115
|
+
CreateSessionOptions,
|
|
116
|
+
SaveMessageOptions,
|
|
117
|
+
} from "./types/persistence";
|