@falai/agent 0.4.1 → 0.5.1

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 (285) hide show
  1. package/README.md +21 -74
  2. package/dist/cjs/core/Agent.d.ts +22 -29
  3. package/dist/cjs/core/Agent.d.ts.map +1 -1
  4. package/dist/cjs/core/Agent.js +464 -291
  5. package/dist/cjs/core/Agent.js.map +1 -1
  6. package/dist/cjs/core/Events.d.ts +10 -1
  7. package/dist/cjs/core/Events.d.ts.map +1 -1
  8. package/dist/cjs/core/Events.js +3 -2
  9. package/dist/cjs/core/Events.js.map +1 -1
  10. package/dist/cjs/core/PersistenceManager.d.ts +19 -0
  11. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  12. package/dist/cjs/core/PersistenceManager.js +55 -0
  13. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  14. package/dist/cjs/core/PromptComposer.d.ts +24 -0
  15. package/dist/cjs/core/PromptComposer.d.ts.map +1 -0
  16. package/dist/cjs/core/PromptComposer.js +127 -0
  17. package/dist/cjs/core/PromptComposer.js.map +1 -0
  18. package/dist/cjs/core/ResponseEngine.d.ts +19 -0
  19. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -0
  20. package/dist/cjs/core/ResponseEngine.js +51 -0
  21. package/dist/cjs/core/ResponseEngine.js.map +1 -0
  22. package/dist/cjs/core/Route.d.ts +18 -12
  23. package/dist/cjs/core/Route.d.ts.map +1 -1
  24. package/dist/cjs/core/Route.js +15 -9
  25. package/dist/cjs/core/Route.js.map +1 -1
  26. package/dist/cjs/core/RoutingEngine.d.ts +38 -0
  27. package/dist/cjs/core/RoutingEngine.d.ts.map +1 -0
  28. package/dist/cjs/core/RoutingEngine.js +110 -0
  29. package/dist/cjs/core/RoutingEngine.js.map +1 -0
  30. package/dist/cjs/core/State.d.ts +15 -4
  31. package/dist/cjs/core/State.d.ts.map +1 -1
  32. package/dist/cjs/core/State.js +21 -2
  33. package/dist/cjs/core/State.js.map +1 -1
  34. package/dist/cjs/core/ToolExecutor.d.ts +29 -0
  35. package/dist/cjs/core/ToolExecutor.d.ts.map +1 -0
  36. package/dist/cjs/core/ToolExecutor.js +73 -0
  37. package/dist/cjs/core/ToolExecutor.js.map +1 -0
  38. package/dist/cjs/core/Transition.d.ts +5 -5
  39. package/dist/cjs/core/Transition.d.ts.map +1 -1
  40. package/dist/cjs/core/Transition.js.map +1 -1
  41. package/dist/cjs/index.d.ts +6 -8
  42. package/dist/cjs/index.d.ts.map +1 -1
  43. package/dist/cjs/index.js +8 -10
  44. package/dist/cjs/index.js.map +1 -1
  45. package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
  46. package/dist/cjs/providers/AnthropicProvider.js +10 -13
  47. package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
  48. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  49. package/dist/cjs/providers/GeminiProvider.js +12 -8
  50. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  51. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  52. package/dist/cjs/providers/OpenAIProvider.js +10 -53
  53. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  54. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  55. package/dist/cjs/providers/OpenRouterProvider.js +10 -53
  56. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  57. package/dist/cjs/types/agent.d.ts +13 -12
  58. package/dist/cjs/types/agent.d.ts.map +1 -1
  59. package/dist/cjs/types/ai.d.ts +8 -2
  60. package/dist/cjs/types/ai.d.ts.map +1 -1
  61. package/dist/cjs/types/history.d.ts +8 -0
  62. package/dist/cjs/types/history.d.ts.map +1 -1
  63. package/dist/cjs/types/index.d.ts +0 -3
  64. package/dist/cjs/types/index.d.ts.map +1 -1
  65. package/dist/cjs/types/index.js +1 -3
  66. package/dist/cjs/types/index.js.map +1 -1
  67. package/dist/cjs/types/route.d.ts +39 -4
  68. package/dist/cjs/types/route.d.ts.map +1 -1
  69. package/dist/cjs/types/routing.d.ts +16 -0
  70. package/dist/cjs/types/routing.d.ts.map +1 -0
  71. package/dist/cjs/types/routing.js +3 -0
  72. package/dist/cjs/types/routing.js.map +1 -0
  73. package/dist/cjs/types/schema.d.ts +22 -0
  74. package/dist/cjs/types/schema.d.ts.map +1 -0
  75. package/dist/cjs/types/schema.js +3 -0
  76. package/dist/cjs/types/schema.js.map +1 -0
  77. package/dist/cjs/types/session.d.ts +77 -0
  78. package/dist/cjs/types/session.d.ts.map +1 -0
  79. package/dist/cjs/types/session.js +146 -0
  80. package/dist/cjs/types/session.js.map +1 -0
  81. package/dist/cjs/types/tool.d.ts +11 -5
  82. package/dist/cjs/types/tool.d.ts.map +1 -1
  83. package/dist/cjs/utils/id.d.ts +0 -5
  84. package/dist/cjs/utils/id.d.ts.map +1 -1
  85. package/dist/cjs/utils/id.js +0 -10
  86. package/dist/cjs/utils/id.js.map +1 -1
  87. package/dist/cjs/utils/schema.d.ts +17 -0
  88. package/dist/cjs/utils/schema.d.ts.map +1 -0
  89. package/dist/cjs/utils/schema.js +32 -0
  90. package/dist/cjs/utils/schema.js.map +1 -0
  91. package/dist/core/Agent.d.ts +22 -29
  92. package/dist/core/Agent.d.ts.map +1 -1
  93. package/dist/core/Agent.js +464 -291
  94. package/dist/core/Agent.js.map +1 -1
  95. package/dist/core/Events.d.ts +10 -1
  96. package/dist/core/Events.d.ts.map +1 -1
  97. package/dist/core/Events.js +3 -2
  98. package/dist/core/Events.js.map +1 -1
  99. package/dist/core/PersistenceManager.d.ts +19 -0
  100. package/dist/core/PersistenceManager.d.ts.map +1 -1
  101. package/dist/core/PersistenceManager.js +55 -0
  102. package/dist/core/PersistenceManager.js.map +1 -1
  103. package/dist/core/PromptComposer.d.ts +24 -0
  104. package/dist/core/PromptComposer.d.ts.map +1 -0
  105. package/dist/core/PromptComposer.js +123 -0
  106. package/dist/core/PromptComposer.js.map +1 -0
  107. package/dist/core/ResponseEngine.d.ts +19 -0
  108. package/dist/core/ResponseEngine.d.ts.map +1 -0
  109. package/dist/core/ResponseEngine.js +47 -0
  110. package/dist/core/ResponseEngine.js.map +1 -0
  111. package/dist/core/Route.d.ts +18 -12
  112. package/dist/core/Route.d.ts.map +1 -1
  113. package/dist/core/Route.js +15 -9
  114. package/dist/core/Route.js.map +1 -1
  115. package/dist/core/RoutingEngine.d.ts +38 -0
  116. package/dist/core/RoutingEngine.d.ts.map +1 -0
  117. package/dist/core/RoutingEngine.js +106 -0
  118. package/dist/core/RoutingEngine.js.map +1 -0
  119. package/dist/core/State.d.ts +15 -4
  120. package/dist/core/State.d.ts.map +1 -1
  121. package/dist/core/State.js +21 -2
  122. package/dist/core/State.js.map +1 -1
  123. package/dist/core/ToolExecutor.d.ts +29 -0
  124. package/dist/core/ToolExecutor.d.ts.map +1 -0
  125. package/dist/core/ToolExecutor.js +69 -0
  126. package/dist/core/ToolExecutor.js.map +1 -0
  127. package/dist/core/Transition.d.ts +5 -5
  128. package/dist/core/Transition.d.ts.map +1 -1
  129. package/dist/core/Transition.js.map +1 -1
  130. package/dist/index.d.ts +6 -8
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +3 -5
  133. package/dist/index.js.map +1 -1
  134. package/dist/providers/AnthropicProvider.d.ts.map +1 -1
  135. package/dist/providers/AnthropicProvider.js +10 -13
  136. package/dist/providers/AnthropicProvider.js.map +1 -1
  137. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  138. package/dist/providers/GeminiProvider.js +12 -8
  139. package/dist/providers/GeminiProvider.js.map +1 -1
  140. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  141. package/dist/providers/OpenAIProvider.js +10 -53
  142. package/dist/providers/OpenAIProvider.js.map +1 -1
  143. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  144. package/dist/providers/OpenRouterProvider.js +10 -53
  145. package/dist/providers/OpenRouterProvider.js.map +1 -1
  146. package/dist/types/agent.d.ts +13 -12
  147. package/dist/types/agent.d.ts.map +1 -1
  148. package/dist/types/ai.d.ts +8 -2
  149. package/dist/types/ai.d.ts.map +1 -1
  150. package/dist/types/history.d.ts +8 -0
  151. package/dist/types/history.d.ts.map +1 -1
  152. package/dist/types/index.d.ts +0 -3
  153. package/dist/types/index.d.ts.map +1 -1
  154. package/dist/types/index.js +0 -1
  155. package/dist/types/index.js.map +1 -1
  156. package/dist/types/route.d.ts +39 -4
  157. package/dist/types/route.d.ts.map +1 -1
  158. package/dist/types/routing.d.ts +16 -0
  159. package/dist/types/routing.d.ts.map +1 -0
  160. package/dist/types/routing.js +2 -0
  161. package/dist/types/routing.js.map +1 -0
  162. package/dist/types/schema.d.ts +22 -0
  163. package/dist/types/schema.d.ts.map +1 -0
  164. package/dist/types/schema.js +2 -0
  165. package/dist/types/schema.js.map +1 -0
  166. package/dist/types/session.d.ts +77 -0
  167. package/dist/types/session.d.ts.map +1 -0
  168. package/dist/types/session.js +138 -0
  169. package/dist/types/session.js.map +1 -0
  170. package/dist/types/tool.d.ts +11 -5
  171. package/dist/types/tool.d.ts.map +1 -1
  172. package/dist/utils/id.d.ts +0 -5
  173. package/dist/utils/id.d.ts.map +1 -1
  174. package/dist/utils/id.js +0 -9
  175. package/dist/utils/id.js.map +1 -1
  176. package/dist/utils/schema.d.ts +17 -0
  177. package/dist/utils/schema.d.ts.map +1 -0
  178. package/dist/utils/schema.js +27 -0
  179. package/dist/utils/schema.js.map +1 -0
  180. package/docs/ADAPTERS.md +83 -3
  181. package/docs/API_REFERENCE.md +329 -104
  182. package/docs/ARCHITECTURE.md +284 -286
  183. package/docs/CONSTRUCTOR_OPTIONS.md +192 -135
  184. package/docs/CONTEXT_MANAGEMENT.md +311 -28
  185. package/docs/CONTRIBUTING.md +1 -1
  186. package/docs/DOMAINS.md +61 -0
  187. package/docs/GETTING_STARTED.md +177 -88
  188. package/docs/PERSISTENCE.md +170 -23
  189. package/docs/README.md +7 -10
  190. package/examples/business-onboarding.ts +21 -9
  191. package/examples/company-qna-agent.ts +508 -0
  192. package/examples/declarative-agent.ts +143 -26
  193. package/examples/domain-scoping.ts +31 -10
  194. package/examples/extracted-data-modification.ts +415 -0
  195. package/examples/healthcare-agent.ts +194 -90
  196. package/examples/openai-agent.ts +67 -25
  197. package/examples/opensearch-persistence.ts +455 -151
  198. package/examples/persistent-onboarding.ts +162 -96
  199. package/examples/prisma-persistence.ts +371 -125
  200. package/examples/redis-persistence.ts +393 -23
  201. package/examples/rules-prohibitions.ts +32 -11
  202. package/examples/streaming-agent.ts +61 -13
  203. package/examples/travel-agent.ts +266 -133
  204. package/package.json +1 -1
  205. package/src/core/Agent.ts +668 -356
  206. package/src/core/Events.ts +12 -2
  207. package/src/core/PersistenceManager.ts +81 -0
  208. package/src/core/PromptComposer.ts +143 -0
  209. package/src/core/ResponseEngine.ts +82 -0
  210. package/src/core/Route.ts +32 -17
  211. package/src/core/RoutingEngine.ts +165 -0
  212. package/src/core/State.ts +55 -15
  213. package/src/core/ToolExecutor.ts +117 -0
  214. package/src/core/Transition.ts +5 -5
  215. package/src/index.ts +12 -21
  216. package/src/providers/AnthropicProvider.ts +10 -13
  217. package/src/providers/GeminiProvider.ts +12 -8
  218. package/src/providers/OpenAIProvider.ts +10 -56
  219. package/src/providers/OpenRouterProvider.ts +10 -56
  220. package/src/types/agent.ts +16 -13
  221. package/src/types/ai.ts +6 -2
  222. package/src/types/history.ts +8 -0
  223. package/src/types/index.ts +0 -11
  224. package/src/types/route.ts +41 -5
  225. package/src/types/routing.ts +18 -0
  226. package/src/types/schema.ts +23 -0
  227. package/src/types/session.ts +219 -0
  228. package/src/types/tool.ts +29 -7
  229. package/src/utils/id.ts +0 -10
  230. package/src/utils/schema.ts +32 -0
  231. package/dist/cjs/core/ConditionEvaluator.d.ts +0 -72
  232. package/dist/cjs/core/ConditionEvaluator.d.ts.map +0 -1
  233. package/dist/cjs/core/ConditionEvaluator.js +0 -272
  234. package/dist/cjs/core/ConditionEvaluator.js.map +0 -1
  235. package/dist/cjs/core/Observation.d.ts +0 -24
  236. package/dist/cjs/core/Observation.d.ts.map +0 -1
  237. package/dist/cjs/core/Observation.js +0 -39
  238. package/dist/cjs/core/Observation.js.map +0 -1
  239. package/dist/cjs/core/PreparationEngine.d.ts +0 -116
  240. package/dist/cjs/core/PreparationEngine.d.ts.map +0 -1
  241. package/dist/cjs/core/PreparationEngine.js +0 -353
  242. package/dist/cjs/core/PreparationEngine.js.map +0 -1
  243. package/dist/cjs/core/PromptBuilder.d.ts +0 -136
  244. package/dist/cjs/core/PromptBuilder.d.ts.map +0 -1
  245. package/dist/cjs/core/PromptBuilder.js +0 -421
  246. package/dist/cjs/core/PromptBuilder.js.map +0 -1
  247. package/dist/cjs/types/observation.d.ts +0 -27
  248. package/dist/cjs/types/observation.d.ts.map +0 -1
  249. package/dist/cjs/types/observation.js +0 -6
  250. package/dist/cjs/types/observation.js.map +0 -1
  251. package/dist/cjs/types/prompt.d.ts +0 -46
  252. package/dist/cjs/types/prompt.d.ts.map +0 -1
  253. package/dist/cjs/types/prompt.js +0 -19
  254. package/dist/cjs/types/prompt.js.map +0 -1
  255. package/dist/core/ConditionEvaluator.d.ts +0 -72
  256. package/dist/core/ConditionEvaluator.d.ts.map +0 -1
  257. package/dist/core/ConditionEvaluator.js +0 -268
  258. package/dist/core/ConditionEvaluator.js.map +0 -1
  259. package/dist/core/Observation.d.ts +0 -24
  260. package/dist/core/Observation.d.ts.map +0 -1
  261. package/dist/core/Observation.js +0 -35
  262. package/dist/core/Observation.js.map +0 -1
  263. package/dist/core/PreparationEngine.d.ts +0 -116
  264. package/dist/core/PreparationEngine.d.ts.map +0 -1
  265. package/dist/core/PreparationEngine.js +0 -349
  266. package/dist/core/PreparationEngine.js.map +0 -1
  267. package/dist/core/PromptBuilder.d.ts +0 -136
  268. package/dist/core/PromptBuilder.d.ts.map +0 -1
  269. package/dist/core/PromptBuilder.js +0 -417
  270. package/dist/core/PromptBuilder.js.map +0 -1
  271. package/dist/types/observation.d.ts +0 -27
  272. package/dist/types/observation.d.ts.map +0 -1
  273. package/dist/types/observation.js +0 -5
  274. package/dist/types/observation.js.map +0 -1
  275. package/dist/types/prompt.d.ts +0 -46
  276. package/dist/types/prompt.d.ts.map +0 -1
  277. package/dist/types/prompt.js +0 -16
  278. package/dist/types/prompt.js.map +0 -1
  279. package/docs/STRUCTURE.md +0 -58
  280. package/src/core/ConditionEvaluator.ts +0 -381
  281. package/src/core/Observation.ts +0 -47
  282. package/src/core/PreparationEngine.ts +0 -561
  283. package/src/core/PromptBuilder.ts +0 -617
  284. package/src/types/observation.ts +0 -29
  285. package/src/types/prompt.ts +0 -49
