@falai/agent 0.9.2 → 1.0.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 (628) hide show
  1. package/README.md +281 -42
  2. package/dist/adapters/MemoryAdapter.d.ts.map +1 -0
  3. package/dist/adapters/MemoryAdapter.js.map +1 -0
  4. package/dist/adapters/MongoAdapter.d.ts.map +1 -0
  5. package/dist/adapters/MongoAdapter.js.map +1 -0
  6. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -0
  7. package/dist/adapters/OpenSearchAdapter.js.map +1 -0
  8. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  9. package/dist/adapters/PostgreSQLAdapter.js.map +1 -0
  10. package/dist/adapters/PrismaAdapter.d.ts.map +1 -0
  11. package/dist/{src/adapters → adapters}/PrismaAdapter.js +3 -2
  12. package/dist/adapters/PrismaAdapter.js.map +1 -0
  13. package/dist/adapters/RedisAdapter.d.ts.map +1 -0
  14. package/dist/{src/adapters → adapters}/RedisAdapter.js +3 -3
  15. package/dist/adapters/RedisAdapter.js.map +1 -0
  16. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -0
  17. package/dist/adapters/SQLiteAdapter.js.map +1 -0
  18. package/dist/adapters/index.d.ts.map +1 -0
  19. package/dist/adapters/index.js.map +1 -0
  20. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -0
  21. package/dist/cjs/adapters/MongoAdapter.js.map +1 -0
  22. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -0
  23. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -0
  24. package/dist/{src → cjs}/adapters/PrismaAdapter.d.ts.map +1 -1
  25. package/dist/cjs/{src/adapters → adapters}/PrismaAdapter.js +3 -2
  26. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -0
  27. package/dist/cjs/{src/adapters → adapters}/RedisAdapter.js +2 -2
  28. package/dist/cjs/adapters/RedisAdapter.js.map +1 -0
  29. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -0
  30. package/dist/cjs/adapters/index.js.map +1 -0
  31. package/dist/cjs/constants/index.js.map +1 -0
  32. package/dist/cjs/{src/core → core}/Agent.d.ts +16 -1
  33. package/dist/cjs/core/Agent.d.ts.map +1 -0
  34. package/dist/cjs/{src/core → core}/Agent.js +63 -2
  35. package/dist/cjs/core/Agent.js.map +1 -0
  36. package/dist/cjs/core/BatchExecutor.d.ts +353 -0
  37. package/dist/cjs/core/BatchExecutor.d.ts.map +1 -0
  38. package/dist/cjs/core/BatchExecutor.js +850 -0
  39. package/dist/cjs/core/BatchExecutor.js.map +1 -0
  40. package/dist/cjs/core/BatchPromptBuilder.d.ts +86 -0
  41. package/dist/cjs/core/BatchPromptBuilder.d.ts.map +1 -0
  42. package/dist/cjs/core/BatchPromptBuilder.js +217 -0
  43. package/dist/cjs/core/BatchPromptBuilder.js.map +1 -0
  44. package/dist/cjs/core/Events.js.map +1 -0
  45. package/dist/cjs/core/PersistenceManager.js.map +1 -0
  46. package/dist/{src → cjs}/core/PromptComposer.d.ts +1 -1
  47. package/dist/cjs/core/PromptComposer.d.ts.map +1 -0
  48. package/dist/cjs/{src/core → core}/PromptComposer.js +44 -7
  49. package/dist/cjs/core/PromptComposer.js.map +1 -0
  50. package/dist/{src → cjs}/core/ResponseEngine.d.ts.map +1 -1
  51. package/dist/cjs/core/ResponseEngine.js +211 -0
  52. package/dist/cjs/core/ResponseEngine.js.map +1 -0
  53. package/dist/{src → cjs}/core/ResponseModal.d.ts +45 -0
  54. package/dist/cjs/core/ResponseModal.d.ts.map +1 -0
  55. package/dist/cjs/{src/core → core}/ResponseModal.js +752 -74
  56. package/dist/cjs/core/ResponseModal.js.map +1 -0
  57. package/dist/{src → cjs}/core/ResponsePipeline.d.ts +2 -2
  58. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -0
  59. package/dist/cjs/{src/core → core}/ResponsePipeline.js +13 -6
  60. package/dist/cjs/core/ResponsePipeline.js.map +1 -0
  61. package/dist/{src → cjs}/core/Route.d.ts +34 -5
  62. package/dist/cjs/core/Route.d.ts.map +1 -0
  63. package/dist/cjs/{src/core → core}/Route.js +196 -19
  64. package/dist/cjs/core/Route.js.map +1 -0
  65. package/dist/cjs/{src/core → core}/RoutingEngine.d.ts +30 -5
  66. package/dist/cjs/core/RoutingEngine.d.ts.map +1 -0
  67. package/dist/cjs/{src/core → core}/RoutingEngine.js +330 -80
  68. package/dist/cjs/core/RoutingEngine.js.map +1 -0
  69. package/dist/cjs/core/SessionManager.js.map +1 -0
  70. package/dist/{src → cjs}/core/Step.d.ts +31 -10
  71. package/dist/cjs/core/Step.d.ts.map +1 -0
  72. package/dist/cjs/{src/core → core}/Step.js +105 -10
  73. package/dist/cjs/core/Step.js.map +1 -0
  74. package/dist/cjs/core/ToolManager.js.map +1 -0
  75. package/dist/{src → cjs}/index.d.ts +4 -1
  76. package/dist/cjs/index.d.ts.map +1 -0
  77. package/dist/cjs/{src/index.js → index.js} +12 -1
  78. package/dist/cjs/index.js.map +1 -0
  79. package/dist/cjs/{src/providers → providers}/AnthropicProvider.js +18 -18
  80. package/dist/cjs/providers/AnthropicProvider.js.map +1 -0
  81. package/dist/{src → cjs}/providers/GeminiProvider.d.ts.map +1 -1
  82. package/dist/cjs/{src/providers → providers}/GeminiProvider.js +123 -51
  83. package/dist/cjs/providers/GeminiProvider.js.map +1 -0
  84. package/dist/cjs/{src/providers → providers}/OpenAIProvider.js +19 -19
  85. package/dist/cjs/providers/OpenAIProvider.js.map +1 -0
  86. package/dist/cjs/{src/providers → providers}/OpenRouterProvider.js +19 -19
  87. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -0
  88. package/dist/cjs/providers/index.js.map +1 -0
  89. package/dist/cjs/{src/types → types}/agent.d.ts +15 -3
  90. package/dist/cjs/types/agent.d.ts.map +1 -0
  91. package/dist/cjs/types/agent.js.map +1 -0
  92. package/dist/{src → cjs}/types/ai.js.map +1 -1
  93. package/dist/cjs/types/history.js.map +1 -0
  94. package/dist/cjs/{src/types → types}/index.d.ts +2 -1
  95. package/dist/{src → cjs}/types/index.d.ts.map +1 -1
  96. package/dist/cjs/{src/types → types}/index.js +6 -1
  97. package/dist/cjs/types/index.js.map +1 -0
  98. package/dist/cjs/types/persistence.js.map +1 -0
  99. package/dist/cjs/{src/types → types}/route.d.ts +111 -12
  100. package/dist/cjs/types/route.d.ts.map +1 -0
  101. package/dist/cjs/{src/types → types}/route.js.map +1 -1
  102. package/dist/cjs/types/session.js.map +1 -0
  103. package/dist/cjs/types/template.d.ts +88 -0
  104. package/dist/cjs/types/template.d.ts.map +1 -0
  105. package/dist/cjs/types/tool.js.map +1 -0
  106. package/dist/cjs/utils/clone.js.map +1 -0
  107. package/dist/cjs/utils/condition.d.ts +38 -0
  108. package/dist/cjs/utils/condition.d.ts.map +1 -0
  109. package/dist/cjs/utils/condition.js +168 -0
  110. package/dist/cjs/utils/condition.js.map +1 -0
  111. package/dist/cjs/utils/event.js.map +1 -0
  112. package/dist/cjs/utils/history.js.map +1 -0
  113. package/dist/cjs/utils/id.js.map +1 -0
  114. package/dist/cjs/{src/utils → utils}/index.d.ts +3 -1
  115. package/dist/cjs/utils/index.d.ts.map +1 -0
  116. package/dist/cjs/{src/utils → utils}/index.js +12 -1
  117. package/dist/cjs/utils/index.js.map +1 -0
  118. package/dist/cjs/utils/json.d.ts +16 -0
  119. package/dist/cjs/utils/json.d.ts.map +1 -0
  120. package/dist/cjs/utils/json.js +47 -0
  121. package/dist/cjs/utils/json.js.map +1 -0
  122. package/dist/cjs/utils/logger.js.map +1 -0
  123. package/dist/{src → cjs}/utils/retry.d.ts +0 -3
  124. package/dist/cjs/utils/retry.d.ts.map +1 -0
  125. package/dist/cjs/{src/utils → utils}/retry.js +8 -7
  126. package/dist/cjs/utils/retry.js.map +1 -0
  127. package/dist/cjs/utils/session.js.map +1 -0
  128. package/dist/{src → cjs}/utils/template.d.ts +48 -0
  129. package/dist/cjs/utils/template.d.ts.map +1 -0
  130. package/dist/cjs/{src/utils → utils}/template.js +100 -0
  131. package/dist/cjs/utils/template.js.map +1 -0
  132. package/dist/constants/index.d.ts.map +1 -0
  133. package/dist/constants/index.js.map +1 -0
  134. package/dist/{src/core → core}/Agent.d.ts +16 -1
  135. package/dist/core/Agent.d.ts.map +1 -0
  136. package/dist/{src/core → core}/Agent.js +64 -3
  137. package/dist/core/Agent.js.map +1 -0
  138. package/dist/core/BatchExecutor.d.ts +353 -0
  139. package/dist/core/BatchExecutor.d.ts.map +1 -0
  140. package/dist/core/BatchExecutor.js +845 -0
  141. package/dist/core/BatchExecutor.js.map +1 -0
  142. package/dist/core/BatchPromptBuilder.d.ts +86 -0
  143. package/dist/core/BatchPromptBuilder.d.ts.map +1 -0
  144. package/dist/core/BatchPromptBuilder.js +213 -0
  145. package/dist/core/BatchPromptBuilder.js.map +1 -0
  146. package/dist/core/Events.d.ts.map +1 -0
  147. package/dist/core/Events.js.map +1 -0
  148. package/dist/core/PersistenceManager.d.ts.map +1 -0
  149. package/dist/core/PersistenceManager.js.map +1 -0
  150. package/dist/{cjs/src/core → core}/PromptComposer.d.ts +1 -1
  151. package/dist/core/PromptComposer.d.ts.map +1 -0
  152. package/dist/{src/core → core}/PromptComposer.js +45 -8
  153. package/dist/core/PromptComposer.js.map +1 -0
  154. package/dist/core/ResponseEngine.d.ts.map +1 -0
  155. package/dist/core/ResponseEngine.js +207 -0
  156. package/dist/core/ResponseEngine.js.map +1 -0
  157. package/dist/{cjs/src/core → core}/ResponseModal.d.ts +45 -0
  158. package/dist/core/ResponseModal.d.ts.map +1 -0
  159. package/dist/{src/core → core}/ResponseModal.js +752 -74
  160. package/dist/core/ResponseModal.js.map +1 -0
  161. package/dist/{cjs/src/core → core}/ResponsePipeline.d.ts +2 -2
  162. package/dist/core/ResponsePipeline.d.ts.map +1 -0
  163. package/dist/{src/core → core}/ResponsePipeline.js +13 -6
  164. package/dist/core/ResponsePipeline.js.map +1 -0
  165. package/dist/{cjs/src/core → core}/Route.d.ts +34 -5
  166. package/dist/core/Route.d.ts.map +1 -0
  167. package/dist/{src/core → core}/Route.js +195 -18
  168. package/dist/core/Route.js.map +1 -0
  169. package/dist/{src/core → core}/RoutingEngine.d.ts +30 -5
  170. package/dist/core/RoutingEngine.d.ts.map +1 -0
  171. package/dist/{src/core → core}/RoutingEngine.js +310 -60
  172. package/dist/core/RoutingEngine.js.map +1 -0
  173. package/dist/core/SessionManager.d.ts.map +1 -0
  174. package/dist/core/SessionManager.js.map +1 -0
  175. package/dist/{cjs/src/core → core}/Step.d.ts +31 -10
  176. package/dist/core/Step.d.ts.map +1 -0
  177. package/dist/{src/core → core}/Step.js +104 -9
  178. package/dist/core/Step.js.map +1 -0
  179. package/dist/core/ToolManager.d.ts.map +1 -0
  180. package/dist/core/ToolManager.js.map +1 -0
  181. package/dist/{cjs/src/index.d.ts → index.d.ts} +4 -1
  182. package/dist/index.d.ts.map +1 -0
  183. package/dist/{src/index.js → index.js} +3 -0
  184. package/dist/index.js.map +1 -0
  185. package/dist/providers/AnthropicProvider.d.ts.map +1 -0
  186. package/dist/{src/providers → providers}/AnthropicProvider.js +17 -17
  187. package/dist/providers/AnthropicProvider.js.map +1 -0
  188. package/dist/providers/GeminiProvider.d.ts.map +1 -0
  189. package/dist/{src/providers → providers}/GeminiProvider.js +123 -51
  190. package/dist/providers/GeminiProvider.js.map +1 -0
  191. package/dist/providers/OpenAIProvider.d.ts.map +1 -0
  192. package/dist/{src/providers → providers}/OpenAIProvider.js +18 -18
  193. package/dist/providers/OpenAIProvider.js.map +1 -0
  194. package/dist/providers/OpenRouterProvider.d.ts.map +1 -0
  195. package/dist/{src/providers → providers}/OpenRouterProvider.js +18 -18
  196. package/dist/providers/OpenRouterProvider.js.map +1 -0
  197. package/dist/providers/index.d.ts.map +1 -0
  198. package/dist/providers/index.js.map +1 -0
  199. package/dist/{src/types → types}/agent.d.ts +15 -3
  200. package/dist/types/agent.d.ts.map +1 -0
  201. package/dist/types/agent.js.map +1 -0
  202. package/dist/types/ai.d.ts.map +1 -0
  203. package/dist/types/ai.js.map +1 -0
  204. package/dist/types/history.d.ts.map +1 -0
  205. package/dist/types/history.js.map +1 -0
  206. package/dist/{src/types → types}/index.d.ts +2 -1
  207. package/dist/types/index.d.ts.map +1 -0
  208. package/dist/{src/types → types}/index.js +1 -0
  209. package/dist/types/index.js.map +1 -0
  210. package/dist/types/persistence.d.ts.map +1 -0
  211. package/dist/types/persistence.js.map +1 -0
  212. package/dist/{src/types → types}/route.d.ts +111 -12
  213. package/dist/types/route.d.ts.map +1 -0
  214. package/dist/{src/types → types}/route.js.map +1 -1
  215. package/dist/types/routing.d.ts.map +1 -0
  216. package/dist/{cjs/src/types → types}/routing.js.map +1 -1
  217. package/dist/types/schema.d.ts.map +1 -0
  218. package/dist/{cjs/src/types → types}/schema.js.map +1 -1
  219. package/dist/types/session.d.ts.map +1 -0
  220. package/dist/{src/types → types}/session.js.map +1 -1
  221. package/dist/types/template.d.ts +88 -0
  222. package/dist/types/template.d.ts.map +1 -0
  223. package/dist/{cjs/src/types → types}/template.js.map +1 -1
  224. package/dist/types/tool.d.ts.map +1 -0
  225. package/dist/types/tool.js.map +1 -0
  226. package/dist/utils/clone.d.ts.map +1 -0
  227. package/dist/utils/clone.js.map +1 -0
  228. package/dist/utils/condition.d.ts +38 -0
  229. package/dist/utils/condition.d.ts.map +1 -0
  230. package/dist/utils/condition.js +161 -0
  231. package/dist/utils/condition.js.map +1 -0
  232. package/dist/utils/event.d.ts.map +1 -0
  233. package/dist/utils/event.js.map +1 -0
  234. package/dist/utils/history.d.ts.map +1 -0
  235. package/dist/utils/history.js.map +1 -0
  236. package/dist/utils/id.d.ts.map +1 -0
  237. package/dist/utils/id.js.map +1 -0
  238. package/dist/{src/utils → utils}/index.d.ts +3 -1
  239. package/dist/utils/index.d.ts.map +1 -0
  240. package/dist/{src/utils → utils}/index.js +5 -1
  241. package/dist/utils/index.js.map +1 -0
  242. package/dist/utils/json.d.ts +16 -0
  243. package/dist/utils/json.d.ts.map +1 -0
  244. package/dist/utils/json.js +43 -0
  245. package/dist/utils/json.js.map +1 -0
  246. package/dist/utils/logger.d.ts.map +1 -0
  247. package/dist/utils/logger.js.map +1 -0
  248. package/dist/{cjs/src/utils → utils}/retry.d.ts +0 -3
  249. package/dist/utils/retry.d.ts.map +1 -0
  250. package/dist/{src/utils → utils}/retry.js +5 -4
  251. package/dist/utils/retry.js.map +1 -0
  252. package/dist/utils/session.d.ts.map +1 -0
  253. package/dist/utils/session.js.map +1 -0
  254. package/dist/{cjs/src/utils → utils}/template.d.ts +48 -0
  255. package/dist/utils/template.d.ts.map +1 -0
  256. package/dist/{src/utils → utils}/template.js +98 -0
  257. package/dist/utils/template.js.map +1 -0
  258. package/docs/README.md +1 -0
  259. package/docs/api/README.md +237 -12
  260. package/docs/api/overview.md +206 -3
  261. package/docs/architecture/data-extraction-flow.md +363 -0
  262. package/docs/architecture/multi-step-execution.md +243 -0
  263. package/docs/core/agent/README.md +156 -5
  264. package/docs/core/agent/rules-and-prohibitions.md +113 -0
  265. package/docs/core/agent/session-management.md +1 -1
  266. package/docs/core/ai-integration/prompt-composition.md +135 -0
  267. package/docs/core/ai-integration/response-processing.md +146 -0
  268. package/docs/core/conversation-flows/data-collection.md +143 -0
  269. package/docs/core/conversation-flows/routes.md +2 -2
  270. package/docs/core/conversation-flows/step-transitions.md +132 -0
  271. package/docs/core/conversation-flows/steps.md +112 -0
  272. package/docs/core/error-handling.md +193 -0
  273. package/docs/core/routing/intelligent-routing.md +118 -0
  274. package/docs/guides/getting-started/README.md +284 -3
  275. package/docs/guides/migration/README.md +27 -0
  276. package/docs/guides/migration/flexible-routing-conditions.md +375 -0
  277. package/docs/guides/migration/multi-step-execution.md +373 -0
  278. package/examples/advanced-patterns/knowledge-based-agent.ts +101 -24
  279. package/examples/advanced-patterns/persistent-onboarding.ts +40 -5
  280. package/examples/advanced-patterns/route-lifecycle-hooks.ts +82 -12
  281. package/examples/advanced-patterns/streaming-responses.ts +2 -2
  282. package/examples/ai-providers/anthropic-integration.ts +4 -4
  283. package/examples/ai-providers/openai-integration.ts +1 -1
  284. package/examples/condition-patterns/function-only-conditions.ts +365 -0
  285. package/examples/condition-patterns/mixed-array-conditions.ts +477 -0
  286. package/examples/condition-patterns/route-skipif-patterns.ts +468 -0
  287. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  288. package/examples/condition-patterns/string-only-conditions.ts +296 -0
  289. package/examples/conversation-flows/completion-transitions.ts +48 -7
  290. package/examples/core-concepts/basic-agent.ts +54 -33
  291. package/examples/core-concepts/schema-driven-extraction.ts +33 -9
  292. package/examples/core-concepts/session-management.ts +51 -16
  293. package/examples/integrations/database-integration.ts +6 -6
  294. package/examples/integrations/healthcare-integration.ts +10 -10
  295. package/examples/integrations/search-integration.ts +8 -8
  296. package/examples/integrations/server-session-management.ts +8 -8
  297. package/examples/persistence/database-persistence.ts +15 -15
  298. package/examples/persistence/memory-sessions.ts +3 -3
  299. package/examples/persistence/redis-persistence.ts +7 -9
  300. package/examples/tools/data-enrichment-tools.ts +4 -4
  301. package/package.json +6 -4
  302. package/src/adapters/PrismaAdapter.ts +3 -2
  303. package/src/adapters/RedisAdapter.ts +3 -3
  304. package/src/core/Agent.ts +78 -2
  305. package/src/core/BatchExecutor.ts +1166 -0
  306. package/src/core/BatchPromptBuilder.ts +293 -0
  307. package/src/core/PromptComposer.ts +53 -16
  308. package/src/core/ResponseEngine.ts +168 -29
  309. package/src/core/ResponseModal.ts +954 -74
  310. package/src/core/ResponsePipeline.ts +17 -9
  311. package/src/core/Route.ts +223 -22
  312. package/src/core/RoutingEngine.ts +426 -83
  313. package/src/core/Step.ts +144 -16
  314. package/src/index.ts +19 -0
  315. package/src/providers/AnthropicProvider.ts +17 -17
  316. package/src/providers/GeminiProvider.ts +129 -60
  317. package/src/providers/OpenAIProvider.ts +18 -18
  318. package/src/providers/OpenRouterProvider.ts +18 -18
  319. package/src/types/agent.ts +15 -3
  320. package/src/types/index.ts +12 -1
  321. package/src/types/route.ts +131 -12
  322. package/src/types/template.ts +70 -2
  323. package/src/utils/condition.ts +190 -0
  324. package/src/utils/index.ts +12 -0
  325. package/src/utils/json.ts +46 -0
  326. package/src/utils/retry.ts +5 -4
  327. package/src/utils/template.ts +109 -0
  328. package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +0 -1
  329. package/dist/cjs/src/adapters/MemoryAdapter.js.map +0 -1
  330. package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +0 -1
  331. package/dist/cjs/src/adapters/MongoAdapter.js.map +0 -1
  332. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +0 -1
  333. package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +0 -1
  334. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  335. package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +0 -1
  336. package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +0 -1
  337. package/dist/cjs/src/adapters/PrismaAdapter.js.map +0 -1
  338. package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +0 -1
  339. package/dist/cjs/src/adapters/RedisAdapter.js.map +0 -1
  340. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +0 -1
  341. package/dist/cjs/src/adapters/SQLiteAdapter.js.map +0 -1
  342. package/dist/cjs/src/adapters/index.d.ts.map +0 -1
  343. package/dist/cjs/src/adapters/index.js.map +0 -1
  344. package/dist/cjs/src/constants/index.d.ts.map +0 -1
  345. package/dist/cjs/src/constants/index.js.map +0 -1
  346. package/dist/cjs/src/core/Agent.d.ts.map +0 -1
  347. package/dist/cjs/src/core/Agent.js.map +0 -1
  348. package/dist/cjs/src/core/Events.d.ts.map +0 -1
  349. package/dist/cjs/src/core/Events.js.map +0 -1
  350. package/dist/cjs/src/core/PersistenceManager.d.ts.map +0 -1
  351. package/dist/cjs/src/core/PersistenceManager.js.map +0 -1
  352. package/dist/cjs/src/core/PromptComposer.d.ts.map +0 -1
  353. package/dist/cjs/src/core/PromptComposer.js.map +0 -1
  354. package/dist/cjs/src/core/ResponseEngine.d.ts.map +0 -1
  355. package/dist/cjs/src/core/ResponseEngine.js +0 -84
  356. package/dist/cjs/src/core/ResponseEngine.js.map +0 -1
  357. package/dist/cjs/src/core/ResponseModal.d.ts.map +0 -1
  358. package/dist/cjs/src/core/ResponseModal.js.map +0 -1
  359. package/dist/cjs/src/core/ResponsePipeline.d.ts.map +0 -1
  360. package/dist/cjs/src/core/ResponsePipeline.js.map +0 -1
  361. package/dist/cjs/src/core/Route.d.ts.map +0 -1
  362. package/dist/cjs/src/core/Route.js.map +0 -1
  363. package/dist/cjs/src/core/RoutingEngine.d.ts.map +0 -1
  364. package/dist/cjs/src/core/RoutingEngine.js.map +0 -1
  365. package/dist/cjs/src/core/SessionManager.d.ts.map +0 -1
  366. package/dist/cjs/src/core/SessionManager.js.map +0 -1
  367. package/dist/cjs/src/core/Step.d.ts.map +0 -1
  368. package/dist/cjs/src/core/Step.js.map +0 -1
  369. package/dist/cjs/src/core/ToolManager.d.ts.map +0 -1
  370. package/dist/cjs/src/core/ToolManager.js.map +0 -1
  371. package/dist/cjs/src/index.d.ts.map +0 -1
  372. package/dist/cjs/src/index.js.map +0 -1
  373. package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +0 -1
  374. package/dist/cjs/src/providers/AnthropicProvider.js.map +0 -1
  375. package/dist/cjs/src/providers/GeminiProvider.d.ts.map +0 -1
  376. package/dist/cjs/src/providers/GeminiProvider.js.map +0 -1
  377. package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +0 -1
  378. package/dist/cjs/src/providers/OpenAIProvider.js.map +0 -1
  379. package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +0 -1
  380. package/dist/cjs/src/providers/OpenRouterProvider.js.map +0 -1
  381. package/dist/cjs/src/providers/index.d.ts.map +0 -1
  382. package/dist/cjs/src/providers/index.js.map +0 -1
  383. package/dist/cjs/src/types/agent.d.ts.map +0 -1
  384. package/dist/cjs/src/types/agent.js.map +0 -1
  385. package/dist/cjs/src/types/ai.d.ts.map +0 -1
  386. package/dist/cjs/src/types/ai.js.map +0 -1
  387. package/dist/cjs/src/types/history.d.ts.map +0 -1
  388. package/dist/cjs/src/types/history.js.map +0 -1
  389. package/dist/cjs/src/types/index.d.ts.map +0 -1
  390. package/dist/cjs/src/types/index.js.map +0 -1
  391. package/dist/cjs/src/types/persistence.d.ts.map +0 -1
  392. package/dist/cjs/src/types/persistence.js.map +0 -1
  393. package/dist/cjs/src/types/route.d.ts.map +0 -1
  394. package/dist/cjs/src/types/routing.d.ts.map +0 -1
  395. package/dist/cjs/src/types/schema.d.ts.map +0 -1
  396. package/dist/cjs/src/types/session.d.ts.map +0 -1
  397. package/dist/cjs/src/types/session.js.map +0 -1
  398. package/dist/cjs/src/types/template.d.ts +0 -30
  399. package/dist/cjs/src/types/template.d.ts.map +0 -1
  400. package/dist/cjs/src/types/tool.d.ts.map +0 -1
  401. package/dist/cjs/src/types/tool.js.map +0 -1
  402. package/dist/cjs/src/utils/clone.d.ts.map +0 -1
  403. package/dist/cjs/src/utils/clone.js.map +0 -1
  404. package/dist/cjs/src/utils/event.d.ts.map +0 -1
  405. package/dist/cjs/src/utils/event.js.map +0 -1
  406. package/dist/cjs/src/utils/history.d.ts.map +0 -1
  407. package/dist/cjs/src/utils/history.js.map +0 -1
  408. package/dist/cjs/src/utils/id.d.ts.map +0 -1
  409. package/dist/cjs/src/utils/id.js.map +0 -1
  410. package/dist/cjs/src/utils/index.d.ts.map +0 -1
  411. package/dist/cjs/src/utils/index.js.map +0 -1
  412. package/dist/cjs/src/utils/logger.d.ts.map +0 -1
  413. package/dist/cjs/src/utils/logger.js.map +0 -1
  414. package/dist/cjs/src/utils/retry.d.ts.map +0 -1
  415. package/dist/cjs/src/utils/retry.js.map +0 -1
  416. package/dist/cjs/src/utils/session.d.ts.map +0 -1
  417. package/dist/cjs/src/utils/session.js.map +0 -1
  418. package/dist/cjs/src/utils/template.d.ts.map +0 -1
  419. package/dist/cjs/src/utils/template.js.map +0 -1
  420. package/dist/src/adapters/MemoryAdapter.js.map +0 -1
  421. package/dist/src/adapters/MongoAdapter.js.map +0 -1
  422. package/dist/src/adapters/OpenSearchAdapter.js.map +0 -1
  423. package/dist/src/adapters/PostgreSQLAdapter.js.map +0 -1
  424. package/dist/src/adapters/PrismaAdapter.js.map +0 -1
  425. package/dist/src/adapters/RedisAdapter.js.map +0 -1
  426. package/dist/src/adapters/SQLiteAdapter.js.map +0 -1
  427. package/dist/src/adapters/index.js.map +0 -1
  428. package/dist/src/constants/index.js.map +0 -1
  429. package/dist/src/core/Agent.d.ts.map +0 -1
  430. package/dist/src/core/Agent.js.map +0 -1
  431. package/dist/src/core/Events.js.map +0 -1
  432. package/dist/src/core/PersistenceManager.js.map +0 -1
  433. package/dist/src/core/PromptComposer.d.ts.map +0 -1
  434. package/dist/src/core/PromptComposer.js.map +0 -1
  435. package/dist/src/core/ResponseEngine.js +0 -80
  436. package/dist/src/core/ResponseEngine.js.map +0 -1
  437. package/dist/src/core/ResponseModal.d.ts.map +0 -1
  438. package/dist/src/core/ResponseModal.js.map +0 -1
  439. package/dist/src/core/ResponsePipeline.d.ts.map +0 -1
  440. package/dist/src/core/ResponsePipeline.js.map +0 -1
  441. package/dist/src/core/Route.d.ts.map +0 -1
  442. package/dist/src/core/Route.js.map +0 -1
  443. package/dist/src/core/RoutingEngine.d.ts.map +0 -1
  444. package/dist/src/core/RoutingEngine.js.map +0 -1
  445. package/dist/src/core/SessionManager.js.map +0 -1
  446. package/dist/src/core/Step.d.ts.map +0 -1
  447. package/dist/src/core/Step.js.map +0 -1
  448. package/dist/src/core/ToolManager.js.map +0 -1
  449. package/dist/src/index.d.ts.map +0 -1
  450. package/dist/src/index.js.map +0 -1
  451. package/dist/src/providers/AnthropicProvider.js.map +0 -1
  452. package/dist/src/providers/GeminiProvider.js.map +0 -1
  453. package/dist/src/providers/OpenAIProvider.js.map +0 -1
  454. package/dist/src/providers/OpenRouterProvider.js.map +0 -1
  455. package/dist/src/providers/index.js.map +0 -1
  456. package/dist/src/types/agent.d.ts.map +0 -1
  457. package/dist/src/types/agent.js.map +0 -1
  458. package/dist/src/types/history.js.map +0 -1
  459. package/dist/src/types/index.js.map +0 -1
  460. package/dist/src/types/persistence.js.map +0 -1
  461. package/dist/src/types/route.d.ts.map +0 -1
  462. package/dist/src/types/template.d.ts +0 -30
  463. package/dist/src/types/template.d.ts.map +0 -1
  464. package/dist/src/types/tool.js.map +0 -1
  465. package/dist/src/utils/clone.js.map +0 -1
  466. package/dist/src/utils/event.js.map +0 -1
  467. package/dist/src/utils/history.js.map +0 -1
  468. package/dist/src/utils/id.js.map +0 -1
  469. package/dist/src/utils/index.d.ts.map +0 -1
  470. package/dist/src/utils/index.js.map +0 -1
  471. package/dist/src/utils/logger.js.map +0 -1
  472. package/dist/src/utils/retry.d.ts.map +0 -1
  473. package/dist/src/utils/retry.js.map +0 -1
  474. package/dist/src/utils/session.js.map +0 -1
  475. package/dist/src/utils/template.d.ts.map +0 -1
  476. package/dist/src/utils/template.js.map +0 -1
  477. /package/dist/{cjs/src/adapters → adapters}/MemoryAdapter.d.ts +0 -0
  478. /package/dist/{src/adapters → adapters}/MemoryAdapter.js +0 -0
  479. /package/dist/{cjs/src/adapters → adapters}/MongoAdapter.d.ts +0 -0
  480. /package/dist/{src/adapters → adapters}/MongoAdapter.js +0 -0
  481. /package/dist/{cjs/src/adapters → adapters}/OpenSearchAdapter.d.ts +0 -0
  482. /package/dist/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
  483. /package/dist/{cjs/src/adapters → adapters}/PostgreSQLAdapter.d.ts +0 -0
  484. /package/dist/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
  485. /package/dist/{cjs/src/adapters → adapters}/PrismaAdapter.d.ts +0 -0
  486. /package/dist/{cjs/src/adapters → adapters}/RedisAdapter.d.ts +0 -0
  487. /package/dist/{cjs/src/adapters → adapters}/SQLiteAdapter.d.ts +0 -0
  488. /package/dist/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
  489. /package/dist/{cjs/src/adapters → adapters}/index.d.ts +0 -0
  490. /package/dist/{src/adapters → adapters}/index.js +0 -0
  491. /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts +0 -0
  492. /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts.map +0 -0
  493. /package/dist/cjs/{src/adapters → adapters}/MemoryAdapter.js +0 -0
  494. /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts +0 -0
  495. /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts.map +0 -0
  496. /package/dist/cjs/{src/adapters → adapters}/MongoAdapter.js +0 -0
  497. /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts +0 -0
  498. /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts.map +0 -0
  499. /package/dist/cjs/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
  500. /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts +0 -0
  501. /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts.map +0 -0
  502. /package/dist/cjs/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
  503. /package/dist/{src → cjs}/adapters/PrismaAdapter.d.ts +0 -0
  504. /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts +0 -0
  505. /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts.map +0 -0
  506. /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts +0 -0
  507. /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts.map +0 -0
  508. /package/dist/cjs/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
  509. /package/dist/{src → cjs}/adapters/index.d.ts +0 -0
  510. /package/dist/{src → cjs}/adapters/index.d.ts.map +0 -0
  511. /package/dist/cjs/{src/adapters → adapters}/index.js +0 -0
  512. /package/dist/cjs/{src/constants → constants}/index.d.ts +0 -0
  513. /package/dist/{src → cjs}/constants/index.d.ts.map +0 -0
  514. /package/dist/cjs/{src/constants → constants}/index.js +0 -0
  515. /package/dist/cjs/{src/core → core}/Events.d.ts +0 -0
  516. /package/dist/{src → cjs}/core/Events.d.ts.map +0 -0
  517. /package/dist/cjs/{src/core → core}/Events.js +0 -0
  518. /package/dist/cjs/{src/core → core}/PersistenceManager.d.ts +0 -0
  519. /package/dist/{src → cjs}/core/PersistenceManager.d.ts.map +0 -0
  520. /package/dist/cjs/{src/core → core}/PersistenceManager.js +0 -0
  521. /package/dist/cjs/{src/core → core}/ResponseEngine.d.ts +0 -0
  522. /package/dist/cjs/{src/core → core}/SessionManager.d.ts +0 -0
  523. /package/dist/{src → cjs}/core/SessionManager.d.ts.map +0 -0
  524. /package/dist/cjs/{src/core → core}/SessionManager.js +0 -0
  525. /package/dist/cjs/{src/core → core}/ToolManager.d.ts +0 -0
  526. /package/dist/{src → cjs}/core/ToolManager.d.ts.map +0 -0
  527. /package/dist/cjs/{src/core → core}/ToolManager.js +0 -0
  528. /package/dist/cjs/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
  529. /package/dist/{src → cjs}/providers/AnthropicProvider.d.ts.map +0 -0
  530. /package/dist/cjs/{src/providers → providers}/GeminiProvider.d.ts +0 -0
  531. /package/dist/cjs/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
  532. /package/dist/{src → cjs}/providers/OpenAIProvider.d.ts.map +0 -0
  533. /package/dist/cjs/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
  534. /package/dist/{src → cjs}/providers/OpenRouterProvider.d.ts.map +0 -0
  535. /package/dist/cjs/{src/providers → providers}/index.d.ts +0 -0
  536. /package/dist/{src → cjs}/providers/index.d.ts.map +0 -0
  537. /package/dist/cjs/{src/providers → providers}/index.js +0 -0
  538. /package/dist/cjs/{src/types → types}/agent.js +0 -0
  539. /package/dist/cjs/{src/types → types}/ai.d.ts +0 -0
  540. /package/dist/{src → cjs}/types/ai.d.ts.map +0 -0
  541. /package/dist/cjs/{src/types → types}/ai.js +0 -0
  542. /package/dist/cjs/{src/types → types}/history.d.ts +0 -0
  543. /package/dist/{src → cjs}/types/history.d.ts.map +0 -0
  544. /package/dist/cjs/{src/types → types}/history.js +0 -0
  545. /package/dist/cjs/{src/types → types}/persistence.d.ts +0 -0
  546. /package/dist/{src → cjs}/types/persistence.d.ts.map +0 -0
  547. /package/dist/cjs/{src/types → types}/persistence.js +0 -0
  548. /package/dist/cjs/{src/types → types}/route.js +0 -0
  549. /package/dist/cjs/{src/types → types}/routing.d.ts +0 -0
  550. /package/dist/{src → cjs}/types/routing.d.ts.map +0 -0
  551. /package/dist/cjs/{src/types → types}/routing.js +0 -0
  552. /package/dist/{src → cjs}/types/routing.js.map +0 -0
  553. /package/dist/cjs/{src/types → types}/schema.d.ts +0 -0
  554. /package/dist/{src → cjs}/types/schema.d.ts.map +0 -0
  555. /package/dist/cjs/{src/types → types}/schema.js +0 -0
  556. /package/dist/{src → cjs}/types/schema.js.map +0 -0
  557. /package/dist/cjs/{src/types → types}/session.d.ts +0 -0
  558. /package/dist/{src → cjs}/types/session.d.ts.map +0 -0
  559. /package/dist/cjs/{src/types → types}/session.js +0 -0
  560. /package/dist/cjs/{src/types → types}/template.js +0 -0
  561. /package/dist/{src → cjs}/types/template.js.map +0 -0
  562. /package/dist/cjs/{src/types → types}/tool.d.ts +0 -0
  563. /package/dist/{src → cjs}/types/tool.d.ts.map +0 -0
  564. /package/dist/cjs/{src/types → types}/tool.js +0 -0
  565. /package/dist/cjs/{src/utils → utils}/clone.d.ts +0 -0
  566. /package/dist/{src → cjs}/utils/clone.d.ts.map +0 -0
  567. /package/dist/cjs/{src/utils → utils}/clone.js +0 -0
  568. /package/dist/cjs/{src/utils → utils}/event.d.ts +0 -0
  569. /package/dist/{src → cjs}/utils/event.d.ts.map +0 -0
  570. /package/dist/cjs/{src/utils → utils}/event.js +0 -0
  571. /package/dist/cjs/{src/utils → utils}/history.d.ts +0 -0
  572. /package/dist/{src → cjs}/utils/history.d.ts.map +0 -0
  573. /package/dist/cjs/{src/utils → utils}/history.js +0 -0
  574. /package/dist/cjs/{src/utils → utils}/id.d.ts +0 -0
  575. /package/dist/{src → cjs}/utils/id.d.ts.map +0 -0
  576. /package/dist/cjs/{src/utils → utils}/id.js +0 -0
  577. /package/dist/cjs/{src/utils → utils}/logger.d.ts +0 -0
  578. /package/dist/{src → cjs}/utils/logger.d.ts.map +0 -0
  579. /package/dist/cjs/{src/utils → utils}/logger.js +0 -0
  580. /package/dist/cjs/{src/utils → utils}/session.d.ts +0 -0
  581. /package/dist/{src → cjs}/utils/session.d.ts.map +0 -0
  582. /package/dist/cjs/{src/utils → utils}/session.js +0 -0
  583. /package/dist/{src/constants → constants}/index.d.ts +0 -0
  584. /package/dist/{src/constants → constants}/index.js +0 -0
  585. /package/dist/{src/core → core}/Events.d.ts +0 -0
  586. /package/dist/{src/core → core}/Events.js +0 -0
  587. /package/dist/{src/core → core}/PersistenceManager.d.ts +0 -0
  588. /package/dist/{src/core → core}/PersistenceManager.js +0 -0
  589. /package/dist/{src/core → core}/ResponseEngine.d.ts +0 -0
  590. /package/dist/{src/core → core}/SessionManager.d.ts +0 -0
  591. /package/dist/{src/core → core}/SessionManager.js +0 -0
  592. /package/dist/{src/core → core}/ToolManager.d.ts +0 -0
  593. /package/dist/{src/core → core}/ToolManager.js +0 -0
  594. /package/dist/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
  595. /package/dist/{src/providers → providers}/GeminiProvider.d.ts +0 -0
  596. /package/dist/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
  597. /package/dist/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
  598. /package/dist/{src/providers → providers}/index.d.ts +0 -0
  599. /package/dist/{src/providers → providers}/index.js +0 -0
  600. /package/dist/{src/types → types}/agent.js +0 -0
  601. /package/dist/{src/types → types}/ai.d.ts +0 -0
  602. /package/dist/{src/types → types}/ai.js +0 -0
  603. /package/dist/{src/types → types}/history.d.ts +0 -0
  604. /package/dist/{src/types → types}/history.js +0 -0
  605. /package/dist/{src/types → types}/persistence.d.ts +0 -0
  606. /package/dist/{src/types → types}/persistence.js +0 -0
  607. /package/dist/{src/types → types}/route.js +0 -0
  608. /package/dist/{src/types → types}/routing.d.ts +0 -0
  609. /package/dist/{src/types → types}/routing.js +0 -0
  610. /package/dist/{src/types → types}/schema.d.ts +0 -0
  611. /package/dist/{src/types → types}/schema.js +0 -0
  612. /package/dist/{src/types → types}/session.d.ts +0 -0
  613. /package/dist/{src/types → types}/session.js +0 -0
  614. /package/dist/{src/types → types}/template.js +0 -0
  615. /package/dist/{src/types → types}/tool.d.ts +0 -0
  616. /package/dist/{src/types → types}/tool.js +0 -0
  617. /package/dist/{src/utils → utils}/clone.d.ts +0 -0
  618. /package/dist/{src/utils → utils}/clone.js +0 -0
  619. /package/dist/{src/utils → utils}/event.d.ts +0 -0
  620. /package/dist/{src/utils → utils}/event.js +0 -0
  621. /package/dist/{src/utils → utils}/history.d.ts +0 -0
  622. /package/dist/{src/utils → utils}/history.js +0 -0
  623. /package/dist/{src/utils → utils}/id.d.ts +0 -0
  624. /package/dist/{src/utils → utils}/id.js +0 -0
  625. /package/dist/{src/utils → utils}/logger.d.ts +0 -0
  626. /package/dist/{src/utils → utils}/logger.js +0 -0
  627. /package/dist/{src/utils → utils}/session.d.ts +0 -0
  628. /package/dist/{src/utils → utils}/session.js +0 -0
