@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,7 +1,7 @@
1
1
  /**
2
- * Example: Custom Database Integration (Manual Session State Management)
2
+ * Example: Custom Database Integration (Manual Session Step Management)
3
3
  *
4
- * This example shows how to manually manage session state when using your own
4
+ * This example shows how to manually manage session step when using your own
5
5
  * database structure instead of the built-in persistence adapters.
6
6
  *
7
7
  * Use this approach if you:
@@ -16,10 +16,10 @@ import {
16
16
  createMessageEvent,
17
17
  EventSource,
18
18
  createSession,
19
- SessionState,
19
+ SessionStep,
20
20
  MessageEventData,
21
21
  Event,
22
- END_STATE,
22
+ END_ROUTE,
23
23
  } from "../src/index";
24
24
 
25
25
  /**
@@ -30,13 +30,13 @@ interface CustomDatabaseSession {
30
30
  id: string;
31
31
  userId: string;
32
32
  currentRoute?: string;
33
- currentState?: string;
33
+ currentStep?: string;
34
34
  collectedData?: {
35
- extracted?: Record<string, unknown>;
36
- extractedByRoute?: Record<string, Partial<unknown>>;
35
+ data?: Record<string, unknown>;
36
+ dataByRoute?: Record<string, Partial<unknown>>;
37
37
  routeHistory?: unknown[];
38
38
  currentRouteTitle?: string;
39
- currentStateDescription?: string;
39
+ currentStepDescription?: string;
40
40
  metadata?: Record<string, unknown>;
41
41
  };
42
42
  createdAt: Date;
@@ -50,7 +50,7 @@ interface CustomDatabaseMessage {
50
50
  role: "user" | "agent" | "system";
51
51
  content: string;
52
52
  route?: string;
53
- state?: string;
53
+ step?: string;
54
54
  createdAt: Date;
55
55
  }
56
56
 
@@ -148,7 +148,7 @@ async function example() {
148
148
  "User is a new customer",
149
149
  "User needs to set up their account",
150
150
  ],
151
- extractionSchema: {
151
+ schema: {
152
152
  type: "object",
153
153
  properties: {
154
154
  fullName: { type: "string" },
@@ -161,47 +161,47 @@ async function example() {
161
161
  },
162
162
  });
163
163
 
164
- // Define states with custom IDs
165
- onboardingRoute.initialState
166
- .transitionTo({
164
+ // Define steps with custom IDs
165
+ onboardingRoute.initialStep
166
+ .nextStep({
167
167
  id: "ask_name",
168
- chatState: "Ask for full name",
169
- gather: ["fullName"],
168
+ instructions: "Ask for full name",
169
+ collect: ["fullName"],
170
170
  skipIf: (data) => !!data.fullName,
171
171
  })
172
- .transitionTo({
172
+ .nextStep({
173
173
  id: "ask_email",
174
- chatState: "Ask for email address",
175
- gather: ["email"],
174
+ instructions: "Ask for email address",
175
+ collect: ["email"],
176
176
  skipIf: (data) => !!data.email,
177
177
  })
178
- .transitionTo({
178
+ .nextStep({
179
179
  id: "ask_company",
180
- chatState: "Ask for company name",
181
- gather: ["companyName"],
180
+ instructions: "Ask for company name",
181
+ collect: ["companyName"],
182
182
  skipIf: (data) => !!data.companyName,
183
183
  })
184
- .transitionTo({
184
+ .nextStep({
185
185
  id: "ask_phone",
186
- chatState: "Ask for phone number (optional)",
187
- gather: ["phoneNumber"],
186
+ instructions: "Ask for phone number (optional)",
187
+ collect: ["phoneNumber"],
188
188
  })
189
- .transitionTo({
189
+ .nextStep({
190
190
  id: "ask_industry",
191
- chatState: "Ask for industry",
192
- gather: ["industry"],
191
+ instructions: "Ask for industry",
192
+ collect: ["industry"],
193
193
  })
194
- .transitionTo({
194
+ .nextStep({
195
195
  id: "confirm_details",
196
- chatState: "Confirm all details",
197
- requiredData: ["fullName", "email", "companyName"],
196
+ instructions: "Confirm all details",
197
+ requires: ["fullName", "email", "companyName"],
198
198
  })
199
- .transitionTo({
199
+ .nextStep({
200
200
  id: "complete_onboarding",
201
- chatState:
201
+ instructions:
202
202
  "Thank you! Your account is set up. You will receive a confirmation email shortly.",
203
203
  })
204
- .transitionTo({ state: END_STATE });
204
+ .nextStep({ step: END_ROUTE });
205
205
 
206
206
  /**
207
207
  * Create or load session from your custom database
@@ -218,9 +218,9 @@ async function example() {
218
218
  }
219
219
 
220
220
  /**
221
- * Convert database session to agent SessionState
221
+ * Convert database session to agent SessionStep
222
222
  */
