@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
@@ -76,9 +76,9 @@ export function createMessageEvent(
76
76
  session?: {
77
77
  routeId?: string;
78
78
  routeTitle?: string;
79
- stateId?: string;
80
- stateDescription?: string;
81
- extracted?: Record<string, unknown>;
79
+ stepId?: string;
80
+ stepDescription?: string;
81
+ data?: Record<string, unknown>;
82
82
  };
83
83
  }
84
84
  ): Event<MessageEventData>;
@@ -90,9 +90,9 @@ export function createMessageEvent(options: {
90
90
  session?: {
91
91
  routeId?: string;
92
92
  routeTitle?: string;
93
- stateId?: string;
94
- stateDescription?: string;
95
- extracted?: Record<string, unknown>;
93
+ stepId?: string;
94
+ stepDescription?: string;
95
+ data?: Record<string, unknown>;
96
96
  };
97
97
  }): Event<MessageEventData>;
98
98
  export function createMessageEvent(
@@ -106,9 +106,9 @@ export function createMessageEvent(
106
106
  session?: {
107
107
  routeId?: string;
108
108
  routeTitle?: string;
109
- stateId?: string;
110
- stateDescription?: string;
111
- extracted?: Record<string, unknown>;
109
+ stepId?: string;
110
+ stepDescription?: string;
111
+ data?: Record<string, unknown>;
112
112
  };
113
113
  },
114
114
  participantName?: string,
@@ -118,9 +118,9 @@ export function createMessageEvent(
118
118
  session?: {
119
119
  routeId?: string;
120
120
  routeTitle?: string;
121
- stateId?: string;
122
- stateDescription?: string;
123
- extracted?: Record<string, unknown>;
121
+ stepId?: string;
122
+ stepDescription?: string;
123
+ data?: Record<string, unknown>;
124
124
  };
125
125
  }
126
126
  ): Event<MessageEventData> {
@@ -14,11 +14,11 @@ import type {
14
14
  MessageRepository,
15
15
  } from "../types/persistence";
16
16
  import type { Event } from "../types/history";
17
- import type { SessionState } from "../types/session";
17
+ import type { SessionStep } from "../types/session";
18
18
  import {
19
19
  createSession,
20
- sessionStateToData,
21
- sessionDataToState,
20
+ sessionStepToData,
21
+ sessionDataToStep,
22
22
  } from "../types/session";
23
23
 
24
24
  /**
@@ -119,18 +119,14 @@ export class PersistenceManager {
119
119
  }
120
120
 
121
121
  /**
122
- * Update current route and state
122
+ * Update current route and step
123
123
  */
124
- async updateRouteState(
124
+ async updateRouteStep(
125
125
  sessionId: string,
126
126
  route?: string,
127
- state?: string
127
+ step?: string
128
128
  ): Promise<SessionData | null> {
129
- return await this.sessionRepository.updateRouteState(
130
- sessionId,
131
- route,
132
- state
133
- );
129
+ return await this.sessionRepository.updateRouteStep(sessionId, route, step);
134
130
  }
135
131
 
136
132
  /**
@@ -145,7 +141,7 @@ export class PersistenceManager {
145
141
  role: options.role,
146
142
  content: options.content,
147
143
  route: options.route,
148
- state: options.state,
144
+ step: options.step,
149
145
  toolCalls: options.toolCalls,
150
146
  event: options.event,
151
147
  });
@@ -227,77 +223,77 @@ export class PersistenceManager {
227
223
  }
228
224
 
229
225
  /**
230
- * Save SessionState to database
231
- * Converts SessionState to SessionData and persists it
226
+ * Save SessionStep to database
227
+ * Converts SessionStep to SessionData and persists it
232
228
  */
233
- async saveSessionState<TExtracted = Record<string, unknown>>(
229
+ async saveSessionStep<TData = Record<string, unknown>>(
234
230
  sessionId: string,
235
- sessionState: SessionState<TExtracted>
231
+ sessionStep: SessionStep<TData>
236
232
  ): Promise<SessionData | null> {
237
- const persistenceData = sessionStateToData(sessionState);
233
+ const persistenceData = sessionStepToData(sessionStep);
238
234
 
239
235
  return await this.sessionRepository.update(sessionId, {
240
236
  currentRoute: persistenceData.currentRoute,
241
- currentState: persistenceData.currentState,
237
+ currentStep: persistenceData.currentStep,
242
238
  collectedData: persistenceData.collectedData,
243
239
  lastMessageAt: new Date(),
244
240
  });
245
241
  }
246
242
 
247
243
  /**
248
- * Load SessionState from database
249
- * Converts SessionData to SessionState
244
+ * Load SessionStep from database
245
+ * Converts SessionData to SessionStep
250
246
  */
251
- async loadSessionState<TExtracted = Record<string, unknown>>(
247
+ async loadSessionStep<TData = Record<string, unknown>>(
252
248
  sessionId: string
253
- ): Promise<SessionState<TExtracted> | null> {
249
+ ): Promise<SessionStep<TData> | null> {
254
250
  const sessionData = await this.sessionRepository.findById(sessionId);
255
251
 
256
252
  if (!sessionData) {
257
253
  return null;
258
254
  }
259
255
 
260
- const stateData = sessionDataToState<TExtracted>(sessionId, {
256
+ const stepData = sessionDataToStep<TData>(sessionId, {
261
257
  currentRoute: sessionData.currentRoute,
262
- currentState: sessionData.currentState,
258
+ currentStep: sessionData.currentStep,
263
259
  collectedData: sessionData.collectedData,
264
260
  });
265
261
 
266
- // Create a full session state with the loaded data
267
- const session = createSession<TExtracted>(sessionId, {
262
+ // Create a full session step with the loaded data
263
+ const session = createSession<TData>(sessionId, {
268
264
  createdAt: sessionData.createdAt,
269
265
  lastUpdatedAt: sessionData.updatedAt,
270
266
  });
271
267
 
272
268
  return {
273
269
  ...session,
274
- ...stateData,
270
+ ...stepData,
275
271
  };
276
272
  }
277
273
 
278
274
  /**
279
- * Create session with SessionState support
280
- * Returns both SessionData and initialized SessionState
275
+ * Create session with SessionStep support
276
+ * Returns both SessionData and initialized SessionStep
281
277
  */
282
- async createSessionWithState<TExtracted = Record<string, unknown>>(
278
+ async createSessionWithStep<TData = Record<string, unknown>>(
283
279
  options: CreateSessionOptions
284
280
  ): Promise<{
285
281
  sessionData: SessionData;
286
- sessionState: SessionState<TExtracted>;
282
+ sessionStep: SessionStep<TData>;
287
283
  }> {
288
284
  const sessionData = await this.createSession(options);
289
285
 
290
- // Create SessionState with database session ID
291
- const sessionState = createSession<TExtracted>(sessionData.id, {
286
+ // Create SessionStep with database session ID
287
+ const sessionStep = createSession<TData>(sessionData.id, {
292
288
  createdAt: sessionData.createdAt,
293
289
  lastUpdatedAt: sessionData.updatedAt,
294
290
  });
295
291
 
296
- // If initial data was provided, merge it as extracted data
292
+ // If initial data was provided, merge it as collected data
297
293
  if (options.initialData) {
298
- sessionState.extracted = options.initialData as Partial<TExtracted>;
294
+ sessionStep.data = options.initialData as Partial<TData>;
299
295
  }
300
296
 
301
- return { sessionData, sessionState };
297
+ return { sessionData, sessionStep };
302
298
  }
303
299
  }
@@ -1,19 +1,13 @@
1
1
  import type { Event } from "../types/history";
2
2
  import type { Route } from "./Route";
3
- import type { State } from "./State";
3
+ import type { Step } from "./Step";
4
4
  import type { StructuredSchema } from "../types/schema";
5
5
  import { PromptComposer } from "./PromptComposer";
6
6
 
7
- export interface ResponseOutput<TData = unknown> {
8
- message: string;
9
- data?: TData;
10
- contextUpdate?: Record<string, unknown>;
11
- }
12
-
13
7
  export class ResponseEngine<TContext = unknown> {
14
- responseSchemaForRoute<TExtracted = unknown>(
15
- route: Route<TContext, TExtracted>,
16
- currentState?: State<TContext, TExtracted>
8
+ responseSchemaForRoute<TData = unknown>(
9
+ route: Route<TContext, TData>,
10
+ currentStep?: Step<TContext, TData>
17
11
  ): StructuredSchema {
18
12
  const base: StructuredSchema = {
19
13
  type: "object",
@@ -29,10 +23,10 @@ export class ResponseEngine<TContext = unknown> {
29
23
  base.properties!.data = route.responseOutputSchema;
30
24
  }
31
25
 
32
- // Add gather fields from current state
33
- if (currentState?.gatherFields && route.extractionSchema?.properties) {
34
- for (const field of currentState.gatherFields) {
35
- const fieldSchema = route.extractionSchema.properties[field];
26
+ // Add collect fields from current step
27
+ if (currentStep?.collectFields && route.schema?.properties) {
28
+ for (const field of currentStep.collectFields) {
29
+ const fieldSchema = route.schema.properties[field];
36
30
  if (fieldSchema) {
37
31
  base.properties![field] = fieldSchema;
38
32
  }
@@ -44,7 +38,7 @@ export class ResponseEngine<TContext = unknown> {
44
38
 
45
39
  buildResponsePrompt(
46
40
  route: Route<TContext>,
47
- currentState: State<TContext>,
41
+ currentStep: Step<TContext>,
48
42
  rules: string[],
49
43
  prohibitions: string[],
50
44
  directives: string[] | undefined,
@@ -72,9 +66,9 @@ export class ResponseEngine<TContext = unknown> {
72
66
  route.description ? ` — ${route.description}` : ""
73
67
  }`
74
68
  );
75
- if (currentState.chatState) {
69
+ if (currentStep.instructions) {
76
70
  pc.addInstruction(
77
- `Guideline for your response (adapt to the conversation):\n${currentState.chatState}`
71
+ `Guideline for your response (adapt to the conversation):\n${currentStep.instructions}`
78
72
  );
79
73
  }
80
74
  if (rules.length) pc.addInstruction(`Rules:\n- ${rules.join("\n- ")}`);
package/src/core/Route.ts CHANGED
@@ -13,13 +13,13 @@ import type {
13
13
  import type { StructuredSchema } from "../types/schema";
14
14
  import type { Guideline } from "../types/agent";
15
15
 
16
- import { State } from "./State";
16
+ import { Step } from "./Step";
17
17
  import { generateRouteId } from "../utils/id";
18
18
 
19
19
  /**
20
20
  * Represents a conversational route/journey
21
21
  */
22
- export class Route<TContext = unknown, TExtracted = unknown> {
22
+ export class Route<TContext = unknown, TData = unknown> {
23
23
  public readonly id: string;
24
24
  public readonly title: string;
25
25
  public readonly description?: string;
@@ -27,16 +27,22 @@ export class Route<TContext = unknown, TExtracted = unknown> {
27
27
  public readonly domains?: string[];
28
28
  public readonly rules: string[];
29
29
  public readonly prohibitions: string[];
30
- public readonly initialState: State<TContext, TExtracted>;
31
- public readonly endStateSpec: Omit<TransitionSpec<TContext, TExtracted>, "state" | "condition" | "skipIf">;
30
+ public readonly initialStep: Step<TContext, TData>;
31
+ public readonly endStepSpec: Omit<
32
+ TransitionSpec<TContext, TData>,
33
+ "step" | "condition" | "skipIf"
34
+ >;
32
35
  public readonly responseOutputSchema?: StructuredSchema;
33
- public readonly extractionSchema?: StructuredSchema;
34
- public readonly initialData?: Partial<TExtracted>;
35
- public readonly onComplete?: string | RouteTransitionConfig | RouteCompletionHandler<TContext, TExtracted>;
36
+ public readonly schema?: StructuredSchema;
37
+ public readonly initialData?: Partial<TData>;
38
+ public readonly onComplete?:
39
+ | string
40
+ | RouteTransitionConfig
41
+ | RouteCompletionHandler<TContext, TData>;
36
42
  private routingExtrasSchema?: StructuredSchema;
37
43
  private guidelines: Guideline[] = [];
38
44
 
39
- constructor(options: RouteOptions<TExtracted>) {
45
+ constructor(options: RouteOptions<TContext, TData>) {
40
46
  // Use provided ID or generate a deterministic one from the title
41
47
  this.id = options.id || generateRouteId(options.title);
42
48
  this.title = options.title;
@@ -45,22 +51,23 @@ export class Route<TContext = unknown, TExtracted = unknown> {
45
51
  this.domains = options.domains;
46
52
  this.rules = options.rules || ([] as string[]);
47
53
  this.prohibitions = options.prohibitions || ([] as string[]);
48
- this.initialState = new State<TContext, TExtracted>(
54
+ this.initialStep = new Step<TContext, TData>(
49
55
  this.id,
50
- options.initialState?.chatState || "Initial state",
51
- options.initialState?.id,
52
- options.initialState?.gather,
53
- options.initialState?.skipIf,
54
- options.initialState?.requiredData,
55
- options.initialState?.chatState
56
+ options.initialStep?.instructions || "Initial step",
57
+ options.initialStep?.id,
58
+ options.initialStep?.collect,
59
+ options.initialStep?.skipIf,
60
+ options.initialStep?.requires,
61
+ options.initialStep?.instructions
56
62
  );
57
- // Store endState spec (will be used when route completes)
58
- this.endStateSpec = options.endState || {
59
- chatState: "Summarize what was accomplished and confirm completion based on the conversation history and collected data"
63
+ // Store endStep spec (will be used when route completes)
64
+ this.endStepSpec = options.endStep || {
65
+ instructions:
66
+ "Summarize what was accomplished and confirm completion based on the conversation history and collected data",
60
67
  };
61
68
  this.routingExtrasSchema = options.routingExtrasSchema;
62
69
  this.responseOutputSchema = options.responseOutputSchema;
63
- this.extractionSchema = options.extractionSchema;
70
+ this.schema = options.schema;
64
71
  this.initialData = options.initialData;
65
72
  this.onComplete = options.onComplete;
66
73
 
@@ -78,24 +85,23 @@ export class Route<TContext = unknown, TExtracted = unknown> {
78
85
  }
79
86
 
80
87
  /**
81
- * Build a sequential state machine from an array of steps
88
+ * Build a sequential step machine from an array of steps
82
89
  * @private
83
90
  */
84
91
  private buildSequentialSteps(
85
- steps: Array<TransitionSpec<TContext, TExtracted>>
92
+ steps: Array<TransitionSpec<TContext, TData>>
86
93
  ): void {
87
- // Import END_STATE dynamically to avoid circular dependency
88
- const END_STATE = Symbol.for("END_STATE");
94
+ // Import END_ROUTE dynamically to avoid circular dependency
95
+ const END_ROUTE = Symbol.for("END_ROUTE");
89
96
 
90
- let currentState: TransitionResult<TContext, TExtracted> =
91
- this.initialState;
97
+ let currentStep: TransitionResult<TContext, TData> = this.initialStep;
92
98
 
93
99
  for (const step of steps) {
94
- currentState = currentState.transitionTo(step);
100
+ currentStep = currentStep.nextStep(step);
95
101
  }
96
102
 
97
103
  // End the route
98
- currentState.transitionTo({ state: END_STATE });
104
+ currentStep.nextStep({ step: END_ROUTE });
99
105
  }
100
106
 
101
107
  /**
@@ -163,12 +169,12 @@ export class Route<TContext = unknown, TExtracted = unknown> {
163
169
  }
164
170
 
165
171
  /**
166
- * Get all states in this route (via traversal from initial state)
172
+ * Get all steps in this route (via traversal from initial step)
167
173
  */
168
- getAllStates(): State<TContext, TExtracted>[] {
174
+ getAllSteps(): Step<TContext, TData>[] {
169
175
  const visited = new Set<string>();
170
- const states: State<TContext, TExtracted>[] = [];
171
- const queue: State<TContext, TExtracted>[] = [this.initialState];
176
+ const steps: Step<TContext, TData>[] = [];
177
+ const queue: Step<TContext, TData>[] = [this.initialStep];
172
178
 
173
179
  while (queue.length > 0) {
174
180
  const current = queue.shift()!;
@@ -178,9 +184,9 @@ export class Route<TContext = unknown, TExtracted = unknown> {
178
184
  }
179
185
 
180
186
  visited.add(current.id);
181
- states.push(current);
187
+ steps.push(current);
182
188
 
183
- // Add target states from transitions
189
+ // Add target steps from transitions
184
190
  for (const transition of current.getTransitions()) {
185
191
  const target = transition.getTarget();
186
192
  if (target && !visited.has(target.id)) {
@@ -189,17 +195,17 @@ export class Route<TContext = unknown, TExtracted = unknown> {
189
195
  }
190
196
  }
191
197
 
192
- return states;
198
+ return steps;
193
199
  }
194
200
 
195
201
  /**
196
- * Get a specific state by ID
197
- * @param stateId - The state ID to find
198
- * @returns The state if found, undefined otherwise
202
+ * Get a specific step by ID
203
+ * @param stepId - The step ID to find
204
+ * @returns The step if found, undefined otherwise
199
205
  */
200
- getState(stateId: string): State<TContext, TExtracted> | undefined {
201
- const states = this.getAllStates();
202
- return states.find((state) => state.id === stateId);
206
+ getStep(stepId: string): Step<TContext, TData> | undefined {
207
+ const steps = this.getAllSteps();
208
+ return steps.find((step) => step.id === stepId);
203
209
  }
204
210
 
205
211
  /**
@@ -212,16 +218,16 @@ export class Route<TContext = unknown, TExtracted = unknown> {
212
218
  `Description: ${this.description || "N/A"}`,
213
219
  `Conditions: ${this.conditions.join(", ") || "None"}`,
214
220
  "",
215
- "States:",
221
+ "Steps:",
216
222
  ];
217
223
 
218
- const states = this.getAllStates();
219
- for (const state of states) {
224
+ const steps = this.getAllSteps();
225
+ for (const step of steps) {
220
226
  lines.push(
221
- ` - ${state.id}${state.description ? `: ${state.description}` : ""}`
227
+ ` - ${step.id}${step.description ? `: ${step.description}` : ""}`
222
228
  );
223
229
 
224
- const transitions = state.getTransitions();
230
+ const transitions = step.getTransitions();
225
231
  for (const transition of transitions) {
226
232
  lines.push(` -> ${transition.describe()}`);
227
233
  }
@@ -232,12 +238,12 @@ export class Route<TContext = unknown, TExtracted = unknown> {
232
238
 
233
239
  /**
234
240
  * Evaluate the onComplete handler and return transition config
235
- * @param session - Current session state
241
+ * @param session - Current session step
236
242
  * @param context - Agent context
237
243
  * @returns Transition config or undefined if no transition
238
244
  */
239
245
  async evaluateOnComplete(
240
- session: { extracted?: Partial<TExtracted> },
246
+ session: { data?: Partial<TData> },
241
247
  context?: TContext
242
248
  ): Promise<RouteTransitionConfig | undefined> {
243
249
  if (!this.onComplete) {
@@ -247,7 +253,7 @@ export class Route<TContext = unknown, TExtracted = unknown> {
247
253
  // String form: just route ID/title
248
254
  if (typeof this.onComplete === "string") {
249
255
  return {
250
- transitionTo: this.onComplete,
256
+ nextStep: this.onComplete,
251
257
  };
252
258
  }
253
259
 
@@ -261,7 +267,7 @@ export class Route<TContext = unknown, TExtracted = unknown> {
261
267
 
262
268
  if (typeof result === "string") {
263
269
  return {
264
- transitionTo: result,
270
+ nextStep: result,
265
271
  };
266
272
  }
267
273