@@ -0,0 +1,373 @@
1
+ # Multi-Step Execution Migration Guide
2
+
3
+ This guide covers the behavioral changes from single-step to multi-step execution and provides migration guidance for existing routes.
4
+
5
+ ## Breaking Changes in v1.0.0
6
+
7
+ ### History API Simplified
8
+
9
+ The `createMessageEvent` and `EventSource` exports have been replaced with simpler helper functions:
10
+
11
+ **Before (v0.x):**
12
+ ```typescript
13
+ import { createMessageEvent, EventSource } from "@falai/agent";
14
+
15
+ const history = [
16
+ createMessageEvent(EventSource.CUSTOMER, "Hello"),
17
+ createMessageEvent(EventSource.AI_AGENT, "Hi there!"),
18
+ ];
19
+ ```
20
+
21
+ **After (v1.0.0):**
22
+ ```typescript
23
+ import { userMessage, assistantMessage } from "@falai/agent";
24
+
25
+ const history = [
26
+ userMessage("Hello"),
27
+ assistantMessage("Hi there!"),
28
+ ];
29
+ ```
30
+
31
+ The history is now a simple array of objects with `role` and `content` properties:
32
+
33
+ ```typescript
34
+ // Available helper functions
35
+ import {
36
+ userMessage, // (content, name?) => { role: "user", content, name? }
37
+ assistantMessage, // (content, toolCalls?) => { role: "assistant", content, tool_calls? }
38
+ toolMessage, // (toolCallId, name, content) => { role: "tool", ... }
39
+ systemMessage, // (content) => { role: "system", content }
40
+ } from "@falai/agent";
41
+
42
+ // Or create history items directly
43
+ const history = [
44
+ { role: "user", content: "Hello" },
45
+ { role: "assistant", content: "Hi there!" },
46
+ ];
47
+ ```
48
+
49
+ ### StepOptions: `instructions` → `prompt`
50
+
51
+ The `instructions` property in `StepOptions` has been renamed to `prompt`:
52
+
53
+ **Before:**
54
+ ```typescript
55
+ steps: [
56
+ {
57
+ id: "greeting",
58
+ instructions: "Greet the user warmly",
59
+ }
60
+ ]
61
+ ```
62
+
63
+ **After:**
64
+ ```typescript
65
+ steps: [
66
+ {
67
+ id: "greeting",
68
+ prompt: "Greet the user warmly",
69
+ }
70
+ ]
71
+ ```
72
+
73
+ ---
74
+
75
+ ## Overview
76
+
77
+ Multi-step execution is a **major behavioral change** that allows multiple consecutive steps to execute in a single LLM call. While the public API shape remains compatible, the execution semantics differ from the previous single-step model.
78
+
79
+ ## Key Behavioral Changes
80
+
81
+ ### Before: Single-Step Execution
82
+
83
+ Previously, each `.respond()` call executed exactly one step:
84
+
85
+ ```typescript
86
+ // Turn 1
87
+ const response1 = await agent.respond("Book Grand Hotel for 2 on Friday");
88
+ // Executes: ask-hotel step
89
+ // Response: "What date would you like to book?"
90
+
91
+ // Turn 2
92
+ const response2 = await agent.respond("Friday");
93
+ // Executes: ask-date step
94
+ // Response: "How many guests?"
95
+
96
+ // Turn 3
97
+ const response3 = await agent.respond("2 people");
98
+ // Executes: ask-guests step
99
+ // Response: "Booking confirmed!"
100
+
101
+ // Total: 3 LLM calls
102
+ ```
103
+
104
+ ### After: Multi-Step Execution
105
+
106
+ Now, multiple steps can execute in a single call when data requirements are satisfied:
107
+
108
+ ```typescript
109
+ // Turn 1
110
+ const response = await agent.respond("Book Grand Hotel for 2 on Friday");
111
+ // Pre-extraction captures: { hotel: "Grand Hotel", date: "Friday", guests: 2 }
112
+ // Executes: ask-hotel, ask-date, ask-guests steps (all in one batch)
113
+ // Response: "Booking confirmed for 2 guests at Grand Hotel on Friday!"
114
+
115
+ // Total: 1 LLM call
116
+ ```
117
+
118
+ ## What Changed
119
+
120
+ | Aspect | Before | After |
121
+ |--------|--------|-------|
122
+ | Steps per call | Always 1 | 1 or more (batched) |
123
+ | LLM calls | One per step | One per batch |
124
+ | Pre-extraction | Per-step | Before batch determination |
125
+ | Response fields | Basic | Includes `executedSteps`, `stoppedReason` |
126
+ | Hook execution | Per-step | All prepare hooks, then LLM, then all finalize hooks |
127
+
128
+ ## Migration Checklist
129
+
130
+ ### 1. Review Hook Dependencies
131
+
132
+ If your hooks depend on being called between steps, they may need adjustment:
133
+
134
+ ```typescript
135
+ // Before: Hooks called between each step
136
+ const step1 = {
137
+ finalize: async (ctx, data) => {
138
+ // This ran before step2's prepare
139
+ await saveProgress(data);
140
+ }
141
+ };
142
+
143
+ const step2 = {
144
+ prepare: async (ctx, data) => {
145
+ // This expected step1's finalize to have run
146
+ const progress = await loadProgress();
147
+ }
148
+ };
149
+
150
+ // After: All prepare hooks run first, then all finalize hooks
151
+ // If step1 and step2 are batched together:
152
+ // 1. step1.prepare runs
153
+ // 2. step2.prepare runs
154
+ // 3. LLM call
155
+ // 4. step1.finalize runs
156
+ // 5. step2.finalize runs
157
+
158
+ // Migration: Use session data instead of external state
159
+ const step1 = {
160
+ finalize: async (ctx, data) => {
161
+ // Store in session data, not external state
162
+ data.step1Complete = true;
163
+ }
164
+ };
165
+
166
+ const step2 = {
167
+ prepare: async (ctx, data) => {
168
+ // Check session data
169
+ if (!data.step1Complete) {
170
+ // Handle case where step1 hasn't finalized yet
171
+ }
172
+ }
173
+ };
174
+ ```
175
+
176
+ ### 2. Update Response Handling
177
+
178
+ Check for new response fields:
179
+
180
+ ```typescript
181
+ // Before
182
+ const response = await agent.respond(message);
183
+ console.log(response.message);
184
+ console.log(response.isRouteComplete);
185
+
186
+ // After - additional fields available
187
+ const response = await agent.respond(message);
188
+ console.log(response.message);
189
+ console.log(response.isRouteComplete);
190
+ console.log(response.executedSteps); // NEW: Array of executed steps
191
+ console.log(response.stoppedReason); // NEW: Why execution stopped
192
+ console.log(response.error); // NEW: Error details if any
193
+ ```
194
+
195
+ ### 3. Review SkipIf Conditions
196
+
197
+ SkipIf conditions now affect batch determination:
198
+
199
+ ```typescript
200
+ // Before: skipIf evaluated when entering step
201
+ const step = {
202
+ skipIf: (data) => {
203
+ // Called when transitioning to this step
204
+ return data.alreadyHaveInfo;
205
+ }
206
+ };
207
+
208
+ // After: skipIf evaluated during batch determination
209
+ // If skipIf returns true, step is skipped and next step is evaluated
210
+ // If skipIf throws, step is treated as non-skippable (included in batch)
211
+
212
+ // Migration: Ensure skipIf is pure and doesn't have side effects
213
+ const step = {
214
+ skipIf: (data) => {
215
+ // GOOD: Pure function
216
+ return data.alreadyHaveInfo;
217
+ }
218
+ };
219
+
220
+ // AVOID: Side effects in skipIf
221
+ const badStep = {
222
+ skipIf: (data) => {
223
+ // BAD: Side effect
224
+ logSkipCheck(data);
225
+ return data.alreadyHaveInfo;
226
+ }
227
+ };
228
+ ```
229
+
230
+ ### 4. Handle Partial Execution
231
+
232
+ Errors may leave partial progress:
233
+
234
+ ```typescript
235
+ // Before: Single step, all or nothing
236
+
237
+ // After: Batch may partially complete
238
+ const response = await agent.respond(message);
239
+
240
+ if (response.stoppedReason === 'prepare_error') {
241
+ // Some steps may have executed before the error
242
+ console.log("Executed before error:", response.executedSteps);
243
+ console.log("Error details:", response.error);
244
+ }
245
+ ```
246
+
247
+ ### 5. Update Tests
248
+
249
+ Tests expecting single-step behavior need updates:
250
+
251
+ ```typescript
252
+ // Before
253
+ test("collects hotel name", async () => {
254
+ const response = await agent.respond("Book Grand Hotel");
255
+ expect(response.session.data.hotel).toBe("Grand Hotel");
256
+ // Assumed only hotel step executed
257
+ });
258
+
259
+ // After
260
+ test("collects hotel name", async () => {
261
+ const response = await agent.respond("Book Grand Hotel");
262
+ expect(response.session.data.hotel).toBe("Grand Hotel");
263
+
264
+ // Check which steps actually executed
265
+ expect(response.executedSteps).toContainEqual(
266
+ expect.objectContaining({ id: "ask-hotel" })
267
+ );
268
+
269
+ // May have executed more steps if data was available
270
+ expect(response.stoppedReason).toBe("needs_input");
271
+ });
272
+ ```
273
+
274
+ ## Before/After Examples
275
+
276
+ ### Example 1: Simple Booking Flow
277
+
278
+ **Before (3 turns):**
279
+ ```
280
+ User: "I want to book a hotel"
281
+ Bot: "Which hotel would you like?"
282
+ User: "Grand Hotel"
283
+ Bot: "What date?"
284
+ User: "Friday"
285
+ Bot: "Booking confirmed!"
286
+ ```
287
+
288
+ **After (potentially 1-2 turns):**
289
+ ```
290
+ User: "I want to book Grand Hotel for Friday"
291
+ Bot: "Booking confirmed for Grand Hotel on Friday!"
292
+ ```
293
+
294
+ ### Example 2: Partial Information
295
+
296
+ **Before:**
297
+ ```
298
+ User: "Book Grand Hotel"
299
+ Bot: "What date?" (only hotel step executed)
300
+ ```
301
+
302
+ **After:**
303
+ ```
304
+ User: "Book Grand Hotel"
305
+ Bot: "What date?" (hotel step executed, stopped at date step)
306
+ // response.executedSteps = [{ id: "ask-hotel" }]
307
+ // response.stoppedReason = "needs_input"
308
+ ```
309
+
310
+ ### Example 3: With SkipIf Conditions
311
+
312
+ **Before:**
313
+ ```typescript
314
+ // Each step evaluated individually
315
+ const step1 = { skipIf: (d) => !!d.name }; // Skipped if name exists
316
+ const step2 = { skipIf: (d) => !!d.email }; // Skipped if email exists
317
+ ```
318
+
319
+ **After:**
320
+ ```typescript
321
+ // All skipIf conditions evaluated during batch determination
322
+ // If user provides "I'm John, john@example.com":
323
+ // - Pre-extraction: { name: "John", email: "john@example.com" }
324
+ // - step1 skipIf: true (skipped)
325
+ // - step2 skipIf: true (skipped)
326
+ // - Both steps skipped, route may complete immediately
327
+ ```
328
+
329
+ ## Opting Out of Batching
330
+
331
+ If you need single-step behavior for specific steps, use `requires` to create dependencies:
332
+
333
+ ```typescript
334
+ // Force step2 to wait for step1's data
335
+ const step1 = {
336
+ collect: ["name"],
337
+ };
338
+
339
+ const step2 = {
340
+ collect: ["email"],
341
+ requires: ["name"], // Won't batch with step1
342
+ };
343
+
344
+ // Now step2 will only execute after step1 completes
345
+ // (in a separate batch/LLM call)
346
+ ```
347
+
348
+ ## Debugging Migration Issues
349
+
350
+ Enable debug mode to see batch behavior:
351
+
352
+ ```typescript
353
+ const agent = new Agent({
354
+ debug: true,
355
+ // ...
356
+ });
357
+
358
+ // Logs will show:
359
+ // [BatchExecutor] Starting batch determination...
360
+ // [BatchExecutor] Including step ask-hotel in batch
361
+ // [BatchExecutor] Step ask-date needs input, stopping batch
362
+ ```
363
+
364
+ ## Summary
365
+
366
+ 1. **Multiple steps can now execute together** - reducing LLM calls
367
+ 2. **Pre-extraction happens before batch determination** - maximizing batching
368
+ 3. **New response fields** - `executedSteps`, `stoppedReason`, `error`
369
+ 4. **Hook execution order changed** - all prepare, then LLM, then all finalize
370
+ 5. **SkipIf affects batching** - evaluated during batch determination
371
+ 6. **Partial progress preserved** - on errors, completed steps are retained
372
+
373
+ The changes improve efficiency and UX while maintaining API compatibility. Most existing code will work without changes, but reviewing hook dependencies and test expectations is recommended.
@@ -8,6 +8,12 @@
8
8
  * 3. Session step management even for stepless conversations
