@falai/agent 0.9.0-alpha-1 → 0.9.0

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 (217) hide show
  1. package/README.md +34 -22
  2. package/dist/cjs/src/core/Agent.d.ts +77 -59
  3. package/dist/cjs/src/core/Agent.d.ts.map +1 -1
  4. package/dist/cjs/src/core/Agent.js +284 -1060
  5. package/dist/cjs/src/core/Agent.js.map +1 -1
  6. package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -1
  7. package/dist/cjs/src/core/PersistenceManager.js +48 -25
  8. package/dist/cjs/src/core/PersistenceManager.js.map +1 -1
  9. package/dist/cjs/src/core/PromptComposer.d.ts +1 -1
  10. package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -1
  11. package/dist/cjs/src/core/PromptComposer.js.map +1 -1
  12. package/dist/cjs/src/core/ResponseEngine.d.ts +13 -12
  13. package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -1
  14. package/dist/cjs/src/core/ResponseEngine.js +4 -4
  15. package/dist/cjs/src/core/ResponseEngine.js.map +1 -1
  16. package/dist/cjs/src/core/ResponseModal.d.ts +205 -0
  17. package/dist/cjs/src/core/ResponseModal.d.ts.map +1 -0
  18. package/dist/cjs/src/core/ResponseModal.js +1328 -0
  19. package/dist/cjs/src/core/ResponseModal.js.map +1 -0
  20. package/dist/cjs/src/core/ResponsePipeline.d.ts +66 -38
  21. package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -1
  22. package/dist/cjs/src/core/ResponsePipeline.js +72 -4
  23. package/dist/cjs/src/core/ResponsePipeline.js.map +1 -1
  24. package/dist/cjs/src/core/Route.d.ts +24 -5
  25. package/dist/cjs/src/core/Route.d.ts.map +1 -1
  26. package/dist/cjs/src/core/Route.js +45 -1
  27. package/dist/cjs/src/core/Route.js.map +1 -1
  28. package/dist/cjs/src/core/RoutingEngine.d.ts +31 -6
  29. package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -1
  30. package/dist/cjs/src/core/RoutingEngine.js +113 -9
  31. package/dist/cjs/src/core/RoutingEngine.js.map +1 -1
  32. package/dist/cjs/src/core/SessionManager.d.ts +14 -4
  33. package/dist/cjs/src/core/SessionManager.d.ts.map +1 -1
  34. package/dist/cjs/src/core/SessionManager.js +25 -5
  35. package/dist/cjs/src/core/SessionManager.js.map +1 -1
  36. package/dist/cjs/src/core/Step.d.ts +10 -10
  37. package/dist/cjs/src/core/Step.d.ts.map +1 -1
  38. package/dist/cjs/src/core/Step.js.map +1 -1
  39. package/dist/cjs/src/core/ToolExecutor.d.ts +4 -2
  40. package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -1
  41. package/dist/cjs/src/core/ToolExecutor.js +13 -3
  42. package/dist/cjs/src/core/ToolExecutor.js.map +1 -1
  43. package/dist/cjs/src/index.d.ts +3 -1
  44. package/dist/cjs/src/index.d.ts.map +1 -1
  45. package/dist/cjs/src/index.js +7 -1
  46. package/dist/cjs/src/index.js.map +1 -1
  47. package/dist/cjs/src/types/agent.d.ts +42 -21
  48. package/dist/cjs/src/types/agent.d.ts.map +1 -1
  49. package/dist/cjs/src/types/agent.js.map +1 -1
  50. package/dist/cjs/src/types/ai.d.ts +1 -1
  51. package/dist/cjs/src/types/ai.d.ts.map +1 -1
  52. package/dist/cjs/src/types/index.d.ts +1 -1
  53. package/dist/cjs/src/types/index.d.ts.map +1 -1
  54. package/dist/cjs/src/types/index.js.map +1 -1
  55. package/dist/cjs/src/types/persistence.d.ts +0 -1
  56. package/dist/cjs/src/types/persistence.d.ts.map +1 -1
  57. package/dist/cjs/src/types/route.d.ts +22 -16
  58. package/dist/cjs/src/types/route.d.ts.map +1 -1
  59. package/dist/cjs/src/types/session.d.ts +6 -11
  60. package/dist/cjs/src/types/session.d.ts.map +1 -1
  61. package/dist/cjs/src/types/tool.d.ts +12 -6
  62. package/dist/cjs/src/types/tool.d.ts.map +1 -1
  63. package/dist/cjs/src/utils/clone.d.ts.map +1 -1
  64. package/dist/cjs/src/utils/clone.js +0 -4
  65. package/dist/cjs/src/utils/clone.js.map +1 -1
  66. package/dist/cjs/src/utils/history.d.ts +30 -1
  67. package/dist/cjs/src/utils/history.d.ts.map +1 -1
  68. package/dist/cjs/src/utils/history.js +169 -23
  69. package/dist/cjs/src/utils/history.js.map +1 -1
  70. package/dist/cjs/src/utils/index.d.ts +1 -1
  71. package/dist/cjs/src/utils/index.d.ts.map +1 -1
  72. package/dist/cjs/src/utils/index.js +5 -1
  73. package/dist/cjs/src/utils/index.js.map +1 -1
  74. package/dist/cjs/src/utils/session.d.ts +2 -2
  75. package/dist/cjs/src/utils/session.d.ts.map +1 -1
  76. package/dist/cjs/src/utils/session.js +6 -26
  77. package/dist/cjs/src/utils/session.js.map +1 -1
  78. package/dist/src/core/Agent.d.ts +77 -59
  79. package/dist/src/core/Agent.d.ts.map +1 -1
  80. package/dist/src/core/Agent.js +285 -1061
  81. package/dist/src/core/Agent.js.map +1 -1
  82. package/dist/src/core/PersistenceManager.d.ts.map +1 -1
  83. package/dist/src/core/PersistenceManager.js +48 -25
  84. package/dist/src/core/PersistenceManager.js.map +1 -1
  85. package/dist/src/core/PromptComposer.d.ts +1 -1
  86. package/dist/src/core/PromptComposer.d.ts.map +1 -1
  87. package/dist/src/core/PromptComposer.js.map +1 -1
  88. package/dist/src/core/ResponseEngine.d.ts +13 -12
  89. package/dist/src/core/ResponseEngine.d.ts.map +1 -1
  90. package/dist/src/core/ResponseEngine.js +4 -4
  91. package/dist/src/core/ResponseEngine.js.map +1 -1
  92. package/dist/src/core/ResponseModal.d.ts +205 -0
  93. package/dist/src/core/ResponseModal.d.ts.map +1 -0
  94. package/dist/src/core/ResponseModal.js +1323 -0
  95. package/dist/src/core/ResponseModal.js.map +1 -0
  96. package/dist/src/core/ResponsePipeline.d.ts +66 -38
  97. package/dist/src/core/ResponsePipeline.d.ts.map +1 -1
  98. package/dist/src/core/ResponsePipeline.js +72 -4
  99. package/dist/src/core/ResponsePipeline.js.map +1 -1
  100. package/dist/src/core/Route.d.ts +24 -5
  101. package/dist/src/core/Route.d.ts.map +1 -1
  102. package/dist/src/core/Route.js +45 -1
  103. package/dist/src/core/Route.js.map +1 -1
  104. package/dist/src/core/RoutingEngine.d.ts +31 -6
  105. package/dist/src/core/RoutingEngine.d.ts.map +1 -1
  106. package/dist/src/core/RoutingEngine.js +113 -9
  107. package/dist/src/core/RoutingEngine.js.map +1 -1
  108. package/dist/src/core/SessionManager.d.ts +14 -4
  109. package/dist/src/core/SessionManager.d.ts.map +1 -1
  110. package/dist/src/core/SessionManager.js +25 -5
  111. package/dist/src/core/SessionManager.js.map +1 -1
  112. package/dist/src/core/Step.d.ts +10 -10
  113. package/dist/src/core/Step.d.ts.map +1 -1
  114. package/dist/src/core/Step.js.map +1 -1
  115. package/dist/src/core/ToolExecutor.d.ts +4 -2
  116. package/dist/src/core/ToolExecutor.d.ts.map +1 -1
  117. package/dist/src/core/ToolExecutor.js +13 -3
  118. package/dist/src/core/ToolExecutor.js.map +1 -1
  119. package/dist/src/index.d.ts +3 -1
  120. package/dist/src/index.d.ts.map +1 -1
  121. package/dist/src/index.js +2 -1
  122. package/dist/src/index.js.map +1 -1
  123. package/dist/src/types/agent.d.ts +42 -21
  124. package/dist/src/types/agent.d.ts.map +1 -1
  125. package/dist/src/types/agent.js.map +1 -1
  126. package/dist/src/types/ai.d.ts +1 -1
  127. package/dist/src/types/ai.d.ts.map +1 -1
  128. package/dist/src/types/index.d.ts +1 -1
  129. package/dist/src/types/index.d.ts.map +1 -1
  130. package/dist/src/types/index.js.map +1 -1
  131. package/dist/src/types/persistence.d.ts +0 -1
  132. package/dist/src/types/persistence.d.ts.map +1 -1
  133. package/dist/src/types/route.d.ts +22 -16
  134. package/dist/src/types/route.d.ts.map +1 -1
  135. package/dist/src/types/session.d.ts +6 -11
  136. package/dist/src/types/session.d.ts.map +1 -1
  137. package/dist/src/types/tool.d.ts +12 -6
  138. package/dist/src/types/tool.d.ts.map +1 -1
  139. package/dist/src/utils/clone.d.ts.map +1 -1
  140. package/dist/src/utils/clone.js +0 -4
  141. package/dist/src/utils/clone.js.map +1 -1
  142. package/dist/src/utils/history.d.ts +30 -1
  143. package/dist/src/utils/history.d.ts.map +1 -1
  144. package/dist/src/utils/history.js +165 -23
  145. package/dist/src/utils/history.js.map +1 -1
  146. package/dist/src/utils/index.d.ts +1 -1
  147. package/dist/src/utils/index.d.ts.map +1 -1
  148. package/dist/src/utils/index.js +1 -1
  149. package/dist/src/utils/index.js.map +1 -1
  150. package/dist/src/utils/session.d.ts +2 -2
  151. package/dist/src/utils/session.d.ts.map +1 -1
  152. package/dist/src/utils/session.js +6 -26
  153. package/dist/src/utils/session.js.map +1 -1
  154. package/docs/README.md +5 -4
  155. package/docs/api/README.md +195 -4
  156. package/docs/api/overview.md +232 -13
  157. package/docs/core/agent/README.md +162 -17
  158. package/docs/core/agent/context-management.md +39 -15
  159. package/docs/core/agent/session-management.md +49 -16
  160. package/docs/core/ai-integration/prompt-composition.md +38 -14
  161. package/docs/core/ai-integration/response-processing.md +28 -17
  162. package/docs/core/conversation-flows/data-collection.md +103 -25
  163. package/docs/core/conversation-flows/route-dsl.md +45 -22
  164. package/docs/core/conversation-flows/routes.md +74 -18
  165. package/docs/core/conversation-flows/step-transitions.md +3 -3
  166. package/docs/core/conversation-flows/steps.md +39 -15
  167. package/docs/core/routing/intelligent-routing.md +18 -9
  168. package/docs/core/tools/tool-definition.md +8 -8
  169. package/docs/core/tools/tool-execution.md +26 -26
  170. package/docs/core/tools/tool-scoping.md +5 -5
  171. package/docs/guides/getting-started/README.md +54 -32
  172. package/docs/guides/migration/README.md +72 -0
  173. package/docs/guides/migration/response-modal-refactor.md +518 -0
  174. package/examples/advanced-patterns/knowledge-based-agent.ts +37 -28
  175. package/examples/advanced-patterns/persistent-onboarding.ts +70 -41
  176. package/examples/advanced-patterns/route-lifecycle-hooks.ts +28 -2
  177. package/examples/advanced-patterns/streaming-responses.ts +197 -119
  178. package/examples/ai-providers/anthropic-integration.ts +40 -33
  179. package/examples/ai-providers/openai-integration.ts +25 -25
  180. package/examples/conversation-flows/completion-transitions.ts +36 -32
  181. package/examples/core-concepts/basic-agent.ts +76 -78
  182. package/examples/core-concepts/modern-streaming-api.ts +309 -0
  183. package/examples/core-concepts/schema-driven-extraction.ts +20 -16
  184. package/examples/core-concepts/session-management.ts +65 -53
  185. package/examples/integrations/database-integration.ts +49 -34
  186. package/examples/integrations/healthcare-integration.ts +96 -91
  187. package/examples/integrations/search-integration.ts +79 -82
  188. package/examples/integrations/server-session-management.ts +25 -17
  189. package/examples/persistence/database-persistence.ts +61 -45
  190. package/examples/persistence/memory-sessions.ts +52 -63
  191. package/examples/persistence/redis-persistence.ts +81 -95
  192. package/examples/tools/basic-tools.ts +73 -62
  193. package/examples/tools/data-enrichment-tools.ts +52 -44
  194. package/package.json +1 -1
  195. package/src/core/Agent.ts +396 -1499
  196. package/src/core/PersistenceManager.ts +51 -27
  197. package/src/core/PromptComposer.ts +1 -1
  198. package/src/core/ResponseEngine.ts +21 -19
  199. package/src/core/ResponseModal.ts +1722 -0
  200. package/src/core/ResponsePipeline.ts +175 -60
  201. package/src/core/Route.ts +58 -6
  202. package/src/core/RoutingEngine.ts +174 -27
  203. package/src/core/SessionManager.ts +32 -8
  204. package/src/core/Step.ts +20 -12
  205. package/src/core/ToolExecutor.ts +19 -5
  206. package/src/index.ts +11 -0
  207. package/src/types/agent.ts +47 -23
  208. package/src/types/ai.ts +1 -1
  209. package/src/types/index.ts +2 -0
  210. package/src/types/persistence.ts +0 -1
  211. package/src/types/route.ts +22 -16
  212. package/src/types/session.ts +6 -12
  213. package/src/types/tool.ts +15 -9
  214. package/src/utils/clone.ts +6 -8
  215. package/src/utils/history.ts +190 -27
  216. package/src/utils/index.ts +4 -0
  217. package/src/utils/session.ts +6 -31
