@falai/agent 1.0.2 → 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.
Files changed (109) hide show
  1. package/dist/adapters/MemoryAdapter.d.ts.map +1 -1
  2. package/dist/adapters/MemoryAdapter.js +2 -1
  3. package/dist/adapters/MemoryAdapter.js.map +1 -1
  4. package/dist/adapters/MongoAdapter.d.ts.map +1 -1
  5. package/dist/adapters/MongoAdapter.js +2 -1
  6. package/dist/adapters/MongoAdapter.js.map +1 -1
  7. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
  8. package/dist/adapters/OpenSearchAdapter.js +2 -1
  9. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  10. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  11. package/dist/adapters/PostgreSQLAdapter.js +2 -1
  12. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  13. package/dist/adapters/PrismaAdapter.d.ts.map +1 -1
  14. package/dist/adapters/PrismaAdapter.js +2 -1
  15. package/dist/adapters/PrismaAdapter.js.map +1 -1
  16. package/dist/adapters/RedisAdapter.d.ts.map +1 -1
  17. package/dist/adapters/RedisAdapter.js.map +1 -1
  18. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  19. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  20. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -1
  21. package/dist/cjs/adapters/MemoryAdapter.js +2 -1
  22. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  23. package/dist/cjs/adapters/MongoAdapter.d.ts.map +1 -1
  24. package/dist/cjs/adapters/MongoAdapter.js +2 -1
  25. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  26. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  27. package/dist/cjs/adapters/OpenSearchAdapter.js +2 -1
  28. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  29. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  30. package/dist/cjs/adapters/PostgreSQLAdapter.js +2 -1
  31. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  32. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -1
  33. package/dist/cjs/adapters/PrismaAdapter.js +2 -1
  34. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  35. package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -1
  36. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  37. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  38. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  39. package/dist/cjs/core/BatchExecutor.d.ts +6 -0
  40. package/dist/cjs/core/BatchExecutor.d.ts.map +1 -1
  41. package/dist/cjs/core/BatchExecutor.js +14 -5
  42. package/dist/cjs/core/BatchExecutor.js.map +1 -1
  43. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  44. package/dist/cjs/core/ResponseModal.js +1 -0
  45. package/dist/cjs/core/ResponseModal.js.map +1 -1
  46. package/dist/cjs/core/SessionManager.d.ts.map +1 -1
  47. package/dist/cjs/core/SessionManager.js +4 -11
  48. package/dist/cjs/core/SessionManager.js.map +1 -1
  49. package/dist/cjs/index.d.ts +1 -1
  50. package/dist/cjs/index.d.ts.map +1 -1
  51. package/dist/cjs/index.js +3 -2
  52. package/dist/cjs/index.js.map +1 -1
  53. package/dist/cjs/types/agent.d.ts +11 -0
  54. package/dist/cjs/types/agent.d.ts.map +1 -1
  55. package/dist/cjs/types/route.d.ts +1 -1
  56. package/dist/cjs/types/route.d.ts.map +1 -1
  57. package/dist/cjs/utils/session.d.ts +6 -0
  58. package/dist/cjs/utils/session.d.ts.map +1 -1
  59. package/dist/cjs/utils/session.js +26 -8
  60. package/dist/cjs/utils/session.js.map +1 -1
  61. package/dist/core/BatchExecutor.d.ts +6 -0
  62. package/dist/core/BatchExecutor.d.ts.map +1 -1
  63. package/dist/core/BatchExecutor.js +15 -6
  64. package/dist/core/BatchExecutor.js.map +1 -1
  65. package/dist/core/ResponseModal.d.ts.map +1 -1
  66. package/dist/core/ResponseModal.js +1 -0
  67. package/dist/core/ResponseModal.js.map +1 -1
  68. package/dist/core/SessionManager.d.ts.map +1 -1
  69. package/dist/core/SessionManager.js +4 -11
  70. package/dist/core/SessionManager.js.map +1 -1
  71. package/dist/index.d.ts +1 -1
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +1 -1
  74. package/dist/index.js.map +1 -1
  75. package/dist/types/agent.d.ts +11 -0
  76. package/dist/types/agent.d.ts.map +1 -1
  77. package/dist/types/route.d.ts +1 -1
  78. package/dist/types/route.d.ts.map +1 -1
  79. package/dist/utils/session.d.ts +6 -0
  80. package/dist/utils/session.d.ts.map +1 -1
  81. package/dist/utils/session.js +26 -8
  82. package/dist/utils/session.js.map +1 -1
  83. package/docs/api/README.md +31 -2
  84. package/docs/api/overview.md +19 -11
  85. package/docs/architecture/multi-step-execution.md +37 -3
  86. package/docs/core/conversation-flows/data-collection.md +8 -2
  87. package/docs/core/conversation-flows/route-dsl.md +8 -1
  88. package/docs/core/conversation-flows/step-transitions.md +4 -0
  89. package/docs/core/conversation-flows/steps.md +3 -1
  90. package/docs/core/persistence/session-storage.md +12 -0
  91. package/docs/guides/migration/README.md +2 -0
  92. package/docs/guides/migration/multi-step-execution.md +29 -9
  93. package/examples/integrations/database-integration.ts +10 -9
  94. package/examples/persistence/custom-adapter.ts +12 -15
  95. package/package.json +1 -1
  96. package/src/adapters/MemoryAdapter.ts +6 -8
  97. package/src/adapters/MongoAdapter.ts +6 -8
  98. package/src/adapters/OpenSearchAdapter.ts +6 -8
  99. package/src/adapters/PostgreSQLAdapter.ts +6 -8
  100. package/src/adapters/PrismaAdapter.ts +4 -6
  101. package/src/adapters/RedisAdapter.ts +4 -7
  102. package/src/adapters/SQLiteAdapter.ts +6 -9
  103. package/src/core/BatchExecutor.ts +143 -125
  104. package/src/core/ResponseModal.ts +1 -0
  105. package/src/core/SessionManager.ts +4 -13
  106. package/src/index.ts +11 -11
  107. package/src/types/agent.ts +11 -0
  108. package/src/types/route.ts +8 -7
  109. package/src/utils/session.ts +48 -10
