@falai/agent 0.6.3 → 0.6.4

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 (128) hide show
  1. package/README.md +89 -29
  2. package/dist/cjs/constants/index.d.ts +6 -1
  3. package/dist/cjs/constants/index.d.ts.map +1 -1
  4. package/dist/cjs/constants/index.js +8 -3
  5. package/dist/cjs/constants/index.js.map +1 -1
  6. package/dist/cjs/core/Agent.d.ts +22 -0
  7. package/dist/cjs/core/Agent.d.ts.map +1 -1
  8. package/dist/cjs/core/Agent.js +108 -21
  9. package/dist/cjs/core/Agent.js.map +1 -1
  10. package/dist/cjs/core/Events.d.ts +13 -0
  11. package/dist/cjs/core/Events.d.ts.map +1 -1
  12. package/dist/cjs/core/Events.js +28 -14
  13. package/dist/cjs/core/Events.js.map +1 -1
  14. package/dist/cjs/core/Route.d.ts.map +1 -1
  15. package/dist/cjs/core/Route.js +4 -4
  16. package/dist/cjs/core/Route.js.map +1 -1
  17. package/dist/cjs/core/RoutingEngine.d.ts +6 -1
  18. package/dist/cjs/core/RoutingEngine.d.ts.map +1 -1
  19. package/dist/cjs/core/RoutingEngine.js +112 -37
  20. package/dist/cjs/core/RoutingEngine.js.map +1 -1
  21. package/dist/cjs/core/State.d.ts +15 -5
  22. package/dist/cjs/core/State.d.ts.map +1 -1
  23. package/dist/cjs/core/State.js +24 -5
  24. package/dist/cjs/core/State.js.map +1 -1
  25. package/dist/cjs/core/Tool.d.ts +8 -1
  26. package/dist/cjs/core/Tool.d.ts.map +1 -1
  27. package/dist/cjs/core/Tool.js +25 -28
  28. package/dist/cjs/core/Tool.js.map +1 -1
  29. package/dist/cjs/core/Transition.js +1 -1
  30. package/dist/cjs/index.d.ts +1 -1
  31. package/dist/cjs/index.d.ts.map +1 -1
  32. package/dist/cjs/index.js +3 -2
  33. package/dist/cjs/index.js.map +1 -1
  34. package/dist/cjs/types/agent.d.ts +5 -0
  35. package/dist/cjs/types/agent.d.ts.map +1 -1
  36. package/dist/cjs/types/agent.js.map +1 -1
  37. package/dist/cjs/types/route.d.ts +7 -1
  38. package/dist/cjs/types/route.d.ts.map +1 -1
  39. package/dist/cjs/types/session.d.ts +12 -1
  40. package/dist/cjs/types/session.d.ts.map +1 -1
  41. package/dist/cjs/types/session.js +26 -5
  42. package/dist/cjs/types/session.js.map +1 -1
  43. package/dist/cjs/utils/logger.d.ts +10 -0
  44. package/dist/cjs/utils/logger.d.ts.map +1 -0
  45. package/dist/cjs/utils/logger.js +23 -0
  46. package/dist/cjs/utils/logger.js.map +1 -0
  47. package/dist/constants/index.d.ts +6 -1
  48. package/dist/constants/index.d.ts.map +1 -1
  49. package/dist/constants/index.js +6 -1
  50. package/dist/constants/index.js.map +1 -1
  51. package/dist/core/Agent.d.ts +22 -0
  52. package/dist/core/Agent.d.ts.map +1 -1
  53. package/dist/core/Agent.js +108 -21
  54. package/dist/core/Agent.js.map +1 -1
  55. package/dist/core/Events.d.ts +13 -0
  56. package/dist/core/Events.d.ts.map +1 -1
  57. package/dist/core/Events.js +28 -14
  58. package/dist/core/Events.js.map +1 -1
  59. package/dist/core/Route.d.ts.map +1 -1
  60. package/dist/core/Route.js +4 -4
  61. package/dist/core/Route.js.map +1 -1
  62. package/dist/core/RoutingEngine.d.ts +6 -1
  63. package/dist/core/RoutingEngine.d.ts.map +1 -1
  64. package/dist/core/RoutingEngine.js +112 -37
  65. package/dist/core/RoutingEngine.js.map +1 -1
  66. package/dist/core/State.d.ts +15 -5
  67. package/dist/core/State.d.ts.map +1 -1
  68. package/dist/core/State.js +25 -6
  69. package/dist/core/State.js.map +1 -1
  70. package/dist/core/Tool.d.ts +8 -1
  71. package/dist/core/Tool.d.ts.map +1 -1
  72. package/dist/core/Tool.js +25 -28
  73. package/dist/core/Tool.js.map +1 -1
  74. package/dist/core/Transition.js +1 -1
  75. package/dist/index.d.ts +1 -1
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +1 -1
  78. package/dist/index.js.map +1 -1
  79. package/dist/types/agent.d.ts +5 -0
  80. package/dist/types/agent.d.ts.map +1 -1
  81. package/dist/types/agent.js.map +1 -1
  82. package/dist/types/route.d.ts +7 -1
  83. package/dist/types/route.d.ts.map +1 -1
  84. package/dist/types/session.d.ts +12 -1
  85. package/dist/types/session.d.ts.map +1 -1
  86. package/dist/types/session.js +26 -5
  87. package/dist/types/session.js.map +1 -1
  88. package/dist/utils/logger.d.ts +10 -0
  89. package/dist/utils/logger.d.ts.map +1 -0
  90. package/dist/utils/logger.js +17 -0
  91. package/dist/utils/logger.js.map +1 -0
  92. package/docs/{CONSTRUCTOR_OPTIONS.md → AGENT.md} +79 -7
  93. package/docs/API_REFERENCE.md +309 -18
  94. package/docs/ARCHITECTURE.md +1 -1
  95. package/docs/DOCS.md +46 -22
  96. package/docs/GETTING_STARTED.md +1 -1
  97. package/docs/README.md +13 -5
  98. package/docs/ROUTES.md +743 -0
  99. package/docs/STATES.md +798 -0
  100. package/examples/business-onboarding.ts +46 -5
  101. package/examples/company-qna-agent.ts +107 -1
  102. package/examples/custom-database-persistence.ts +44 -1
  103. package/examples/declarative-agent.ts +80 -37
  104. package/examples/domain-scoping.ts +91 -21
  105. package/examples/extracted-data-modification.ts +64 -2
  106. package/examples/healthcare-agent.ts +61 -4
  107. package/examples/openai-agent.ts +24 -2
  108. package/examples/opensearch-persistence.ts +26 -1
  109. package/examples/persistent-onboarding.ts +84 -18
  110. package/examples/prisma-persistence.ts +90 -16
  111. package/examples/redis-persistence.ts +89 -17
  112. package/examples/rules-prohibitions.ts +300 -139
  113. package/examples/streaming-agent.ts +60 -0
  114. package/examples/travel-agent.ts +66 -24
  115. package/package.json +3 -2
  116. package/src/constants/index.ts +6 -1
  117. package/src/core/Agent.ts +135 -21
  118. package/src/core/Events.ts +73 -10
  119. package/src/core/Route.ts +8 -4
  120. package/src/core/RoutingEngine.ts +150 -39
  121. package/src/core/State.ts +35 -10
  122. package/src/core/Tool.ts +67 -10
  123. package/src/core/Transition.ts +1 -1
  124. package/src/index.ts +1 -1
  125. package/src/types/agent.ts +5 -0
  126. package/src/types/route.ts +10 -1
  127. package/src/types/session.ts +42 -6
  128. package/src/utils/logger.ts +19 -0
