@falai/agent 0.6.8 → 0.7.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 (231) hide show
  1. package/README.md +62 -59
  2. package/dist/adapters/MemoryAdapter.js +2 -2
  3. package/dist/adapters/MemoryAdapter.js.map +1 -1
  4. package/dist/adapters/MongoAdapter.js +2 -2
  5. package/dist/adapters/MongoAdapter.js.map +1 -1
  6. package/dist/adapters/OpenSearchAdapter.js +7 -7
  7. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  8. package/dist/adapters/PostgreSQLAdapter.js +9 -9
  9. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  10. package/dist/adapters/PrismaAdapter.js +3 -3
  11. package/dist/adapters/PrismaAdapter.js.map +1 -1
  12. package/dist/adapters/RedisAdapter.js +2 -2
  13. package/dist/adapters/RedisAdapter.js.map +1 -1
  14. package/dist/adapters/SQLiteAdapter.d.ts +3 -3
  15. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  16. package/dist/adapters/SQLiteAdapter.js +11 -11
  17. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  18. package/dist/adapters/index.d.ts +1 -1
  19. package/dist/adapters/index.d.ts.map +1 -1
  20. package/dist/cjs/adapters/MemoryAdapter.js +2 -2
  21. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  22. package/dist/cjs/adapters/MongoAdapter.js +2 -2
  23. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  24. package/dist/cjs/adapters/OpenSearchAdapter.js +7 -7
  25. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  26. package/dist/cjs/adapters/PostgreSQLAdapter.js +9 -9
  27. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  28. package/dist/cjs/adapters/PrismaAdapter.js +3 -3
  29. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  30. package/dist/cjs/adapters/RedisAdapter.js +2 -2
  31. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  32. package/dist/cjs/adapters/SQLiteAdapter.d.ts +3 -3
  33. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  34. package/dist/cjs/adapters/SQLiteAdapter.js +11 -11
  35. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  36. package/dist/cjs/adapters/index.d.ts +1 -1
  37. package/dist/cjs/adapters/index.d.ts.map +1 -1
  38. package/dist/cjs/constants/index.d.ts +4 -4
  39. package/dist/cjs/constants/index.js +5 -5
  40. package/dist/cjs/core/Agent.d.ts +22 -22
  41. package/dist/cjs/core/Agent.d.ts.map +1 -1
  42. package/dist/cjs/core/Agent.js +160 -152
  43. package/dist/cjs/core/Agent.js.map +1 -1
  44. package/dist/cjs/core/Events.d.ts +6 -6
  45. package/dist/cjs/core/Events.d.ts.map +1 -1
  46. package/dist/cjs/core/PersistenceManager.d.ts +13 -13
  47. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  48. package/dist/cjs/core/PersistenceManager.js +24 -24
  49. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  50. package/dist/cjs/core/ResponseEngine.d.ts +3 -8
  51. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  52. package/dist/cjs/core/ResponseEngine.js +8 -8
  53. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  54. package/dist/cjs/core/Route.d.ts +17 -17
  55. package/dist/cjs/core/Route.d.ts.map +1 -1
  56. package/dist/cjs/core/Route.js +33 -33
  57. package/dist/cjs/core/Route.js.map +1 -1
  58. package/dist/cjs/core/RoutingEngine.d.ts +30 -30
  59. package/dist/cjs/core/RoutingEngine.d.ts.map +1 -1
  60. package/dist/cjs/core/RoutingEngine.js +192 -192
  61. package/dist/cjs/core/RoutingEngine.js.map +1 -1
  62. package/dist/cjs/core/Step.d.ts +72 -0
  63. package/dist/cjs/core/Step.d.ts.map +1 -0
  64. package/dist/cjs/core/Step.js +150 -0
  65. package/dist/cjs/core/Step.js.map +1 -0
  66. package/dist/cjs/core/ToolExecutor.d.ts +5 -5
  67. package/dist/cjs/core/ToolExecutor.d.ts.map +1 -1
  68. package/dist/cjs/core/ToolExecutor.js +8 -8
  69. package/dist/cjs/core/ToolExecutor.js.map +1 -1
  70. package/dist/cjs/core/Transition.d.ts +14 -14
  71. package/dist/cjs/core/Transition.d.ts.map +1 -1
  72. package/dist/cjs/core/Transition.js +48 -19
  73. package/dist/cjs/core/Transition.js.map +1 -1
  74. package/dist/cjs/index.d.ts +7 -7
  75. package/dist/cjs/index.d.ts.map +1 -1
  76. package/dist/cjs/index.js +8 -8
  77. package/dist/cjs/index.js.map +1 -1
  78. package/dist/cjs/types/agent.d.ts +8 -8
  79. package/dist/cjs/types/agent.d.ts.map +1 -1
  80. package/dist/cjs/types/ai.d.ts +2 -2
  81. package/dist/cjs/types/ai.d.ts.map +1 -1
  82. package/dist/cjs/types/history.d.ts +3 -3
  83. package/dist/cjs/types/history.d.ts.map +1 -1
  84. package/dist/cjs/types/index.d.ts +1 -1
  85. package/dist/cjs/types/index.d.ts.map +1 -1
  86. package/dist/cjs/types/persistence.d.ts +5 -5
  87. package/dist/cjs/types/persistence.d.ts.map +1 -1
  88. package/dist/cjs/types/route.d.ts +57 -52
  89. package/dist/cjs/types/route.d.ts.map +1 -1
  90. package/dist/cjs/types/session.d.ts +27 -27
  91. package/dist/cjs/types/session.d.ts.map +1 -1
  92. package/dist/cjs/types/session.js +48 -50
  93. package/dist/cjs/types/session.js.map +1 -1
  94. package/dist/cjs/types/tool.d.ts +13 -13
  95. package/dist/cjs/types/tool.d.ts.map +1 -1
  96. package/dist/cjs/utils/id.d.ts +8 -3
  97. package/dist/cjs/utils/id.d.ts.map +1 -1
  98. package/dist/cjs/utils/id.js +16 -7
  99. package/dist/cjs/utils/id.js.map +1 -1
  100. package/dist/constants/index.d.ts +4 -4
  101. package/dist/constants/index.js +4 -4
  102. package/dist/core/Agent.d.ts +22 -22
  103. package/dist/core/Agent.d.ts.map +1 -1
  104. package/dist/core/Agent.js +162 -154
  105. package/dist/core/Agent.js.map +1 -1
  106. package/dist/core/Events.d.ts +6 -6
  107. package/dist/core/Events.d.ts.map +1 -1
  108. package/dist/core/PersistenceManager.d.ts +13 -13
  109. package/dist/core/PersistenceManager.d.ts.map +1 -1
  110. package/dist/core/PersistenceManager.js +25 -25
  111. package/dist/core/PersistenceManager.js.map +1 -1
  112. package/dist/core/ResponseEngine.d.ts +3 -8
  113. package/dist/core/ResponseEngine.d.ts.map +1 -1
  114. package/dist/core/ResponseEngine.js +8 -8
  115. package/dist/core/ResponseEngine.js.map +1 -1
  116. package/dist/core/Route.d.ts +17 -17
  117. package/dist/core/Route.d.ts.map +1 -1
  118. package/dist/core/Route.js +33 -33
  119. package/dist/core/Route.js.map +1 -1
  120. package/dist/core/RoutingEngine.d.ts +30 -30
  121. package/dist/core/RoutingEngine.d.ts.map +1 -1
  122. package/dist/core/RoutingEngine.js +193 -193
  123. package/dist/core/RoutingEngine.js.map +1 -1
  124. package/dist/core/Step.d.ts +72 -0
  125. package/dist/core/Step.d.ts.map +1 -0
  126. package/dist/core/Step.js +146 -0
  127. package/dist/core/Step.js.map +1 -0
  128. package/dist/core/ToolExecutor.d.ts +5 -5
  129. package/dist/core/ToolExecutor.d.ts.map +1 -1
  130. package/dist/core/ToolExecutor.js +8 -8
  131. package/dist/core/ToolExecutor.js.map +1 -1
  132. package/dist/core/Transition.d.ts +14 -14
  133. package/dist/core/Transition.d.ts.map +1 -1
  134. package/dist/core/Transition.js +48 -19
  135. package/dist/core/Transition.js.map +1 -1
  136. package/dist/index.d.ts +7 -7
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +4 -4
  139. package/dist/index.js.map +1 -1
  140. package/dist/types/agent.d.ts +8 -8
  141. package/dist/types/agent.d.ts.map +1 -1
  142. package/dist/types/ai.d.ts +2 -2
  143. package/dist/types/ai.d.ts.map +1 -1
  144. package/dist/types/history.d.ts +3 -3
  145. package/dist/types/history.d.ts.map +1 -1
  146. package/dist/types/index.d.ts +1 -1
  147. package/dist/types/index.d.ts.map +1 -1
  148. package/dist/types/persistence.d.ts +5 -5
  149. package/dist/types/persistence.d.ts.map +1 -1
  150. package/dist/types/route.d.ts +57 -52
  151. package/dist/types/route.d.ts.map +1 -1
  152. package/dist/types/session.d.ts +27 -27
  153. package/dist/types/session.d.ts.map +1 -1
  154. package/dist/types/session.js +44 -46
  155. package/dist/types/session.js.map +1 -1
  156. package/dist/types/tool.d.ts +13 -13
  157. package/dist/types/tool.d.ts.map +1 -1
  158. package/dist/utils/id.d.ts +8 -3
  159. package/dist/utils/id.d.ts.map +1 -1
  160. package/dist/utils/id.js +14 -6
  161. package/dist/utils/id.js.map +1 -1
  162. package/docs/ADAPTERS.md +21 -21
  163. package/docs/AGENT.md +57 -55
  164. package/docs/API_REFERENCE.md +218 -220
  165. package/docs/ARCHITECTURE.md +99 -104
  166. package/docs/CONTEXT_MANAGEMENT.md +81 -88
  167. package/docs/DOCS.md +18 -18
  168. package/docs/DOMAINS.md +16 -16
  169. package/docs/EXAMPLES.md +43 -43
  170. package/docs/GETTING_STARTED.md +60 -63
  171. package/docs/PERSISTENCE.md +66 -70
  172. package/docs/PROVIDERS.md +2 -2
  173. package/docs/README.md +6 -6
  174. package/docs/ROUTES.md +218 -220
  175. package/docs/STEPS.md +883 -0
  176. package/examples/business-onboarding.ts +84 -81
  177. package/examples/company-qna-agent.ts +68 -67
  178. package/examples/custom-database-persistence.ts +87 -89
  179. package/examples/declarative-agent.ts +32 -32
  180. package/examples/domain-scoping.ts +18 -18
  181. package/examples/extracted-data-modification.ts +92 -97
  182. package/examples/healthcare-agent.ts +89 -91
  183. package/examples/openai-agent.ts +29 -32
  184. package/examples/opensearch-persistence.ts +43 -45
  185. package/examples/persistent-onboarding.ts +65 -66
  186. package/examples/prisma-persistence.ts +108 -112
  187. package/examples/prisma-schema.example.prisma +3 -3
  188. package/examples/redis-persistence.ts +67 -73
  189. package/examples/route-transitions.ts +71 -47
  190. package/examples/rules-prohibitions.ts +28 -28
  191. package/examples/streaming-agent.ts +24 -24
  192. package/examples/travel-agent.ts +94 -109
  193. package/package.json +1 -1
  194. package/src/adapters/MemoryAdapter.ts +3 -3
  195. package/src/adapters/MongoAdapter.ts +3 -3
  196. package/src/adapters/OpenSearchAdapter.ts +8 -8
  197. package/src/adapters/PostgreSQLAdapter.ts +10 -10
  198. package/src/adapters/PrismaAdapter.ts +4 -4
  199. package/src/adapters/RedisAdapter.ts +3 -3
  200. package/src/adapters/SQLiteAdapter.ts +15 -15
  201. package/src/adapters/index.ts +1 -1
  202. package/src/constants/index.ts +4 -4
  203. package/src/core/Agent.ts +210 -206
  204. package/src/core/Events.ts +12 -12
  205. package/src/core/PersistenceManager.ts +32 -36
  206. package/src/core/ResponseEngine.ts +11 -17
  207. package/src/core/Route.ts +55 -49
  208. package/src/core/RoutingEngine.ts +244 -252
  209. package/src/core/Step.ts +197 -0
  210. package/src/core/ToolExecutor.ts +11 -11
  211. package/src/core/Transition.ts +72 -26
  212. package/src/index.ts +8 -8
  213. package/src/types/agent.ts +8 -8
  214. package/src/types/ai.ts +2 -2
  215. package/src/types/history.ts +3 -3
  216. package/src/types/index.ts +1 -1
  217. package/src/types/persistence.ts +6 -6
  218. package/src/types/route.ts +77 -61
  219. package/src/types/session.ts +75 -78
  220. package/src/types/tool.ts +17 -17
  221. package/src/utils/id.ts +15 -6
  222. package/dist/cjs/core/State.d.ts +0 -72
  223. package/dist/cjs/core/State.d.ts.map +0 -1
  224. package/dist/cjs/core/State.js +0 -148
  225. package/dist/cjs/core/State.js.map +0 -1
  226. package/dist/core/State.d.ts +0 -72
  227. package/dist/core/State.d.ts.map +0 -1
  228. package/dist/core/State.js +0 -144
  229. package/dist/core/State.js.map +0 -1
  230. package/docs/STATES.md +0 -888
  231. package/src/core/State.ts +0 -212