223
- let agentSession: SessionState<OnboardingData>;
223
+ let agentSession: SessionStep<OnboardingData>;
224
224
 
225
225
  if (dbSession.currentRoute && dbSession.collectedData) {
226
226
  // Restore existing session from database
@@ -233,23 +233,22 @@ async function example() {
233
233
  dbSession.collectedData?.currentRouteTitle || dbSession.currentRoute,
234
234
  enteredAt: new Date(),
235
235
  },
236
- currentState: dbSession.currentState
236
+ currentStep: dbSession.currentStep
237
237
  ? {
238
- id: dbSession.currentState,
239
- description: dbSession.collectedData?.currentStateDescription,
238
+ id: dbSession.currentStep,
239
+ description: dbSession.collectedData?.currentStepDescription,
240
240
  enteredAt: new Date(),
241
241
  }
242
242
  : undefined,
243
- extracted:
244
- (dbSession.collectedData?.extracted as Partial<OnboardingData>) || {},
245
- extractedByRoute:
246
- (dbSession.collectedData?.extractedByRoute as Record<
243
+ data: (dbSession.collectedData?.data as Partial<OnboardingData>) || {},
244
+ dataByRoute:
245
+ (dbSession.collectedData?.dataByRoute as Record<
247
246
  string,
248
247
  Partial<OnboardingData>
249
248
  >) || {},
250
249
  routeHistory:
251
250
  (dbSession.collectedData
252
- ?.routeHistory as SessionState<OnboardingData>["routeHistory"]) || [],
251
+ ?.routeHistory as SessionStep<OnboardingData>["routeHistory"]) || [],
253
252
  metadata: {
254
253
  sessionId: dbSession.id,
255
254
  userId,
@@ -262,12 +261,12 @@ async function example() {
262
261
  console.log("✅ Session restored:", {
263
262
  sessionId: agentSession.metadata?.sessionId,
264
263
  currentRoute: agentSession.currentRoute?.title,
265
- currentState: agentSession.currentState?.id,
266
- extracted: agentSession.extracted,
264
+ currentStep: agentSession.currentStep?.id,
265
+ data: agentSession.data,
267
266
  });
268
267
  } else {
269
- // Create new session state
270
- console.log("🆕 Creating new session state...");
268
+ // Create new session step
269
+ console.log("🆕 Creating new session step...");
271
270
 
272
271
  agentSession = createSession<OnboardingData>(dbSession.id, {
273
272
  sessionId: dbSession.id,
@@ -304,7 +303,7 @@ async function example() {
304
303
  });
305
304
 
306
305
  console.log("🤖 Agent:", response1.message);
307
- console.log("📊 Extracted so far:", response1.session?.extracted);
306
+ console.log("📊 Data so far:", response1.session?.data);
308
307
 
309
308
  // Save agent message to database
310
309
  await db.createMessage({
@@ -313,18 +312,18 @@ async function example() {
313
312
  role: "agent",
314
313
  content: response1.message,
315
314
  route: response1.session?.currentRoute?.id,
316
- state: response1.session?.currentState?.id,
315
+ step: response1.session?.currentStep?.id,
317
316
  });
318
317
 
319
- // Manually save session state back to database
318
+ // Manually save session step back to database
320
319
  await db.updateSession(dbSession.id, {
321
320
  currentRoute: response1.session?.currentRoute?.id,
322
- currentState: response1.session?.currentState?.id,
321
+ currentStep: response1.session?.currentStep?.id,
323
322
  collectedData: {
324
- extracted: response1.session?.extracted,
323
+ data: response1.session?.data,
325
324
  routeHistory: response1.session?.routeHistory,
326
325
  currentRouteTitle: response1.session?.currentRoute?.title,
327
- currentStateDescription: response1.session?.currentState?.description,
326
+ currentStepDescription: response1.session?.currentStep?.description,
328
327
  metadata: response1.session?.metadata,
329
328
  },
330
329
  });
@@ -360,7 +359,7 @@ async function example() {
360
359
  });
361
360
 
362
361
  console.log("🤖 Agent:", response2.message);
363
- console.log("📊 Extracted so far:", response2.session?.extracted);
362
+ console.log("📊 Data so far:", response2.session?.data);
364
363
 
365
364
  await db.createMessage({
366
365
  sessionId: dbSession.id,
@@ -368,18 +367,18 @@ async function example() {
368
367
  role: "agent",
369
368
  content: response2.message,
370
369
  route: response2.session?.currentRoute?.id,
371
- state: response2.session?.currentState?.id,
370
+ step: response2.session?.currentStep?.id,
372
371
  });
373
372
 
374
- // Save session state
373
+ // Save session step
375
374
  await db.updateSession(dbSession.id, {
376
375
  currentRoute: response2.session?.currentRoute?.id,
377
- currentState: response2.session?.currentState?.id,
376
+ currentStep: response2.session?.currentStep?.id,
378
377
  collectedData: {
379
- extracted: response2.session?.extracted,
378
+ data: response2.session?.data,
380
379
  routeHistory: response2.session?.routeHistory,
381
380
  currentRouteTitle: response2.session?.currentRoute?.title,
382
- currentStateDescription: response2.session?.currentState?.description,
381
+ currentStepDescription: response2.session?.currentStep?.description,
383
382
  metadata: response2.session?.metadata,
384
383
  },
385
384
  });
@@ -391,7 +390,7 @@ async function example() {
391
390
  console.log("\n✅ Onboarding Complete!");
392
391
  // In a real app, you would now trigger the next steps,
393
392
  // like sending a welcome email, creating an account, etc.
394
- await processOnboarding(response2.session?.extracted);
393
+ await processOnboarding(response2.session?.data);
395
394
  }
396
395
 
397
396
  /**
@@ -404,8 +403,8 @@ async function example() {
404
403
  const reloadedDbSession = await db.findSession(dbSession.id);
405
404
  if (!reloadedDbSession) throw new Error("Session not found");
406
405
 
407
- // Reconstruct session state
408
- const recoveredSession: SessionState<OnboardingData> = {
406
+ // Reconstruct session step
407
+ const recoveredSession: SessionStep<OnboardingData> = {
409
408
  currentRoute: reloadedDbSession.currentRoute
410
409
  ? {
411
410
  id: reloadedDbSession.currentRoute,
@@ -415,24 +414,23 @@ async function example() {
415
414
  enteredAt: new Date(),
416
415
  }
417
416
  : undefined,
418
- currentState: reloadedDbSession.currentState
417
+ currentStep: reloadedDbSession.currentStep
419
418
  ? {
420
- id: reloadedDbSession.currentState,
421
- description: reloadedDbSession.collectedData?.currentStateDescription,
419
+ id: reloadedDbSession.currentStep,
420
+ description: reloadedDbSession.collectedData?.currentStepDescription,
422
421
  enteredAt: new Date(),
423
422
  }
424
423
  : undefined,
425
- extracted:
426
- (reloadedDbSession.collectedData?.extracted as Partial<OnboardingData>) ||
427
- {},
428
- extractedByRoute:
429
- (reloadedDbSession.collectedData?.extractedByRoute as Record<
424
+ data:
425
+ (reloadedDbSession.collectedData?.data as Partial<OnboardingData>) || {},
426
+ dataByRoute:
427
+ (reloadedDbSession.collectedData?.dataByRoute as Record<
430
428
  string,
431
429
  Partial<OnboardingData>
432
430
  >) || {},
433
431
  routeHistory:
434
432
  (reloadedDbSession.collectedData
435
- ?.routeHistory as SessionState<OnboardingData>["routeHistory"]) || [],
433
+ ?.routeHistory as SessionStep<OnboardingData>["routeHistory"]) || [],
436
434
  metadata: {
437
435
  sessionId: reloadedDbSession.id,
438
436
  userId,
@@ -444,8 +442,8 @@ async function example() {
444
442
  console.log("✅ Session recovered from database:", {
445
443
  sessionId: recoveredSession.metadata?.sessionId,
446
444
  currentRoute: recoveredSession.currentRoute?.title,
447
- currentState: recoveredSession.currentState?.id,
448
- extracted: recoveredSession.extracted,
445
+ currentStep: recoveredSession.currentStep?.id,
446
+ data: recoveredSession.data,
449
447
  });
450
448
 
451
449
  // Load message history
@@ -486,28 +484,28 @@ async function advancedExample() {
486
484
  model: "models/gemini-2.0-flash-exp",
487
485
  }),
488
486
  hooks: {
489
- // Validate and enrich extracted data
490
- onExtractedUpdate: async (extracted, previous) => {
491
- console.log("🔄 Data extracted, validating...");
487
+ // Validate and enrich collected data
488
+ onDataUpdate: async (data, previous) => {
489
+ console.log("🔄 Data collected, validating...");
492
490
 
493
491
  // Normalize email
494
- if (extracted.email) {
495
- extracted.email = extracted.email.toLowerCase().trim();
492
+ if (data.email) {
493
+ data.email = data.email.toLowerCase().trim();
496
494
  }
497
495
 
498
496
  // Normalize phone
499
- if (extracted.phoneNumber) {
500
- extracted.phoneNumber = extracted.phoneNumber.replace(/\D/g, "");
497
+ if (data.phoneNumber) {
498
+ data.phoneNumber = data.phoneNumber.replace(/\D/g, "");
501
499
  }
502
500
 
503
- return extracted;
501
+ return data;
504
502
  },
505
503
  },
506
504
  });
507
505
 
508
506
  const route = agent.createRoute<OnboardingData>({
509
507
  title: "Onboarding",
510
- extractionSchema: {
508
+ schema: {
511
509
  type: "object",
512
510
  properties: {
513
511
  fullName: { type: "string" },
@@ -519,10 +517,10 @@ async function advancedExample() {
519
517
  },
520
518
  });
521
519
 
522
- route.initialState.transitionTo({
520
+ route.initialStep.nextStep({
523
521
  id: "collect_all",
524
- chatState: "Collect all information",
525
- gather: ["fullName", "email", "companyName", "phoneNumber"],
522
+ instructions: "Collect all information",
523
+ collect: ["fullName", "email", "companyName", "phoneNumber"],
526
524
  });
527
525
 
528
526
  // Create database session
@@ -549,18 +547,18 @@ async function advancedExample() {
549
547
  });
550
548
 
551
549
  console.log("🤖 Agent:", response.message);
552
- console.log("📊 Normalized data:", response.session?.extracted);
550
+ console.log("📊 Normalized data:", response.session?.data);
553
551
  // Shows: { email: "alice@example.com", phoneNumber: "5551234567", ... }
554
552
 
555
553
  // Save to database
556
554
  await db.updateSession(dbSession.id, {
557
555
  currentRoute: response.session?.currentRoute?.id,
558
- currentState: response.session?.currentState?.id,
556
+ currentStep: response.session?.currentStep?.id,
559
557
  collectedData: {
560
- extracted: response.session?.extracted,
558
+ data: response.session?.data,
561
559
  routeHistory: response.session?.routeHistory,
562
560
  currentRouteTitle: response.session?.currentRoute?.title,
563
- currentStateDescription: response.session?.currentState?.description,
561
+ currentStepDescription: response.session?.currentStep?.description,
564
562
  metadata: response.session?.metadata,
565
563
  },
566
564
  });
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Example: Declarative Agent Configuration with Session State
2
+ * Example: Declarative Agent Configuration with Session Step
3
3
  *
4
4
  * This example demonstrates how to configure an entire agent
5
5
  * using declarative syntax in the constructor, including:
@@ -7,7 +7,7 @@
7
7
  * - Guidelines (behavior rules)
8
8
  * - Capabilities
9
9
  * - Routes with data extraction schemas and custom IDs
10
- * - Session state management for multi-turn conversations
10
+ * - Session step management for multi-turn conversations
11
11
  */
12
12
 
13
13
  import {
@@ -21,7 +21,7 @@ import {
21
21
  type Guideline,
22
22
  type Capability,
23
23
  type RouteOptions,
24
- END_STATE,
24
+ END_ROUTE,
25
25
  } from "../src/index";
26
26
 
27
27
  // Context type
@@ -80,9 +80,9 @@ const getLabResults = defineTool<
80
80
  { report: string; status: string }
81
81
  >({
82
82
  name: "get_lab_results",
83
- handler: async ({ context, extracted }) => {
84
- // Tools can now access extracted data
85
- const labData = extracted as Partial<LabData>;
83
+ handler: async ({ context, data }) => {
84
+ // Tools can now access collected data
85
+ const labData = data as Partial<LabData>;
86
86
  if (labData?.testType) {
87
87
  return {
88
88
  data: {
@@ -105,9 +105,9 @@ const getLabResults = defineTool<
105
105
 
106
106
  const scheduleAppointment = defineTool<HealthcareContext>({
107
107
  name: "schedule_appointment",
108
- handler: async ({ context, extracted }) => {
109
- // Tools can access extracted appointment data
110
- const appointment = extracted as Partial<AppointmentData>;
108
+ handler: async ({ context, data }) => {
109
+ // Tools can access data appointment data
110
+ const appointment = data as Partial<AppointmentData>;
111
111
  if (!appointment?.preferredDate || !appointment?.preferredTime) {
112
112
  return { data: { confirmation: "Please provide appointment details" } };
113
113
  }
@@ -179,7 +179,7 @@ const routes: RouteOptions[] = [
179
179
  title: "Schedule Appointment",
180
180
  description: "Helps the patient schedule an appointment",
181
181
  conditions: ["The patient wants to schedule an appointment"],
182
- extractionSchema: {
182
+ schema: {
183
183
  type: "object",
184
184
  properties: {
185
185
  appointmentType: {
@@ -219,29 +219,29 @@ const routes: RouteOptions[] = [
219
219
  steps: [
220
220
  {
221
221
  id: "ask_appointment_type",
222
- chatState:
222
+ instructions:
223
223
  "What type of appointment do you need? (checkup, consultation, or followup)",
224
- gather: ["appointmentType"],
224
+ collect: ["appointmentType"],
225
225
  },
226
226
  {
227
227
  id: "ask_date_time",
228
- chatState: "When would you like to come in?",
229
- gather: ["preferredDate", "preferredTime"],
230
- requiredData: ["appointmentType"],
228
+ instructions: "When would you like to come in?",
229
+ collect: ["preferredDate", "preferredTime"],
230
+ requires: ["appointmentType"],
231
231
  },
232
232
  {
233
233
  id: "ask_symptoms",
234
- chatState: "Are you experiencing any symptoms?",
235
- gather: ["symptoms"],
234
+ instructions: "Are you experiencing any symptoms?",
235
+ collect: ["symptoms"],
236
236
  },
237
237
  {
238
238
  id: "confirm_appointment",
239
- toolState: scheduleAppointment,
240
- requiredData: ["preferredDate", "preferredTime"],
239
+ tool: scheduleAppointment,
240
+ requires: ["preferredDate", "preferredTime"],
241
241
  },
242
242
  {
243
243
  id: "final_confirmation",
244
- chatState:
244
+ instructions:
245
245
  "Your appointment is confirmed. You will receive a notification shortly.",
246
246
  },
247
247
  ],
@@ -251,7 +251,7 @@ const routes: RouteOptions[] = [
251
251
  title: "Check Lab Results",
252
252
  description: "Retrieves and explains patient lab results",
253
253
  conditions: ["The patient wants to see their lab results"],
254
- extractionSchema: {
254
+ schema: {
255
255
  type: "object",
256
256
  properties: {
257
257
  testType: {
@@ -283,7 +283,7 @@ const routes: RouteOptions[] = [
283
283
  title: "General Healthcare Questions",
284
284
  description: "Answer general healthcare questions",
285
285
  conditions: ["Patient asks general healthcare questions"],
286
- // No extractionSchema - stateless Q&A
286
+ // No schema - stepless Q&A
287
287
  },
288
288
  ] as RouteOptions[];
289
289
 
@@ -320,9 +320,9 @@ agent
320
320
  synonyms: ["virtual visit", "video appointment"],
321
321
  });
322
322
 
323
- // Example usage with session state
323
+ // Example usage with session step
324
324
  async function main() {
325
- // Initialize session state
325
+ // Initialize session step
326
326
  let session = createSession<AppointmentData | LabData>();
327
327
 
328
328
  // Create events with custom timestamps (useful for historical data)
@@ -338,12 +338,12 @@ async function main() {
338
338
  const response = await agent.respond({ history, session });
339
339
  console.log("Agent:", response.message);
340
340
  console.log("Route chosen:", response.session?.currentRoute?.title);
341
- console.log("Extracted data:", response.session?.extracted);
341
+ console.log("Collected data:", response.session?.data);
342
342
 
343
- // Session state is updated with progress
343
+ // Session step is updated with progress
344
344
  session = response.session!;
345
345
 
346
- // Turn 2 - Continue conversation with session state
346
+ // Turn 2 - Continue conversation with session step
347
347
  if (response.session?.currentRoute?.title === "Schedule Appointment") {
348
348
  const history2 = [
349
349
  ...history,
@@ -357,26 +357,26 @@ async function main() {
357
357
 
358
358
  const response2 = await agent.respond({ history: history2, session });
359
359
  console.log("Agent:", response2.message);
360
- console.log("Updated extracted:", response2.session?.extracted);
360
+ console.log("Updated data:", response2.session?.data);
361
361
 
362
362
  // Session tracks the appointment booking progress
363
- console.log("Current state:", response2.session?.currentState?.id);
363
+ console.log("Current step:", response2.session?.currentStep?.id);
364
364
 
365
365
  // Check for route completion
366
366
  if (response2.isRouteComplete && response2.session) {
367
367
  console.log("\n✅ Appointment scheduling complete!");
368
368
  await sendAppointmentConfirmation(
369
- agent.getExtractedData(response2.session.id) as AppointmentData
369
+ agent.getData(response2.session.id) as AppointmentData
370
370
  );
371
371
  }
372
372
  }
373
373
 
374
374
  // Note: Custom IDs ensure consistency across server restarts
375
- // Session state enables:
375
+ // Session step enables:
376
376
  // - Tracking conversation progress across turns
377
377
  // - Extracting structured data throughout conversation
378
378
  // - Always-on routing that respects user intent changes
379
- // - State recovery for resuming conversations
379
+ // - Step recovery for resuming conversations
380
380
  }
381
381
 
382
382
  /**
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Domain Scoping Example
3
- * Updated for v2 architecture with session state management
3
+ * Updated for v2 architecture with session step management
4
4
  *
5
5
  * This example demonstrates how to use domain scoping to restrict which tools
6
6
  * can EXECUTE in different conversation routes for security and isolation.
@@ -9,7 +9,7 @@
9
9
  * available everywhere. Use domains when you need security and organization.
10
10
  *
11
11
  * Key Concept: The AI never sees tools. Domains control which tools can
12
- * execute automatically when triggered by the state machine or guidelines.
12
+ * execute automatically when triggered by the step machine or guidelines.
13
13
  */
14
14
 
15
15
  import {
@@ -17,7 +17,7 @@ import {
17
17
  createMessageEvent,
18
18
  EventSource,
19
19
  createSession,
20
- END_STATE,
20
+ END_ROUTE,
21
21
  defineTool,
22
22
  } from "../src/index";
23
23
  import { OpenRouterProvider } from "../src/providers";
@@ -108,8 +108,8 @@ const scheduleEventTool = defineTool({
108
108
  id: "scheduleEvent",
109
109
  name: "scheduleEvent",
110
110
  description: "Schedules an event in the calendar",
111
- handler: async ({ extracted }) => {
112
- const { title, date, description } = extracted as {
111
+ handler: async ({ data }) => {
112
+ const { title, date, description } = data as {
113
113
  title: string;
114
114
  date: string;
115
115
  description: string;
@@ -124,7 +124,7 @@ agent.createRoute<{ title: string; date: string; description: string }>({
124
124
  description: "Book and manage appointments",
125
125
  conditions: ["User wants to schedule, view, or cancel events"],
126
126
  domains: ["calendar"], // ✅ Only calendar tools available
127
- extractionSchema: {
127
+ schema: {
128
128
  type: "object",
129
129
  properties: {
130
130
  title: { type: "string" },
@@ -135,22 +135,22 @@ agent.createRoute<{ title: string; date: string; description: string }>({
135
135
  },
136
136
  steps: [
137
137
  {
138
- chatState: "What is the title of the meeting?",
139
- gather: ["title"],
138
+ instructions: "What is the title of the meeting?",
139
+ collect: ["title"],
140
140
  },
141
141
  {
142
- chatState: "When would you like to schedule it?",
143
- gather: ["date"],
142
+ instructions: "When would you like to schedule it?",
143
+ collect: ["date"],
144
144
  },
145
145
  {
146
- chatState: "Any description for the meeting?",
147
- gather: ["description"],
146
+ instructions: "Any description for the meeting?",
147
+ collect: ["description"],
148
148
  },
149
149
  {
150
- toolState: scheduleEventTool,
150
+ tool: scheduleEventTool,
151
151
  },
152
152
  {
153
- chatState: "The meeting has been scheduled.",
153
+ instructions: "The meeting has been scheduled.",
154
154
  },
155
155
  ],
156
156
  });
@@ -190,7 +190,7 @@ async function demonstrateScoping() {
190
190
  }),
191
191
  ];
192
192
 
193
- // Initialize session state for multi-turn conversation
193
+ // Initialize session step for multi-turn conversation
194
194
  let session = createSession();
195
195
 
196
196
  const response1 = await agent.respond({ history: history1, session });
@@ -219,7 +219,7 @@ async function demonstrateScoping() {
219
219
  if (response2.isRouteComplete) {
220
220
  console.log("\n✅ Meeting scheduling complete!");
221
221
  await sendMeetingInvite(
222
- agent.getExtractedData(response2.session?.id) as {
222
+ agent.getData(response2.session?.id) as {
223
223
  title: string;
224
224
  date: string;
225
225
  }
@@ -270,7 +270,7 @@ console.log(`
270
270
  - Data Collection route cannot execute calendar.scheduleEvent()
271
271
  - Each route has minimum necessary tool permissions
272
272
  - Prevents prompt injection attacks from calling sensitive tools
273
- - Session state ensures domain scoping persists across turns
273
+ - Session step ensures domain scoping persists across turns
274
274
 
275
275
  🎯 Isolation Benefits:
276
276
  - Route execution is isolated - tools can't cross boundaries
@@ -283,7 +283,7 @@ console.log(`
283
283
  - Easy to audit what each route can execute
284
284
  - Better debugging when tools are called
285
285
  - Self-documenting security model
286
- - Session state tracks domain-scoped conversations
286
+ - Session step tracks domain-scoped conversations
287
287
  `);
288
288
 
289
289
  // Inspect route configurations