@@ -1,14 +1,13 @@
1
1
  /**
2
- * Example: Declarative Agent Configuration
2
+ * Example: Declarative Agent Configuration with Session State
3
3
  *
4
4
  * This example demonstrates how to configure an entire agent
5
5
  * using declarative syntax in the constructor, including:
6
6
  * - Terms (glossary)
7
7
  * - Guidelines (behavior rules)
8
8
  * - Capabilities
9
- * - Routes with nested guidelines and custom IDs
10
- * - Observations with route references and custom IDs
11
- * - Custom timestamps for events
9
+ * - Routes with data extraction schemas and custom IDs
10
+ * - Session state management for multi-turn conversations
12
11
  */
13
12
 
14
13
  import {
@@ -17,11 +16,11 @@ import {
17
16
  createMessageEvent,
18
17
  EventSource,
19
18
  GeminiProvider,
19
+ createSession,
20
20
  type Term,
21
21
  type Guideline,
22
22
  type Capability,
23
23
  type RouteOptions,
24
- type ObservationOptions,
25
24
  } from "../src/index";
26
25
 
27
26
  // Context type
@@ -30,6 +29,21 @@ interface HealthcareContext {
30
29
  patientName: string;
31
30
  }
32
31
 
32
+ // Data extraction types
33
+ interface AppointmentData {
34
+ appointmentType: "checkup" | "consultation" | "followup";
35
+ preferredDate: string;
36
+ preferredTime: string;
37
+ symptoms?: string;
38
+ urgency: "low" | "medium" | "high";
39
+ }
40
+
41
+ interface LabData {
42
+ testType: string;
43
+ testDate: string;
44
+ resultsNeeded: boolean;
45
+ }
46
+
33
47
  // Define tools with custom IDs (optional - IDs are deterministic by default)
34
48
  const getInsuranceProviders = defineTool<HealthcareContext, [], string[]>(
35
49
  "get_insurance_providers",
@@ -69,7 +83,18 @@ const getLabResults = defineTool<
69
83
  { report: string; status: string }
70
84
  >(
71
85
  "get_lab_results",
72
- async ({ context }) => {
86
+ async ({ context, extracted }) => {
87
+ // Tools can now access extracted data
88
+ const labData = extracted as Partial<LabData>;
89
+ if (labData?.testType) {
90
+ return {
91
+ data: {
92
+ report: `${labData.testType} results for ${context.patientName}`,
93
+ status: "All values within normal range",
94
+ },
95
+ };
96
+ }
97
+
73
98
  return {
74
99
  data: {
75
100
  report: `Lab results for ${context.patientName}`,
@@ -83,6 +108,31 @@ const getLabResults = defineTool<
83
108
  }
84
109
  );
85
110
 
111
+ const scheduleAppointment = defineTool<
112
+ HealthcareContext,
113
+ [],
114
+ { confirmation: string }
115
+ >(
116
+ "schedule_appointment",
117
+ async ({ context, extracted }) => {
118
+ // Tools can access extracted appointment data
119
+ const appointment = extracted as Partial<AppointmentData>;
120
+ if (!appointment?.preferredDate || !appointment?.preferredTime) {
121
+ return { data: { confirmation: "Please provide appointment details" } };
122
+ }
123
+
124
+ return {
125
+ data: {
126
+ confirmation: `Appointment scheduled for ${appointment.preferredDate} at ${appointment.preferredTime}`,
127
+ },
128
+ };
129
+ },
130
+ {
131
+ id: "healthcare_schedule_appointment",
132
+ description: "Schedules patient appointments",
133
+ }
134
+ );
135
+
86
136
  // Declarative configuration
87
137
  const terms: Term[] = [
88
138
  {
@@ -140,6 +190,34 @@ const routes: RouteOptions[] = [
140
190
  title: "Schedule Appointment",
141
191
  description: "Helps the patient schedule an appointment",
142
192
  conditions: ["The patient wants to schedule an appointment"],
193
+ gatherSchema: {
194
+ type: "object",
195
+ properties: {
196
+ appointmentType: {
197
+ type: "string",
198
+ enum: ["checkup", "consultation", "followup"],
199
+ description: "Type of appointment needed",
200
+ },
201
+ preferredDate: {
202
+ type: "string",
203
+ description: "Preferred appointment date",
204
+ },
205
+ preferredTime: {
206
+ type: "string",
207
+ description: "Preferred appointment time",
208
+ },
209
+ symptoms: {
210
+ type: "string",
211
+ description: "Description of symptoms (if applicable)",
212
+ },
213
+ urgency: {
214
+ type: "string",
215
+ enum: ["low", "medium", "high"],
216
+ default: "medium",
217
+ },
218
+ },
219
+ required: ["appointmentType", "preferredDate", "preferredTime"],
220
+ },
143
221
  guidelines: [
144
222
  {
145
223
  condition: "The patient says their visit is urgent",
@@ -154,6 +232,25 @@ const routes: RouteOptions[] = [
154
232
  title: "Check Lab Results",
155
233
  description: "Retrieves and explains patient lab results",
156
234
  conditions: ["The patient wants to see their lab results"],
235
+ gatherSchema: {
236
+ type: "object",
237
+ properties: {
238
+ testType: {
239
+ type: "string",
240
+ description: "Type of lab test",
241
+ },
242
+ testDate: {
243
+ type: "string",
244
+ description: "Date of the lab test",
245
+ },
246
+ resultsNeeded: {
247
+ type: "boolean",
248
+ default: true,
249
+ description: "Whether detailed results are needed",
250
+ },
251
+ },
252
+ required: ["testType"],
253
+ },
157
254
  guidelines: [
158
255
  {
159
256
  condition: "The patient presses for more conclusions about results",
@@ -163,14 +260,11 @@ const routes: RouteOptions[] = [
163
260
  },
164
261
  ],
165
262
  },
166
- ];
167
-
168
- const observations: ObservationOptions[] = [
169
263
  {
170
- id: "obs_visit_followup", // Custom ID for tracking
171
- description:
172
- "The patient asks to follow up on their visit, but it's not clear in which way",
173
- routeRefs: ["Schedule Appointment", "Check Lab Results"], // Reference by title
264
+ title: "General Healthcare Questions",
265
+ description: "Answer general healthcare questions",
266
+ conditions: ["Patient asks general healthcare questions"],
267
+ // No gatherSchema - stateless Q&A
174
268
  },
175
269
  ];
176
270
 
@@ -192,7 +286,6 @@ const agent = new Agent<HealthcareContext>({
192
286
  guidelines,
193
287
  capabilities,
194
288
  routes,
195
- observations,
196
289
  });
197
290
 
198
291
  // You can still add more dynamically after construction
@@ -208,31 +301,55 @@ agent
208
301
  synonyms: ["virtual visit", "video appointment"],
209
302
  });
210
303
 
211
- // Example usage
304
+ // Example usage with session state
212
305
  async function main() {
306
+ // Initialize session state
307
+ let session = createSession<AppointmentData | LabData>();
308
+
213
309
  // Create events with custom timestamps (useful for historical data)
214
310
  const history = [
215
311
  createMessageEvent(
216
312
  EventSource.CUSTOMER,
217
313
  "Alice",
218
- "Hi, I need to follow up on my recent visit",
219
- "2025-10-13T14:30:00Z" // Optional custom timestamp
314
+ "Hi, I need to follow up on my recent visit"
220
315
  ),
221
316
  ];
222
317
 
223
- const response = await agent.respond({ history });
318
+ // Turn 1 - Agent responds and extracts intent
319
+ const response = await agent.respond({ history, session });
224
320
  console.log("Agent:", response.message);
225
- console.log("Route chosen:", response.route?.title);
226
- console.log("Route ID:", response.route?.id); // Custom ID is preserved
321
+ console.log("Route chosen:", response.session?.currentRoute?.title);
322
+ console.log("Extracted data:", response.session?.extracted);
323
+
324
+ // Session state is updated with progress
325
+ session = response.session!;
227
326
 
228
- // The agent will use the observation to disambiguate
229
- // and ask which type of follow-up the patient needs
327
+ // Turn 2 - Continue conversation with session state
328
+ if (response.session?.currentRoute?.title === "Schedule Appointment") {
329
+ const history2 = [
330
+ ...history,
331
+ createMessageEvent(EventSource.AI_AGENT, "Bot", response.message),
332
+ createMessageEvent(
333
+ EventSource.CUSTOMER,
334
+ "Alice",
335
+ "I need a checkup next week"
336
+ ),
337
+ ];
338
+
339
+ const response2 = await agent.respond({ history: history2, session });
340
+ console.log("Agent:", response2.message);
341
+ console.log("Updated extracted:", response2.session?.extracted);
342
+
343
+ // Session tracks the appointment booking progress
344
+ console.log("Current state:", response2.session?.currentState?.id);
345
+ }
230
346
 
231
347
  // Note: Custom IDs ensure consistency across server restarts
232
- // This is crucial for:
233
- // - Storing conversation state in databases
234
- // - Tracking metrics and analytics
235
- // - Referencing routes in external systems
348
+ // Session state enables:
349
+ // - Tracking conversation progress across turns
350
+ // - Extracting structured data throughout conversation
351
+ // - Always-on routing that respects user intent changes
352
+ // - State recovery for resuming conversations
236
353
  }
237
354
 
238
355
  // Uncomment to run:
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * Domain Scoping Example
3
+ * Updated for v2 architecture with session state management
3
4
  *
4
5
  * This example demonstrates how to use domain scoping to restrict which tools
5
6
  * can EXECUTE in different conversation routes for security and isolation.
@@ -11,7 +12,12 @@
11
12
  * execute automatically when triggered by the state machine or guidelines.
12
13
  */
13
14
 
14
- import { Agent, createMessageEvent, EventSource } from "../src/index";
15
+ import {
16
+ Agent,
17
+ createMessageEvent,
18
+ EventSource,
19
+ createSession,
20
+ } from "../src/index";
15
21
  import { OpenRouterProvider } from "../src/providers";
16
22
 
17
23
  // Initialize AI provider
@@ -138,11 +144,17 @@ async function demonstrateScoping() {
138
144
  ),
139
145
  ];
140
146
 
141
- const response1 = await agent.respond({ history: history1 });
142
- console.log(`Route chosen: ${response1.route?.title}`);
147
+ // Initialize session state for multi-turn conversation
148
+ let session = createSession();
149
+
150
+ const response1 = await agent.respond({ history: history1, session });
151
+ console.log(`Route chosen: ${response1.session?.currentRoute?.title}`);
143
152
  console.log(`Available tools in this route: scraping only`);
144
153
  console.log(`Response: ${response1.message}\n`);
145
154
 
155
+ // Update session with progress
156
+ session = response1.session!;
157
+
146
158
  // Example 2: Schedule Meeting route - only calendar tools available
147
159
  console.log("2️⃣ Example: User wants to schedule a meeting");
148
160
  const history2 = [
@@ -153,11 +165,14 @@ async function demonstrateScoping() {
153
165
  ),
154
166
  ];
155
167
 
156
- const response2 = await agent.respond({ history: history2 });
157
- console.log(`Route chosen: ${response2.route?.title}`);
168
+ const response2 = await agent.respond({ history: history2, session });
169
+ console.log(`Route chosen: ${response2.session?.currentRoute?.title}`);
158
170
  console.log(`Available tools in this route: calendar only`);
159
171
  console.log(`Response: ${response2.message}\n`);
160
172
 
173
+ // Update session again
174
+ session = response2.session!;
175
+
161
176
  // Example 3: Customer Support route - NO tools available
162
177
  console.log("3️⃣ Example: User has a general question");
163
178
  const history3 = [
@@ -168,11 +183,14 @@ async function demonstrateScoping() {
168
183
  ),
169
184
  ];
170
185
 
171
- const response3 = await agent.respond({ history: history3 });
172
- console.log(`Route chosen: ${response3.route?.title}`);
186
+ const response3 = await agent.respond({ history: history3, session });
187
+ console.log(`Route chosen: ${response3.session?.currentRoute?.title}`);
173
188
  console.log(`Available tools in this route: none (conversation only)`);
174
189
  console.log(`Response: ${response3.message}\n`);
175
190
 
191
+ // Update session again
192
+ session = response3.session!;
193
+
176
194
  // Example 4: Admin Support route - ALL tools available (for demo purposes)
177
195
  console.log("4️⃣ Example: Admin needs full access");
178
196
  const history4 = [
@@ -183,30 +201,33 @@ async function demonstrateScoping() {
183
201
  ),
184
202
  ];
185
203
 
186
- const response4 = await agent.respond({ history: history4 });
187
- console.log(`Route chosen: ${response4.route?.title}`);
204
+ const response4 = await agent.respond({ history: history4, session });
205
+ console.log(`Route chosen: ${response4.session?.currentRoute?.title}`);
188
206
  console.log(`Available tools in this route: all domains`);
189
207
  console.log(`Response: ${response4.message}\n`);
190
208
  }
191
209
 
192
210
  // Benefits demonstration
193
211
  console.log(`
194
- 🔒 Security Benefits:
212
+ 🔒 Security Benefits (V2 Architecture):
195
213
  - Customer Support route cannot execute payment.processPayment()
196
214
  - Data Collection route cannot execute calendar.scheduleEvent()
197
215
  - Each route has minimum necessary tool permissions
198
216
  - Prevents prompt injection attacks from calling sensitive tools
217
+ - Session state ensures domain scoping persists across turns
199
218
 
200
219
  🎯 Isolation Benefits:
201
220
  - Route execution is isolated - tools can't cross boundaries
202
221
  - Checkout can't accidentally trigger admin operations
203
222
  - Clear separation of concerns by capability
223
+ - Always-on routing maintains domain restrictions
204
224
 
205
225
  📋 Clarity Benefits:
206
226
  - Routes clearly document their capabilities
207
227
  - Easy to audit what each route can execute
208
228
  - Better debugging when tools are called
209
229
  - Self-documenting security model
230
+ - Session state tracks domain-scoped conversations
210
231
  `);
211
232
 
212
233
  // Inspect route configurations