@falai/agent 0.6.9 → 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 OpenSearch for Persistence with Session State
2
+ * Example: Using OpenSearch for Persistence with Session Step
3
3
  *
4
4
  * OpenSearch provides powerful persistence with:
5
5
  * - Full-text search across conversations
6
- * - Analytics and aggregations on extracted data
6
+ * - Analytics and aggregations on collected data
7
7
  * - Time-series analysis of sessions
8
8
  * - Compatible with Elasticsearch 7.x
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 { Client } from "@opensearch-project/opensearch";
@@ -92,7 +92,7 @@ async function example() {
92
92
  },
93
93
  persistence: {
94
94
  adapter,
95
- autoSave: true, // Auto-save session state with extracted data
95
+ autoSave: true, // Auto-save session step with collected data
96
96
  userId,
97
97
  },
98
98
  });
@@ -106,7 +106,7 @@ async function example() {
106
106
  "User reports an issue or problem",
107
107
  "User is dissatisfied",
108
108
  ],
109
- extractionSchema: {
109
+ schema: {
110
110
  type: "object",
111
111
  properties: {
112
112
  category: {
@@ -136,37 +136,37 @@ async function example() {
136
136
  },
137
137
  });
138
138
 
139
- // State flow
140
- complaintRoute.initialState
141
- .transitionTo({
142
- chatState: "Understand the complaint",
143
- gather: ["category", "severity", "description"],
139
+ // Step flow
140
+ complaintRoute.initialStep
141
+ .nextStep({
142
+ instructions: "Understand the complaint",
143
+ collect: ["category", "severity", "description"],
144
144
  skipIf: (data) => !!data.description,
145
145
  })
146
- .transitionTo({
147
- chatState: "Identify affected service",
148
- gather: ["affectedService"],
146
+ .nextStep({
147
+ instructions: "Identify affected service",
148
+ collect: ["affectedService"],
149
149
  skipIf: (data) => !!data.affectedService,
150
- requiredData: ["description"],
150
+ requires: ["description"],
151
151
  })
152
- .transitionTo({
153
- chatState: "Ask for desired resolution",
154
- gather: ["requestedResolution"],
152
+ .nextStep({
153
+ instructions: "Ask for desired resolution",
154
+ collect: ["requestedResolution"],
155
155
  skipIf: (data) => !!data.requestedResolution,
156
- requiredData: ["category", "description"],
156
+ requires: ["category", "description"],
157
157
  })
158
- .transitionTo({
159
- chatState: "Propose solution and close complaint",
160
- requiredData: ["category", "description"],
158
+ .nextStep({
159
+ instructions: "Propose solution and close complaint",
160
+ requires: ["category", "description"],
161
161
  })
162
- .transitionTo({ state: END_STATE });
162
+ .nextStep({ step: END_ROUTE });
163
163
 
164
164
  const persistence = agent.getPersistenceManager();
165
165
  if (!persistence) return;
166
166
 
167
- // Create session with state
168
- const { sessionData, sessionState } =
169
- await persistence.createSessionWithState<ComplaintData>({
167
+ // Create session with step
168
+ const { sessionData, sessionStep } =
169
+ await persistence.createSessionWithStep<ComplaintData>({
170
170
  userId,
171
171
  agentName: "Customer Service Agent",
172
172
  initialData: {
@@ -178,7 +178,7 @@ async function example() {
178
178
 
179
179
  // Conversation flow
180
180
  const history: Event<MessageEventData>[] = [];
181
- let session = sessionState;
181
+ let session = sessionStep;
182
182
 
183
183
  // Turn 1
184
184
  console.log("\n--- Turn 1 ---");
@@ -192,7 +192,7 @@ async function example() {
192
192
  const response1 = await agent.respond({ history, session });
193
193
 
194
194
  console.log("šŸ¤– Agent:", response1.message);
195
- console.log("šŸ“Š Extracted:", response1.session?.extracted);
195
+ console.log("šŸ“Š Data:", response1.session?.data);
196
196
 
197
197
  await persistence.saveMessage({
198
198
  sessionId: sessionData.id,
@@ -206,7 +206,7 @@ async function example() {
206
206
  role: "agent",
207
207
  content: response1.message,
208
208
  route: response1.session?.currentRoute?.id,
209
- state: response1.session?.currentState?.id,
209
+ step: response1.session?.currentStep?.id,
210
210
  });
211
211
 
212
212
  session = response1.session!;
@@ -227,7 +227,7 @@ async function example() {
227
227
  const response2 = await agent.respond({ history, session });
228
228
 
229
229
  console.log("šŸ¤– Agent:", response2.message);
230
- console.log("šŸ“Š Extracted:", response2.session?.extracted);
230
+ console.log("šŸ“Š Data:", response2.session?.data);
231
231
 
232
232
  await persistence.saveMessage({
233
233
  sessionId: sessionData.id,
@@ -243,20 +243,18 @@ async function example() {
243
243
 
244
244
  if (response2.isRouteComplete) {
245
245
  console.log("\nāœ… Complaint route complete!");
246
- await createSupportTicket(
247
- agent.getExtractedData(session.id) as ComplaintData
248
- );
246
+ await createSupportTicket(agent.getData(session.id) as ComplaintData);
249
247
  }
250
248
 
251
249
  // Load session from OpenSearch
252
250
  console.log("\n--- Loading Session from OpenSearch ---");
253
- const loadedSession = await persistence.loadSessionState<ComplaintData>(
251
+ const loadedSession = await persistence.loadSessionStep<ComplaintData>(
254
252
  sessionData.id
255
253
  );
256
254
 
257
255
  console.log("šŸ“„ Loaded session:", {
258
256
  currentRoute: loadedSession?.currentRoute?.title,
259
- extracted: loadedSession?.extracted,
257
+ data: loadedSession?.data,
260
258
  });
261
259
 
262
260
  // Demonstrate full-text search
@@ -306,7 +304,7 @@ async function example() {
306
304
  }
307
305
 
308
306
  /**
309
- * Advanced Example: Search and Analytics on Extracted Data
307
+ * Advanced Example: Search and Analytics on Collected data
310
308
  */
311
309
  async function analyticsExample() {
312
310
  const client = new Client({
@@ -346,7 +344,7 @@ async function analyticsExample() {
346
344
 
347
345
  const ticketRoute = agent.createRoute<TicketData>({
348
346
  title: "Analyze Support Ticket",
349
- extractionSchema: {
347
+ schema: {
350
348
  type: "object",
351
349
  properties: {
352
350
  ticketType: { type: "string" },
@@ -360,17 +358,17 @@ async function analyticsExample() {
360
358
  },
361
359
  });
362
360
 
363
- ticketRoute.initialState.transitionTo({
364
- chatState: "Analyze and categorize ticket",
365
- gather: ["ticketType", "priority", "tags"],
361
+ ticketRoute.initialStep.nextStep({
362
+ instructions: "Analyze and categorize ticket",
363
+ collect: ["ticketType", "priority", "tags"],
366
364
  });
367
365
 
368
366
  const persistence = agent.getPersistenceManager()!;
369
367
 
370
368
  // Create multiple sessions
371
369
  for (let i = 0; i < 3; i++) {
372
- const { sessionData, sessionState } =
373
- await persistence.createSessionWithState<TicketData>({
370
+ const { sessionData, sessionStep } =
371
+ await persistence.createSessionWithStep<TicketData>({
374
372
  userId: "analyst_001",
375
373
  agentName: "Support Analyzer",
376
374
  });
@@ -385,7 +383,7 @@ async function analyticsExample() {
385
383
  }`
386
384
  ),
387
385
  ],
388
- session: sessionState,
386
+ session: sessionStep,
389
387
  });
390
388
 
391
389
  await persistence.saveMessage({
@@ -410,14 +408,14 @@ async function analyticsExample() {
410
408
  `šŸ“Š Total sessions indexed: ${allSessions.body.hits.total.value}`
411
409
  );
412
410
 
413
- // Analyze extracted data patterns
414
- console.log("\n--- Analyze Extracted Data ---");
411
+ // Analyze collected data patterns
412
+ console.log("\n--- Analyze Collected data ---");
415
413
  const sessions = allSessions.body.hits.hits;
416
414
 
417
415
  sessions.forEach((hit: any) => {
418
416
  const collectedData = hit._source.collectedData;
419
417
  console.log(`Session ${hit._id}:`, {
420
- extracted: collectedData?.extracted,
418
+ data: collectedData?.data,
421
419
  route: hit._source.currentRoute,
422
420
  });
423
421
  });
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Persistent multi-turn onboarding agent example
3
- * Updated for v2 architecture with session state management and schema-first data extraction
3
+ * Updated for v2 architecture with session step management and schema-first data extraction
4
4
  */
5
5
 
6
6
  import {
7
7
  Agent,
8
8
  defineTool,
9
9
  GeminiProvider,
10
- END_STATE,
10
+ END_ROUTE,
11
11
  EventSource,
12
12
  createMessageEvent,
13
13
  createSession,
@@ -100,25 +100,24 @@ async function createPersistentOnboardingAgent(sessionId: string) {
100
100
 
101
101
  // Define lifecycle hooks for automatic persistence
102
102
  const hooks = {
103
- // Called after data extraction - validate and enrich extracted data
104
- onExtractedUpdate: async (extracted: Partial<OnboardingData>) => {
105
- console.log("šŸ”„ Processing extracted data...");
103
+ // Called after data extraction - validate and enrich collected data
104
+ onDataUpdate: async (data: Partial<OnboardingData>) => {
105
+ console.log("šŸ”„ Processing collected data...");
106
106
 
107
- // Update completed steps based on what's been extracted
107
+ // Update completed steps based on what's been data
108
108
  const completedSteps: string[] = [];
109
- if (extracted.businessName) completedSteps.push("business_info");
110
- if (extracted.businessDescription)
111
- completedSteps.push("business_description");
112
- if (extracted.industry) completedSteps.push("industry");
113
- if (extracted.contactEmail) completedSteps.push("contact");
109
+ if (data.businessName) completedSteps.push("business_info");
110
+ if (data.businessDescription) completedSteps.push("business_description");
111
+ if (data.industry) completedSteps.push("industry");
112
+ if (data.contactEmail) completedSteps.push("contact");
114
113
 
115
114
  // Persist to database
116
115
  await db.sessions.update(sessionId, {
117
- collectedData: extracted,
116
+ collectedData: data,
118
117
  completedSteps,
119
118
  });
120
119
 
121
- return extracted;
120
+ return data;
122
121
  },
123
122
  };
124
123
 
@@ -244,7 +243,7 @@ async function createPersistentOnboardingAgent(sessionId: string) {
244
243
  title: "Business Onboarding",
245
244
  description: "Guide user through business information collection",
246
245
  conditions: ["User is onboarding their business"],
247
- extractionSchema: {
246
+ schema: {
248
247
  type: "object",
249
248
  properties: {
250
249
  businessName: {
@@ -266,55 +265,55 @@ async function createPersistentOnboardingAgent(sessionId: string) {
266
265
  },
267
266
  required: ["businessName", "businessDescription"],
268
267
  },
269
- endState: {
270
- chatState: "Summarize all collected information warmly and confirm onboarding is complete",
268
+ endStep: {
269
+ instructions:
270
+ "Summarize all collected information warmly and confirm onboarding is complete",
271
271
  },
272
272
  });
273
273
 
274
- // State 1: Gather business name and description
275
- const gatherBusinessInfo = onboardingRoute.initialState.transitionTo({
276
- chatState: "Ask for business name and a brief description",
277
- gather: ["businessName", "businessDescription"],
278
- skipIf: (extracted) =>
279
- !!extracted.businessName && !!extracted.businessDescription,
274
+ // Step 1: Collect business name and description
275
+ const collectBusinessInfo = onboardingRoute.initialStep.nextStep({
276
+ instructions: "Ask for business name and a brief description",
277
+ collect: ["businessName", "businessDescription"],
278
+ skipIf: (data) => !!data.businessName && !!data.businessDescription,
280
279
  condition: "Need to collect basic business information first",
281
280
  });
282
281
 
283
- // State 2: Save business info (tool execution)
284
- const saveBusiness = gatherBusinessInfo.transitionTo({
285
- toolState: saveBusinessInfo,
286
- requiredData: ["businessName", "businessDescription"],
282
+ // Step 2: Save business info (tool execution)
283
+ const saveBusiness = collectBusinessInfo.nextStep({
284
+ tool: saveBusinessInfo,
285
+ requires: ["businessName", "businessDescription"],
287
286
  condition: "Business name and description provided, save to database",
288
287
  });
289
288
 
290
- // State 3: Gather industry
291
- const gatherIndustry = saveBusiness.transitionTo({
292
- chatState: "Ask what industry the business operates in",
293
- gather: ["industry"],
294
- skipIf: (extracted) => !!extracted.industry,
289
+ // Step 3: Collect industry
290
+ const collectIndustry = saveBusiness.nextStep({
291
+ instructions: "Ask what industry the business operates in",
292
+ collect: ["industry"],
293
+ skipIf: (data) => !!data.industry,
295
294
  });
296
295
 
297
- // State 4: Save industry (tool execution)
298
- const saveIndustryStep = gatherIndustry.transitionTo({
299
- toolState: saveIndustry,
300
- requiredData: ["industry"],
296
+ // Step 4: Save industry (tool execution)
297
+ const saveIndustryStep = collectIndustry.nextStep({
298
+ tool: saveIndustry,
299
+ requires: ["industry"],
301
300
  });
302
301
 
303
- // State 5: Gather contact email
304
- const gatherContact = saveIndustryStep.transitionTo({
305
- chatState: "Ask for their contact email",
306
- gather: ["contactEmail"],
307
- skipIf: (extracted) => !!extracted.contactEmail,
302
+ // Step 5: Collect contact email
303
+ const collectContact = saveIndustryStep.nextStep({
304
+ instructions: "Ask for their contact email",
305
+ collect: ["contactEmail"],
306
+ skipIf: (data) => !!data.contactEmail,
308
307
  });
309
308
 
310
- // State 6: Save contact (tool execution)
311
- const saveContact = gatherContact.transitionTo({
312
- toolState: saveContactEmail,
313
- requiredData: ["contactEmail"],
309
+ // Step 6: Save contact (tool execution)
310
+ const saveContact = collectContact.nextStep({
311
+ tool: saveContactEmail,
312
+ requires: ["contactEmail"],
314
313
  });
315
314
 
316
- // State 7: Confirmation - uses route-level endState
317
- saveContact.transitionTo({ state: END_STATE });
315
+ // Step 7: Confirmation - uses route-level endStep
316
+ saveContact.nextStep({ step: END_ROUTE });
318
317
 
319
318
  // Guidelines
320
319
  onboardingRoute.createGuideline({
@@ -415,7 +414,7 @@ async function main() {
415
414
 
416
415
  console.log("=== MULTI-TURN CONVERSATION SIMULATION ===\n");
417
416
 
418
- // Initialize session state for multi-turn conversation
417
+ // Initialize session step for multi-turn conversation
419
418
  let session = createSession<OnboardingData>();
420
419
 
421
420
  // Turn 1: Start onboarding
@@ -431,7 +430,7 @@ async function main() {
431
430
  session,
432
431
  });
433
432
  console.log("šŸ¤– Bot:", response1.message);
434
- console.log("šŸ“Š Extracted after turn 1:", response1.session?.extracted);
433
+ console.log("šŸ“Š Data after turn 1:", response1.session?.data);
435
434
  console.log("šŸ“Š Route:", response1.session?.currentRoute?.title);
436
435
 
437
436
  // Check route completion after turn 1
@@ -464,7 +463,7 @@ async function main() {
464
463
  ];
465
464
  const response2 = await agent.respond({ history: history2, session });
466
465
  console.log("šŸ¤– Bot:", response2.message);
467
- console.log("šŸ“Š Extracted after turn 2:", response2.session?.extracted);
466
+ console.log("šŸ“Š Data after turn 2:", response2.session?.data);
468
467
 
469
468
  // Check route completion after turn 2
470
469
  console.log("šŸ” Route Completion Check (Turn 2):");
@@ -492,7 +491,7 @@ async function main() {
492
491
  ];
493
492
  const response3 = await agent.respond({ history: history3, session });
494
493
  console.log("šŸ¤– Bot:", response3.message);
495
- console.log("šŸ“Š Extracted after turn 3:", response3.session?.extracted);
494
+ console.log("šŸ“Š Data after turn 3:", response3.session?.data);
496
495
 
497
496
  // Check route completion after turn 3
498
497
  console.log("šŸ” Route Completion Check (Turn 3):");
@@ -520,13 +519,13 @@ async function main() {
520
519
  ];
521
520
  const response4 = await agent.respond({ history: history4, session });
522
521
  console.log("šŸ¤– Bot:", response4.message);
523
- console.log("šŸ“Š Extracted after turn 4:", response4.session?.extracted);
522
+ console.log("šŸ“Š Data after turn 4:", response4.session?.data);
524
523
 
525
524
  // Check for route completion
526
525
  if (response4.isRouteComplete) {
527
526
  console.log("\nāœ… Onboarding complete!");
528
527
  await finalizeOnboarding(
529
- agent.getExtractedData(response4.session?.id) as unknown as OnboardingData
528
+ agent.getData(response4.session?.id) as unknown as OnboardingData
530
529
  );
531
530
  }
532
531
 
@@ -544,17 +543,17 @@ async function main() {
544
543
  // ============================================================================
545
544
 
546
545
  /*
547
- * āœ… PATTERN 1: Session State Management (Core v2 pattern)
548
- * - createSession<T>(): Initialize typed session state
546
+ * āœ… PATTERN 1: Session Step Management (Core v2 pattern)
547
+ * - createSession<T>(): Initialize typed session step
549
548
  * - Pass session to respond() calls
550
- * - Session tracks extracted data across turns
549
+ * - Session tracks collected data across turns
551
550
  * - Always-on routing respects intent changes
552
551
  *
553
552
  * āœ… PATTERN 2: Schema-First Data Extraction
554
- * - extractionSchema: Define data contracts upfront
553
+ * - schema: Define data contracts upfront
555
554
  * - Type-safe extraction throughout conversation
556
- * - skipIf functions for deterministic state logic
557
- * - requiredData arrays for prerequisites
555
+ * - skipIf functions for deterministic step logic
556
+ * - requires arrays for prerequisites
558
557
  *
559
558
  * āœ… PATTERN 3: Context Provider (For external data sources)
560
559
  * - contextProvider: Load fresh context from database/API
@@ -562,19 +561,19 @@ async function main() {
562
561
  * - Perfect for real-time external data
563
562
  *
564
563
  * āœ… PATTERN 4: Lifecycle Hooks (Data validation & enrichment)
565
- * - onExtractedUpdate: Process extracted data after extraction
566
- * - Validate, enrich, and persist extracted data
567
- * - Return modified extracted data
564
+ * - onDataUpdate: Process collected data after extraction
565
+ * - Validate, enrich, and persist collected data
566
+ * - Return modified collected data
568
567
  *
569
568
  * āœ… PATTERN 5: Tool Integration (Enhanced context access)
570
- * - Tools access extracted data via context parameter
571
- * - Can return extractedUpdate to modify extracted data
569
+ * - Tools access collected data via context parameter
570
+ * - Can return dataUpdate to modify collected data
572
571
  * - Perfect for data validation and enrichment
573
572
  *
574
- * āœ… PATTERN 6: State Progression (Code-based logic)
573
+ * āœ… PATTERN 6: Step Progression (Code-based logic)
575
574
  * - skipIf: Deterministic functions instead of fuzzy conditions
576
- * - requiredData: Prerequisites for state transitions
577
- * - No more LLM interpretation of state logic
575
+ * - requires: Prerequisites for step transitions
576
+ * - No more LLM interpretation of step logic
578
577
  */
579
578
 
580
579
  /**