9
9
  * 4. Always-on routing with context awareness
10
10
  * 5. Three-phase pipeline: PREPARATION → ROUTING → RESPONSE
11
+ * 6. NEW: Complex ConditionTemplate patterns for intelligent routing:
12
+ * - Mixed conditions: ["AI context", (ctx) => programmatic_check]
13
+ * - Route skipIf: Dynamic route exclusion based on message content
14
+ * - Function-only conditions: (ctx) => sophisticated_logic
15
+ * - String-only conditions: "simple AI context"
16
+ * - Fallback routing with programmatic logic
11
17
  */
12
18
 
13
19
  import {
@@ -119,7 +125,7 @@ const searchKnowledgeTool: Tool<CompanyContext, UnifiedData> = {
119
125
  ).message.toLowerCase();
120
126
 
121
127
  // Simple keyword matching (in real app, use vector search)
122
- const relevantFaqs = context.context.faqs.filter(
128
+ const relevantFaqs = toolContext.context.faqs.filter(
123
129
  (faq) =>
124
130
  faq.question.toLowerCase().includes(query) ||
125
131
  faq.answer.toLowerCase().includes(query)
@@ -262,12 +268,25 @@ const agent = new Agent<CompanyContext, UnifiedData>({
262
268
  agent.createRoute({
263
269
  title: "Company Information",
264
270
  description: "Answer general questions about Acme Corp",
265
- conditions: [
271
+ // Mixed condition: AI context + programmatic validation
272
+ when: [
266
273
  "User asks about the company",
267
274
  "Questions about company history, size, location",
268
275
  "When was the company founded",
269
276
  "How many employees",
270
277
  "Where is the headquarters",
278
+ (ctx) => {
279
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
280
+ return message.includes('company') || message.includes('acme') || message.includes('founded');
281
+ }
282
+ ],
283
+ // Skip if user is asking about specific products instead
284
+ skipIf: [
285
+ "user is asking about specific products or services",
286
+ (ctx) => {
287
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
288
+ return message.includes('widget') || message.includes('gadget') || message.includes('product');
289
+ }
271
290
  ],
272
291
  // Route-specific knowledge base for company information
273
292
  knowledgeBase: {
@@ -299,12 +318,18 @@ agent.createRoute({
299
318
  agent.createRoute({
300
319
  title: "Product Information",
301
320
  description: "Answer questions about products",
302
- conditions: [
303
- "User asks about products",
304
- "Questions about features, pricing, availability",
305
- "What products do you offer",
306
- "Tell me about your widgets",
307
- ],
321
+ // Function-only condition for programmatic logic
322
+ when: (ctx) => {
323
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
324
+ return message.includes('product') || message.includes('widget') ||
325
+ message.includes('gadget') || message.includes('price') ||
326
+ message.includes('feature');
327
+ },
328
+ // Skip if user is asking about company policies instead
329
+ skipIf: (ctx) => {
330
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
331
+ return message.includes('policy') || message.includes('return') || message.includes('warranty');
332
+ },
308
333
  // NO schema - just answering questions
309
334
  });
310
335
 
@@ -315,11 +340,25 @@ agent.createRoute({
315
340
  agent.createRoute({
316
341
  title: "Policy Information",
317
342
  description: "Answer questions about company policies",
318
- conditions: [
343
+ // Mixed condition: AI context + programmatic check
344
+ when: [
319
345
  "User asks about policies",
320
346
  "Return policy",
321
- "Shipping information",
347
+ "Shipping information",
322
348
  "Warranty questions",
349
+ (ctx) => {
350
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
351
+ return message.includes('policy') || message.includes('return') ||
352
+ message.includes('shipping') || message.includes('warranty');
353
+ }
354
+ ],
355
+ // Skip if user is asking about news or updates
356
+ skipIf: [
357
+ "user wants latest news or updates",
358
+ (ctx) => {
359
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
360
+ return message.includes('news') || message.includes('update') || message.includes('new');
361
+ }
323
362
  ],
324
363
  // NO schema
325
364
  });
@@ -330,12 +369,13 @@ agent.createRoute({
330
369
  const newsRoute = agent.createRoute({
331
370
  title: "Company News",
332
371
  description: "Share latest company news and updates",
333
- conditions: [
334
- "User asks about news",
335
- "What's new",
336
- "Recent updates",
337
- "Latest announcements",
338
- ],
372
+ // String-only condition for AI context
373
+ when: "User asks about news, updates, or recent announcements",
374
+ // Skip if user is asking about general FAQ topics
375
+ skipIf: (ctx) => {
376
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
377
+ return message.includes('how do i') || message.includes('can i') || message.includes('is there');
378
+ },
339
379
  });
340
380
 
341
381
  // Add tool to initial step to fetch news
@@ -351,11 +391,25 @@ fetchNews.nextStep({
351
391
  const faqRoute = agent.createRoute({
352
392
  title: "FAQ Search",
353
393
  description: "Search FAQs for relevant answers",
354
- conditions: [
394
+ // Mixed condition: AI context + programmatic pattern matching
395
+ when: [
355
396
  "User has a question that might be in FAQs",
356
397
  "How do I...",
357
398
  "Can I...",
358
399
  "Is there...",
400
+ (ctx) => {
401
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
402
+ return message.startsWith('how ') || message.startsWith('can ') ||
403
+ message.startsWith('is ') || message.includes('?');
404
+ }
405
+ ],
406
+ // Skip if user is clearly asking for news or company info
407
+ skipIf: [
408
+ "user wants company news or general company information",
409
+ (ctx) => {
410
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
411
+ return message.includes('news') || message.includes('company') || message.includes('founded');
412
+ }
359
413
  ],
360
414
  });
361
415
 
@@ -372,12 +426,15 @@ searchFaqs.nextStep({
372
426
  agent.createRoute({
373
427
  title: "General Conversation",
374
428
  description: "Handle general conversation or unclear questions",
375
- conditions: [
376
- "User message doesn't match other routes",
377
- "Greetings",
378
- "Small talk",
379
- "Unclear intent",
380
- ],
429
+ // Function-only condition for fallback logic
430
+ when: (ctx) => {
431
+ // This route catches everything that doesn't match other routes
432
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
433
+ return !message.includes('product') && !message.includes('policy') &&
434
+ !message.includes('news') && !message.includes('company');
435
+ },
436
+ // Never skip the fallback route
437
+ skipIf: ()=>false,
381
438
  });
382
439
 
383
440
  // Initial step is enough for fallback conversations
@@ -386,7 +443,27 @@ agent.createRoute({
386
443
  const feedbackRoute = agent.createRoute({
387
444
  title: "Collect Feedback",
388
445
  description: "Collect user feedback about their experience",
389
- conditions: ["User wants to leave feedback", "User seems satisfied or upset"],
446
+ // Mixed condition: AI context + sentiment analysis
447
+ when: [
448
+ "User wants to leave feedback",
449
+ "User seems satisfied or upset",
450
+ (ctx) => {
451
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
452
+ return message.includes('feedback') || message.includes('review') ||
453
+ message.includes('satisfied') || message.includes('disappointed');
454
+ }
455
+ ],
456
+ // Skip if user is in the middle of another task
457
+ skipIf: [
458
+ "user is actively getting help with something else",
459
+ (ctx) => {
460
+ const recentMessages = ctx.history?.filter((m) => "content" in m).slice(-3) || [];
461
+ return recentMessages.some(msg =>
462
+ (msg.content as string)?.toLowerCase().includes('help') ||
463
+ (msg.content as string)?.toLowerCase().includes('problem')
464
+ );
465
+ }
466
+ ],
390
467
  // NEW: Required fields for route completion
391
468
  requiredFields: ["rating", "comments"],
392
469
  // NEW: Optional fields
@@ -1,6 +1,13 @@
1
1
  /**
2
2
  * Persistent multi-turn onboarding agent example
3
3
  * Updated for v2 architecture with session step management and schema-first data extraction
4
+ *
5
+ * NEW: Enhanced with flexible ConditionTemplate patterns:
6
+ * - Mixed route conditions: ["AI context", (ctx) => state_check]
7
+ * - Route skipIf: Skip if onboarding already complete
8
+ * - Step skipIf: Enhanced conditional step skipping with AI context
9
+ * - Programmatic when conditions: (ctx) => data_validation
10
+ * - Performance patterns for condition evaluation
4
11
  */
5
12
 
6
13
  import {
@@ -327,7 +334,24 @@ function createPersistentOnboardingAgent(sessionId: string) {
327
334
  const onboardingRoute = agent.createRoute({
328
335
  title: "Business Onboarding",
329
336
  description: "Guide user through business information collection",
330
- conditions: ["User is onboarding their business"],
337
+ // Mixed condition: AI context + programmatic validation
338
+ when: [
339
+ "User is onboarding their business",
340
+ (ctx) => {
341
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
342
+ return message.includes('onboard') || message.includes('register') ||
343
+ message.includes('business') || message.includes('start');
344
+ }
345
+ ],
346
+ // Skip if user already has complete business info
347
+ skipIf: [
348
+ "business information already complete",
349
+ (ctx) => {
350
+ const data = ctx.data;
351
+ return !!(data?.businessName && data?.businessDescription &&
352
+ data?.industry && data?.contactEmail);
353
+ }
354
+ ],
331
355
  // NEW: Required fields for route completion
332
356
  requiredFields: ["businessName", "businessDescription"],
333
357
  // NEW: Optional fields that enhance the experience
@@ -342,7 +366,12 @@ function createPersistentOnboardingAgent(sessionId: string) {
342
366
  const collectBusinessInfo = onboardingRoute.initialStep.nextStep({
343
367
  prompt: "Ask for business name and a brief description",
344
368
  collect: ["businessName", "businessDescription"],
345
- skipIf: (data) => !!data.businessName && !!data.businessDescription,
369
+ // Mixed skipIf: AI context + programmatic check
370
+ skipIf: [
371
+ "business name and description already provided",
372
+ (ctx) => !!ctx.data?.businessName && !!ctx.data.businessDescription
373
+ ],
374
+ // String-only when condition for AI context
346
375
  when: "Need to collect basic business information first",
347
376
  });
348
377
 
@@ -350,14 +379,19 @@ function createPersistentOnboardingAgent(sessionId: string) {
350
379
  const saveBusiness = collectBusinessInfo.nextStep({
351
380
  tools: [saveBusinessInfo],
352
381
  requires: ["businessName", "businessDescription"],
353
- when: "Business name and description provided, save to database",
382
+ // Function-only when condition for programmatic logic
383
+ when: (ctx) => !!ctx.data?.businessName && !!ctx.data?.businessDescription,
354
384
  });
355
385
 
356
386
  // Step 3: Collect industry
357
387
  const collectIndustry = saveBusiness.nextStep({
358
388
  prompt: "Ask what industry the business operates in",
359
389
  collect: ["industry"],
360
- skipIf: (data) => !!data.industry,
390
+ // Mixed skipIf: AI context + programmatic logic
391
+ skipIf: [
392
+ "industry already specified",
393
+ (ctx) => !!ctx.data?.industry
394
+ ],
361
395
  });
362
396
 
363
397
  // Step 4: Save industry (tool execution)
@@ -370,7 +404,8 @@ function createPersistentOnboardingAgent(sessionId: string) {
370
404
  const collectContact = saveIndustryStep.nextStep({
371
405
  prompt: "Ask for their contact email",
372
406
  collect: ["contactEmail"],
373
- skipIf: (data) => !!data.contactEmail,
407
+ // Function-only skipIf for programmatic check
408
+ skipIf: (ctx) => !!ctx.data?.contactEmail,
374
409
  });
375
410
 
376
411
  // Step 6: Save contact (tool execution)