@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,6 +1,6 @@
1
1
  /**
2
2
  * Example: Streaming Responses
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 the respondStream method
6
6
  * to stream AI responses in real-time for better user experience
@@ -14,7 +14,7 @@ import {
14
14
  OpenAIProvider,
15
15
  GeminiProvider,
16
16
  createSession,
17
- END_STATE,
17
+ END_ROUTE,
18
18
  } from "../src/index";
19
19
 
20
20
  // Custom context type
@@ -73,10 +73,10 @@ async function streamingWithAnthropic() {
73
73
  console.log("📤 Streaming response from Claude...\n");
74
74
  console.log("Response: ");
75
75
 
76
- // Initialize session state for streaming conversation
76
+ // Initialize session step for streaming conversation
77
77
  let session = createSession();
78
78
 
79
- // Use respondStream for real-time streaming with session state
79
+ // Use respondStream for real-time streaming with session step
80
80
  let fullMessage = "";
81
81
  for await (const chunk of agent.respondStream({ history, session })) {
82
82
  // chunk.delta contains the new text
@@ -94,7 +94,7 @@ async function streamingWithAnthropic() {
94
94
  console.log(
95
95
  ` - Route: ${chunk.session?.currentRoute?.title || "None"}`
96
96
  );
97
- console.log(` - Extracted:`, chunk.session?.extracted || "None");
97
+ console.log(` - Data:`, chunk.session?.data || "None");
98
98
  console.log(` - Tool Calls: ${chunk.toolCalls?.length || 0}`);
99
99
 
100
100
  // Update session with progress
@@ -142,7 +142,7 @@ async function streamingWithOpenAI() {
142
142
  console.log("📤 Streaming response from OpenAI...\n");
143
143
  console.log("Response: ");
144
144
 
145
- // Initialize session state for streaming conversation
145
+ // Initialize session step for streaming conversation
146
146
  let session = createSession();
147
147
 
148
148
  for await (const chunk of agent.respondStream({ history, session })) {
@@ -155,7 +155,7 @@ async function streamingWithOpenAI() {
155
155
  console.log(
156
156
  ` - Route: ${chunk.session?.currentRoute?.title || "None"}`
157
157
  );
158
- console.log(` - Extracted:`, chunk.session?.extracted || "None");
158
+ console.log(` - Data:`, chunk.session?.data || "None");
159
159
 
160
160
  // Update session with progress
161
161
  session = chunk.session!;
@@ -202,7 +202,7 @@ async function streamingWithGemini() {
202
202
  console.log("📤 Streaming response from Gemini...\n");
203
203
  console.log("Response: ");
204
204
 
205
- // Initialize session state for streaming conversation
205
+ // Initialize session step for streaming conversation
206
206
  let session = createSession();
207
207
 
208
208
  for await (const chunk of agent.respondStream({ history, session })) {
@@ -215,7 +215,7 @@ async function streamingWithGemini() {
215
215
  console.log(
216
216
  ` - Route: ${chunk.session?.currentRoute?.title || "None"}`
217
217
  );
218
- console.log(` - Extracted:`, chunk.session?.extracted || "None");
218
+ console.log(` - Data:`, chunk.session?.data || "None");
219
219
 
220
220
  // Update session with progress
221
221
  session = chunk.session!;
@@ -227,7 +227,7 @@ async function streamingWithGemini() {
227
227
  }
228
228
 
229
229
  async function streamingWithRoutes() {
230
- console.log("\n🤖 Example 4: Streaming with Routes and States\n");
230
+ console.log("\n🤖 Example 4: Streaming with Routes and Steps\n");
231
231
 
232
232
  const provider = new AnthropicProvider({
233
233
  apiKey: process.env.ANTHROPIC_API_KEY || "",
@@ -254,8 +254,8 @@ async function streamingWithRoutes() {
254
254
  conditions: ["User asks about product features or issues"],
255
255
  });
256
256
 
257
- supportRoute.initialState.transitionTo({
258
- chatState: "Understand the user's product question",
257
+ supportRoute.initialStep.nextStep({
258
+ instructions: "Understand the user's product question",
259
259
  });
260
260
 
261
261
  // Create a feedback route
@@ -266,7 +266,7 @@ async function streamingWithRoutes() {
266
266
  title: "Collect Feedback",
267
267
  description: "Collect user feedback on their support experience",
268
268
  conditions: ["User wants to provide feedback"],
269
- extractionSchema: {
269
+ schema: {
270
270
  type: "object",
271
271
  properties: {
272
272
  rating: { type: "number", minimum: 1, maximum: 5 },
@@ -276,15 +276,15 @@ async function streamingWithRoutes() {
276
276
  },
277
277
  steps: [
278
278
  {
279
- chatState: "How would you rate your support experience from 1 to 5?",
280
- gather: ["rating"],
279
+ instructions: "How would you rate your support experience from 1 to 5?",
280
+ collect: ["rating"],
281
281
  },
282
282
  {
283
- chatState: "Thanks for the rating! Any other comments?",
284
- gather: ["comments"],
283
+ instructions: "Thanks for the rating! Any other comments?",
284
+ collect: ["comments"],
285
285
  },
286
286
  {
287
- chatState: "We appreciate your feedback!",
287
+ instructions: "We appreciate your feedback!",
288
288
  },
289
289
  ],
290
290
  });
@@ -301,7 +301,7 @@ async function streamingWithRoutes() {
301
301
  console.log("📤 Streaming response with route detection...\n");
302
302
  console.log("Response: ");
303
303
 
304
- // Initialize session state for streaming conversation
304
+ // Initialize session step for streaming conversation
305
305
  let session = createSession();
306
306
 
307
307
  for await (const chunk of agent.respondStream({ history, session })) {
@@ -315,14 +315,14 @@ async function streamingWithRoutes() {
315
315
  console.log(
316
316
  ` - Route: ${chunk.session?.currentRoute?.title || "None"}`
317
317
  );
318
- console.log(` - Extracted:`, chunk.session?.extracted || "None");
318
+ console.log(` - Data:`, chunk.session?.data || "None");
319
319
 
320
320
  // Check for route completion
321
321
  if (chunk.isRouteComplete) {
322
322
  console.log("\n✅ Route complete!");
323
323
  if (chunk.session?.currentRoute?.title === "Collect Feedback") {
324
324
  await logFeedback(
325
- agent.getExtractedData(chunk.session?.id) as {
325
+ agent.getData(chunk.session?.id) as {
326
326
  rating: number;
327
327
  comments: string;
328
328
  }
@@ -381,7 +381,7 @@ async function streamingWithAbortSignal() {
381
381
  console.log("📤 Streaming response (will abort after 3s)...\n");
382
382
  console.log("Response: ");
383
383
 
384
- // Initialize session state for streaming conversation
384
+ // Initialize session step for streaming conversation
385
385
  let session = createSession();
386
386
 
387
387
  for await (const chunk of agent.respondStream({
@@ -399,7 +399,7 @@ async function streamingWithAbortSignal() {
399
399
  console.log(
400
400
  ` - Route: ${chunk.session?.currentRoute?.title || "None"}`
401
401
  );
402
- console.log(` - Extracted:`, chunk.session?.extracted || "None");
402
+ console.log(` - Data:`, chunk.session?.data || "None");
403
403
 
404
404
  // Update session with progress
405
405
  session = chunk.session!;
@@ -453,7 +453,7 @@ async function main() {
453
453
  console.log(" - Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or GEMINI_API_KEY");
454
454
  console.log(" - Streaming provides real-time responses for better UX");
455
455
  console.log(" - Use AbortSignal to cancel long-running streams");
456
- console.log(" - Access chunk.route and chunk.state for flow information");
456
+ console.log(" - Access chunk.route and chunk.step for flow information");
457
457
 
458
458
  console.log("\n" + "=".repeat(60));
459
459
 
@@ -1,13 +1,13 @@
1
1
  /**
2
- * Travel agent example with session state management
3
- * Demonstrates data-driven conversations with schema extraction and state progression
2
+ * Travel agent example with session step management
3
+ * Demonstrates data-driven conversations with schema extraction and step progression
4
4
  */