@@ -575,6 +575,7 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
575
575
  currentStep,
576
576
  sessionData: updatedSession.data || {},
577
577
  context: params.context,
578
+ maxSteps: this.agent.getAgentOptions().maxStepsPerBatch,
578
579
  });
579
580
 
580
581
  batchSteps = batchResult.steps;
@@ -10,6 +10,7 @@ import type { History, HistoryItem } from "../types/history";
10
10
  import { PersistenceManager } from "./PersistenceManager";
11
11
  import type { PersistenceAdapter } from "../types/persistence";
12
12
  import type { Agent } from "./Agent";
13
+ import { createSession } from "../utils";
13
14
 
14
15
  /**
15
16
  * SessionManager handles session lifecycle and conversation history
@@ -93,20 +94,10 @@ export class SessionManager<TData = unknown> {
93
94
  * Create a new session with optional custom ID
94
95
  */
95
96
  private async create(sessionId?: string): Promise<SessionState<TData>> {
96
- const id =
97
- sessionId ||
98
- `session_${Date.now()}_${Math.random().toString(36).slice(2)}`;
99
-
100
- const session: SessionState<TData> = {
101
- id,
102
- data: {} as Partial<TData>, // Agent-level data structure
103
- routeHistory: [],
97
+ const session = createSession<TData>({
98
+ id: sessionId,
104
99
  history: [], // Session manages its own history
105
- metadata: {
106
- createdAt: new Date(),
107
- lastUpdatedAt: new Date(),
108
- },
109
- };
100
+ });
110
101
 
111
102
  this.currentSession = session;
112
103
 
package/src/index.ts CHANGED
@@ -9,11 +9,11 @@ export { Agent } from "./core/Agent";
9
9
  export { Route } from "./core/Route";
10
10
  export { Step } from "./core/Step";
11
11
  export { ResponseModal } from "./core/ResponseModal";
12
- export type {
13
- ResponseModalOptions,
14
- RespondParams,
15
- StreamOptions,
16
- GenerateOptions
12
+ export type {
13
+ ResponseModalOptions,
14
+ RespondParams,
15
+ StreamOptions,
16
+ GenerateOptions
17
17
  } from "./core/ResponseModal";
18
18
  export { adaptEvent, convertHistoryToEvents } from "./core/Events";
19
19
  export { PersistenceManager } from "./core/PersistenceManager";
@@ -73,11 +73,11 @@ export { END_ROUTE, END_ROUTE_ID } from "./constants";
73
73
  // Utils
74
74
  export { generateRouteId, generateStepId, generateToolId } from "./utils/id";
75
75
  export { formatKnowledgeBase } from "./utils/template";
76
- export {
77
- ConditionEvaluator,
78
- createConditionEvaluator,
79
- extractAIContextStrings,
80
- hasProgrammaticConditions
76
+ export {
77
+ ConditionEvaluator,
78
+ createConditionEvaluator,
79
+ extractAIContextStrings,
80
+ hasProgrammaticConditions
81
81
  } from "./utils/condition";
82
82
  export {
83
83
  normalizeHistory,
@@ -163,4 +163,4 @@ export type {
163
163
  BatchExecutionError,
164
164
  } from "./types";
165
165
  export { CompositionMode, EventKind, MessageRole } from "./types";
166
- export { createSession, enterRoute, enterStep, mergeCollected } from "./utils";
166
+ export { createSession, createSessionId, enterRoute, enterStep, mergeCollected } from "./utils";
@@ -121,6 +121,17 @@ export interface AgentOptions<TContext = unknown, TData = unknown> {
121
121
  * @default 15
122
122
  */
123
123
  routeSwitchMargin?: number;
124
+ /**
125
+ * Maximum number of steps to execute in a single batch.
126
+ * Controls how many consecutive steps can run together in one LLM call.
127
+ *
128
+ * - `1` (default): Steps execute one at a time (classic behavior)
129
+ * - `Infinity`: No limit — all eligible steps batch together
130
+ * - Any positive integer: Cap the batch to that many steps
131
+ *
132
+ * @default 1
133
+ */
134
+ maxStepsPerBatch?: number;
124
135
  }
125
136
 
126
137
  /**
@@ -12,13 +12,14 @@ import { Template, ConditionTemplate } from "./template";
12
12
  * Used to indicate the stopping condition for multi-step execution
13
13
  */
14
14
  export type StoppedReason =
15
- | 'needs_input' // Step requires uncollected data
16
- | 'end_route' // Reached END_ROUTE
17
- | 'route_complete' // All Steps processed
18
- | 'prepare_error' // Error in prepare hook
19
- | 'llm_error' // Error during LLM call
20
- | 'validation_error' // Error validating collected data
21
- | 'finalize_error'; // Error in finalize hook (non-fatal, logged)
15
+ | 'needs_input' // Step requires uncollected data
16
+ | 'end_route' // Reached END_ROUTE
17
+ | 'route_complete' // All Steps processed
18
+ | 'max_steps_reached' // Batch hit the maxStepsPerBatch limit
19
+ | 'prepare_error' // Error in prepare hook
20
+ | 'llm_error' // Error during LLM call
21
+ | 'validation_error' // Error validating collected data
22
+ | 'finalize_error'; // Error in finalize hook (non-fatal, logged)
22
23
 
23
24
  /**
24
25
  * Event types for batch execution observability
@@ -4,19 +4,57 @@ import type { CollectedStateData } from "../types/persistence";
4
4
 
5
5
  /**
6
6
  * Helper to create a new session
7
+ *
8
+ * Overload 1: Create with optional sessionId and metadata
7
9
  * @param sessionId - Optional session ID (e.g., from database)
8
10
  * @param metadata - Optional metadata to attach
11
+ *
12
+ * Overload 2: Create from a partial session state (merged with defaults)
13
+ * @param state - Partial session state to merge with defaults
9
14
  */
10
15
  export function createSession<TData = Record<string, unknown>>(
11
16
  sessionId?: string,
12
17
  metadata?: SessionState<TData>["metadata"]
18
+ ): SessionState<TData>;
19
+ export function createSession<TData = Record<string, unknown>>(
20
+ state: Partial<SessionState<TData>>
21
+ ): SessionState<TData>;
22
+ export function createSession<TData = Record<string, unknown>>(
23
+ sessionIdOrState?: string | Partial<SessionState<TData>>,
24
+ metadata?: SessionState<TData>["metadata"]
13
25
  ): SessionState<TData> {
26
+ // Overload 2: partial state object
27
+ if (typeof sessionIdOrState === "object" && sessionIdOrState !== null) {
28
+ const state = sessionIdOrState;
29
+ const now = new Date();
30
+ const id =
31
+ state.id ||
32
+ `session_${Date.now()}_${Math.random().toString(36).slice(2)}`;
33
+
34
+ return {
35
+ id,
36
+ data: state.data ?? ({} as Partial<TData>),
37
+ routeHistory: state.routeHistory ?? [],
38
+ currentRoute: state.currentRoute,
39
+ currentStep: state.currentStep,
40
+ pendingTransition: state.pendingTransition,
41
+ history: state.history,
42
+ metadata: {
43
+ createdAt: now,
44
+ lastUpdatedAt: now,
45
+ ...state.metadata,
46
+ },
47
+ };
48
+ }
49
+
50
+ // Overload 1: sessionId + metadata
14
51
  const id =
15
- sessionId || `session_${Date.now()}_${Math.random().toString(36).slice(2)}`;
52
+ sessionIdOrState ||
53
+ `session_${Date.now()}_${Math.random().toString(36).slice(2)}`;
16
54
 
17
55
  return {
18
56
  id,
19
- data: {} as Partial<TData>, // Agent-level data structure
57
+ data: {} as Partial<TData>,
20
58
  routeHistory: [],
21
59
  metadata: {
22
60
  ...metadata,
@@ -184,17 +222,17 @@ export function sessionDataToStep<TData = Record<string, unknown>>(
184
222
  id: sessionId,
185
223
  currentRoute: data.currentRoute
186
224
  ? {
187
- id: data.currentRoute,
188
- title: collectedData.currentRouteTitle || data.currentRoute,
189
- enteredAt: new Date(),
190
- }
225
+ id: data.currentRoute,
226
+ title: collectedData.currentRouteTitle || data.currentRoute,
227
+ enteredAt: new Date(),
228
+ }
191
229
  : undefined,
192
230
  currentStep: data.currentStep
193
231
  ? {
194
- id: data.currentStep,
195
- description: collectedData.currentStepDescription || undefined,
196
- enteredAt: new Date(),
197
- }
232
+ id: data.currentStep,
233
+ description: collectedData.currentStepDescription || undefined,
234
+ enteredAt: new Date(),
235
+ }
198
236
  : undefined,
199
237
  data: collectedData.data || {},
200
238
  routeHistory: collectedData.routeHistory || [],