@@ -53,7 +53,6 @@ export class PersistenceManager<TData = Record<string, unknown>> {
53
53
  status: "active",
54
54
  collectedData: {
55
55
  data: options.initialData || {},
56
- dataByRoute: {},
57
56
  routeHistory: [],
58
57
  metadata: {},
59
58
  },
@@ -235,32 +234,57 @@ export class PersistenceManager<TData = Record<string, unknown>> {
235
234
  sessionId: string,
236
235
  sessionStep: SessionState<TData>
237
236
  ): Promise<SessionData<TData> | null> {
238
- const persistenceData = sessionStepToData(sessionStep);
239
-
240
- // First try to find existing session
241
- const existingSession = await this.sessionRepository.findById(sessionId);
242
-
243
- if (existingSession) {
244
- // Update existing session
245
- return await this.sessionRepository.update(sessionId, {
246
- currentRoute: persistenceData.currentRoute,
247
- currentStep: persistenceData.currentStep,
248
- collectedData: persistenceData.collectedData,
249
- lastMessageAt: new Date(),
250
- });
251
- } else {
252
- // Create new session if it doesn't exist
253
- return await this.sessionRepository.create({
254
- id: sessionId,
255
- userId: persistenceData.collectedData.metadata?.userId
256
- ? JSON.stringify(persistenceData.collectedData.metadata?.userId)
257
- : this.config.userId,
258
- status: "active",
259
- currentRoute: persistenceData.currentRoute,
260
- currentStep: persistenceData.currentStep,
261
- collectedData: persistenceData.collectedData,
262
- messageCount: 0,
263
- });
237
+ // Validate input parameters
238
+ if (!sessionId || typeof sessionId !== 'string') {
239
+ throw new Error('Session ID must be a non-empty string');
240
+ }
241
+
242
+ if (!sessionStep || typeof sessionStep !== 'object') {
243
+ throw new Error('Session step must be a valid object');
244
+ }
245
+
246
+ // Validate session data structure
247
+ if (sessionStep.data && typeof sessionStep.data !== 'object') {
248
+ throw new Error('Session data must be an object');
249
+ }
250
+
251
+ let persistenceData;
252
+ try {
253
+ persistenceData = sessionStepToData(sessionStep);
254
+ } catch (error) {
255
+ const errorMessage = error instanceof Error ? error.message : String(error);
256
+ throw new Error(`Failed to convert session step to persistence data: ${errorMessage}`);
257
+ }
258
+
259
+ try {
260
+ // First try to find existing session
261
+ const existingSession = await this.sessionRepository.findById(sessionId);
262
+
263
+ if (existingSession) {
264
+ // Update existing session
265
+ return await this.sessionRepository.update(sessionId, {
266
+ currentRoute: persistenceData.currentRoute,
267
+ currentStep: persistenceData.currentStep,
268
+ collectedData: persistenceData.collectedData,
269
+ lastMessageAt: new Date(),
270
+ });
271
+ } else {
272
+ // Create new session if it doesn't exist
273
+ return await this.sessionRepository.create({
274
+ id: sessionId,
275
+ userId: persistenceData.collectedData.metadata?.userId
276
+ ? JSON.stringify(persistenceData.collectedData.metadata?.userId)
277
+ : this.config.userId,
278
+ status: "active",
279
+ currentRoute: persistenceData.currentRoute,
280
+ currentStep: persistenceData.currentStep,
281
+ collectedData: persistenceData.collectedData,
282
+ messageCount: 0,
283
+ });
284
+ }
285
+ } catch (error) {
286
+ const errorMessage = error instanceof Error ? error.message : String(error);
287
+ throw new Error(`Failed to save session state to persistence: ${errorMessage}`);
264
288
  }
265
289
  }
266
290
 
@@ -13,7 +13,7 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
13
13
 
14
14
  // Specific, typed sections tailored to the framework
15
15
 
16
- async addAgentMeta(agent: AgentOptions<TContext>): Promise<this> {
16
+ async addAgentMeta(agent: AgentOptions<TContext, TData>): Promise<this> {
17
17
  const lines: string[] = [];
18
18
  lines.push("## Agent");
19
19
  lines.push(`**Name:** ${agent.name}`);
@@ -23,27 +23,30 @@ export interface BuildResponsePromptParams<
23
23
  directives: string[] | undefined;
24
24
  history: Event[];
25
25
  lastMessage: string;
26
- agentOptions?: AgentOptions<TContext>;
26
+ agentOptions?: AgentOptions<TContext, TData>;
27
27
  // Combined properties from agent and route
28
- combinedGuidelines?: Guideline<TContext>[];
29
- combinedTerms?: Term<TContext>[];
28
+ combinedGuidelines?: Guideline<TContext, TData>[];
29
+ combinedTerms?: Term<TContext, TData>[];
30
30
  context?: TContext;
31
31
  session?: SessionState<TData>;
32
+ // NEW: Agent-level schema for data validation
33
+ agentSchema?: StructuredSchema;
32
34
  }
33
35
 
34
- export interface BuildFallbackPromptParams<TContext = unknown> {
36
+ export interface BuildFallbackPromptParams<TContext = unknown, TData = unknown> {
35
37
  history: Event[];
36
- agentOptions: AgentOptions<TContext>;
37
- terms: Term<TContext>[];
38
- guidelines: Guideline<TContext>[];
38
+ agentOptions: AgentOptions<TContext, TData>;
39
+ terms: Term<TContext, TData>[];
40
+ guidelines: Guideline<TContext, TData>[];
39
41
  context?: TContext;
40
- session?: SessionState;
42
+ session?: SessionState<TData>;
41
43
  }
42
44
 
43
- export class ResponseEngine<TContext = unknown> {
44
- responseSchemaForRoute<TData = unknown>(
45
+ export class ResponseEngine<TContext = unknown, TData = unknown> {
46
+ responseSchemaForRoute(
45
47
  route: Route<TContext, TData>,
46
- currentStep?: Step<TContext, TData>
48
+ currentStep?: Step<TContext, TData>,
49
+ agentSchema?: StructuredSchema
47
50
  ): StructuredSchema {
48
51
  const base: StructuredSchema = {
49
52
  type: "object",
@@ -59,12 +62,12 @@ export class ResponseEngine<TContext = unknown> {
59
62
  base.properties!.data = route.responseOutputSchema;
60
63
  }
61
64
 
62
- // Add collect fields from current step
63
- if (currentStep?.collect && route.schema?.properties) {
65
+ // Add collect fields from current step using agent-level schema
66
+ if (currentStep?.collect && agentSchema?.properties) {
64
67
  for (const field of currentStep.collect) {
65
- const fieldSchema = route.schema.properties[field];
68
+ const fieldSchema = agentSchema.properties[field as string];
66
69
  if (fieldSchema) {
67
- base.properties![field] = fieldSchema;
70
+ base.properties![field as string] = fieldSchema;
68
71
  }
69
72
  }
70
73
  }
@@ -73,7 +76,7 @@ export class ResponseEngine<TContext = unknown> {
73
76
  }
74
77
 
75
78
  async buildResponsePrompt(
76
- params: BuildResponsePromptParams<TContext>
79
+ params: BuildResponsePromptParams<TContext, TData>
77
80
  ): Promise<string> {
78
81
  const {
79
82
  route,
@@ -107,8 +110,7 @@ export class ResponseEngine<TContext = unknown> {
107
110
  await pc.addAgentMeta(effectiveAgentOptions);
108
111
  }
109
112
  await pc.addInstruction(
110
- `Route: ${route.title}${
111
- route.description ? ` — ${route.description}` : ""
113
+ `Route: ${route.title}${route.description ? ` — ${route.description}` : ""
112
114
  }`
113
115
  );
114
116
  if (currentStep.prompt) {
@@ -148,7 +150,7 @@ export class ResponseEngine<TContext = unknown> {
148
150
  }
149
151
 
150
152
  async buildFallbackPrompt(
151
- params: BuildFallbackPromptParams<TContext>
153
+ params: BuildFallbackPromptParams<TContext, TData>
152
154
  ): Promise<string> {
153
155
  const { history, agentOptions, terms, guidelines, context, session } =
154
156
  params;