5
5
 
6
6
  import {
7
7
  Agent,
8
8
  defineTool,
9
9
  OpenRouterProvider,
10
- END_STATE,
10
+ END_ROUTE,
11
11
  EventSource,
12
12
  createMessageEvent,
13
13
  createSession,
@@ -63,11 +63,8 @@ const getAvailableDestinations = defineTool(
63
63
 
64
64
  const lookupDestinationCode = defineTool(
65
65
  "lookup_destination_code",
66
- async ({
67
- context,
68
- extracted,
69
- }: ToolContext<TravelContext, FlightBookingData>) => {
70
- if (!extracted?.destination) {
66
+ async ({ context, data }: ToolContext<TravelContext, FlightBookingData>) => {
67
+ if (!data?.destination) {
71
68
  return { data: undefined };
72
69
  }
73
70
 
@@ -81,8 +78,8 @@ const lookupDestinationCode = defineTool(
81
78
 
82
79
  return {
83
80
  data: undefined,
84
- extractedUpdate: {
85
- destinationCode: codes[extracted.destination],
81
+ dataUpdate: {
82
+ destinationCode: codes[data.destination],
86
83
  },
87
84
  };
88
85
  },
@@ -93,46 +90,40 @@ const lookupDestinationCode = defineTool(
93
90
 
94
91
  const searchFlights = defineTool(
95
92
  "search_flights",
96
- async ({
97
- context,
98
- extracted,
99
- }: ToolContext<TravelContext, FlightBookingData>) => {
100
- if (!extracted?.destination || !extracted?.departureDate) {
93
+ async ({ context, data }: ToolContext<TravelContext, FlightBookingData>) => {
94
+ if (!data?.destination || !data?.departureDate) {
101
95
  return { data: [] };
102
96
  }
103
97
 
104
- // Simulate flight search based on extracted data
98
+ // Simulate flight search based on collected data
105
99
  const flights = [
106
- `Flight 123 - ${extracted.departureDate}, 9:00 AM, $${
100
+ `Flight 123 - ${data.departureDate}, 9:00 AM, $${
107
101
  800 + Math.floor(Math.random() * 200)
108
102
  }`,
109
- `Flight 321 - ${extracted.departureDate}, 2:30 PM, $${
103
+ `Flight 321 - ${data.departureDate}, 2:30 PM, $${
110
104
  700 + Math.floor(Math.random() * 200)
111
105
  }`,
112
- `Flight 987 - ${extracted.departureDate}, 6:45 PM, $${
106
+ `Flight 987 - ${data.departureDate}, 6:45 PM, $${
113
107
  600 + Math.floor(Math.random() * 200)
114
108
  }`,
115
109
  ];
116
110
 
117
111
  return {
118
112
  data: flights,
119
- extractedUpdate: {
113
+ dataUpdate: {
120
114
  shouldSearchFlights: false, // Clear the flag
121
115
  },
122
116
  };
123
117
  },
124
118
  {
125
- description: "Search for flights based on extracted travel data",
119
+ description: "Search for flights based on data travel data",
126
120
  }
127
121
  );
128
122
 
129
123
  const bookFlight = defineTool(
130
124
  "book_flight",
131
- async ({
132
- context,
133
- extracted,
134
- }: ToolContext<TravelContext, FlightBookingData>) => {
135
- if (!extracted) {
125
+ async ({ context, data }: ToolContext<TravelContext, FlightBookingData>) => {
126
+ if (!data) {
136
127
  return { data: "Please provide flight details" };
137
128
  }
138
129
 
@@ -142,11 +133,11 @@ const bookFlight = defineTool(
142
133
  .replace(/-/g, "")}-001`;
143
134
 
144
135
  return {
145
- data: `Flight booked for ${context.customerName} to ${extracted.destination}. Confirmation: ${confirmationNumber}`,
136
+ data: `Flight booked for ${context.customerName} to ${data.destination}. Confirmation: ${confirmationNumber}`,
146
137
  };
147
138
  },
148
139
  {
149
- description: "Book a flight using extracted travel data",
140
+ description: "Book a flight using data travel data",
150
141
  }
151
142
  );
152
143
 
@@ -156,11 +147,8 @@ const getBookingStatus = defineTool<
156
147
  { status: string; details: string; notes?: string }
157
148
  >(
158
149
  "get_booking_status",
159
- async ({
160
- context,
161
- extracted,
162
- }: ToolContext<TravelContext, BookingStatusData>) => {
163
- if (!extracted?.confirmationNumber) {
150
+ async ({ context, data }: ToolContext<TravelContext, BookingStatusData>) => {
151
+ if (!data?.confirmationNumber) {
164
152
  return {
165
153
  data: {
166
154
  status: "Error",
@@ -172,13 +160,13 @@ const getBookingStatus = defineTool<
172
160
  return {
173
161
  data: {
174
162
  status: "Confirmed",
175
- details: `Flight booking ${extracted.confirmationNumber} is confirmed.`,
163
+ details: `Flight booking ${data.confirmationNumber} is confirmed.`,
176
164
  notes: "Check-in opens 24 hours before departure.",
177
165
  },
178
166
  };
179
167
  },
180
168
  {
181
- description: "Get booking status using extracted confirmation number",
169
+ description: "Get booking status using data confirmation number",
182
170
  }
183
171
  );
184
172
 
@@ -234,12 +222,12 @@ async function createTravelAgent() {
234
222
  // NEW: Transition to feedback collection after successful booking
235
223
  onComplete: (session) => {
236
224
  // Dynamic logic: only collect feedback if destination is known
237
- if (session.extracted?.destination) {
225
+ if (session.data?.destination) {
238
226
  return "Travel Feedback";
239
227
  }
240
228
  return undefined; // No transition
241
229
  },
242
- extractionSchema: {
230
+ schema: {
243
231
  type: "object",
244
232
  properties: {
245
233
  destination: {
@@ -285,66 +273,66 @@ async function createTravelAgent() {
285
273
  },
286
274
  });
287
275
 
288
- // Build the route flow with data extraction and smart state progression
289
- const askDestination = flightBookingRoute.initialState.transitionTo({
290
- chatState: "Ask about the destination",
291
- gather: ["destination"],
292
- skipIf: (extracted) => !!extracted.destination,
276
+ // Build the route flow with data extraction and smart step progression
277
+ const askDestination = flightBookingRoute.initialStep.nextStep({
278
+ instructions: "Ask about the destination",
279
+ collect: ["destination"],
280
+ skipIf: (data) => !!data.destination,
293
281
  condition: "Customer needs to specify their travel destination",
294
282
  });
295
283
 
296
- const enrichDestination = askDestination.transitionTo({
297
- toolState: lookupDestinationCode,
298
- requiredData: ["destination"],
284
+ const enrichDestination = askDestination.nextStep({
285
+ tool: lookupDestinationCode,
286
+ requires: ["destination"],
299
287
  condition: "Destination provided, lookup airport code",
300
288
  });
301
289
 
302
- const askDates = enrichDestination.transitionTo({
303
- chatState: "Ask about preferred travel dates",
304
- gather: ["departureDate"],
305
- skipIf: (extracted) => !!extracted.departureDate,
306
- requiredData: ["destination"],
290
+ const askDates = enrichDestination.nextStep({
291
+ instructions: "Ask about preferred travel dates",
292
+ collect: ["departureDate"],
293
+ skipIf: (data) => !!data.departureDate,
294
+ requires: ["destination"],
307
295
  condition: "Destination confirmed, need travel dates",
308
296
  });
309
297
 
310
- const askPassengers = askDates.transitionTo({
311
- chatState: "Ask for number of passengers",
312
- gather: ["passengers"],
313
- skipIf: (extracted) => !!extracted.passengers,
314
- requiredData: ["destination", "departureDate"],
298
+ const askPassengers = askDates.nextStep({
299
+ instructions: "Ask for number of passengers",
300
+ collect: ["passengers"],
301
+ skipIf: (data) => !!data.passengers,
302
+ requires: ["destination", "departureDate"],
315
303
  condition: "Dates confirmed, need passenger count",
316
304
  });
317
305
 
318
- const searchFlightsState = askPassengers.transitionTo({
319
- toolState: searchFlights,
306
+ const searchFlightsStep = askPassengers.nextStep({
307
+ tool: searchFlights,
320
308
  // Triggered when shouldSearchFlights flag is set by hook
321
- condition: "All basic info gathered, search for available flights",
309
+ condition: "All basic info collected, search for available flights",
322
310
  });
323
311
 
324
- const presentFlights = searchFlightsState.transitionTo({
325
- chatState: "Present available flights and ask which one works for them",
312
+ const presentFlights = searchFlightsStep.nextStep({
313
+ instructions: "Present available flights and ask which one works for them",
326
314
  condition: "Flight search complete, present options to customer",
327
315
  });
328
316
 
329
317
  // Happy path: customer selects a flight
330
- const confirmBooking = presentFlights.transitionTo({
331
- chatState: "Confirm booking details before proceeding",
332
- gather: ["cabinClass", "urgency"], // Additional optional data
318
+ const confirmBooking = presentFlights.nextStep({
319
+ instructions: "Confirm booking details before proceeding",
320
+ collect: ["cabinClass", "urgency"], // Additional optional data
333
321
  condition: "Customer interested in a flight, confirm booking details",
334
322
  });
335
323
 
336
- const bookFlightState = confirmBooking.transitionTo({
337
- toolState: bookFlight,
324
+ const bookFlightStep = confirmBooking.nextStep({
325
+ tool: bookFlight,
338
326
  condition: "Customer confirmed, proceed with booking",
339
327
  });
340
328
 
341
- const provideConfirmation = bookFlightState.transitionTo({
342
- chatState: "Provide confirmation number and booking summary",
329
+ const provideConfirmation = bookFlightStep.nextStep({
330
+ instructions: "Provide confirmation number and booking summary",
343
331
  condition: "Booking completed successfully",
344
332
  });
345
333
 
346
- provideConfirmation.transitionTo({
347
- state: END_STATE,
334
+ provideConfirmation.nextStep({
335
+ step: END_ROUTE,
348
336
  condition: "Customer has confirmation, booking flow complete",
349
337
  });
350
338
 
@@ -368,7 +356,7 @@ async function createTravelAgent() {
368
356
  description:
369
357
  "Retrieves the customer's booking status and provides relevant information.",
370
358
  conditions: ["The customer wants to check their booking status"],
371
- extractionSchema: {
359
+ schema: {
372
360
  type: "object",
373
361
  properties: {
374
362
  confirmationNumber: {
@@ -384,27 +372,27 @@ async function createTravelAgent() {
384
372
  },
385
373
  });
386
374
 
387
- const askConfirmation = bookingStatusRoute.initialState.transitionTo({
388
- chatState: "Ask for the confirmation number or booking reference",
389
- gather: ["confirmationNumber"],
390
- skipIf: (extracted) => !!extracted.confirmationNumber,
375
+ const askConfirmation = bookingStatusRoute.initialStep.nextStep({
376
+ instructions: "Ask for the confirmation number or booking reference",
377
+ collect: ["confirmationNumber"],
378
+ skipIf: (data) => !!data.confirmationNumber,
391
379
  condition:
392
380
  "Customer wants to check booking status but hasn't provided confirmation number",
393
381
  });
394
382
 
395
- const checkStatus = askConfirmation.transitionTo({
396
- toolState: getBookingStatus,
397
- requiredData: ["confirmationNumber"],
383
+ const checkStatus = askConfirmation.nextStep({
384
+ tool: getBookingStatus,
385
+ requires: ["confirmationNumber"],
398
386
  condition: "Confirmation number provided, look up booking details",
399
387
  });
400
388
 
401
- const provideStatus = checkStatus.transitionTo({
402
- chatState: "Provide booking status and relevant information",
389
+ const provideStatus = checkStatus.nextStep({
390
+ instructions: "Provide booking status and relevant information",
403
391
  condition: "Booking status retrieved successfully",
404
392
  });
405
393
 
406
- provideStatus.transitionTo({
407
- state: END_STATE,
394
+ provideStatus.nextStep({
395
+ step: END_ROUTE,
408
396
  condition: "Booking information provided to customer",
409
397
  });
410
398
 
@@ -413,7 +401,7 @@ async function createTravelAgent() {
413
401
  title: "Travel Feedback",
414
402
  description: "Collects customer feedback after flight booking",
415
403
  conditions: ["Collect travel booking feedback"],
416
- extractionSchema: {
404
+ schema: {
417
405
  type: "object",
418
406
  properties: {
419
407
  rating: {
@@ -433,25 +421,24 @@ async function createTravelAgent() {
433
421
  },
434
422
  });
435
423
 
436
- const askFeedbackRating = feedbackRoute.initialState.transitionTo({
437
- chatState:
424
+ const askFeedbackRating = feedbackRoute.initialStep.nextStep({
425
+ instructions:
438
426
  "Ask for overall rating from 1 to 5 for the booking experience",
439
- gather: ["rating"],
440
- skipIf: (extracted) => !!extracted.rating,
427
+ collect: ["rating"],
428
+ skipIf: (data) => !!data.rating,
441
429
  });
442
430
 
443
- const askRecommendation = askFeedbackRating.transitionTo({
444
- chatState:
431
+ const askRecommendation = askFeedbackRating.nextStep({
432
+ instructions:
445
433
  "Ask if they would recommend our service to a friend (yes/no)",
446
- gather: ["recommendToFriend"],
434
+ collect: ["recommendToFriend"],
447
435
  });
448
436
 
449
- const thankForFeedback = askRecommendation.transitionTo({
450
- chatState:
451
- "Thank them for their feedback and wish them a great trip!",
437
+ const thankForFeedback = askRecommendation.nextStep({
438
+ instructions: "Thank them for their feedback and wish them a great trip!",
452
439
  });
453
440
 
454
- thankForFeedback.transitionTo({ state: END_STATE });
441
+ thankForFeedback.nextStep({ step: END_ROUTE });
455
442
 
456
443
  // Global guidelines
457
444
  agent.createGuideline({
@@ -476,11 +463,11 @@ async function createTravelAgent() {
476
463
  return agent;
477
464
  }
478
465
 
479
- // Example usage with session state
466
+ // Example usage with session step
480
467
  async function main() {
481
468
  const agent = await createTravelAgent();
482
469
 
483
- // Initialize session state
470
+ // Initialize session step
484
471
  let session = createSession<FlightBookingData | BookingStatusData>();
485
472
 
486
473
  // Simulate a conversation
@@ -500,13 +487,13 @@ async function main() {
500
487
  console.info("\n=== TURN 1 ===");
501
488
  console.info("Agent:", response1.message);
502
489
  console.info("Route:", response1.session?.currentRoute?.title);
503
- console.info("State:", response1.session?.currentState?.id);
504
- console.info("Extracted:", response1.session?.extracted);
490
+ console.info("Step:", response1.session?.currentStep?.id);
491
+ console.info("Data:", response1.session?.data);
505
492
 
506
- // Session state updated with progress
493
+ // Session step updated with progress
507
494
  session = response1.session!;
508
495
 
509
- // Turn 2 - Continue with session state
496
+ // Turn 2 - Continue with session step
510
497
  if (response1.session?.currentRoute?.title === "Book a Flight") {
511
498
  const history2 = [
512
499
  ...history,
@@ -517,8 +504,8 @@ async function main() {
517
504
  const response2 = await agent.respond({ history: history2, session });
518
505
  console.info("\n=== TURN 2 ===");
519
506
  console.info("Agent:", response2.message);
520
- console.info("Updated extracted:", response2.session?.extracted);
521
- console.info("Current state:", response2.session?.currentState?.id);
507
+ console.info("Updated data:", response2.session?.data);
508
+ console.info("Current step:", response2.session?.currentStep?.id);
522
509
  }
523
510
 
524
511
  // Demonstrate booking status check
@@ -538,23 +525,21 @@ async function main() {
538
525
  console.info("\n=== BOOKING STATUS CHECK ===");
539
526
  console.info("Agent:", statusResponse.message);
540
527
  console.info("Route:", statusResponse.session?.currentRoute?.title);
541
- console.info("Extracted:", statusResponse.session?.extracted);
528
+ console.info("Data:", statusResponse.session?.data);
542
529
 
543
- // Show session state management benefits
544
- console.info("\n=== SESSION STATE BENEFITS ===");
530
+ // Show session step management benefits
531
+ console.info("\n=== SESSION STEP BENEFITS ===");
545
532
  console.info("✅ Always-on routing - respects user intent changes");
546
- console.info("✅ Data persistence - extracted data survives across turns");
533
+ console.info("✅ Data persistence - collected data survives across turns");
547
534
  console.info(
548
- "✅ State progression - intelligent flow based on collected data"
535
+ "✅ Step progression - intelligent flow based on collected data"
549
536
  );
550
537
  console.info("✅ Context awareness - router sees current progress");
551
538
 
552
539
  if (statusResponse.isRouteComplete) {
553
540
  console.info("\n✅ Booking status check complete!");
554
541
  await logBookingStatusCheck(
555
- agent.getExtractedData(
556
- statusResponse.session?.id
557
- ) as unknown as BookingStatusData
542
+ agent.getData(statusResponse.session?.id) as unknown as BookingStatusData
558
543
  );
559
544
  }
560
545
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@falai/agent",
3
- "version": "0.6.8",
3
+ "version": "0.7.0",
4
4
  "description": "Standalone, strongly-typed AI Agent framework with route DSL and AI provider strategy",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
@@ -149,14 +149,14 @@ class MemorySessionRepository implements SessionRepository {
149
149
  return await this.update(id, { collectedData });
150
150
  }
151
151
 
152
- async updateRouteState(
152
+ async updateRouteStep(
153
153
  id: string,
154
154
  route?: string,
155
- state?: string
155
+ step?: string
156
156
  ): Promise<SessionData | null> {
157
157
  return await this.update(id, {
158
158
  currentRoute: route,
159
- currentState: state,
159
+ currentStep: step,
160
160
  });
161
161
  }
162
162
 
@@ -206,14 +206,14 @@ class MongoSessionRepository implements SessionRepository {
206
206
  return await this.update(id, { collectedData });
207
207
  }
208
208
 
209
- async updateRouteState(
209
+ async updateRouteStep(
210
210
  id: string,
211
211
  route?: string,
212
- state?: string
212
+ step?: string
213
213
  ): Promise<SessionData | null> {
214
214
  return await this.update(id, {
215
215
  currentRoute: route,
216
- currentState: state,
216
+ currentStep: step,
217
217
  });
218
218
  }
219
219