@falai/agent 0.6.9 → 0.8.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 (242) hide show
  1. package/README.md +78 -82
  2. package/dist/adapters/MemoryAdapter.d.ts +1 -1
  3. package/dist/adapters/MemoryAdapter.js +3 -3
  4. package/dist/adapters/MemoryAdapter.js.map +1 -1
  5. package/dist/adapters/MongoAdapter.d.ts +1 -1
  6. package/dist/adapters/MongoAdapter.js +3 -3
  7. package/dist/adapters/MongoAdapter.js.map +1 -1
  8. package/dist/adapters/OpenSearchAdapter.js +7 -7
  9. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  10. package/dist/adapters/PostgreSQLAdapter.d.ts +1 -1
  11. package/dist/adapters/PostgreSQLAdapter.js +10 -10
  12. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  13. package/dist/adapters/PrismaAdapter.d.ts +1 -1
  14. package/dist/adapters/PrismaAdapter.js +4 -4
  15. package/dist/adapters/PrismaAdapter.js.map +1 -1
  16. package/dist/adapters/RedisAdapter.d.ts +1 -1
  17. package/dist/adapters/RedisAdapter.js +3 -3
  18. package/dist/adapters/RedisAdapter.js.map +1 -1
  19. package/dist/adapters/SQLiteAdapter.d.ts +4 -4
  20. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  21. package/dist/adapters/SQLiteAdapter.js +12 -12
  22. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  23. package/dist/adapters/index.d.ts +1 -1
  24. package/dist/adapters/index.d.ts.map +1 -1
  25. package/dist/cjs/adapters/MemoryAdapter.d.ts +1 -1
  26. package/dist/cjs/adapters/MemoryAdapter.js +3 -3
  27. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  28. package/dist/cjs/adapters/MongoAdapter.d.ts +1 -1
  29. package/dist/cjs/adapters/MongoAdapter.js +3 -3
  30. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  31. package/dist/cjs/adapters/OpenSearchAdapter.js +7 -7
  32. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  33. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +1 -1
  34. package/dist/cjs/adapters/PostgreSQLAdapter.js +10 -10
  35. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  36. package/dist/cjs/adapters/PrismaAdapter.d.ts +1 -1
  37. package/dist/cjs/adapters/PrismaAdapter.js +4 -4
  38. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  39. package/dist/cjs/adapters/RedisAdapter.d.ts +1 -1
  40. package/dist/cjs/adapters/RedisAdapter.js +3 -3
  41. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  42. package/dist/cjs/adapters/SQLiteAdapter.d.ts +4 -4
  43. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  44. package/dist/cjs/adapters/SQLiteAdapter.js +12 -12
  45. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  46. package/dist/cjs/adapters/index.d.ts +1 -1
  47. package/dist/cjs/adapters/index.d.ts.map +1 -1
  48. package/dist/cjs/constants/index.d.ts +4 -4
  49. package/dist/cjs/constants/index.js +5 -5
  50. package/dist/cjs/core/Agent.d.ts +22 -22
  51. package/dist/cjs/core/Agent.d.ts.map +1 -1
  52. package/dist/cjs/core/Agent.js +168 -160
  53. package/dist/cjs/core/Agent.js.map +1 -1
  54. package/dist/cjs/core/Events.d.ts +6 -6
  55. package/dist/cjs/core/Events.d.ts.map +1 -1
  56. package/dist/cjs/core/PersistenceManager.d.ts +13 -13
  57. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  58. package/dist/cjs/core/PersistenceManager.js +24 -24
  59. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  60. package/dist/cjs/core/ResponseEngine.d.ts +3 -8
  61. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  62. package/dist/cjs/core/ResponseEngine.js +8 -8
  63. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  64. package/dist/cjs/core/Route.d.ts +17 -17
  65. package/dist/cjs/core/Route.d.ts.map +1 -1
  66. package/dist/cjs/core/Route.js +33 -33
  67. package/dist/cjs/core/Route.js.map +1 -1
  68. package/dist/cjs/core/RoutingEngine.d.ts +31 -31
  69. package/dist/cjs/core/RoutingEngine.d.ts.map +1 -1
  70. package/dist/cjs/core/RoutingEngine.js +196 -196
  71. package/dist/cjs/core/RoutingEngine.js.map +1 -1
  72. package/dist/cjs/core/Step.d.ts +72 -0
  73. package/dist/cjs/core/Step.d.ts.map +1 -0
  74. package/dist/cjs/core/Step.js +150 -0
  75. package/dist/cjs/core/Step.js.map +1 -0
  76. package/dist/cjs/core/ToolExecutor.d.ts +5 -5
  77. package/dist/cjs/core/ToolExecutor.d.ts.map +1 -1
  78. package/dist/cjs/core/ToolExecutor.js +8 -8
  79. package/dist/cjs/core/ToolExecutor.js.map +1 -1
  80. package/dist/cjs/core/Transition.d.ts +14 -14
  81. package/dist/cjs/core/Transition.d.ts.map +1 -1
  82. package/dist/cjs/core/Transition.js +48 -19
  83. package/dist/cjs/core/Transition.js.map +1 -1
  84. package/dist/cjs/index.d.ts +7 -7
  85. package/dist/cjs/index.d.ts.map +1 -1
  86. package/dist/cjs/index.js +8 -8
  87. package/dist/cjs/index.js.map +1 -1
  88. package/dist/cjs/types/agent.d.ts +9 -9
  89. package/dist/cjs/types/agent.d.ts.map +1 -1
  90. package/dist/cjs/types/ai.d.ts +2 -2
  91. package/dist/cjs/types/ai.d.ts.map +1 -1
  92. package/dist/cjs/types/history.d.ts +3 -3
  93. package/dist/cjs/types/history.d.ts.map +1 -1
  94. package/dist/cjs/types/index.d.ts +1 -1
  95. package/dist/cjs/types/index.d.ts.map +1 -1
  96. package/dist/cjs/types/persistence.d.ts +5 -5
  97. package/dist/cjs/types/persistence.d.ts.map +1 -1
  98. package/dist/cjs/types/route.d.ts +57 -52
  99. package/dist/cjs/types/route.d.ts.map +1 -1
  100. package/dist/cjs/types/session.d.ts +27 -27
  101. package/dist/cjs/types/session.d.ts.map +1 -1
  102. package/dist/cjs/types/session.js +48 -50
  103. package/dist/cjs/types/session.js.map +1 -1
  104. package/dist/cjs/types/tool.d.ts +13 -13
  105. package/dist/cjs/types/tool.d.ts.map +1 -1
  106. package/dist/cjs/utils/id.d.ts +8 -3
  107. package/dist/cjs/utils/id.d.ts.map +1 -1
  108. package/dist/cjs/utils/id.js +16 -7
  109. package/dist/cjs/utils/id.js.map +1 -1
  110. package/dist/constants/index.d.ts +4 -4
  111. package/dist/constants/index.js +4 -4
  112. package/dist/core/Agent.d.ts +22 -22
  113. package/dist/core/Agent.d.ts.map +1 -1
  114. package/dist/core/Agent.js +170 -162
  115. package/dist/core/Agent.js.map +1 -1
  116. package/dist/core/Events.d.ts +6 -6
  117. package/dist/core/Events.d.ts.map +1 -1
  118. package/dist/core/PersistenceManager.d.ts +13 -13
  119. package/dist/core/PersistenceManager.d.ts.map +1 -1
  120. package/dist/core/PersistenceManager.js +25 -25
  121. package/dist/core/PersistenceManager.js.map +1 -1
  122. package/dist/core/ResponseEngine.d.ts +3 -8
  123. package/dist/core/ResponseEngine.d.ts.map +1 -1
  124. package/dist/core/ResponseEngine.js +8 -8
  125. package/dist/core/ResponseEngine.js.map +1 -1
  126. package/dist/core/Route.d.ts +17 -17
  127. package/dist/core/Route.d.ts.map +1 -1
  128. package/dist/core/Route.js +33 -33
  129. package/dist/core/Route.js.map +1 -1
  130. package/dist/core/RoutingEngine.d.ts +31 -31
  131. package/dist/core/RoutingEngine.d.ts.map +1 -1
  132. package/dist/core/RoutingEngine.js +197 -197
  133. package/dist/core/RoutingEngine.js.map +1 -1
  134. package/dist/core/Step.d.ts +72 -0
  135. package/dist/core/Step.d.ts.map +1 -0
  136. package/dist/core/Step.js +146 -0
  137. package/dist/core/Step.js.map +1 -0
  138. package/dist/core/ToolExecutor.d.ts +5 -5
  139. package/dist/core/ToolExecutor.d.ts.map +1 -1
  140. package/dist/core/ToolExecutor.js +8 -8
  141. package/dist/core/ToolExecutor.js.map +1 -1
  142. package/dist/core/Transition.d.ts +14 -14
  143. package/dist/core/Transition.d.ts.map +1 -1
  144. package/dist/core/Transition.js +48 -19
  145. package/dist/core/Transition.js.map +1 -1
  146. package/dist/index.d.ts +7 -7
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +4 -4
  149. package/dist/index.js.map +1 -1
  150. package/dist/types/agent.d.ts +9 -9
  151. package/dist/types/agent.d.ts.map +1 -1
  152. package/dist/types/ai.d.ts +2 -2
  153. package/dist/types/ai.d.ts.map +1 -1
  154. package/dist/types/history.d.ts +3 -3
  155. package/dist/types/history.d.ts.map +1 -1
  156. package/dist/types/index.d.ts +1 -1
  157. package/dist/types/index.d.ts.map +1 -1
  158. package/dist/types/persistence.d.ts +5 -5
  159. package/dist/types/persistence.d.ts.map +1 -1
  160. package/dist/types/route.d.ts +57 -52
  161. package/dist/types/route.d.ts.map +1 -1
  162. package/dist/types/session.d.ts +27 -27
  163. package/dist/types/session.d.ts.map +1 -1
  164. package/dist/types/session.js +44 -46
  165. package/dist/types/session.js.map +1 -1
  166. package/dist/types/tool.d.ts +13 -13
  167. package/dist/types/tool.d.ts.map +1 -1
  168. package/dist/utils/id.d.ts +8 -3
  169. package/dist/utils/id.d.ts.map +1 -1
  170. package/dist/utils/id.js +14 -6
  171. package/dist/utils/id.js.map +1 -1
  172. package/docs/ADAPTERS.md +21 -21
  173. package/docs/AGENT.md +63 -61
  174. package/docs/API_REFERENCE.md +218 -220
  175. package/docs/ARCHITECTURE.md +99 -104
  176. package/docs/CONTEXT_MANAGEMENT.md +84 -91
  177. package/docs/CONTRIBUTING.md +3 -3
  178. package/docs/DOCS.md +18 -18
  179. package/docs/DOMAINS.md +18 -18
  180. package/docs/EXAMPLES.md +44 -44
  181. package/docs/GETTING_STARTED.md +63 -66
  182. package/docs/PERSISTENCE.md +70 -74
  183. package/docs/PROVIDERS.md +6 -6
  184. package/docs/README.md +6 -6
  185. package/docs/ROUTES.md +218 -220
  186. package/docs/STEPS.md +883 -0
  187. package/examples/business-onboarding.ts +85 -82
  188. package/examples/company-qna-agent.ts +69 -68
  189. package/examples/custom-database-persistence.ts +89 -91
  190. package/examples/declarative-agent.ts +33 -33
  191. package/examples/domain-scoping.ts +20 -20
  192. package/examples/extracted-data-modification.ts +93 -98
  193. package/examples/healthcare-agent.ts +90 -92
  194. package/examples/openai-agent.ts +30 -33
  195. package/examples/opensearch-persistence.ts +46 -48
  196. package/examples/persistent-onboarding.ts +67 -68
  197. package/examples/prisma-persistence.ts +111 -115
  198. package/examples/prisma-schema.example.prisma +3 -3
  199. package/examples/redis-persistence.ts +70 -76
  200. package/examples/route-transitions.ts +72 -48
  201. package/examples/rules-prohibitions.ts +31 -31
  202. package/examples/streaming-agent.ts +29 -29
  203. package/examples/travel-agent.ts +95 -110
  204. package/package.json +1 -1
  205. package/src/adapters/MemoryAdapter.ts +4 -4
  206. package/src/adapters/MongoAdapter.ts +4 -4
  207. package/src/adapters/OpenSearchAdapter.ts +8 -8
  208. package/src/adapters/PostgreSQLAdapter.ts +11 -11
  209. package/src/adapters/PrismaAdapter.ts +5 -5
  210. package/src/adapters/RedisAdapter.ts +4 -4
  211. package/src/adapters/SQLiteAdapter.ts +16 -16
  212. package/src/adapters/index.ts +1 -1
  213. package/src/constants/index.ts +4 -4
  214. package/src/core/Agent.ts +218 -214
  215. package/src/core/Events.ts +12 -12
  216. package/src/core/PersistenceManager.ts +32 -36
  217. package/src/core/ResponseEngine.ts +11 -17
  218. package/src/core/Route.ts +55 -49
  219. package/src/core/RoutingEngine.ts +252 -258
  220. package/src/core/Step.ts +197 -0
  221. package/src/core/ToolExecutor.ts +11 -11
  222. package/src/core/Transition.ts +72 -26
  223. package/src/index.ts +8 -8
  224. package/src/types/agent.ts +9 -9
  225. package/src/types/ai.ts +2 -2
  226. package/src/types/history.ts +3 -3
  227. package/src/types/index.ts +1 -1
  228. package/src/types/persistence.ts +6 -6
  229. package/src/types/route.ts +77 -61
  230. package/src/types/session.ts +75 -78
  231. package/src/types/tool.ts +17 -17
  232. package/src/utils/id.ts +15 -6
  233. package/dist/cjs/core/State.d.ts +0 -72
  234. package/dist/cjs/core/State.d.ts.map +0 -1
  235. package/dist/cjs/core/State.js +0 -148
  236. package/dist/cjs/core/State.js.map +0 -1
  237. package/dist/core/State.d.ts +0 -72
  238. package/dist/core/State.d.ts.map +0 -1
  239. package/dist/core/State.js +0 -144
  240. package/dist/core/State.js.map +0 -1
  241. package/docs/STATES.md +0 -888
  242. package/src/core/State.ts +0 -212