@@ -1,9 +1,9 @@
1
1
  /**
2
- * Example: Using Redis for Persistence with Session State
2
+ * Example: Using Redis for Persistence with Session Step
3
3
  *
4
4
  * Fast, in-memory persistence perfect for:
5
5
  * - High-throughput applications
6
- * - Session caching with extracted data
6
+ * - Session caching with collected data
7
7
  * - Real-time chat applications
8
8
  * - Temporary conversation storage
9
9
  */
@@ -16,7 +16,7 @@ import {
16
16
  EventSource,
17
17
  MessageEventData,
18
18
  Event,
19
- END_STATE,
19
+ END_ROUTE,
20
20
  } from "../src/index";
21
21
  // @ts-ignore
22
22
  import Redis from "ioredis";
@@ -86,12 +86,12 @@ async function example() {
86
86
  sessionTTL: 24 * 60 * 60, // 24 hours
87
87
  messageTTL: 7 * 24 * 60 * 60, // 7 days
88
88
  }),
89
- autoSave: true, // Auto-save session state
89
+ autoSave: true, // Auto-save session step
90
90
  userId,
91
91
  },
92
92
  });
93
93
 
94
- // Create support ticket route with data gathering
94
+ // Create support ticket route with data collecting
95
95
  const ticketRoute = agent.createRoute<SupportTicketData>({
96
96
  title: "Create Support Ticket",
97
97
  description: "Help user create and track support tickets",
@@ -100,7 +100,7 @@ async function example() {
100
100
  "User wants to report a problem",
101
101
  "User mentions support, help, or issue",
102
102
  ],
103
- extractionSchema: {
103
+ schema: {
104
104
  type: "object",
105
105
  properties: {
106
106
  issue: {
@@ -127,37 +127,37 @@ async function example() {
127
127
  },
128
128
  });
129
129
 
130
- // State flow
131
- ticketRoute.initialState
132
- .transitionTo({
133
- chatState: "Ask what the issue is",
134
- gather: ["issue", "category"],
130
+ // Step flow
131
+ ticketRoute.initialStep
132
+ .nextStep({
133
+ instructions: "Ask what the issue is",
134
+ collect: ["issue", "category"],
135
135
  skipIf: (data) => !!data.issue && !!data.category,
136
136
  })
137
- .transitionTo({
138
- chatState: "Ask for priority",
139
- gather: ["priority"],
137
+ .nextStep({
138
+ instructions: "Ask for priority",
139
+ collect: ["priority"],
140
140
  skipIf: (data) => !!data.priority,
141
- requiredData: ["issue", "category"],
141
+ requires: ["issue", "category"],
142
142
  })
143
- .transitionTo({
144
- chatState: "Ask for detailed description",
145
- gather: ["description"],
143
+ .nextStep({
144
+ instructions: "Ask for detailed description",
145
+ collect: ["description"],
146
146
  skipIf: (data) => !!data.description,
147
- requiredData: ["issue", "category"],
147
+ requires: ["issue", "category"],
148
148
  })
149
- .transitionTo({
150
- chatState: "Confirm and create ticket",
151
- requiredData: ["issue", "category", "description"],
149
+ .nextStep({
150
+ instructions: "Confirm and create ticket",
151
+ requires: ["issue", "category", "description"],
152
152
  })
153
- .transitionTo({ state: END_STATE });
153
+ .nextStep({ step: END_ROUTE });
154
154
 
155
155
  const persistence = agent.getPersistenceManager();
156
156
  if (!persistence) return;
157
157
 
158
- // Create session with state support
159
- const { sessionData, sessionState } =
160
- await persistence.createSessionWithState<SupportTicketData>({
158
+ // Create session with step support
159
+ const { sessionData, sessionStep } =
160
+ await persistence.createSessionWithStep<SupportTicketData>({
161
161
  userId,
162
162
  agentName: "Support Assistant",
163
163
  initialData: {
@@ -166,13 +166,13 @@ async function example() {
166
166
  });
167
167
 
168
168
  console.log("✨ Session created in Redis:", sessionData.id);
169
- console.log("📊 Initial state:", {
170
- extracted: sessionState.extracted,
169
+ console.log("📊 Initial step:", {
170
+ data: sessionStep.data,
171
171
  });
172
172
 
173
173
  // Turn 1: User provides issue
174
174
  const history: Event<MessageEventData>[] = [];
175
- let session = sessionState;
175
+ let session = sessionStep;
176
176
 
177
177
  const message1 = createMessageEvent(
178
178
  EventSource.CUSTOMER,
@@ -188,7 +188,7 @@ async function example() {
188
188
 
189
189
  console.log("\n--- Turn 1 ---");
190
190
  console.log("🤖 Agent:", response1.message);
191
- console.log("📊 Extracted data:", response1.session?.extracted);
191
+ console.log("📊 Collected data:", response1.session?.data);
192
192
 
193
193
  // Save messages
194
194
  await persistence.saveMessage({
@@ -202,7 +202,7 @@ async function example() {
202
202
  role: "agent",
203
203
  content: response1.message,
204
204
  route: response1.session?.currentRoute?.id,
205
- state: response1.session?.currentState?.id,
205
+ step: response1.session?.currentStep?.id,
206
206
  });
207
207
 
208
208
  session = response1.session!;
@@ -230,7 +230,7 @@ async function example() {
230
230
 
231
231
  console.log("\n--- Turn 2 ---");
232
232
  console.log("🤖 Agent:", response2.message);
233
- console.log("📊 Extracted data:", response2.session?.extracted);
233
+ console.log("📊 Collected data:", response2.session?.data);
234
234
 
235
235
  await persistence.saveMessage({
236
236
  sessionId: sessionData.id,
@@ -246,20 +246,18 @@ async function example() {
246
246
 
247
247
  if (response2.isRouteComplete) {
248
248
  console.log("\n✅ Support ticket route complete!");
249
- await fileSupportTicket(
250
- agent.getExtractedData(session.id) as SupportTicketData
251
- );
249
+ await fileSupportTicket(agent.getData(session.id) as SupportTicketData);
252
250
  }
253
251
 
254
- // Load session state from Redis (demonstrates persistence)
252
+ // Load session step from Redis (demonstrates persistence)
255
253
  console.log("\n--- Loading Session from Redis ---");
256
- const loadedSession = await persistence.loadSessionState<SupportTicketData>(
254
+ const loadedSession = await persistence.loadSessionStep<SupportTicketData>(
257
255
  sessionData.id
258
256
  );
259
257
 
260
258
  console.log("📥 Loaded session:", {
261
259
  currentRoute: loadedSession?.currentRoute?.title,
262
- extracted: loadedSession?.extracted,
260
+ data: loadedSession?.data,
263
261
  });
264
262
 
265
263
  // Get messages
@@ -275,7 +273,7 @@ async function example() {
275
273
  }
276
274
 
277
275
  /**
278
- * Advanced Example: High-Throughput Chat with Session State
276
+ * Advanced Example: High-Throughput Chat with Session Step
279
277
  */
280
278
  async function highThroughputExample() {
281
279
  const redis = new Redis();
@@ -301,7 +299,7 @@ async function highThroughputExample() {
301
299
  // Simple chat route that extracts topic and sentiment
302
300
  const chatRoute = agent.createRoute<QuickChatData>({
303
301
  title: "General Chat",
304
- extractionSchema: {
302
+ schema: {
305
303
  type: "object",
306
304
  properties: {
307
305
  topic: {
@@ -318,18 +316,18 @@ async function highThroughputExample() {
318
316
  },
319
317
  });
320
318
 
321
- chatRoute.initialState
322
- .transitionTo({
323
- chatState: "Chat and extract topic/sentiment",
324
- gather: ["topic", "sentiment"],
319
+ chatRoute.initialStep
320
+ .nextStep({
321
+ instructions: "Chat and extract topic/sentiment",
322
+ collect: ["topic", "sentiment"],
325
323
  })
326
- .transitionTo({ state: END_STATE });
324
+ .nextStep({ step: END_ROUTE });
327
325
 
328
326
  const persistence = agent.getPersistenceManager()!;
329
327
 
330
328
  // Create session
331
- const { sessionData, sessionState } =
332
- await persistence.createSessionWithState<QuickChatData>({
329
+ const { sessionData, sessionStep } =
330
+ await persistence.createSessionWithStep<QuickChatData>({
333
331
  userId: "user_456",
334
332
  agentName: "Chat Bot",
335
333
  });
@@ -343,20 +341,18 @@ async function highThroughputExample() {
343
341
  "I'm loving the new features you added!"
344
342
  ),
345
343
  ],
346
- session: sessionState,
344
+ session: sessionStep,
347
345
  });
348
346
 
349
347
  console.log("🤖 Response:", response.message);
350
- console.log("📊 Extracted:", response.session?.extracted);
348
+ console.log("📊 Data:", response.session?.data);
351
349
 
352
350
  if (response.isRouteComplete) {
353
351
  console.log("\n✅ Chat analytics route complete!");
354
- await logChatAnalytics(
355
- agent.getExtractedData(sessionData.id) as QuickChatData
356
- );
352
+ await logChatAnalytics(agent.getData(sessionData.id) as QuickChatData);
357
353
  }
358
354
 
359
- console.log("💾 Session state cached in Redis!");
355
+ console.log("💾 Session step cached in Redis!");
360
356
 
361
357
  await redis.quit();
362
358
  }
@@ -383,7 +379,7 @@ async function sessionRecoveryExample() {
383
379
 
384
380
  const orderRoute = agent.createRoute<OrderData>({
385
381
  title: "Place Order",
386
- extractionSchema: {
382
+ schema: {
387
383
  type: "object",
388
384
  properties: {
389
385
  productId: { type: "string" },
@@ -394,22 +390,22 @@ async function sessionRecoveryExample() {
394
390
  },
395
391
  });
396
392
 
397
- orderRoute.initialState
398
- .transitionTo({
399
- chatState: "Ask what to order",
400
- gather: ["productId", "quantity"],
393
+ orderRoute.initialStep
394
+ .nextStep({
395
+ instructions: "Ask what to order",
396
+ collect: ["productId", "quantity"],
401
397
  })
402
- .transitionTo({
403
- chatState: "Ask for shipping address",
404
- gather: ["shippingAddress"],
398
+ .nextStep({
399
+ instructions: "Ask for shipping address",
400
+ collect: ["shippingAddress"],
405
401
  })
406
- .transitionTo({ state: END_STATE });
402
+ .nextStep({ step: END_ROUTE });
407
403
 
408
404
  const persistence = agent.getPersistenceManager()!;
409
405
 
410
406
  // Start a new session
411
- const { sessionData, sessionState } =
412
- await persistence.createSessionWithState<OrderData>({
407
+ const { sessionData, sessionStep } =
408
+ await persistence.createSessionWithStep<OrderData>({
413
409
  userId: "user_789",
414
410
  agentName: "Order Assistant",
415
411
  });
@@ -427,23 +423,23 @@ async function sessionRecoveryExample() {
427
423
  "I want to order product ABC123, 2 units"
428
424
  ),
429
425
  ],
430
- session: sessionState,
426
+ session: sessionStep,
431
427
  });
432
428
 
433
429
  console.log("🤖 Response:", response1.message);
434
- console.log("📊 Extracted so far:", response1.session?.extracted);
430
+ console.log("📊 Data so far:", response1.session?.data);
435
431
 
436
432
  // --- Simulate user disconnecting and reconnecting ---
437
433
  console.log("\n--- User Reconnects ---");
438
434
 
439
435
  // Load session from Redis
440
- const recoveredSession = await persistence.loadSessionState<OrderData>(
436
+ const recoveredSession = await persistence.loadSessionStep<OrderData>(
441
437
  sessionId
442
438
  );
443
439
 
444
- console.log("📥 Recovered session state:", {
440
+ console.log("📥 Recovered session step:", {
445
441
  currentRoute: recoveredSession?.currentRoute?.title,
446
- extracted: recoveredSession?.extracted,
442
+ data: recoveredSession?.data,
447
443
  });
448
444
 
449
445
  // Load message history
@@ -465,13 +461,11 @@ async function sessionRecoveryExample() {
465
461
  });
466
462
 
467
463
  console.log("🤖 Response:", response2.message);
468
- console.log("📊 Final extracted data:", response2.session?.extracted);
464
+ console.log("📊 Final collected data:", response2.session?.data);
469
465
 
470
466
  if (response2.isRouteComplete) {
471
467
  console.log("\n✅ Order placement complete!");
472
- await processOrder(
473
- agent.getExtractedData(sessionId) as unknown as OrderData
474
- );
468
+ await processOrder(agent.getData(sessionId) as unknown as OrderData);
475
469
  }
476
470
 
477
471
  console.log("✅ Order complete with recovered session!");
@@ -13,8 +13,8 @@ import {
13
13
  GeminiProvider,
14
14
  createMessageEvent,
15
15
  EventSource,
16
- END_STATE,
17
- type SessionState,
16
+ END_ROUTE,
17
+ type SessionStep,
18
18
  } from "../src/index";
19
19
 
20
20
  // Type definitions for our booking data
@@ -46,7 +46,7 @@ async function main() {
46
46
  title: "Book Hotel",
47
47
  description: "Collects hotel booking information",
48
48
  conditions: ["User wants to book a hotel"],
49
- extractionSchema: {
49
+ schema: {
50
50
  type: "object",
51
51
  properties: {
52
52
  hotelName: { type: "string" },
@@ -56,46 +56,47 @@ async function main() {
56
56
  required: ["hotelName", "date", "guests"],
57
57
  },
58
58
  // Configure completion message at route level
59
- endState: {
60
- chatState: "Confirm the booking with a summary of the hotel, date, and number of guests. Be enthusiastic!",
59
+ endStep: {
60
+ instructions:
61
+ "Confirm the booking with a summary of the hotel, date, and number of guests. Be enthusiastic!",
61
62
  },
62
63
  // Option 1: Simple string
63
64
  onComplete: "Collect Feedback",
64
65
  // Option 2: Object with condition
65
66
  // onComplete: {
66
- // transitionTo: "Collect Feedback",
67
+ // nextStep: "Collect Feedback",
67
68
  // condition: "if booking was successful"
68
69
  // },
69
70
  // Option 3: Function with logic
70
71
  // onComplete: (session) => {
71
- // if (session.extracted?.guests && session.extracted.guests > 5) {
72
+ // if (session.data?.guests && session.data.guests > 5) {
72
73
  // return "VIP Feedback"; // Different feedback for large groups
73
74
  // }
74
75
  // return "Collect Feedback";
75
76
  // },
76
77
  });
77
78
 
78
- const askHotel = bookingRoute.initialState.transitionTo({
79
- chatState: "Ask which hotel they want to book",
80
- gather: ["hotelName"],
81
- skipIf: (extracted) => !!extracted.hotelName,
79
+ const askHotel = bookingRoute.initialStep.nextStep({
80
+ instructions: "Ask which hotel they want to book",
81
+ collect: ["hotelName"],
82
+ skipIf: (data) => !!data.hotelName,
82
83
  });
83
84
 
84
- const askDate = askHotel.transitionTo({
85
- chatState: "Ask for the booking date",
86
- gather: ["date"],
87
- skipIf: (extracted) => !!extracted.date,
85
+ const askDate = askHotel.nextStep({
86
+ instructions: "Ask for the booking date",
87
+ collect: ["date"],
88
+ skipIf: (data) => !!data.date,
88
89
  });
89
90
 
90
- const askGuests = askDate.transitionTo({
91
- chatState: "Ask for the number of guests",
92
- gather: ["guests"],
93
- skipIf: (extracted) => !!extracted.guests,
91
+ const askGuests = askDate.nextStep({
92
+ instructions: "Ask for the number of guests",
93
+ collect: ["guests"],
94
+ skipIf: (data) => !!data.guests,
94
95
  });
95
96
 
96
- // No need to specify chatState here - using route-level endState configuration
97
- askGuests.transitionTo({
98
- state: END_STATE,
97
+ // No need to specify instructions here - using route-level endStep configuration
98
+ askGuests.nextStep({
99
+ step: END_ROUTE,
99
100
  });
100
101
 
101
102
  // Route 2: Feedback Collection
@@ -103,7 +104,7 @@ async function main() {
103
104
  title: "Collect Feedback",
104
105
  description: "Collects user feedback after booking",
105
106
  conditions: ["User wants to provide feedback"],
106
- extractionSchema: {
107
+ schema: {
107
108
  type: "object",
108
109
  properties: {
109
110
  rating: { type: "number" },
@@ -112,31 +113,32 @@ async function main() {
112
113
  required: ["rating"],
113
114
  },
114
115
  // Configure completion message for feedback route
115
- endState: {
116
- chatState: "Thank the user warmly for their feedback and let them know their input is valuable",
116
+ endStep: {
117
+ instructions:
118
+ "Thank the user warmly for their feedback and let them know their input is valuable",
117
119
  },
118
120
  });
119
121
 
120
- const askRating = feedbackRoute.initialState.transitionTo({
121
- chatState: "Ask for rating from 1 to 5",
122
- gather: ["rating"],
123
- skipIf: (extracted) => !!extracted.rating,
122
+ const askRating = feedbackRoute.initialStep.nextStep({
123
+ instructions: "Ask for rating from 1 to 5",
124
+ collect: ["rating"],
125
+ skipIf: (data) => !!data.rating,
124
126
  });
125
127
 
126
- const askComments = askRating.transitionTo({
127
- chatState: "Ask for any additional comments (optional)",
128
- gather: ["comments"],
128
+ const askComments = askRating.nextStep({
129
+ instructions: "Ask for any additional comments (optional)",
130
+ collect: ["comments"],
129
131
  });
130
132
 
131
- // No need to specify chatState here - using route-level endState configuration
132
- askComments.transitionTo({
133
- state: END_STATE,
133
+ // No need to specify instructions here - using route-level endStep configuration
134
+ askComments.nextStep({
135
+ step: END_ROUTE,
134
136
  });
135
137
 
136
138
  console.log("\n=== Route Transitions Example ===\n");
137
139
 
138
140
  // Conversation 1: User provides all booking info at once
139
- let session: SessionState | undefined;
141
+ let session: SessionStep | undefined;
140
142
  let history = [
141
143
  createMessageEvent(
142
144
  EventSource.CUSTOMER,
@@ -155,12 +157,15 @@ async function main() {
155
157
  "Pending transition?",
156
158
  response1.session?.pendingTransition?.targetRouteId
157
159
  );
158
- console.log("Extracted booking data:", response1.session?.extracted);
160
+ console.log("Data booking data:", response1.session?.data);
159
161
 
160
162
  session = response1.session;
161
163
  history = [
162
164
  ...history,
163
- { ...createMessageEvent(EventSource.AI_AGENT, "Bot", response1.message), id: "2" },
165
+ {
166
+ ...createMessageEvent(EventSource.AI_AGENT, "Bot", response1.message),
167
+ id: "2",
168
+ },
164
169
  ];
165
170
 
166
171
  // Second response - should auto-transition to a feedback route
@@ -178,7 +183,10 @@ async function main() {
178
183
  session = response2.session;
179
184
  history = [
180
185
  ...history,
181
- { ...createMessageEvent(EventSource.AI_AGENT, "Bot", response2.message), id: "4" },
186
+ {
187
+ ...createMessageEvent(EventSource.AI_AGENT, "Bot", response2.message),
188
+ id: "4",
189
+ },
182
190
  ];
183
191
 
184
192
  // Third response - provide rating
@@ -195,13 +203,13 @@ async function main() {
195
203
  const response3 = await agent.respond({ history, session });
196
204
  console.log("\nBot:", response3.message);
197
205
  console.log("Current route:", response3.session?.currentRoute?.title);
198
- console.log("Extracted feedback data:", response3.session?.extracted);
206
+ console.log("Data feedback data:", response3.session?.data);
199
207
  console.log("Route complete?", response3.isRouteComplete);
200
208
 
201
209
  console.log("\n=== Manual Transition Example ===\n");
202
210
 
203
- // Demonstrate manual transition using agent.transitionToRoute()
204
- let session2: SessionState | undefined;
211
+ // Demonstrate manual transition using agent.nextStepRoute()
212
+ let session2: SessionStep | undefined;
205
213
  let history2 = [
206
214
  createMessageEvent(
207
215
  EventSource.CUSTOMER,
@@ -212,14 +220,17 @@ async function main() {
212
220
 
213
221
  console.log("User:", history2[0].data.message);
214
222
 
215
- const manualResponse = await agent.respond({ history: history2, session: session2 });
223
+ const manualResponse = await agent.respond({
224
+ history: history2,
225
+ session: session2,
226
+ });
216
227
  console.log("\nBot:", manualResponse.message);
217
228
  console.log("Route complete?", manualResponse.isRouteComplete);
218
229
 
219
230
  if (manualResponse.isRouteComplete && manualResponse.session) {
220
231
  // Manually trigger transition instead of auto-transition
221
232
  console.log("\n[Manually transitioning to feedback route...]");
222
- session2 = agent.transitionToRoute("Collect Feedback", manualResponse.session);
233
+ session2 = agent.nextStepRoute("Collect Feedback", manualResponse.session);
223
234
  console.log(
224
235
  "Pending transition set:",
225
236
  session2.pendingTransition?.targetRouteId
@@ -227,13 +238,26 @@ async function main() {
227
238
 
228
239
  history2 = [
229
240
  ...history2,
230
- { ...createMessageEvent(EventSource.AI_AGENT, "Bot", manualResponse.message), id: "2" },
241
+ {
242
+ ...createMessageEvent(
243
+ EventSource.AI_AGENT,
244
+ "Bot",
245
+ manualResponse.message
246
+ ),
247
+ id: "2",
248
+ },
231
249
  createMessageEvent(EventSource.CUSTOMER, "Bob", "Great!"),
232
250
  ];
233
251
 
234
- const feedbackResponse = await agent.respond({ history: history2, session: session2 });
252
+ const feedbackResponse = await agent.respond({
253
+ history: history2,
254
+ session: session2,
255
+ });
235
256
  console.log("\nBot:", feedbackResponse.message);
236
- console.log("Current route:", feedbackResponse.session?.currentRoute?.title);
257
+ console.log(
258
+ "Current route:",
259
+ feedbackResponse.session?.currentRoute?.title
260
+ );
237
261
  }
238
262
 
239
263
  console.log("\n=== Done ===\n");
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Rules & Prohibitions Example
3
- * Updated for v2 architecture with session state management
3
+ * Updated for v2 architecture with session step management
4
4
  *
5
5
  * Demonstrates how to use rules and prohibitions to control agent behavior
6
6
  * in different conversation routes (e.g., WhatsApp bot with different styles)
@@ -12,7 +12,7 @@ import {
12
12
  type MessageEventData,
13
13
  EventKind,
14
14
  EventSource,
15
- END_STATE,
15
+ END_ROUTE,
16
16
  } from "../src";
17
17
  import { OpenAIProvider } from "../src/providers/OpenAIProvider";
18
18
 
@@ -99,26 +99,26 @@ agent.createRoute({
99
99
  ],
100
100
  });
101
101
 
102
- // Add a stateful feedback flow to the Technical Support route
102
+ // Add a stepful feedback flow to the Technical Support route
103
103
  const techSupportRoute = agent
104
104
  .getRoutes()
105
105
  .find((r) => r.title === "Technical Support")!;
106
- techSupportRoute.initialState
107
- .transitionTo({
108
- chatState: "Provide step-by-step technical assistance.",
106
+ techSupportRoute.initialStep
107
+ .nextStep({
108
+ instructions: "Provide step-by-step technical assistance.",
109
109
  })
110
- .transitionTo({
111
- chatState: "Ask for a rating of the support provided (1-5).",
112
- gather: ["feedbackRating"],
110
+ .nextStep({
111
+ instructions: "Ask for a rating of the support provided (1-5).",
112
+ collect: ["feedbackRating"],
113
113
  })
114
- .transitionTo({
115
- chatState: "Ask for any additional comments.",
116
- gather: ["feedbackComments"],
114
+ .nextStep({
115
+ instructions: "Ask for any additional comments.",
116
+ collect: ["feedbackComments"],
117
117
  })
118
- .transitionTo({
119
- chatState: "Thank the user for their feedback.",
118
+ .nextStep({
119
+ instructions: "Thank the user for their feedback.",
120
120
  })
121
- .transitionTo({ state: END_STATE });
121
+ .nextStep({ step: END_ROUTE });
122
122
 
123
123
  agent.createRoute({
124
124
  title: "Emergency Support",
@@ -231,26 +231,26 @@ async function demonstrateRulesAndProhibitions() {
231
231
  ],
232
232
  });
233
233
 
234
- // Add a stateful feedback flow to the Technical Support route
234
+ // Add a stepful feedback flow to the Technical Support route
235
235
  const techSupportRoute = agent
236
236
  .getRoutes()
237
237
  .find((r) => r.title === "Technical Support")!;
238
- techSupportRoute.initialState
239
- .transitionTo({
240
- chatState: "Provide step-by-step technical assistance.",
238
+ techSupportRoute.initialStep
239
+ .nextStep({
240
+ instructions: "Provide step-by-step technical assistance.",
241
241
  })
242
- .transitionTo({
243
- chatState: "Ask for a rating of the support provided (1-5).",
244
- gather: ["feedbackRating"],
242
+ .nextStep({
243
+ instructions: "Ask for a rating of the support provided (1-5).",
244
+ collect: ["feedbackRating"],
245
245
  })
246
- .transitionTo({
247
- chatState: "Ask for any additional comments.",
248
- gather: ["feedbackComments"],
246
+ .nextStep({
247
+ instructions: "Ask for any additional comments.",
248
+ collect: ["feedbackComments"],
249
249
  })
250
- .transitionTo({
251
- chatState: "Thank the user for their feedback.",
250
+ .nextStep({
251
+ instructions: "Thank the user for their feedback.",
252
252
  })
253
- .transitionTo({ state: END_STATE });
253
+ .nextStep({ step: END_ROUTE });
254
254
 
255
255
  agent.createRoute({
256
256
  title: "Emergency Support",