package/README.md CHANGED
@@ -93,7 +93,6 @@
93
93
 
94
94
  ---
95
95
 
96
-
97
96
  ## 📦 Installation
98
97
 
99
98
  ```bash
@@ -113,7 +112,7 @@ yarn add @falai/agent
113
112
 
114
113
  ## 🚀 Quick Start
115
114
 
116
- Build a conversational AI agent in 2 minutes:
115
+ Build a data-driven conversational AI agent in minutes. This example shows how to intelligently gather structured data over multiple turns.
117
116
 
118
117
  ```typescript
119
118
  import {
@@ -122,65 +121,117 @@ import {
122
121
  defineTool,
123
122
  createMessageEvent,
124
123
  EventSource,
124
+ END_STATE,
125
+ type ToolContext,
125
126
  } from "@falai/agent";
126
127
 
127
- // 1️⃣ Create your agent
128
+ // 1️⃣ Define the data you want to collect
129
+ interface HotelBookingData {
130
+ hotelName: string;
131
+ date: string;
132
+ guests: number;
133
+ }
134
+
135
+ // 2️⃣ Create your agent
128
136
  const agent = new Agent({
129
137
  name: "BookingBot",
130
- description: "Hotel booking assistant",
138
+ description: "A hotel booking assistant that gathers information.",
131
139
  ai: new GeminiProvider({
132
140
  apiKey: process.env.GEMINI_API_KEY!,
133
- model: "models/gemini-2.5-flash",
141
+ model: "models/gemini-2.5-flash", // or your preferred model
134
142
  }),
135
- context: { userId: "user_123" },
136
143
  });
137
144
 
138
- // 2️⃣ Define a simple tool
139
- const checkAvailability = defineTool(
140
- "check_availability",
141
- async (ctx, hotelName: string, date: string) => {
142
- return { data: `${hotelName} has rooms available on ${date}` };
145
+ // 3️⃣ Define a tool that uses the collected data
146
+ const bookHotel = defineTool(
147
+ "book_hotel",
148
+ async ({ extracted }: ToolContext<{}, HotelBookingData>) => {
149
+ // Logic to book the hotel...
150
+ return {
151
+ data: `Booking confirmed for ${extracted?.guests} at ${extracted?.hotelName} on ${extracted?.date}!`,
152
+ };
143
153
  },
144
- { description: "Check hotel availability" }
154
+ { description: "Books a hotel once all information is collected." }
145
155
  );
146
156
 
147
- // 3️⃣ Create a route with 2 states
148
- const bookingRoute = agent.createRoute({
157
+ // 4️⃣ Create a data-driven route
158
+ const bookingRoute = agent.createRoute<HotelBookingData>({
149
159
  title: "Book Hotel",
160
+ description: "Guides the user through the hotel booking process.",
150
161
  conditions: ["User wants to book a hotel"],
162
+ extractionSchema: {
163
+ type: "object",
164
+ properties: {
165
+ hotelName: { type: "string", description: "The name of the hotel." },
166
+ date: { type: "string", description: "The desired booking date." },
167
+ guests: { type: "number", description: "The number of guests." },
168
+ },
169
+ required: ["hotelName", "date", "guests"],
170
+ },
171
+ });
172
+
173
+ // 5️⃣ Build the flow to gather data step-by-step
174
+ const askHotel = bookingRoute.initialState.transitionTo({
175
+ chatState: "Ask which hotel they want to book",
176
+ gather: ["hotelName"],
177
+ skipIf: (extracted) => !!extracted.hotelName, // Skip if we already have it
151
178
  });
152
179
 
153
- bookingRoute.initialState
154
- .transitionTo({
155
- toolState: checkAvailability,
156
- condition: "User provided hotel name and date",
157
- })
158
- .transitionTo({ chatState: "Confirm booking and provide summary" });
180
+ const askDate = askHotel.transitionTo({
181
+ chatState: "Ask for the booking date",
182
+ gather: ["date"],
183
+ skipIf: (extracted) => !!extracted.date,
184
+ });
185
+
186
+ const askGuests = askDate.transitionTo({
187
+ chatState: "Ask for the number of guests",
188
+ gather: ["guests"],
189
+ skipIf: (extracted) => !!extracted.guests,
190
+ });
159
191
 
160
- // 4️⃣ Start conversing
192
+ const confirmBooking = askGuests.transitionTo({
193
+ toolState: bookHotel,
194
+ condition:
195
+ "All required information (hotel, date, guests) has been collected.",
196
+ });
197
+
198
+ confirmBooking.transitionTo({
199
+ state: END_STATE, // End the conversation flow
200
+ });
201
+
202
+ // 6️⃣ Start conversing
161
203
  const response = await agent.respond({
162
204
  history: [
163
205
  createMessageEvent(
164
206
  EventSource.CUSTOMER,
165
207
  "Alice",
166
- "Book me a room at Grand Hotel for tomorrow"
208
+ "I want to book a room at the Grand Hotel for 2 people."
167
209
  ),
168
210
  ],
169
211
  });
170
212
 
171
- console.log(response.message); // 🎉 AI handles the rest!
213
+ // The agent sees that `hotelName` and `guests` are provided,
214
+ // skips the first and third steps, and only asks for the date.
215
+ console.log(response.message);
216
+ // Expected: "Sure, for what date would you like to book at the Grand Hotel?"
172
217
  ```
173
218
 
174
- **That's it!** The agent will:
175
- - ✅ Route to the correct conversation flow
176
- - ✅ Execute tools automatically when conditions match
177
- - ✅ Generate natural responses based on state
219
+ **That's it!** The data-driven agent will:
220
+
221
+ - ✅ **Understand the Goal** - Route to the `Book Hotel` flow based on user intent.
222
+ - ✅ **Extract Known Data** - Automatically pull `hotelName` and `guests` from the first message.
223
+ - ✅ **Skip Unneeded Steps** - Use `skipIf` to bypass questions for data it already has.
224
+ - ✅ **Gather Missing Data** - Intelligently ask only for the missing `date`.
225
+ - ✅ **Execute Deterministically** - Call the `bookHotel` tool only when all required data is present.
226
+
227
+ This creates a flexible and natural conversation, guided by a clear data structure.
178
228
 
179
229
  📖 **[See more examples →](./docs/EXAMPLES.md)** | **[Full tutorial →](./docs/GETTING_STARTED.md)**
180
230
 
181
231
  ### ⚡ Advanced Features
182
232
 
183
233
  **Streaming responses** for real-time UX:
234
+
184
235
  ```typescript
185
236
  for await (const chunk of agent.respondStream({ history })) {
186
237
  process.stdout.write(chunk.delta);
@@ -188,6 +239,7 @@ for await (const chunk of agent.respondStream({ history })) {
188
239
  ```
189
240
 
190
241
  **Session state** for multi-turn conversations:
242
+
191
243
  ```typescript
192
244
  let session = createSession<MyData>();
193
245
  const response = await agent.respond({ history, session });
@@ -195,10 +247,11 @@ session = response.session!; // Tracks progress across turns
195
247
  ```
196
248
 
197
249
  **Database persistence** with any adapter:
250
+
198
251
  ```typescript
199
252
  import { PrismaAdapter } from "@falai/agent";
200
253
  const agent = new Agent({
201
- persistence: { adapter: new PrismaAdapter({ prisma }) }
254
+ persistence: { adapter: new PrismaAdapter({ prisma }) },
202
255
  });
203
256
  ```
204
257
 
@@ -211,15 +264,19 @@ const agent = new Agent({
211
264
  📋 **[Complete Documentation Index →](docs/DOCS.md)** - Searchable index of all docs
212
265
 
213
266
  **Core Guides:**
267
+
214
268
  - 📘 **[Getting Started](./docs/GETTING_STARTED.md)** - Build your first agent in 5 minutes
215
269
  - 🏗️ **[Architecture](./docs/ARCHITECTURE.md)** - Design principles & philosophy
216
270
  - 🔧 **[API Reference](./docs/API_REFERENCE.md)** - Complete API documentation
217
271
  - 📝 **[Examples](./docs/EXAMPLES.md)** - Production-ready code examples
218
272
 
219
273
  **Feature Guides:**
274
+
275
+ - 🛤️ **[Routes](./docs/ROUTES.md)** - Creating conversational routes & flows
276
+ - 🔄 **[States](./docs/STATES.md)** - Managing states & transitions
220
277
  - 💾 **[Persistence](./docs/PERSISTENCE.md)** - Database integration with adapters
221
278
  - 🔒 **[Domains](./docs/DOMAINS.md)** - Optional tool security & organization
222
- - 🎛️ **[Constructor Options](./docs/CONSTRUCTOR_OPTIONS.md)** - Configuration patterns
279
+ - 🎛️ **[Agent](./docs/AGENT.md)** - Configuration patterns
223
280
  - 📊 **[Context Management](./docs/CONTEXT_MANAGEMENT.md)** - Session state & lifecycle hooks
224
281
  - 🤖 **[AI Providers](./docs/PROVIDERS.md)** - Anthropic, OpenAI, Gemini, OpenRouter
225
282
 
@@ -228,6 +285,7 @@ const agent = new Agent({
228
285
  ## 🎯 Examples
229
286
 
230
287
  **Core Examples:**
288
+
231
289
  - 🏢 **[Business Onboarding](./examples/business-onboarding.ts)** - Complex multi-step flow with branching
232
290
  - ✈️ **[Travel Agent](./examples/travel-agent.ts)** - Multi-route booking system with session state
233
291
  - 🏥 **[Healthcare Assistant](./examples/healthcare-agent.ts)** - Appointment scheduling & lab results
@@ -235,6 +293,7 @@ const agent = new Agent({
235
293
  - ⚡ **[Streaming Responses](./examples/streaming-agent.ts)** - Real-time response streaming
236
294
 
237
295
  **Persistence & Advanced:**
296
+
238
297
  - 💾 **[Prisma Persistence](./examples/prisma-persistence.ts)** - Auto-save with Prisma ORM
239
298
  - ⚡ **[Redis Persistence](./examples/redis-persistence.ts)** - Fast in-memory sessions
240
299
  - 🔐 **[Domain Scoping](./examples/domain-scoping.ts)** - Tool security per route
@@ -255,6 +314,7 @@ const agent = new Agent({
255
314
  5. **Message Generation** - AI generates natural responses based on current state
256
315
 
257
316
  **Behind the scenes:**
317
+
258
318
  - The AI only generates messages and extracts data - it never decides which tools to call
259
319
  - Tools execute deterministically based on state transitions and code-based conditions
260
320
  - Session state tracks progress and extracted data across conversation turns
@@ -1,5 +1,10 @@
1
1
  /**
2
2
  * Special marker to end a route/journey
3
3
  */
4
- export declare const END_ROUTE: unique symbol;
4
+ export declare const END_STATE: unique symbol;
5
+ /**
6
+ * String constant for END_STATE comparisons
7
+ * Use this when checking if currentState.id has reached END_STATE
8
+ */
9
+ export declare const END_STATE_ID = "END_STATE";
5
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,SAAS,eAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,SAAS,eAAsB,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,YAAY,cAAc,CAAC"}
@@ -1,8 +1,13 @@
1
1
  "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.END_STATE_ID = exports.END_STATE = void 0;
2
4
  /**
3
5
  * Special marker to end a route/journey
4
6
  */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.END_ROUTE = void 0;
7
- exports.END_ROUTE = Symbol("END_ROUTE");
7
+ exports.END_STATE = Symbol("END_STATE");
8
+ /**
9
+ * String constant for END_STATE comparisons
10
+ * Use this when checking if currentState.id has reached END_STATE
11
+ */
12
+ exports.END_STATE_ID = "END_STATE";
8
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEU,QAAA,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAE7C;;;GAGG;AACU,QAAA,YAAY,GAAG,WAAW,CAAC"}
@@ -22,6 +22,7 @@ export declare class Agent<TContext = unknown> {
22
22
  private persistenceManager;
23
23
  private routingEngine;
24
24
  private responseEngine;
25
+ private currentSession?;
25
26
  /**
26
27
  * Dynamic domain property - populated via addDomain
27
28
  */
@@ -95,6 +96,7 @@ export declare class Agent<TContext = unknown> {
95
96
  toolName: string;
96
97
  arguments: Record<string, unknown>;
97
98
  }>;
99
+ isRouteComplete?: boolean;
98
100
  }>;
99
101
  /**
100
102
  * Generate a response based on history and context
@@ -112,6 +114,7 @@ export declare class Agent<TContext = unknown> {
112
114
  toolName: string;
113
115
  arguments: Record<string, unknown>;
114
116
  }>;
117
+ isRouteComplete?: boolean;
115
118
  }>;
116
119
  /**
117
120
  * Get all routes
@@ -153,5 +156,24 @@ export declare class Agent<TContext = unknown> {
153
156
  * @returns Filtered domains object, or all domains if route has no restrictions
154
157
  */
155
158
  getDomainsForRouteByTitle(routeTitle: string): Record<string, Record<string, unknown>>;
159
+ /**
160
+ * Set the current session for convenience methods
161
+ * @param session - Session state to use for subsequent calls
162
+ */
163
+ setCurrentSession(session: SessionState): void;
164
+ /**
165
+ * Get the current session (if set)
166
+ */
167
+ getCurrentSession(): SessionState | undefined;
168
+ /**
169
+ * Clear the current session
170
+ */
171
+ clearCurrentSession(): void;
172
+ /**
173
+ * Get extracted data from current session
174
+ * @param routeId - Optional route ID to get data for (uses current route if not provided)
175
+ * @returns The extracted data from the current session
176
+ */
177
+ getExtractedData<TExtracted = unknown>(routeId?: string): Partial<TExtracted>;
156
178
  }
157
179
  //# sourceMappingURL=Agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Agent.d.ts","sourceRoot":"","sources":["../../../src/core/Agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Agent.d.ts","sourceRoot":"","sources":["../../../src/core/Agent.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Agent = void 0;
7
7
  const session_1 = require("../types/session");
8
8
  const PromptComposer_1 = require("./PromptComposer");
9
+ const logger_1 = require("../utils/logger");
9
10
  const Route_1 = require("./Route");
10
11
  const DomainRegistry_1 = require("./DomainRegistry");
11
12
  const PersistenceManager_1 = require("./PersistenceManager");
@@ -13,6 +14,7 @@ const RoutingEngine_1 = require("./RoutingEngine");
13
14
  const ResponseEngine_1 = require("./ResponseEngine");
14
15
  const ToolExecutor_1 = require("./ToolExecutor");
15
16
  const event_1 = require("../utils/event");
17
+ const constants_1 = require("../constants");
16
18
  /**
17
19
  * Main Agent class with generic context support
18
20
  */
@@ -29,12 +31,18 @@ class Agent {
29
31
  * Dynamic domain property - populated via addDomain
30
32
  */
31
33
  this.domain = {};
34
+ // Set log level based on debug option
35
+ if (options.debug) {
36
+ logger_1.logger.setLevel(logger_1.LoggerLevel.DEBUG);
37
+ }
32
38
  // Validate context configuration
33
39
  if (options.context !== undefined && options.contextProvider) {
34
40
  throw new Error("Cannot provide both 'context' and 'contextProvider'. Choose one.");
35
41
  }
36
42
  // Initialize context if provided
37
43
  this.context = options.context;
44
+ // Initialize current session if provided
45
+ this.currentSession = options.session;
38
46
  // Initialize routing and response engines
39
47
  this.routingEngine = new RoutingEngine_1.RoutingEngine({
40
48
  maxCandidates: 5,
@@ -48,7 +56,7 @@ class Agent {
48
56
  // Initialize the adapter if it has an initialize method
49
57
  if (options.persistence.adapter.initialize) {
50
58
  options.persistence.adapter.initialize().catch((error) => {
51
- console.error("[Agent] Persistence adapter initialization failed:", error);
59
+ logger_1.logger.error("[Agent] Persistence adapter initialization failed:", error);
52
60
  });
53
61
  }
54
62
  }
@@ -218,8 +226,8 @@ class Agent {
218
226
  ...currentContext,
219
227
  ...contextOverride,
220
228
  };
221
- // Initialize or get session
222
- let session = params.session || (0, session_1.createSession)();
229
+ // Initialize or get session (use current session if available)
230
+ let session = params.session || this.currentSession || (0, session_1.createSession)();
223
231
  // PHASE 1: TOOL EXECUTION - Execute tools if current state has toolState
224
232
  if (session.currentRoute && session.currentState) {
225
233
  const currentRoute = this.routes.find((r) => r.id === session.currentRoute?.id);
@@ -240,9 +248,9 @@ class Agent {
240
248
  // Update extracted data with tool results
241
249
  if (result.extractedUpdate) {
242
250
  session = await this.updateExtracted(session, result.extractedUpdate);
243
- console.log(`[Agent] Tool updated extracted data:`, result.extractedUpdate);
251
+ logger_1.logger.debug(`[Agent] Tool updated extracted data:`, result.extractedUpdate);
244
252
  }
245
- console.log(`[Agent] Executed tool: ${result.toolName} (success: ${result.success})`);
253
+ logger_1.logger.debug(`[Agent] Executed tool: ${result.toolName} (success: ${result.success})`);
246
254
  }
247
255
  }
248
256
  }
@@ -251,6 +259,7 @@ class Agent {
251
259
  let selectedRoute;
252
260
  let responseDirectives;
253
261
  let selectedState;
262
+ let isRouteComplete = false;
254
263
  if (this.routes.length > 0) {
255
264
  const orchestration = await this.routingEngine.decideRouteAndState({
256
265
  routes: this.routes,
@@ -270,9 +279,14 @@ class Agent {
270
279
  selectedState = orchestration.selectedState;
271
280
  responseDirectives = orchestration.responseDirectives;
272
281
  session = orchestration.session;
282
+ isRouteComplete = orchestration.isRouteComplete || false;
283
+ // Log if route is complete
284
+ if (isRouteComplete) {
285
+ logger_1.logger.debug(`[Agent] Route complete: all required data collected, END_STATE reached`);
286
+ }
273
287
  }
274
288
  // PHASE 3: DETERMINE NEXT STATE - Use state from combined decision or get initial state
275
- if (selectedRoute) {
289
+ if (selectedRoute && !isRouteComplete) {
276
290
  let nextState;
277
291
  // If we have a selected state from the combined routing decision, use it
278
292
  if (selectedState) {
@@ -283,17 +297,17 @@ class Agent {
283
297
  const candidates = this.routingEngine.getCandidateStates(selectedRoute, undefined, session.extracted);
284
298
  if (candidates.length > 0) {
285
299
  nextState = candidates[0].state;
286
- console.log(`[Agent] Using first valid state: ${nextState.id} for new route`);
300
+ logger_1.logger.debug(`[Agent] Using first valid state: ${nextState.id} for new route`);
287
301
  }
288
302
  else {
289
303
  // Fallback to initial state even if it should be skipped
290
304
  nextState = selectedRoute.initialState;
291
- console.warn(`[Agent] No valid states found, using initial state: ${nextState.id}`);
305
+ logger_1.logger.warn(`[Agent] No valid states found, using initial state: ${nextState.id}`);
292
306
  }
293
307
  }
294
308
  // Update session with next state
295
309
  session = (0, session_1.enterState)(session, nextState.id, nextState.description);
296
- console.log(`[Agent] Entered state: ${nextState.id}`);
310
+ logger_1.logger.debug(`[Agent] Entered state: ${nextState.id}`);
297
311
  // PHASE 4: RESPONSE GENERATION - Stream message using selected route and state
298
312
  // Get last user message
299
313
  const lastUserMessage = (0, event_1.getLastMessageFromHistory)(history);
@@ -333,7 +347,7 @@ class Agent {
333
347
  // Merge gathered data into session
334
348
  if (Object.keys(gatheredData).length > 0) {
335
349
  session = await this.updateExtracted(session, gatheredData);
336
- console.log(`[Agent] Extracted data:`, gatheredData);
350
+ logger_1.logger.debug(`[Agent] Extracted data:`, gatheredData);
337
351
  }
338
352
  }
339
353
  // Extract any additional data from structured response on final chunk
@@ -350,7 +364,11 @@ class Agent {
350
364
  session.id &&
351
365
  this.options.persistence?.autoSave !== false) {
352
366
  await this.persistenceManager.saveSessionState(session.id, session);
353
- console.log(`[Agent] Auto-saved session state to persistence: ${session.id}`);
367
+ logger_1.logger.debug(`[Agent] Auto-saved session state to persistence: ${session.id}`);
368
+ }
369
+ // Update current session if we have one
370
+ if (chunk.done && this.currentSession) {
371
+ this.currentSession = session;
354
372
  }
355
373
  yield {
356
374
  delta: chunk.delta,
@@ -358,9 +376,23 @@ class Agent {
358
376
  done: chunk.done,
359
377
  session, // Return updated session
360
378
  toolCalls,
379
+ isRouteComplete,
361
380
  };
362
381
  }
363
382
  }
383
+ else if (isRouteComplete && selectedRoute) {
384
+ // Route is complete - set state to END_STATE marker and yield completion signal
385
+ session = (0, session_1.enterState)(session, constants_1.END_STATE_ID, "Route completed");
386
+ logger_1.logger.debug(`[Agent] Route ${selectedRoute.title} completed. Entered END_STATE state.`);
387
+ yield {
388
+ delta: "",
389
+ accumulated: "",
390
+ done: true,
391
+ session,
392
+ toolCalls: undefined,
393
+ isRouteComplete: true,
394
+ };
395
+ }
364
396
  else {
365
397
  // Fallback: No routes defined, stream a simple response
366
398
  const fallbackPrompt = new PromptComposer_1.PromptComposer()
@@ -393,12 +425,17 @@ class Agent {
393
425
  },
394
426
  });
395
427
  for await (const chunk of stream) {
428
+ // Update current session if we have one
429
+ if (chunk.done && this.currentSession) {
430
+ this.currentSession = session;
431
+ }
396
432
  yield {
397
433
  delta: chunk.delta,
398
434
  accumulated: chunk.accumulated,
399
435
  done: chunk.done,
400
436
  session, // Return updated session
401
437
  toolCalls: undefined,
438
+ isRouteComplete: false,
402
439
  };
403
440
  }
404
441
  }
@@ -421,8 +458,8 @@ class Agent {
421
458
  ...currentContext,
422
459
  ...contextOverride,
423
460
  };
424
- // Initialize or get session
425
- let session = params.session || (0, session_1.createSession)();
461
+ // Initialize or get session (use current session if available)
462
+ let session = params.session || this.currentSession || (0, session_1.createSession)();
426
463
  // PHASE 1: TOOL EXECUTION - Execute tools if current state has toolState
427
464
  if (session.currentRoute && session.currentState) {
428
465
  const currentRoute = this.routes.find((r) => r.id === session.currentRoute?.id);
@@ -443,9 +480,9 @@ class Agent {
443
480
  // Update extracted data with tool results
444
481
  if (result.extractedUpdate) {
445
482
  session = await this.updateExtracted(session, result.extractedUpdate);
446
- console.log(`[Agent] Tool updated extracted data:`, result.extractedUpdate);
483
+ logger_1.logger.debug(`[Agent] Tool updated extracted data:`, result.extractedUpdate);
447
484
  }
448
- console.log(`[Agent] Executed tool: ${result.toolName} (success: ${result.success})`);
485
+ logger_1.logger.debug(`[Agent] Executed tool: ${result.toolName} (success: ${result.success})`);
449
486
  }
450
487
  }
451
488
  }
@@ -454,6 +491,7 @@ class Agent {
454
491
  let selectedRoute;
455
492
  let responseDirectives;
456
493
  let selectedState;
494
+ let isRouteComplete = false;
457
495
  if (this.routes.length > 0) {
458
496
  const orchestration = await this.routingEngine.decideRouteAndState({
459
497
  routes: this.routes,
@@ -473,11 +511,16 @@ class Agent {
473
511
  selectedState = orchestration.selectedState;
474
512
  responseDirectives = orchestration.responseDirectives;
475
513
  session = orchestration.session;
514
+ isRouteComplete = orchestration.isRouteComplete || false;
515
+ // Log if route is complete
516
+ if (isRouteComplete) {
517
+ logger_1.logger.debug(`[Agent] Route complete: all required data collected, END_STATE reached`);
518
+ }
476
519
  }
477
520
  // PHASE 3: DETERMINE NEXT STATE - Use state from combined decision or get initial state
478
521
  let message;
479
522
  const toolCalls = undefined;
480
- if (selectedRoute) {
523
+ if (selectedRoute && !isRouteComplete) {
481
524
  let nextState;
482
525
  // If we have a selected state from the combined routing decision, use it
483
526
  if (selectedState) {
@@ -488,17 +531,17 @@ class Agent {
488
531
  const candidates = this.routingEngine.getCandidateStates(selectedRoute, undefined, session.extracted);
489
532
  if (candidates.length > 0) {
490
533
  nextState = candidates[0].state;
491
- console.log(`[Agent] Using first valid state: ${nextState.id} for new route`);
534
+ logger_1.logger.debug(`[Agent] Using first valid state: ${nextState.id} for new route`);
492
535
  }
493
536
  else {
494
537
  // Fallback to initial state even if it should be skipped
495
538
  nextState = selectedRoute.initialState;
496
- console.warn(`[Agent] No valid states found, using initial state: ${nextState.id}`);
539
+ logger_1.logger.warn(`[Agent] No valid states found, using initial state: ${nextState.id}`);
497
540
  }
498
541
  }
499
542
  // Update session with next state
500
543
  session = (0, session_1.enterState)(session, nextState.id, nextState.description);
501
- console.log(`[Agent] Entered state: ${nextState.id}`);
544
+ logger_1.logger.debug(`[Agent] Entered state: ${nextState.id}`);
502
545
  // PHASE 4: RESPONSE GENERATION - Generate message using selected route and state
503
546
  // Get last user message
504
547
  const lastUserMessage = (0, event_1.getLastMessageFromHistory)(history);
@@ -536,7 +579,7 @@ class Agent {
536
579
  // Merge gathered data into session
537
580
  if (Object.keys(gatheredData).length > 0) {
538
581
  session = (0, session_1.mergeExtracted)(session, gatheredData);
539
- console.log(`[Agent] Extracted data:`, gatheredData);
582
+ logger_1.logger.debug(`[Agent] Extracted data:`, gatheredData);
540
583
  }
541
584
  }
542
585
  // Extract any additional data from structured response
@@ -547,6 +590,12 @@ class Agent {
547
590
  .contextUpdate);
548
591
  }
549
592
  }
593
+ else if (isRouteComplete && selectedRoute) {
594
+ // Route is complete - set state to END_STATE marker and return completion signal
595
+ session = (0, session_1.enterState)(session, constants_1.END_STATE_ID, "Route completed");
596
+ message = "";
597
+ logger_1.logger.debug(`[Agent] Route ${selectedRoute.title} completed. Entered END_STATE state.`);
598
+ }
550
599
  else {
551
600
  // Fallback: No routes defined, generate a simple response
552
601
  const fallbackPrompt = new PromptComposer_1.PromptComposer()
@@ -585,12 +634,17 @@ class Agent {
585
634
  session.id &&
586
635
  this.options.persistence?.autoSave !== false) {
587
636
  await this.persistenceManager.saveSessionState(session.id, session);
588
- console.log(`[Agent] Auto-saved session state to persistence: ${session.id}`);
637
+ logger_1.logger.debug(`[Agent] Auto-saved session state to persistence: ${session.id}`);
638
+ }
639
+ // Update current session if we have one
640
+ if (this.currentSession) {
641
+ this.currentSession = session;
589
642
  }
590
643
  return {
591
644
  message,
592
645
  session, // Return updated session with route/state info
593
646
  toolCalls,
647
+ isRouteComplete: !isRouteComplete, // Indicates if the route has reached END_STATE with all data collected
594
648
  };
595
649
  }
596
650
  /**
@@ -663,6 +717,39 @@ class Agent {
663
717
  const allowedDomains = route.getDomains();
664
718
  return this.domainRegistry.getFiltered(allowedDomains);
665
719
  }
720
+ /**
721
+ * Set the current session for convenience methods
722
+ * @param session - Session state to use for subsequent calls
723
+ */
724
+ setCurrentSession(session) {
725
+ this.currentSession = session;
726
+ }
727
+ /**
728
+ * Get the current session (if set)
729
+ */
730
+ getCurrentSession() {
731
+ return this.currentSession;
732
+ }
733
+ /**
734
+ * Clear the current session
735
+ */
736
+ clearCurrentSession() {
737
+ this.currentSession = undefined;
738
+ }
739
+ /**
740
+ * Get extracted data from current session
741
+ * @param routeId - Optional route ID to get data for (uses current route if not provided)
742
+ * @returns The extracted data from the current session
743
+ */
744
+ getExtractedData(routeId) {
745
+ if (!this.currentSession) {
746
+ return {};
747
+ }
748
+ if (routeId) {
749
+ return (this.currentSession.extractedByRoute[routeId] || {});
750
+ }
751
+ return this.currentSession.extracted;
752
+ }
666
753
  }
667
754
  exports.Agent = Agent;
668
755
  //# sourceMappingURL=Agent.js.map