@@ -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
 
@@ -201,7 +189,7 @@ async function createTravelAgent() {
201
189
  description:
202
190
  "A knowledgeable travel agent who helps book flights, answer travel questions, and manage reservations.",
203
191
  goal: "Help customers book travel and manage their reservations",
204
- ai: provider,
192
+ provider: provider,
205
193
  context: {
206
194
  customerId: "test-123",
207
195
  customerName: "Test Customer",
@@ -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.9",
3
+ "version": "0.8.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",
@@ -27,7 +27,7 @@ import type {
27
27
  *
28
28
  * const agent = new Agent({
29
29
  * name: "My Agent",
30
- * ai: provider,
30
+ * provider: provider,
31
31
  * persistence: {
32
32
  * adapter: new MemoryAdapter(),
33
33
  * userId: "user_123",
@@ -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
 
@@ -87,7 +87,7 @@ export interface MongoAdapterOptions {
87
87
  *
88
88
  * const agent = new Agent({
89
89
  * name: "My Agent",
90
- * ai: provider,
90
+ * provider: provider,
91
91
  * persistence: {
92
92
  * adapter: new MongoAdapter({
93
93
  * client,
@@ -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
 
@@ -191,7 +191,7 @@ export class OpenSearchAdapter implements PersistenceAdapter {
191
191
  agentName: { type: "keyword" },
192
192
  status: { type: "keyword" },
193
193
  currentRoute: { type: "keyword" },
194
- currentState: { type: "keyword" },
194
+ currentStep: { type: "keyword" },
195
195
  collectedData: { type: "object", enabled: false },
196
196
  messageCount: { type: "integer" },
197
197
  createdAt: { type: "date" },
@@ -221,7 +221,7 @@ export class OpenSearchAdapter implements PersistenceAdapter {
221
221
  role: { type: "keyword" },
222
222
  content: { type: "text" },
223
223
  route: { type: "keyword" },
224
- state: { type: "keyword" },
224
+ step: { type: "keyword" },
225
225
  toolCalls: { type: "object", enabled: false },
226
226
  event: { type: "object", enabled: false },
227
227
  createdAt: { type: "date" },
@@ -396,10 +396,10 @@ class OpenSearchSessionRepository implements SessionRepository {
396
396
  return await this.findById(id);
397
397
  }
398
398
 
399
- async updateRouteState(
399
+ async updateRouteStep(
400
400
  id: string,
401
401
  route?: string,
402
- state?: string
402
+ step?: string
403
403
  ): Promise<SessionData | null> {
404
404
  const doc: Record<string, unknown> = {
405
405
  updatedAt: new Date().toISOString(),
@@ -408,8 +408,8 @@ class OpenSearchSessionRepository implements SessionRepository {
408
408
  if (route !== undefined) {
409
409
  doc.currentRoute = route;
410
410
  }
411
- if (state !== undefined) {
412
- doc.currentState = state;
411
+ if (step !== undefined) {
412
+ doc.currentStep = step;
413
413
  }
414
414
 
415
415
  await this.client.update({
@@ -478,7 +478,7 @@ class OpenSearchSessionRepository implements SessionRepository {
478
478
  agentName: doc.agentName as string | undefined,
479
479
  status: doc.status as SessionData["status"],
480
480
  currentRoute: doc.currentRoute as string | undefined,
481
- currentState: doc.currentState as string | undefined,
481
+ currentStep: doc.currentStep as string | undefined,
482
482
  collectedData: doc.collectedData as Record<string, unknown> | undefined,
483
483
  messageCount: doc.messageCount as number | undefined,
484
484
  createdAt: new Date(doc.createdAt as string),
@@ -646,7 +646,7 @@ class OpenSearchMessageRepository implements MessageRepository {
646
646
  role: doc.role as MessageData["role"],
647
647
  content: doc.content as string,
648
648
  route: doc.route as string | undefined,
649
- state: doc.state as string | undefined,
649
+ step: doc.step as string | undefined,
650
650
  toolCalls: doc.toolCalls as
651
651
  | Array<{ toolName: string; arguments: Record<string, unknown> }>
652
652
  | undefined,
@@ -68,7 +68,7 @@ export interface PostgreSQLAdapterOptions {
68
68
  *
69
69
  * const agent = new Agent({
70
70
  * name: "My Agent",
71
- * ai: provider,
71
+ * provider: provider,
72
72
  * persistence: {
73
73
  * adapter: new PostgreSQLAdapter({ client }),
74
74
  * userId: "user_123",
@@ -110,7 +110,7 @@ export class PostgreSQLAdapter implements PersistenceAdapter {
110
110
  agent_name VARCHAR(255),
111
111
  status VARCHAR(50) DEFAULT 'active',
112
112
  current_route VARCHAR(255),
113
- current_state VARCHAR(255),
113
+ current_step VARCHAR(255),
114
114
  collected_data JSONB,
115
115
  message_count INTEGER DEFAULT 0,
116
116
  last_message_at TIMESTAMP,
@@ -133,7 +133,7 @@ export class PostgreSQLAdapter implements PersistenceAdapter {
133
133
  role VARCHAR(50) NOT NULL,
134
134
  content TEXT NOT NULL,
135
135
  route VARCHAR(255),
136
- state VARCHAR(255),
136
+ step VARCHAR(255),
137
137
  tool_calls JSONB,
138
138
  event JSONB,
139
139
  created_at TIMESTAMP DEFAULT NOW(),
@@ -237,9 +237,9 @@ class PostgreSQLSessionRepository implements SessionRepository {
237
237
  fields.push(`current_route = $${paramIndex++}`);
238
238
  values.push(data.currentRoute);
239
239
  }
240
- if (data.currentState !== undefined) {
241
- fields.push(`current_state = $${paramIndex++}`);
242
- values.push(data.currentState);
240
+ if (data.currentStep !== undefined) {
241
+ fields.push(`current_step = $${paramIndex++}`);
242
+ values.push(data.currentStep);
243
243
  }
244
244
  if (data.messageCount !== undefined) {
245
245
  fields.push(`message_count = $${paramIndex++}`);
@@ -285,14 +285,14 @@ class PostgreSQLSessionRepository implements SessionRepository {
285
285
  return await this.update(id, { collectedData });
286
286
  }
287
287
 
288
- async updateRouteState(
288
+ async updateRouteStep(
289
289
  id: string,
290
290
  route?: string,
291
- state?: string
291
+ step?: string
292
292
  ): Promise<SessionData | null> {
293
293
  return await this.update(id, {
294
294
  currentRoute: route,
295
- currentState: state,
295
+ currentStep: step,
296
296
  });
297
297
  }
298
298
 
@@ -333,7 +333,7 @@ class PostgreSQLMessageRepository implements MessageRepository {
333
333
 
334
334
  const result = await this.client.query<MessageData>(
335
335
  `INSERT INTO ${this.tableName}
336
- (id, session_id, user_id, role, content, route, state, tool_calls, event, created_at)
336
+ (id, session_id, user_id, role, content, route, step, tool_calls, event, created_at)
337
337
  VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, NOW())
338
338
  RETURNING *`,
339
339
  [
@@ -343,7 +343,7 @@ class PostgreSQLMessageRepository implements MessageRepository {
343
343
  data.role,
344
344
  data.content,
345
345
  data.route || null,
346
- data.state || null,
346
+ data.step || null,
347
347
  JSON.stringify(data.toolCalls || null),
348
348
  JSON.stringify(data.event || null),
349
349
  ]
@@ -107,7 +107,7 @@ export interface PrismaAdapterOptions {
107
107
  *
108
108
  * const agent = new Agent({
109
109
  * name: "My Agent",
110
- * ai: provider,
110
+ * provider: provider,
111
111
  * persistence: {
112
112
  * adapter: new PrismaAdapter({ prisma }),
113
113
  * userId: "user_123",
@@ -333,10 +333,10 @@ class PrismaSessionRepository implements SessionRepository {
333
333
  return this.unmapFields(result);
334
334
  }
335
335
 
336
- async updateRouteState(
336
+ async updateRouteStep(
337
337
  id: string,
338
338
  route?: string,
339
- state?: string
339
+ step?: string
340
340
  ): Promise<SessionData | null> {
341
341
  const data: Record<string, unknown> = {
342
342
  [this.fieldMap.updatedAt || "updatedAt"]: new Date(),
@@ -344,8 +344,8 @@ class PrismaSessionRepository implements SessionRepository {
344
344
  if (route !== undefined) {
345
345
  data[this.fieldMap.currentRoute || "currentRoute"] = route;
346
346
  }
347
- if (state !== undefined) {
348
- data[this.fieldMap.currentState || "currentState"] = state;
347
+ if (step !== undefined) {
348
+ data[this.fieldMap.currentStep || "currentStep"] = step;
349
349
  }
350
350
  const result = await this.getModel().update({
351
351
  where: { [this.fieldMap.id || "id"]: id },