@falai/agent 0.9.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (654) hide show
  1. package/README.md +304 -72
  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/{src → cjs}/core/Agent.d.ts +25 -6
  33. package/dist/cjs/core/Agent.d.ts.map +1 -0
  34. package/dist/cjs/{src/core → core}/Agent.js +121 -37
  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 +842 -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 +201 -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 +202 -0
  52. package/dist/cjs/core/ResponseEngine.js.map +1 -0
  53. package/dist/{src → cjs}/core/ResponseModal.d.ts +54 -3
  54. package/dist/cjs/core/ResponseModal.d.ts.map +1 -0
  55. package/dist/cjs/{src/core → core}/ResponseModal.js +807 -121
  56. package/dist/cjs/core/ResponseModal.js.map +1 -0
  57. package/dist/{src → cjs}/core/ResponsePipeline.d.ts +10 -6
  58. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -0
  59. package/dist/cjs/{src/core → core}/ResponsePipeline.js +60 -25
  60. package/dist/cjs/core/ResponsePipeline.js.map +1 -0
  61. package/dist/{src → cjs}/core/Route.d.ts +46 -10
  62. package/dist/cjs/core/Route.d.ts.map +1 -0
  63. package/dist/cjs/core/Route.js +541 -0
  64. package/dist/cjs/core/Route.js.map +1 -0
  65. package/dist/cjs/{src/core → core}/RoutingEngine.d.ts +35 -5
  66. package/dist/cjs/core/RoutingEngine.d.ts.map +1 -0
  67. package/dist/cjs/{src/core → core}/RoutingEngine.js +360 -98
  68. package/dist/cjs/core/RoutingEngine.js.map +1 -0
  69. package/dist/{src → cjs}/core/SessionManager.d.ts +9 -1
  70. package/dist/cjs/core/SessionManager.d.ts.map +1 -0
  71. package/dist/cjs/{src/core → core}/SessionManager.js +27 -5
  72. package/dist/cjs/core/SessionManager.js.map +1 -0
  73. package/dist/cjs/core/Step.d.ts +170 -0
  74. package/dist/cjs/core/Step.d.ts.map +1 -0
  75. package/dist/cjs/core/Step.js +448 -0
  76. package/dist/cjs/core/Step.js.map +1 -0
  77. package/dist/cjs/core/ToolManager.d.ts +234 -0
  78. package/dist/cjs/core/ToolManager.d.ts.map +1 -0
  79. package/dist/cjs/core/ToolManager.js +1117 -0
  80. package/dist/cjs/core/ToolManager.js.map +1 -0
  81. package/dist/{src → cjs}/index.d.ts +5 -3
  82. package/dist/cjs/index.d.ts.map +1 -0
  83. package/dist/cjs/{src/index.js → index.js} +16 -3
  84. package/dist/cjs/index.js.map +1 -0
  85. package/dist/cjs/{src/providers → providers}/AnthropicProvider.js +18 -18
  86. package/dist/cjs/providers/AnthropicProvider.js.map +1 -0
  87. package/dist/{src → cjs}/providers/GeminiProvider.d.ts.map +1 -1
  88. package/dist/cjs/{src/providers → providers}/GeminiProvider.js +123 -51
  89. package/dist/cjs/providers/GeminiProvider.js.map +1 -0
  90. package/dist/cjs/{src/providers → providers}/OpenAIProvider.js +19 -19
  91. package/dist/cjs/providers/OpenAIProvider.js.map +1 -0
  92. package/dist/cjs/{src/providers → providers}/OpenRouterProvider.js +19 -19
  93. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -0
  94. package/dist/cjs/providers/index.js.map +1 -0
  95. package/dist/cjs/{src/types → types}/agent.d.ts +12 -4
  96. package/dist/cjs/types/agent.d.ts.map +1 -0
  97. package/dist/cjs/types/agent.js.map +1 -0
  98. package/dist/{src → cjs}/types/ai.js.map +1 -1
  99. package/dist/cjs/types/history.js.map +1 -0
  100. package/dist/cjs/{src/types → types}/index.d.ts +5 -3
  101. package/dist/{src → cjs}/types/index.d.ts.map +1 -1
  102. package/dist/cjs/{src/types → types}/index.js +8 -1
  103. package/dist/cjs/types/index.js.map +1 -0
  104. package/dist/cjs/types/persistence.js.map +1 -0
  105. package/dist/cjs/{src/types → types}/route.d.ts +116 -15
  106. package/dist/cjs/types/route.d.ts.map +1 -0
  107. package/dist/cjs/{src/types → types}/route.js.map +1 -1
  108. package/dist/cjs/types/session.js.map +1 -0
  109. package/dist/cjs/types/template.d.ts +88 -0
  110. package/dist/cjs/types/template.d.ts.map +1 -0
  111. package/dist/cjs/types/tool.d.ts +130 -0
  112. package/dist/cjs/types/tool.d.ts.map +1 -0
  113. package/dist/cjs/types/tool.js +19 -0
  114. package/dist/cjs/types/tool.js.map +1 -0
  115. package/dist/cjs/utils/clone.js.map +1 -0
  116. package/dist/cjs/utils/condition.d.ts +38 -0
  117. package/dist/cjs/utils/condition.d.ts.map +1 -0
  118. package/dist/cjs/utils/condition.js +168 -0
  119. package/dist/cjs/utils/condition.js.map +1 -0
  120. package/dist/cjs/utils/event.js.map +1 -0
  121. package/dist/cjs/utils/history.js.map +1 -0
  122. package/dist/cjs/utils/id.js.map +1 -0
  123. package/dist/cjs/{src/utils → utils}/index.d.ts +3 -1
  124. package/dist/cjs/utils/index.d.ts.map +1 -0
  125. package/dist/cjs/{src/utils → utils}/index.js +12 -1
  126. package/dist/cjs/utils/index.js.map +1 -0
  127. package/dist/cjs/utils/json.d.ts +16 -0
  128. package/dist/cjs/utils/json.d.ts.map +1 -0
  129. package/dist/cjs/utils/json.js +47 -0
  130. package/dist/cjs/utils/json.js.map +1 -0
  131. package/dist/cjs/utils/logger.js.map +1 -0
  132. package/dist/{src → cjs}/utils/retry.d.ts +0 -3
  133. package/dist/cjs/utils/retry.d.ts.map +1 -0
  134. package/dist/cjs/{src/utils → utils}/retry.js +8 -7
  135. package/dist/cjs/utils/retry.js.map +1 -0
  136. package/dist/cjs/utils/session.js.map +1 -0
  137. package/dist/{src → cjs}/utils/template.d.ts +48 -0
  138. package/dist/cjs/utils/template.d.ts.map +1 -0
  139. package/dist/cjs/{src/utils → utils}/template.js +100 -0
  140. package/dist/cjs/utils/template.js.map +1 -0
  141. package/dist/constants/index.d.ts.map +1 -0
  142. package/dist/constants/index.js.map +1 -0
  143. package/dist/{cjs/src/core → core}/Agent.d.ts +25 -6
  144. package/dist/core/Agent.d.ts.map +1 -0
  145. package/dist/{src/core → core}/Agent.js +122 -38
  146. package/dist/core/Agent.js.map +1 -0
  147. package/dist/core/BatchExecutor.d.ts +353 -0
  148. package/dist/core/BatchExecutor.d.ts.map +1 -0
  149. package/dist/core/BatchExecutor.js +837 -0
  150. package/dist/core/BatchExecutor.js.map +1 -0
  151. package/dist/core/BatchPromptBuilder.d.ts +86 -0
  152. package/dist/core/BatchPromptBuilder.d.ts.map +1 -0
  153. package/dist/core/BatchPromptBuilder.js +197 -0
  154. package/dist/core/BatchPromptBuilder.js.map +1 -0
  155. package/dist/core/Events.d.ts.map +1 -0
  156. package/dist/core/Events.js.map +1 -0
  157. package/dist/core/PersistenceManager.d.ts.map +1 -0
  158. package/dist/core/PersistenceManager.js.map +1 -0
  159. package/dist/{cjs/src/core → core}/PromptComposer.d.ts +1 -1
  160. package/dist/core/PromptComposer.d.ts.map +1 -0
  161. package/dist/{src/core → core}/PromptComposer.js +45 -8
  162. package/dist/core/PromptComposer.js.map +1 -0
  163. package/dist/core/ResponseEngine.d.ts.map +1 -0
  164. package/dist/core/ResponseEngine.js +198 -0
  165. package/dist/core/ResponseEngine.js.map +1 -0
  166. package/dist/{cjs/src/core → core}/ResponseModal.d.ts +54 -3
  167. package/dist/core/ResponseModal.d.ts.map +1 -0
  168. package/dist/{src/core → core}/ResponseModal.js +807 -121
  169. package/dist/core/ResponseModal.js.map +1 -0
  170. package/dist/{cjs/src/core → core}/ResponsePipeline.d.ts +10 -6
  171. package/dist/core/ResponsePipeline.d.ts.map +1 -0
  172. package/dist/{src/core → core}/ResponsePipeline.js +60 -25
  173. package/dist/core/ResponsePipeline.js.map +1 -0
  174. package/dist/{cjs/src/core → core}/Route.d.ts +46 -10
  175. package/dist/core/Route.d.ts.map +1 -0
  176. package/dist/core/Route.js +537 -0
  177. package/dist/core/Route.js.map +1 -0
  178. package/dist/{src/core → core}/RoutingEngine.d.ts +35 -5
  179. package/dist/core/RoutingEngine.d.ts.map +1 -0
  180. package/dist/{src/core → core}/RoutingEngine.js +343 -81
  181. package/dist/core/RoutingEngine.js.map +1 -0
  182. package/dist/{cjs/src/core → core}/SessionManager.d.ts +9 -1
  183. package/dist/core/SessionManager.d.ts.map +1 -0
  184. package/dist/{src/core → core}/SessionManager.js +27 -5
  185. package/dist/core/SessionManager.js.map +1 -0
  186. package/dist/core/Step.d.ts +170 -0
  187. package/dist/core/Step.d.ts.map +1 -0
  188. package/dist/core/Step.js +444 -0
  189. package/dist/core/Step.js.map +1 -0
  190. package/dist/core/ToolManager.d.ts +234 -0
  191. package/dist/core/ToolManager.d.ts.map +1 -0
  192. package/dist/core/ToolManager.js +1111 -0
  193. package/dist/core/ToolManager.js.map +1 -0
  194. package/dist/{cjs/src/index.d.ts → index.d.ts} +5 -3
  195. package/dist/index.d.ts.map +1 -0
  196. package/dist/{src/index.js → index.js} +4 -1
  197. package/dist/index.js.map +1 -0
  198. package/dist/providers/AnthropicProvider.d.ts.map +1 -0
  199. package/dist/{src/providers → providers}/AnthropicProvider.js +17 -17
  200. package/dist/providers/AnthropicProvider.js.map +1 -0
  201. package/dist/providers/GeminiProvider.d.ts.map +1 -0
  202. package/dist/{src/providers → providers}/GeminiProvider.js +123 -51
  203. package/dist/providers/GeminiProvider.js.map +1 -0
  204. package/dist/providers/OpenAIProvider.d.ts.map +1 -0
  205. package/dist/{src/providers → providers}/OpenAIProvider.js +18 -18
  206. package/dist/providers/OpenAIProvider.js.map +1 -0
  207. package/dist/providers/OpenRouterProvider.d.ts.map +1 -0
  208. package/dist/{src/providers → providers}/OpenRouterProvider.js +18 -18
  209. package/dist/providers/OpenRouterProvider.js.map +1 -0
  210. package/dist/providers/index.d.ts.map +1 -0
  211. package/dist/providers/index.js.map +1 -0
  212. package/dist/{src/types → types}/agent.d.ts +12 -4
  213. package/dist/types/agent.d.ts.map +1 -0
  214. package/dist/types/agent.js.map +1 -0
  215. package/dist/types/ai.d.ts.map +1 -0
  216. package/dist/types/ai.js.map +1 -0
  217. package/dist/types/history.d.ts.map +1 -0
  218. package/dist/types/history.js.map +1 -0
  219. package/dist/{src/types → types}/index.d.ts +5 -3
  220. package/dist/types/index.d.ts.map +1 -0
  221. package/dist/{src/types → types}/index.js +2 -0
  222. package/dist/types/index.js.map +1 -0
  223. package/dist/types/persistence.d.ts.map +1 -0
  224. package/dist/types/persistence.js.map +1 -0
  225. package/dist/{src/types → types}/route.d.ts +116 -15
  226. package/dist/types/route.d.ts.map +1 -0
  227. package/dist/{src/types → types}/route.js.map +1 -1
  228. package/dist/types/routing.d.ts.map +1 -0
  229. package/dist/{cjs/src/types → types}/routing.js.map +1 -1
  230. package/dist/types/schema.d.ts.map +1 -0
  231. package/dist/{cjs/src/types → types}/schema.js.map +1 -1
  232. package/dist/types/session.d.ts.map +1 -0
  233. package/dist/{src/types → types}/session.js.map +1 -1
  234. package/dist/types/template.d.ts +88 -0
  235. package/dist/types/template.d.ts.map +1 -0
  236. package/dist/{cjs/src/types → types}/template.js.map +1 -1
  237. package/dist/types/tool.d.ts +130 -0
  238. package/dist/types/tool.d.ts.map +1 -0
  239. package/dist/types/tool.js +16 -0
  240. package/dist/types/tool.js.map +1 -0
  241. package/dist/utils/clone.d.ts.map +1 -0
  242. package/dist/utils/clone.js.map +1 -0
  243. package/dist/utils/condition.d.ts +38 -0
  244. package/dist/utils/condition.d.ts.map +1 -0
  245. package/dist/utils/condition.js +161 -0
  246. package/dist/utils/condition.js.map +1 -0
  247. package/dist/utils/event.d.ts.map +1 -0
  248. package/dist/utils/event.js.map +1 -0
  249. package/dist/utils/history.d.ts.map +1 -0
  250. package/dist/utils/history.js.map +1 -0
  251. package/dist/utils/id.d.ts.map +1 -0
  252. package/dist/utils/id.js.map +1 -0
  253. package/dist/{src/utils → utils}/index.d.ts +3 -1
  254. package/dist/utils/index.d.ts.map +1 -0
  255. package/dist/{src/utils → utils}/index.js +5 -1
  256. package/dist/utils/index.js.map +1 -0
  257. package/dist/utils/json.d.ts +16 -0
  258. package/dist/utils/json.d.ts.map +1 -0
  259. package/dist/utils/json.js +43 -0
  260. package/dist/utils/json.js.map +1 -0
  261. package/dist/utils/logger.d.ts.map +1 -0
  262. package/dist/utils/logger.js.map +1 -0
  263. package/dist/{cjs/src/utils → utils}/retry.d.ts +0 -3
  264. package/dist/utils/retry.d.ts.map +1 -0
  265. package/dist/{src/utils → utils}/retry.js +5 -4
  266. package/dist/utils/retry.js.map +1 -0
  267. package/dist/utils/session.d.ts.map +1 -0
  268. package/dist/utils/session.js.map +1 -0
  269. package/dist/{cjs/src/utils → utils}/template.d.ts +48 -0
  270. package/dist/utils/template.d.ts.map +1 -0
  271. package/dist/{src/utils → utils}/template.js +98 -0
  272. package/dist/utils/template.js.map +1 -0
  273. package/docs/CONTRIBUTING.md +40 -0
  274. package/docs/README.md +12 -5
  275. package/docs/api/README.md +295 -56
  276. package/docs/api/overview.md +272 -31
  277. package/docs/architecture/data-extraction-flow.md +363 -0
  278. package/docs/architecture/multi-step-execution.md +243 -0
  279. package/docs/core/agent/README.md +120 -5
  280. package/docs/core/agent/session-management.md +153 -6
  281. package/docs/core/ai-integration/prompt-composition.md +135 -0
  282. package/docs/core/ai-integration/response-processing.md +261 -4
  283. package/docs/core/conversation-flows/data-collection.md +143 -0
  284. package/docs/core/conversation-flows/routes.md +132 -2
  285. package/docs/core/conversation-flows/step-transitions.md +132 -0
  286. package/docs/core/conversation-flows/steps.md +112 -0
  287. package/docs/core/error-handling.md +831 -0
  288. package/docs/core/routing/intelligent-routing.md +118 -0
  289. package/docs/core/tools/tool-definition.md +684 -60
  290. package/docs/core/tools/tool-scoping.md +244 -53
  291. package/docs/guides/error-handling-patterns.md +578 -0
  292. package/docs/guides/getting-started/README.md +423 -31
  293. package/docs/guides/migration/README.md +23 -0
  294. package/docs/guides/migration/flexible-routing-conditions.md +375 -0
  295. package/docs/guides/migration/multi-step-execution.md +303 -0
  296. package/examples/advanced-patterns/knowledge-based-agent.ts +107 -30
  297. package/examples/advanced-patterns/persistent-onboarding.ts +70 -48
  298. package/examples/advanced-patterns/route-lifecycle-hooks.ts +82 -12
  299. package/examples/advanced-patterns/streaming-responses.ts +2 -2
  300. package/examples/ai-providers/anthropic-integration.ts +13 -9
  301. package/examples/ai-providers/openai-integration.ts +12 -8
  302. package/examples/condition-patterns/function-only-conditions.ts +365 -0
  303. package/examples/condition-patterns/mixed-array-conditions.ts +477 -0
  304. package/examples/condition-patterns/route-skipif-patterns.ts +468 -0
  305. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  306. package/examples/condition-patterns/string-only-conditions.ts +296 -0
  307. package/examples/conversation-flows/completion-transitions.ts +48 -7
  308. package/examples/core-concepts/basic-agent.ts +158 -98
  309. package/examples/core-concepts/schema-driven-extraction.ts +43 -16
  310. package/examples/core-concepts/session-management.ts +117 -29
  311. package/examples/integrations/database-integration.ts +6 -6
  312. package/examples/integrations/healthcare-integration.ts +25 -39
  313. package/examples/integrations/search-integration.ts +8 -8
  314. package/examples/integrations/server-session-management.ts +11 -11
  315. package/examples/persistence/database-persistence.ts +15 -15
  316. package/examples/persistence/memory-sessions.ts +6 -6
  317. package/examples/persistence/redis-persistence.ts +7 -9
  318. package/examples/tools/basic-tools.ts +293 -89
  319. package/examples/tools/data-enrichment-tools.ts +189 -79
  320. package/package.json +6 -4
  321. package/src/adapters/PrismaAdapter.ts +3 -2
  322. package/src/adapters/RedisAdapter.ts +3 -3
  323. package/src/core/Agent.ts +152 -46
  324. package/src/core/BatchExecutor.ts +1156 -0
  325. package/src/core/BatchPromptBuilder.ts +275 -0
  326. package/src/core/PromptComposer.ts +53 -16
  327. package/src/core/ResponseEngine.ts +143 -4
  328. package/src/core/ResponseModal.ts +1035 -137
  329. package/src/core/ResponsePipeline.ts +99 -65
  330. package/src/core/Route.ts +262 -34
  331. package/src/core/RoutingEngine.ts +467 -120
  332. package/src/core/SessionManager.ts +39 -7
  333. package/src/core/Step.ts +338 -32
  334. package/src/core/ToolManager.ts +1394 -0
  335. package/src/index.ts +27 -3
  336. package/src/providers/AnthropicProvider.ts +17 -17
  337. package/src/providers/GeminiProvider.ts +129 -60
  338. package/src/providers/OpenAIProvider.ts +18 -18
  339. package/src/providers/OpenRouterProvider.ts +18 -18
  340. package/src/types/agent.ts +12 -4
  341. package/src/types/index.ts +25 -3
  342. package/src/types/route.ts +136 -15
  343. package/src/types/template.ts +70 -2
  344. package/src/types/tool.ts +116 -25
  345. package/src/utils/condition.ts +190 -0
  346. package/src/utils/index.ts +12 -0
  347. package/src/utils/json.ts +46 -0
  348. package/src/utils/retry.ts +5 -4
  349. package/src/utils/template.ts +109 -0
  350. package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +0 -1
  351. package/dist/cjs/src/adapters/MemoryAdapter.js.map +0 -1
  352. package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +0 -1
  353. package/dist/cjs/src/adapters/MongoAdapter.js.map +0 -1
  354. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +0 -1
  355. package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +0 -1
  356. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  357. package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +0 -1
  358. package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +0 -1
  359. package/dist/cjs/src/adapters/PrismaAdapter.js.map +0 -1
  360. package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +0 -1
  361. package/dist/cjs/src/adapters/RedisAdapter.js.map +0 -1
  362. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +0 -1
  363. package/dist/cjs/src/adapters/SQLiteAdapter.js.map +0 -1
  364. package/dist/cjs/src/adapters/index.d.ts.map +0 -1
  365. package/dist/cjs/src/adapters/index.js.map +0 -1
  366. package/dist/cjs/src/constants/index.d.ts.map +0 -1
  367. package/dist/cjs/src/constants/index.js.map +0 -1
  368. package/dist/cjs/src/core/Agent.d.ts.map +0 -1
  369. package/dist/cjs/src/core/Agent.js.map +0 -1
  370. package/dist/cjs/src/core/Events.d.ts.map +0 -1
  371. package/dist/cjs/src/core/Events.js.map +0 -1
  372. package/dist/cjs/src/core/PersistenceManager.d.ts.map +0 -1
  373. package/dist/cjs/src/core/PersistenceManager.js.map +0 -1
  374. package/dist/cjs/src/core/PromptComposer.d.ts.map +0 -1
  375. package/dist/cjs/src/core/PromptComposer.js.map +0 -1
  376. package/dist/cjs/src/core/ResponseEngine.d.ts.map +0 -1
  377. package/dist/cjs/src/core/ResponseEngine.js +0 -84
  378. package/dist/cjs/src/core/ResponseEngine.js.map +0 -1
  379. package/dist/cjs/src/core/ResponseModal.d.ts.map +0 -1
  380. package/dist/cjs/src/core/ResponseModal.js.map +0 -1
  381. package/dist/cjs/src/core/ResponsePipeline.d.ts.map +0 -1
  382. package/dist/cjs/src/core/ResponsePipeline.js.map +0 -1
  383. package/dist/cjs/src/core/Route.d.ts.map +0 -1
  384. package/dist/cjs/src/core/Route.js +0 -343
  385. package/dist/cjs/src/core/Route.js.map +0 -1
  386. package/dist/cjs/src/core/RoutingEngine.d.ts.map +0 -1
  387. package/dist/cjs/src/core/RoutingEngine.js.map +0 -1
  388. package/dist/cjs/src/core/SessionManager.d.ts.map +0 -1
  389. package/dist/cjs/src/core/SessionManager.js.map +0 -1
  390. package/dist/cjs/src/core/Step.d.ts +0 -96
  391. package/dist/cjs/src/core/Step.d.ts.map +0 -1
  392. package/dist/cjs/src/core/Step.js +0 -206
  393. package/dist/cjs/src/core/Step.js.map +0 -1
  394. package/dist/cjs/src/core/ToolExecutor.d.ts +0 -45
  395. package/dist/cjs/src/core/ToolExecutor.d.ts.map +0 -1
  396. package/dist/cjs/src/core/ToolExecutor.js +0 -84
  397. package/dist/cjs/src/core/ToolExecutor.js.map +0 -1
  398. package/dist/cjs/src/index.d.ts.map +0 -1
  399. package/dist/cjs/src/index.js.map +0 -1
  400. package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +0 -1
  401. package/dist/cjs/src/providers/AnthropicProvider.js.map +0 -1
  402. package/dist/cjs/src/providers/GeminiProvider.d.ts.map +0 -1
  403. package/dist/cjs/src/providers/GeminiProvider.js.map +0 -1
  404. package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +0 -1
  405. package/dist/cjs/src/providers/OpenAIProvider.js.map +0 -1
  406. package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +0 -1
  407. package/dist/cjs/src/providers/OpenRouterProvider.js.map +0 -1
  408. package/dist/cjs/src/providers/index.d.ts.map +0 -1
  409. package/dist/cjs/src/providers/index.js.map +0 -1
  410. package/dist/cjs/src/types/agent.d.ts.map +0 -1
  411. package/dist/cjs/src/types/agent.js.map +0 -1
  412. package/dist/cjs/src/types/ai.d.ts.map +0 -1
  413. package/dist/cjs/src/types/ai.js.map +0 -1
  414. package/dist/cjs/src/types/history.d.ts.map +0 -1
  415. package/dist/cjs/src/types/history.js.map +0 -1
  416. package/dist/cjs/src/types/index.d.ts.map +0 -1
  417. package/dist/cjs/src/types/index.js.map +0 -1
  418. package/dist/cjs/src/types/persistence.d.ts.map +0 -1
  419. package/dist/cjs/src/types/persistence.js.map +0 -1
  420. package/dist/cjs/src/types/route.d.ts.map +0 -1
  421. package/dist/cjs/src/types/routing.d.ts.map +0 -1
  422. package/dist/cjs/src/types/schema.d.ts.map +0 -1
  423. package/dist/cjs/src/types/session.d.ts.map +0 -1
  424. package/dist/cjs/src/types/session.js.map +0 -1
  425. package/dist/cjs/src/types/template.d.ts +0 -30
  426. package/dist/cjs/src/types/template.d.ts.map +0 -1
  427. package/dist/cjs/src/types/tool.d.ts +0 -60
  428. package/dist/cjs/src/types/tool.d.ts.map +0 -1
  429. package/dist/cjs/src/types/tool.js +0 -6
  430. package/dist/cjs/src/types/tool.js.map +0 -1
  431. package/dist/cjs/src/utils/clone.d.ts.map +0 -1
  432. package/dist/cjs/src/utils/clone.js.map +0 -1
  433. package/dist/cjs/src/utils/event.d.ts.map +0 -1
  434. package/dist/cjs/src/utils/event.js.map +0 -1
  435. package/dist/cjs/src/utils/history.d.ts.map +0 -1
  436. package/dist/cjs/src/utils/history.js.map +0 -1
  437. package/dist/cjs/src/utils/id.d.ts.map +0 -1
  438. package/dist/cjs/src/utils/id.js.map +0 -1
  439. package/dist/cjs/src/utils/index.d.ts.map +0 -1
  440. package/dist/cjs/src/utils/index.js.map +0 -1
  441. package/dist/cjs/src/utils/logger.d.ts.map +0 -1
  442. package/dist/cjs/src/utils/logger.js.map +0 -1
  443. package/dist/cjs/src/utils/retry.d.ts.map +0 -1
  444. package/dist/cjs/src/utils/retry.js.map +0 -1
  445. package/dist/cjs/src/utils/session.d.ts.map +0 -1
  446. package/dist/cjs/src/utils/session.js.map +0 -1
  447. package/dist/cjs/src/utils/template.d.ts.map +0 -1
  448. package/dist/cjs/src/utils/template.js.map +0 -1
  449. package/dist/src/adapters/MemoryAdapter.js.map +0 -1
  450. package/dist/src/adapters/MongoAdapter.js.map +0 -1
  451. package/dist/src/adapters/OpenSearchAdapter.js.map +0 -1
  452. package/dist/src/adapters/PostgreSQLAdapter.js.map +0 -1
  453. package/dist/src/adapters/PrismaAdapter.js.map +0 -1
  454. package/dist/src/adapters/RedisAdapter.js.map +0 -1
  455. package/dist/src/adapters/SQLiteAdapter.js.map +0 -1
  456. package/dist/src/adapters/index.js.map +0 -1
  457. package/dist/src/constants/index.js.map +0 -1
  458. package/dist/src/core/Agent.d.ts.map +0 -1
  459. package/dist/src/core/Agent.js.map +0 -1
  460. package/dist/src/core/Events.js.map +0 -1
  461. package/dist/src/core/PersistenceManager.js.map +0 -1
  462. package/dist/src/core/PromptComposer.d.ts.map +0 -1
  463. package/dist/src/core/PromptComposer.js.map +0 -1
  464. package/dist/src/core/ResponseEngine.js +0 -80
  465. package/dist/src/core/ResponseEngine.js.map +0 -1
  466. package/dist/src/core/ResponseModal.d.ts.map +0 -1
  467. package/dist/src/core/ResponseModal.js.map +0 -1
  468. package/dist/src/core/ResponsePipeline.d.ts.map +0 -1
  469. package/dist/src/core/ResponsePipeline.js.map +0 -1
  470. package/dist/src/core/Route.d.ts.map +0 -1
  471. package/dist/src/core/Route.js +0 -339
  472. package/dist/src/core/Route.js.map +0 -1
  473. package/dist/src/core/RoutingEngine.d.ts.map +0 -1
  474. package/dist/src/core/RoutingEngine.js.map +0 -1
  475. package/dist/src/core/SessionManager.d.ts.map +0 -1
  476. package/dist/src/core/SessionManager.js.map +0 -1
  477. package/dist/src/core/Step.d.ts +0 -96
  478. package/dist/src/core/Step.d.ts.map +0 -1
  479. package/dist/src/core/Step.js +0 -202
  480. package/dist/src/core/Step.js.map +0 -1
  481. package/dist/src/core/ToolExecutor.d.ts +0 -45
  482. package/dist/src/core/ToolExecutor.d.ts.map +0 -1
  483. package/dist/src/core/ToolExecutor.js +0 -80
  484. package/dist/src/core/ToolExecutor.js.map +0 -1
  485. package/dist/src/index.d.ts.map +0 -1
  486. package/dist/src/index.js.map +0 -1
  487. package/dist/src/providers/AnthropicProvider.js.map +0 -1
  488. package/dist/src/providers/GeminiProvider.js.map +0 -1
  489. package/dist/src/providers/OpenAIProvider.js.map +0 -1
  490. package/dist/src/providers/OpenRouterProvider.js.map +0 -1
  491. package/dist/src/providers/index.js.map +0 -1
  492. package/dist/src/types/agent.d.ts.map +0 -1
  493. package/dist/src/types/agent.js.map +0 -1
  494. package/dist/src/types/history.js.map +0 -1
  495. package/dist/src/types/index.js.map +0 -1
  496. package/dist/src/types/persistence.js.map +0 -1
  497. package/dist/src/types/route.d.ts.map +0 -1
  498. package/dist/src/types/template.d.ts +0 -30
  499. package/dist/src/types/template.d.ts.map +0 -1
  500. package/dist/src/types/tool.d.ts +0 -60
  501. package/dist/src/types/tool.d.ts.map +0 -1
  502. package/dist/src/types/tool.js +0 -5
  503. package/dist/src/types/tool.js.map +0 -1
  504. package/dist/src/utils/clone.js.map +0 -1
  505. package/dist/src/utils/event.js.map +0 -1
  506. package/dist/src/utils/history.js.map +0 -1
  507. package/dist/src/utils/id.js.map +0 -1
  508. package/dist/src/utils/index.d.ts.map +0 -1
  509. package/dist/src/utils/index.js.map +0 -1
  510. package/dist/src/utils/logger.js.map +0 -1
  511. package/dist/src/utils/retry.d.ts.map +0 -1
  512. package/dist/src/utils/retry.js.map +0 -1
  513. package/dist/src/utils/session.js.map +0 -1
  514. package/dist/src/utils/template.d.ts.map +0 -1
  515. package/dist/src/utils/template.js.map +0 -1
  516. package/docs/core/tools/tool-execution.md +0 -815
  517. package/src/core/ToolExecutor.ts +0 -126
  518. /package/dist/{cjs/src/adapters → adapters}/MemoryAdapter.d.ts +0 -0
  519. /package/dist/{src/adapters → adapters}/MemoryAdapter.js +0 -0
  520. /package/dist/{cjs/src/adapters → adapters}/MongoAdapter.d.ts +0 -0
  521. /package/dist/{src/adapters → adapters}/MongoAdapter.js +0 -0
  522. /package/dist/{cjs/src/adapters → adapters}/OpenSearchAdapter.d.ts +0 -0
  523. /package/dist/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
  524. /package/dist/{cjs/src/adapters → adapters}/PostgreSQLAdapter.d.ts +0 -0
  525. /package/dist/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
  526. /package/dist/{cjs/src/adapters → adapters}/PrismaAdapter.d.ts +0 -0
  527. /package/dist/{cjs/src/adapters → adapters}/RedisAdapter.d.ts +0 -0
  528. /package/dist/{cjs/src/adapters → adapters}/SQLiteAdapter.d.ts +0 -0
  529. /package/dist/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
  530. /package/dist/{cjs/src/adapters → adapters}/index.d.ts +0 -0
  531. /package/dist/{src/adapters → adapters}/index.js +0 -0
  532. /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts +0 -0
  533. /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts.map +0 -0
  534. /package/dist/cjs/{src/adapters → adapters}/MemoryAdapter.js +0 -0
  535. /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts +0 -0
  536. /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts.map +0 -0
  537. /package/dist/cjs/{src/adapters → adapters}/MongoAdapter.js +0 -0
  538. /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts +0 -0
  539. /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts.map +0 -0
  540. /package/dist/cjs/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
  541. /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts +0 -0
  542. /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts.map +0 -0
  543. /package/dist/cjs/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
  544. /package/dist/{src → cjs}/adapters/PrismaAdapter.d.ts +0 -0
  545. /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts +0 -0
  546. /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts.map +0 -0
  547. /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts +0 -0
  548. /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts.map +0 -0
  549. /package/dist/cjs/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
  550. /package/dist/{src → cjs}/adapters/index.d.ts +0 -0
  551. /package/dist/{src → cjs}/adapters/index.d.ts.map +0 -0
  552. /package/dist/cjs/{src/adapters → adapters}/index.js +0 -0
  553. /package/dist/cjs/{src/constants → constants}/index.d.ts +0 -0
  554. /package/dist/{src → cjs}/constants/index.d.ts.map +0 -0
  555. /package/dist/cjs/{src/constants → constants}/index.js +0 -0
  556. /package/dist/cjs/{src/core → core}/Events.d.ts +0 -0
  557. /package/dist/{src → cjs}/core/Events.d.ts.map +0 -0
  558. /package/dist/cjs/{src/core → core}/Events.js +0 -0
  559. /package/dist/cjs/{src/core → core}/PersistenceManager.d.ts +0 -0
  560. /package/dist/{src → cjs}/core/PersistenceManager.d.ts.map +0 -0
  561. /package/dist/cjs/{src/core → core}/PersistenceManager.js +0 -0
  562. /package/dist/cjs/{src/core → core}/ResponseEngine.d.ts +0 -0
  563. /package/dist/cjs/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
  564. /package/dist/{src → cjs}/providers/AnthropicProvider.d.ts.map +0 -0
  565. /package/dist/cjs/{src/providers → providers}/GeminiProvider.d.ts +0 -0
  566. /package/dist/cjs/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
  567. /package/dist/{src → cjs}/providers/OpenAIProvider.d.ts.map +0 -0
  568. /package/dist/cjs/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
  569. /package/dist/{src → cjs}/providers/OpenRouterProvider.d.ts.map +0 -0
  570. /package/dist/cjs/{src/providers → providers}/index.d.ts +0 -0
  571. /package/dist/{src → cjs}/providers/index.d.ts.map +0 -0
  572. /package/dist/cjs/{src/providers → providers}/index.js +0 -0
  573. /package/dist/cjs/{src/types → types}/agent.js +0 -0
  574. /package/dist/cjs/{src/types → types}/ai.d.ts +0 -0
  575. /package/dist/{src → cjs}/types/ai.d.ts.map +0 -0
  576. /package/dist/cjs/{src/types → types}/ai.js +0 -0
  577. /package/dist/cjs/{src/types → types}/history.d.ts +0 -0
  578. /package/dist/{src → cjs}/types/history.d.ts.map +0 -0
  579. /package/dist/cjs/{src/types → types}/history.js +0 -0
  580. /package/dist/cjs/{src/types → types}/persistence.d.ts +0 -0
  581. /package/dist/{src → cjs}/types/persistence.d.ts.map +0 -0
  582. /package/dist/cjs/{src/types → types}/persistence.js +0 -0
  583. /package/dist/cjs/{src/types → types}/route.js +0 -0
  584. /package/dist/cjs/{src/types → types}/routing.d.ts +0 -0
  585. /package/dist/{src → cjs}/types/routing.d.ts.map +0 -0
  586. /package/dist/cjs/{src/types → types}/routing.js +0 -0
  587. /package/dist/{src → cjs}/types/routing.js.map +0 -0
  588. /package/dist/cjs/{src/types → types}/schema.d.ts +0 -0
  589. /package/dist/{src → cjs}/types/schema.d.ts.map +0 -0
  590. /package/dist/cjs/{src/types → types}/schema.js +0 -0
  591. /package/dist/{src → cjs}/types/schema.js.map +0 -0
  592. /package/dist/cjs/{src/types → types}/session.d.ts +0 -0
  593. /package/dist/{src → cjs}/types/session.d.ts.map +0 -0
  594. /package/dist/cjs/{src/types → types}/session.js +0 -0
  595. /package/dist/cjs/{src/types → types}/template.js +0 -0
  596. /package/dist/{src → cjs}/types/template.js.map +0 -0
  597. /package/dist/cjs/{src/utils → utils}/clone.d.ts +0 -0
  598. /package/dist/{src → cjs}/utils/clone.d.ts.map +0 -0
  599. /package/dist/cjs/{src/utils → utils}/clone.js +0 -0
  600. /package/dist/cjs/{src/utils → utils}/event.d.ts +0 -0
  601. /package/dist/{src → cjs}/utils/event.d.ts.map +0 -0
  602. /package/dist/cjs/{src/utils → utils}/event.js +0 -0
  603. /package/dist/cjs/{src/utils → utils}/history.d.ts +0 -0
  604. /package/dist/{src → cjs}/utils/history.d.ts.map +0 -0
  605. /package/dist/cjs/{src/utils → utils}/history.js +0 -0
  606. /package/dist/cjs/{src/utils → utils}/id.d.ts +0 -0
  607. /package/dist/{src → cjs}/utils/id.d.ts.map +0 -0
  608. /package/dist/cjs/{src/utils → utils}/id.js +0 -0
  609. /package/dist/cjs/{src/utils → utils}/logger.d.ts +0 -0
  610. /package/dist/{src → cjs}/utils/logger.d.ts.map +0 -0
  611. /package/dist/cjs/{src/utils → utils}/logger.js +0 -0
  612. /package/dist/cjs/{src/utils → utils}/session.d.ts +0 -0
  613. /package/dist/{src → cjs}/utils/session.d.ts.map +0 -0
  614. /package/dist/cjs/{src/utils → utils}/session.js +0 -0
  615. /package/dist/{src/constants → constants}/index.d.ts +0 -0
  616. /package/dist/{src/constants → constants}/index.js +0 -0
  617. /package/dist/{src/core → core}/Events.d.ts +0 -0
  618. /package/dist/{src/core → core}/Events.js +0 -0
  619. /package/dist/{src/core → core}/PersistenceManager.d.ts +0 -0
  620. /package/dist/{src/core → core}/PersistenceManager.js +0 -0
  621. /package/dist/{src/core → core}/ResponseEngine.d.ts +0 -0
  622. /package/dist/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
  623. /package/dist/{src/providers → providers}/GeminiProvider.d.ts +0 -0
  624. /package/dist/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
  625. /package/dist/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
  626. /package/dist/{src/providers → providers}/index.d.ts +0 -0
  627. /package/dist/{src/providers → providers}/index.js +0 -0
  628. /package/dist/{src/types → types}/agent.js +0 -0
  629. /package/dist/{src/types → types}/ai.d.ts +0 -0
  630. /package/dist/{src/types → types}/ai.js +0 -0
  631. /package/dist/{src/types → types}/history.d.ts +0 -0
  632. /package/dist/{src/types → types}/history.js +0 -0
  633. /package/dist/{src/types → types}/persistence.d.ts +0 -0
  634. /package/dist/{src/types → types}/persistence.js +0 -0
  635. /package/dist/{src/types → types}/route.js +0 -0
  636. /package/dist/{src/types → types}/routing.d.ts +0 -0
  637. /package/dist/{src/types → types}/routing.js +0 -0
  638. /package/dist/{src/types → types}/schema.d.ts +0 -0
  639. /package/dist/{src/types → types}/schema.js +0 -0
  640. /package/dist/{src/types → types}/session.d.ts +0 -0
  641. /package/dist/{src/types → types}/session.js +0 -0
  642. /package/dist/{src/types → types}/template.js +0 -0
  643. /package/dist/{src/utils → utils}/clone.d.ts +0 -0
  644. /package/dist/{src/utils → utils}/clone.js +0 -0
  645. /package/dist/{src/utils → utils}/event.d.ts +0 -0
  646. /package/dist/{src/utils → utils}/event.js +0 -0
  647. /package/dist/{src/utils → utils}/history.d.ts +0 -0
  648. /package/dist/{src/utils → utils}/history.js +0 -0
  649. /package/dist/{src/utils → utils}/id.d.ts +0 -0
  650. /package/dist/{src/utils → utils}/id.js +0 -0
  651. /package/dist/{src/utils → utils}/logger.d.ts +0 -0
  652. /package/dist/{src/utils → utils}/logger.js +0 -0
  653. /package/dist/{src/utils → utils}/session.d.ts +0 -0
  654. /package/dist/{src/utils → utils}/session.js +0 -0
@@ -3,48 +3,60 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RoutingEngine = void 0;
4
4
  const utils_1 = require("../utils");
5
5
  const PromptComposer_1 = require("./PromptComposer");
6
- const event_1 = require("../utils/event");
7
- const logger_1 = require("../utils/logger");
8
- const template_1 = require("../utils/template");
9
6
  const constants_1 = require("../constants");
7
+ const utils_2 = require("../utils");
10
8
  class RoutingEngine {
11
9
  constructor(options) {
12
10
  this.options = options;
13
11
  }
14
12
  /**
15
- * Optimized decision for single-route scenarios
16
- * Skips route scoring and only does step selection
13
+ * Enter a route if not already in it, merging initial data
17
14
  * @private
18
15
  */
19
- async decideSingleRouteStep(params) {
20
- const { route, session, history, agentOptions, provider, context, signal } = params;
21
- let updatedSession = session;
22
- const selectedRoute = route;
23
- // Check if this single route is complete
24
- const completedRoutes = route.isComplete(session.data || {}) ? [route] : [];
25
- // Enter route if not already in it
16
+ enterRouteIfNeeded(session, route) {
26
17
  if (!session.currentRoute || session.currentRoute.id !== route.id) {
27
- updatedSession = (0, utils_1.enterRoute)(session, route.id, route.title);
18
+ let updatedSession = (0, utils_1.enterRoute)(session, route.id, route.title);
28
19
  if (route.initialData) {
29
20
  updatedSession = (0, utils_1.mergeCollected)(updatedSession, route.initialData);
30
- logger_1.logger.debug(`[RoutingEngine] Single-route: Merged initial data:`, route.initialData);
21
+ utils_2.logger.debug(`[RoutingEngine] Merged initial data for route ${route.title}:`, route.initialData);
31
22
  }
32
- logger_1.logger.debug(`[RoutingEngine] Single-route: Entered route: ${route.title}`);
23
+ utils_2.logger.debug(`[RoutingEngine] Entered route: ${route.title}`);
24
+ return updatedSession;
33
25
  }
34
- // Get candidate steps
26
+ return session;
27
+ }
28
+ /**
29
+ * Optimized decision for single-route scenarios
30
+ * Skips route scoring and only does step selection
31
+ * @private
32
+ */
33
+ async decideSingleRouteStep(params) {
34
+ const { route, session, history, agentOptions, provider, context, signal } = params;
35
+ const selectedRoute = route;
36
+ // Enter route if not already in it (this may merge initial data)
37
+ const updatedSession = this.enterRouteIfNeeded(session, route);
38
+ // Check if this single route is complete (use updated session data)
39
+ const completedRoutes = route.isComplete(updatedSession.data || {}) ? [route] : [];
40
+ // Get candidate steps using new condition evaluation
41
+ const templateContext = (0, utils_2.createTemplateContext)({
42
+ context,
43
+ session: updatedSession,
44
+ history,
45
+ data: updatedSession.data
46
+ });
35
47
  const currentStep = updatedSession.currentStep
36
48
  ? route.getStep(updatedSession.currentStep.id)
37
49
  : undefined;
38
- const candidates = this.getCandidateSteps(route, currentStep, updatedSession.data || {});
50
+ const candidates = await this.getCandidateStepsWithConditions(route, currentStep, templateContext);
39
51
  if (candidates.length === 0) {
40
- logger_1.logger.warn(`[RoutingEngine] Single-route: No valid steps found`);
52
+ utils_2.logger.warn(`[RoutingEngine] Single-route: No valid steps found`);
41
53
  return { selectedRoute, session: updatedSession };
42
54
  }
43
- // If only one candidate, check if route is complete
55
+ // If only one candidate, check if it's a completion marker
44
56
  if (candidates.length === 1) {
45
- const isRouteComplete = candidates[0].isRouteComplete;
46
- if (isRouteComplete) {
47
- logger_1.logger.debug(`[RoutingEngine] Single-route: Route complete - all data collected, END_ROUTE reached`);
57
+ const candidate = candidates[0];
58
+ if (candidate.isRouteComplete) {
59
+ utils_2.logger.debug(`[RoutingEngine] Single-route: Route complete - all required fields collected or END_ROUTE reached`);
48
60
  // Don't return a selectedStep when route is complete - there's no step to enter
49
61
  return {
50
62
  selectedRoute,
@@ -55,18 +67,39 @@ class RoutingEngine {
55
67
  };
56
68
  }
57
69
  else {
58
- logger_1.logger.debug(`[RoutingEngine] Single-route: Only one valid step: ${candidates[0].step.id}`);
70
+ utils_2.logger.debug(`[RoutingEngine] Single-route: Only one valid step: ${candidate.step.id}`);
59
71
  return {
60
72
  selectedRoute,
61
- selectedStep: candidates[0].step,
73
+ selectedStep: candidate.step,
62
74
  session: updatedSession,
63
75
  isRouteComplete: false,
64
76
  completedRoutes,
65
77
  };
66
78
  }
67
79
  }
80
+ // No candidates means route is likely complete or has no valid next steps
81
+ if (candidates.length === 0) {
82
+ const dataComplete = route.isComplete(updatedSession.data || {});
83
+ utils_2.logger.debug(`[RoutingEngine] Single-route: No valid steps found - ` +
84
+ `(data: ${dataComplete ? 'complete' : 'incomplete'}, marking as ${dataComplete ? 'complete' : 'incomplete'})`);
85
+ return {
86
+ selectedRoute,
87
+ selectedStep: undefined,
88
+ session: updatedSession,
89
+ isRouteComplete: dataComplete,
90
+ completedRoutes,
91
+ };
92
+ }
68
93
  // Multiple candidates - use AI to select best step
69
- const lastUserMessage = (0, event_1.getLastMessageFromHistory)(history);
94
+ const lastUserMessage = (0, utils_2.getLastMessageFromHistory)(history);
95
+ // Collect AI context strings from step conditions
96
+ const stepConditionContext = [];
97
+ for (const candidate of candidates) {
98
+ const whenResult = await candidate.step.evaluateWhen(templateContext);
99
+ stepConditionContext.push(...whenResult.aiContextStrings);
100
+ }
101
+ // Check if any candidate is a completion marker (isRouteComplete = true)
102
+ const hasCompletionOption = candidates.some(c => c.isRouteComplete);
70
103
  const stepPrompt = await this.buildStepSelectionPrompt({
71
104
  route,
72
105
  currentStep,
@@ -77,8 +110,10 @@ class RoutingEngine {
77
110
  agentOptions,
78
111
  context,
79
112
  session: updatedSession,
113
+ stepConditionContext,
114
+ includeEndRoute: hasCompletionOption,
80
115
  });
81
- const stepSchema = this.buildStepSelectionSchema(candidates.map((c) => c.step));
116
+ const stepSchema = this.buildStepSelectionSchema(candidates.filter(c => !c.isRouteComplete).map((c) => c.step), hasCompletionOption);
82
117
  const stepResult = await provider.generateMessage({
83
118
  prompt: stepPrompt,
84
119
  history,
@@ -90,13 +125,26 @@ class RoutingEngine {
90
125
  },
91
126
  });
92
127
  const selectedStepId = stepResult.structured?.selectedStepId;
128
+ // Check if AI selected END_ROUTE
129
+ if (selectedStepId === constants_1.END_ROUTE_ID) {
130
+ utils_2.logger.debug(`[RoutingEngine] Single-route: AI selected END_ROUTE - completing route`);
131
+ utils_2.logger.debug(`[RoutingEngine] Single-route: Reasoning: ${stepResult.structured?.reasoning}`);
132
+ return {
133
+ selectedRoute,
134
+ selectedStep: undefined,
135
+ responseDirectives: stepResult.structured?.responseDirectives,
136
+ session: updatedSession,
137
+ isRouteComplete: true,
138
+ completedRoutes,
139
+ };
140
+ }
93
141
  const selectedStep = candidates.find((c) => c.step.id === selectedStepId);
94
142
  if (selectedStep) {
95
- logger_1.logger.debug(`[RoutingEngine] Single-route: AI selected step: ${selectedStep.step.id}`);
96
- logger_1.logger.debug(`[RoutingEngine] Single-route: Reasoning: ${stepResult.structured?.reasoning}`);
143
+ utils_2.logger.debug(`[RoutingEngine] Single-route: AI selected step: ${selectedStep.step.id}`);
144
+ utils_2.logger.debug(`[RoutingEngine] Single-route: Reasoning: ${stepResult.structured?.reasoning}`);
97
145
  }
98
146
  else {
99
- logger_1.logger.warn(`[RoutingEngine] Single-route: Invalid step ID returned, using first candidate`);
147
+ utils_2.logger.warn(`[RoutingEngine] Single-route: Invalid step ID returned, using first candidate`);
100
148
  }
101
149
  return {
102
150
  selectedRoute,
@@ -107,16 +155,17 @@ class RoutingEngine {
107
155
  };
108
156
  }
109
157
  /**
110
- * Recursively traverse step chain to find first non-skipped step or END_ROUTE
158
+ * Recursively traverse step chain to find first non-skipped step or END_ROUTE using new condition evaluation
111
159
  * @private
112
160
  */
113
- findFirstValidStepRecursive(currentStep, data, visited) {
161
+ async findFirstValidStepRecursiveWithConditions(currentStep, templateContext, visited) {
114
162
  // Prevent infinite loops
115
163
  if (visited.has(currentStep.id)) {
116
- return {};
164
+ return { aiContextStrings: [] };
117
165
  }
118
166
  visited.add(currentStep.id);
119
167
  const transitions = currentStep.getTransitions();
168
+ const allAiContextStrings = [];
120
169
  for (const transition of transitions) {
121
170
  const target = transition;
122
171
  // Check for END_ROUTE transition
@@ -124,43 +173,72 @@ class RoutingEngine {
124
173
  // Found END_ROUTE - route is complete
125
174
  return {
126
175
  isRouteComplete: true,
176
+ aiContextStrings: allAiContextStrings,
127
177
  };
128
178
  }
129
179
  if (!target)
130
180
  continue;
181
+ // Evaluate skipIf condition using new system
182
+ const skipResult = await target.evaluateSkipIf(templateContext);
183
+ allAiContextStrings.push(...skipResult.aiContextStrings);
131
184
  // If target should NOT be skipped, we found our step
132
- if (!target.shouldSkip(data)) {
133
- logger_1.logger.debug(`[RoutingEngine] Found valid step after skipping: ${target.id}`);
185
+ if (!skipResult.shouldSkip) {
186
+ utils_2.logger.debug(`[RoutingEngine] Found valid step after skipping: ${target.id}`);
134
187
  return {
135
188
  step: target,
136
189
  isRouteComplete: false,
190
+ aiContextStrings: allAiContextStrings,
137
191
  };
138
192
  }
139
193
  // Target should be skipped too - recurse deeper
140
- logger_1.logger.debug(`[RoutingEngine] Skipping step ${target.id} (skipIf condition met), continuing traversal...`);
141
- const result = this.findFirstValidStepRecursive(target, data, visited);
194
+ utils_2.logger.debug(`[RoutingEngine] Skipping step ${target.id} (skipIf condition met), continuing traversal...`);
195
+ const result = await this.findFirstValidStepRecursiveWithConditions(target, templateContext, visited);
196
+ // Collect AI context from recursive call
197
+ if (result.aiContextStrings) {
198
+ allAiContextStrings.push(...result.aiContextStrings);
199
+ }
142
200
  // If we found something (a valid step or END_ROUTE), return it
143
201
  if (result.step || result.isRouteComplete) {
144
- return result;
202
+ return {
203
+ ...result,
204
+ aiContextStrings: allAiContextStrings,
205
+ };
145
206
  }
146
207
  }
147
208
  // No valid steps or END_ROUTE found in this branch
148
- return {};
209
+ return { aiContextStrings: allAiContextStrings };
149
210
  }
150
211
  /**
151
- * Identify valid next candidate steps based on current step and collected data
212
+ * Identify valid next candidate steps using new condition evaluation system
152
213
  * Returns step with isRouteComplete flag if route is complete (all steps skipped + has END_ROUTE transition)
214
+ *
215
+ * NEW: Automatically completes route when all required fields are collected
153
216
  */
154
- getCandidateSteps(route, currentStep, data) {
217
+ async getCandidateStepsWithConditions(route, currentStep, templateContext) {
155
218
  const candidates = [];
219
+ const data = templateContext.data || {};
220
+ // Check if all required fields are collected
221
+ const allRequiredFieldsCollected = route.isComplete(data);
156
222
  if (!currentStep) {
223
+ // Entering route for the first time
224
+ // If all required fields already collected, route is immediately complete
225
+ if (allRequiredFieldsCollected) {
226
+ utils_2.logger.debug(`[RoutingEngine] Route ${route.title} complete on entry: all required fields already collected`);
227
+ // Return a completion marker - use initial step with completion flag
228
+ candidates.push({
229
+ step: route.initialStep,
230
+ isRouteComplete: true,
231
+ });
232
+ return candidates;
233
+ }
157
234
  const initialStep = route.initialStep;
158
- if (initialStep.shouldSkip(data)) {
235
+ const skipResult = await initialStep.evaluateSkipIf(templateContext);
236
+ if (skipResult.shouldSkip) {
159
237
  // Initial step should be skipped - recursively traverse to find first non-skipped step or END_ROUTE
160
- const result = this.findFirstValidStepRecursive(initialStep, data, new Set());
238
+ const result = await this.findFirstValidStepRecursiveWithConditions(initialStep, templateContext, new Set());
161
239
  if (result.isRouteComplete) {
162
240
  // All steps are skipped and we reached END_ROUTE
163
- logger_1.logger.debug(`[RoutingEngine] Route complete on entry: all steps skipped, END_ROUTE reached`);
241
+ utils_2.logger.debug(`[RoutingEngine] Route complete on entry: all steps skipped, END_ROUTE reached`);
164
242
  candidates.push({
165
243
  step: initialStep,
166
244
  isRouteComplete: true,
@@ -183,6 +261,55 @@ class RoutingEngine {
183
261
  }
184
262
  return candidates;
185
263
  }
264
+ // Check if all required fields are now collected (may have been collected during this step)
265
+ if (allRequiredFieldsCollected) {
266
+ // Required fields are complete - check if we should continue for optional fields
267
+ const transitions = currentStep.getTransitions();
268
+ const optionalFieldCandidates = [];
269
+ for (const transition of transitions) {
270
+ const target = transition;
271
+ // Check for END_ROUTE transition
272
+ if (target && target.id === constants_1.END_ROUTE_ID) {
273
+ continue;
274
+ }
275
+ if (!target)
276
+ continue;
277
+ // Check if this step collects only optional fields
278
+ const collectsOnlyOptional = target.collect && target.collect.length > 0 &&
279
+ target.collect.every(field => route.optionalFields?.includes(field));
280
+ if (collectsOnlyOptional) {
281
+ // This step collects optional fields - it's a candidate
282
+ const skipResult = await target.evaluateSkipIf(templateContext);
283
+ if (!skipResult.shouldSkip) {
284
+ optionalFieldCandidates.push({
285
+ step: target,
286
+ isRouteComplete: false,
287
+ });
288
+ }
289
+ }
290
+ }
291
+ // If we have optional field candidates, include them along with END_ROUTE option
292
+ if (optionalFieldCandidates.length > 0) {
293
+ utils_2.logger.debug(`[RoutingEngine] Required fields complete, but ${optionalFieldCandidates.length} optional field steps available`);
294
+ // Add optional field steps as candidates
295
+ candidates.push(...optionalFieldCandidates);
296
+ // Also add END_ROUTE as a candidate (AI can choose to skip optional fields)
297
+ candidates.push({
298
+ step: currentStep,
299
+ isRouteComplete: true,
300
+ });
301
+ return candidates;
302
+ }
303
+ // No optional fields to collect - route is complete
304
+ utils_2.logger.debug(`[RoutingEngine] Route ${route.title} complete: all required fields collected, no optional fields remain`);
305
+ return [
306
+ {
307
+ step: currentStep,
308
+ isRouteComplete: true,
309
+ },
310
+ ];
311
+ }
312
+ // Required fields not yet complete - continue normal step progression
186
313
  const transitions = currentStep.getTransitions();
187
314
  let hasEndRoute = false;
188
315
  for (const transition of transitions) {
@@ -194,10 +321,11 @@ class RoutingEngine {
194
321
  }
195
322
  if (!target)
196
323
  continue;
197
- if (target.shouldSkip(data)) {
198
- logger_1.logger.debug(`[RoutingEngine] Skipping step ${target.id} (skipIf condition met)`);
324
+ const skipResult = await target.evaluateSkipIf(templateContext);
325
+ if (skipResult.shouldSkip) {
326
+ utils_2.logger.debug(`[RoutingEngine] Skipping step ${target.id} (skipIf condition met)`);
199
327
  // Recursively traverse to find next valid step or END_ROUTE
200
- const result = this.findFirstValidStepRecursive(target, data, new Set([currentStep.id]) // Already visited current step
328
+ const result = await this.findFirstValidStepRecursiveWithConditions(target, templateContext, new Set([currentStep.id]) // Already visited current step
201
329
  );
202
330
  if (result.isRouteComplete) {
203
331
  hasEndRoute = true;
@@ -220,7 +348,7 @@ class RoutingEngine {
220
348
  if (candidates.length === 0) {
221
349
  // If current step has END_ROUTE transition, the route is complete
222
350
  if (hasEndRoute) {
223
- logger_1.logger.debug(`[RoutingEngine] Route complete: all steps processed, END_ROUTE reached`);
351
+ utils_2.logger.debug(`[RoutingEngine] Route complete: all steps processed, END_ROUTE reached`);
224
352
  // Return current step with completion flag
225
353
  return [
226
354
  {
@@ -230,7 +358,8 @@ class RoutingEngine {
230
358
  ];
231
359
  }
232
360
  // Otherwise, stay in current step if it's still valid
233
- if (!currentStep.shouldSkip(data)) {
361
+ const currentSkipResult = await currentStep.evaluateSkipIf(templateContext);
362
+ if (!currentSkipResult.shouldSkip) {
234
363
  candidates.push({
235
364
  step: currentStep,
236
365
  isRouteComplete: hasEndRoute || false,
@@ -255,7 +384,7 @@ class RoutingEngine {
255
384
  const completedRoutes = this.evaluateRouteCompletions(routes, session.data || {});
256
385
  // Log completed routes
257
386
  if (completedRoutes.length > 0) {
258
- logger_1.logger.debug(`[RoutingEngine] Found ${completedRoutes.length} completed routes: ${completedRoutes.map(r => r.title).join(', ')}`);
387
+ utils_2.logger.debug(`[RoutingEngine] Found ${completedRoutes.length} completed routes: ${completedRoutes.map(r => r.title).join(', ')}`);
259
388
  }
260
389
  // OPTIMIZATION: Single route - skip route scoring, only do step selection
261
390
  if (routes.length === 1) {
@@ -273,39 +402,70 @@ class RoutingEngine {
273
402
  completedRoutes,
274
403
  };
275
404
  }
276
- const lastUserMessage = (0, event_1.getLastMessageFromHistory)(history);
405
+ const lastUserMessage = (0, utils_2.getLastMessageFromHistory)(history);
406
+ const templateContext = (0, utils_2.createTemplateContext)({
407
+ context,
408
+ session,
409
+ history,
410
+ data: session.data
411
+ });
412
+ // Apply route filtering with new condition evaluation system
413
+ const skipIfResult = await this.filterRoutesBySkipIf(routes, templateContext);
414
+ const whenResult = await this.filterRoutesByWhen(skipIfResult.eligibleRoutes, templateContext);
415
+ // Collect all AI context strings from route conditions
416
+ const routeConditionContext = [...skipIfResult.aiContextStrings, ...whenResult.aiContextStrings];
417
+ // Use filtered routes for further processing
418
+ const eligibleRoutes = whenResult.eligibleRoutes;
419
+ utils_2.logger.debug(`[RoutingEngine] Route filtering: ${routes.length} total → ${skipIfResult.eligibleRoutes.length} after skipIf → ${eligibleRoutes.length} after when`);
277
420
  let activeRouteSteps;
278
421
  let activeRoute;
279
422
  let isRouteComplete = false;
423
+ let updatedSession = session;
280
424
  if (session.currentRoute) {
281
- activeRoute = routes.find((r) => r.id === session.currentRoute?.id);
425
+ activeRoute = eligibleRoutes.find((r) => r.id === session.currentRoute?.id);
282
426
  if (activeRoute) {
283
427
  const currentStep = session.currentStep
284
428
  ? activeRoute.getStep(session.currentStep.id)
285
429
  : undefined;
286
- const candidates = this.getCandidateSteps(activeRoute, currentStep, session.data || {});
430
+ const activeTemplateContext = (0, utils_2.createTemplateContext)({
431
+ ...templateContext,
432
+ session: updatedSession,
433
+ data: updatedSession.data
434
+ });
435
+ const candidates = await this.getCandidateStepsWithConditions(activeRoute, currentStep, activeTemplateContext);
287
436
  // Check if route is complete
437
+ // getCandidateStepsWithConditions now automatically handles completion when required fields are collected
288
438
  if (candidates.length === 1 && candidates[0].isRouteComplete) {
289
439
  isRouteComplete = true;
290
- logger_1.logger.debug(`[RoutingEngine] Route ${activeRoute.title} is complete - all data collected`);
440
+ utils_2.logger.debug(`[RoutingEngine] Route ${activeRoute.title} is complete - all required fields collected or END_ROUTE reached`);
291
441
  // Don't include steps in routing if route is complete
292
442
  activeRouteSteps = undefined;
293
443
  }
444
+ else if (candidates.length === 0) {
445
+ // No candidates - check if data is complete
446
+ const dataComplete = activeRoute.isComplete(updatedSession.data || {});
447
+ isRouteComplete = dataComplete;
448
+ utils_2.logger.debug(`[RoutingEngine] Route ${activeRoute.title} has no valid steps - ` +
449
+ `marking as ${isRouteComplete ? 'complete' : 'incomplete'}`);
450
+ activeRouteSteps = undefined;
451
+ }
294
452
  else {
453
+ // Multiple candidates or single non-complete candidate
295
454
  activeRouteSteps = candidates.map((c) => c.step);
296
- logger_1.logger.debug(`[RoutingEngine] Found ${activeRouteSteps.length} candidate steps for active route`);
455
+ utils_2.logger.debug(`[RoutingEngine] Found ${activeRouteSteps.length} candidate steps for active route`);
297
456
  }
298
457
  }
299
458
  }
300
- const routingSchema = this.buildDynamicRoutingSchema(routes, undefined, activeRouteSteps);
459
+ const routingSchema = this.buildDynamicRoutingSchema(eligibleRoutes, undefined, activeRouteSteps);
301
460
  const routingPrompt = await this.buildRoutingPrompt({
302
461
  history,
303
- routes,
462
+ routes: eligibleRoutes,
304
463
  lastMessage: lastUserMessage,
305
464
  agentOptions,
306
465
  session,
307
466
  activeRouteSteps,
308
467
  context,
468
+ routeConditionContext, // Pass AI context strings from route conditions
309
469
  });
310
470
  const routingResult = await provider.generateMessage({
311
471
  prompt: routingPrompt,
@@ -320,40 +480,39 @@ class RoutingEngine {
320
480
  let selectedRoute;
321
481
  let selectedStep;
322
482
  let responseDirectives;
323
- let updatedSession = session;
324
483
  if (routingResult.structured?.routes) {
325
484
  // Use cross-route completion evaluation to select optimal route
326
- const optimalRoute = this.selectOptimalRoute(routes, updatedSession.data || {}, routingResult.structured.routes);
327
- // Fall back to traditional scoring if no optimal route found
328
- selectedRoute = optimalRoute || (() => {
329
- const decision = this.decideRouteFromScores({
330
- context: routingResult.structured.context,
331
- routes: routingResult.structured.routes,
332
- responseDirectives: routingResult.structured.responseDirectives,
333
- });
334
- return routes.find((r) => r.id === decision.routeId);
335
- })();
485
+ const optimalRoute = this.selectOptimalRoute(eligibleRoutes, updatedSession.data || {}, routingResult.structured.routes);
486
+ // If no optimal route found, check why
487
+ if (!optimalRoute) {
488
+ if (eligibleRoutes.length === 0) {
489
+ // No routes passed filtering
490
+ utils_2.logger.debug(`[RoutingEngine] No eligible routes available - all routes filtered out`);
491
+ selectedRoute = undefined;
492
+ }
493
+ else {
494
+ // Routes exist but selectOptimalRoute returned undefined
495
+ // This means all routes are 100% complete
496
+ utils_2.logger.debug(`[RoutingEngine] No optimal route found - all ${eligibleRoutes.length} eligible routes are complete`);
497
+ selectedRoute = undefined;
498
+ }
499
+ }
500
+ else {
501
+ selectedRoute = optimalRoute;
502
+ }
336
503
  responseDirectives = routingResult.structured.responseDirectives;
337
504
  if (selectedRoute === activeRoute &&
338
505
  routingResult.structured.selectedStepId &&
339
506
  activeRoute) {
340
507
  selectedStep = activeRoute.getStep(routingResult.structured.selectedStepId);
341
508
  if (selectedStep) {
342
- logger_1.logger.debug(`[RoutingEngine] AI selected step: ${selectedStep.id} in active route`);
343
- logger_1.logger.debug(`[RoutingEngine] Step reasoning: ${routingResult.structured.stepReasoning}`);
509
+ utils_2.logger.debug(`[RoutingEngine] AI selected step: ${selectedStep.id} in active route`);
510
+ utils_2.logger.debug(`[RoutingEngine] Step reasoning: ${routingResult.structured.stepReasoning}`);
344
511
  }
345
512
  }
346
513
  if (selectedRoute) {
347
- logger_1.logger.debug(`[RoutingEngine] Selected route: ${selectedRoute.title}`);
348
- if (!session.currentRoute ||
349
- session.currentRoute.id !== selectedRoute.id) {
350
- updatedSession = (0, utils_1.enterRoute)(session, selectedRoute.id, selectedRoute.title);
351
- if (selectedRoute.initialData) {
352
- updatedSession = (0, utils_1.mergeCollected)(updatedSession, selectedRoute.initialData);
353
- logger_1.logger.debug(`[RoutingEngine] Merged initial data:`, selectedRoute.initialData);
354
- }
355
- logger_1.logger.debug(`[RoutingEngine] Entered route: ${selectedRoute.title}`);
356
- }
514
+ utils_2.logger.debug(`[RoutingEngine] Selected route: ${selectedRoute.title}`);
515
+ updatedSession = this.enterRouteIfNeeded(updatedSession, selectedRoute);
357
516
  }
358
517
  }
359
518
  return {
@@ -365,6 +524,52 @@ class RoutingEngine {
365
524
  completedRoutes,
366
525
  };
367
526
  }
527
+ /**
528
+ * Filter routes based on skipIf conditions
529
+ * @param routes - All available routes
530
+ * @param templateContext - Context for condition evaluation
531
+ * @returns Object with eligible routes and collected AI context strings
532
+ */
533
+ async filterRoutesBySkipIf(routes, templateContext) {
534
+ const eligibleRoutes = [];
535
+ const aiContextStrings = [];
536
+ for (const route of routes) {
537
+ const skipResult = await route.evaluateSkipIf(templateContext);
538
+ // Collect AI context strings from skipIf conditions
539
+ aiContextStrings.push(...skipResult.aiContextStrings);
540
+ // If route should not be skipped, it's eligible
541
+ if (!skipResult.programmaticResult) {
542
+ eligibleRoutes.push(route);
543
+ }
544
+ else {
545
+ utils_2.logger.debug(`[RoutingEngine] Skipping route ${route.title} (skipIf condition met)`);
546
+ }
547
+ }
548
+ return { eligibleRoutes, aiContextStrings };
549
+ }
550
+ /**
551
+ * Filter routes based on when conditions
552
+ * @param routes - Routes that passed skipIf filtering
553
+ * @param templateContext - Context for condition evaluation
554
+ * @returns Object with eligible routes and collected AI context strings
555
+ */
556
+ async filterRoutesByWhen(routes, templateContext) {
557
+ const eligibleRoutes = [];
558
+ const aiContextStrings = [];
559
+ for (const route of routes) {
560
+ const whenResult = await route.evaluateWhen(templateContext);
561
+ // Collect AI context strings from when conditions
562
+ aiContextStrings.push(...whenResult.aiContextStrings);
563
+ // If route has no programmatic conditions or they evaluate to true, it's eligible
564
+ if (!whenResult.hasProgrammaticConditions || whenResult.programmaticResult) {
565
+ eligibleRoutes.push(route);
566
+ }
567
+ else {
568
+ utils_2.logger.debug(`[RoutingEngine] Route ${route.title} not eligible (when condition not met)`);
569
+ }
570
+ }
571
+ return { eligibleRoutes, aiContextStrings };
572
+ }
368
573
  /**
369
574
  * Evaluate all routes for completion based on collected data
370
575
  * @param routes - All available routes
@@ -391,6 +596,7 @@ class RoutingEngine {
391
596
  /**
392
597
  * Find the best route to continue based on completion status and user intent
393
598
  * Prioritizes routes that are partially complete but not finished
599
+ * IMPORTANT: Completed routes are excluded to prevent re-entering finished tasks
394
600
  * @param routes - All available routes
395
601
  * @param data - Currently collected agent-level data
396
602
  * @param routeScores - AI-generated route scores from routing decision
@@ -403,8 +609,10 @@ class RoutingEngine {
403
609
  for (const route of routes) {
404
610
  const aiScore = routeScores[route.id] || 0;
405
611
  const completionProgress = completionStatus.get(route.id) || 0;
406
- // Skip fully completed routes unless they have very high AI scores
407
- if (completionProgress >= 1.0 && aiScore < 80) {
612
+ // ALWAYS skip fully completed routes to prevent re-entering finished tasks
613
+ // Users should not be forced back into completed routes
614
+ if (completionProgress >= 1.0) {
615
+ utils_2.logger.debug(`[RoutingEngine] Excluding completed route: ${route.title} (100% complete)`);
408
616
  continue;
409
617
  }
410
618
  // Boost partially complete routes that match user intent
@@ -418,7 +626,7 @@ class RoutingEngine {
418
626
  // Sort by weighted score and return the best option
419
627
  weightedScores.sort((a, b) => b.score - a.score);
420
628
  if (weightedScores.length > 0) {
421
- logger_1.logger.debug(`[RoutingEngine] Selected optimal route: ${weightedScores[0].route.title} ` +
629
+ utils_2.logger.debug(`[RoutingEngine] Selected optimal route: ${weightedScores[0].route.title} ` +
422
630
  `(AI: ${routeScores[weightedScores[0].route.id]}, ` +
423
631
  `Completion: ${(completionStatus.get(weightedScores[0].route.id) || 0) * 100}%, ` +
424
632
  `Weighted: ${weightedScores[0].score})`);
@@ -431,8 +639,8 @@ class RoutingEngine {
431
639
  * @private
432
640
  */
433
641
  async buildStepSelectionPrompt(params) {
434
- const { route, currentStep, candidates, data, history, lastMessage, agentOptions, context, session, } = params;
435
- const templateContext = { context, session, history };
642
+ const { route, currentStep, candidates, data, history, lastMessage, agentOptions, context, session, stepConditionContext, includeEndRoute = false, } = params;
643
+ const templateContext = (0, utils_2.createTemplateContext)({ context, session, history });
436
644
  const pc = new PromptComposer_1.PromptComposer(templateContext);
437
645
  // Add agent metadata
438
646
  if (agentOptions) {
@@ -457,7 +665,7 @@ class RoutingEngine {
457
665
  // Add conversation history
458
666
  await pc.addInteractionHistory(history);
459
667
  await pc.addLastMessage(lastMessage);
460
- // Add candidate steps
668
+ // Add candidate steps with condition context
461
669
  const stepDescriptions = [];
462
670
  for (const candidate of candidates) {
463
671
  const idx = candidates.indexOf(candidate);
@@ -465,9 +673,15 @@ class RoutingEngine {
465
673
  `${idx + 1}. Step ID: ${candidate.step.id}`,
466
674
  ` Description: ${candidate.step.description || "N/A"}`,
467
675
  ];
676
+ // Add when condition context
468
677
  if (candidate.step.when) {
469
- const renderedWhen = await (0, template_1.render)(candidate.step.when, templateContext);
470
- parts.push(` When this step should be completed: ${renderedWhen}`);
678
+ const whenResult = await candidate.step.evaluateWhen(templateContext);
679
+ if (whenResult.aiContextStrings.length > 0) {
680
+ parts.push(` When conditions: ${whenResult.aiContextStrings.join(", ")}`);
681
+ }
682
+ else if (typeof candidate.step.when === 'string') {
683
+ parts.push(` When this step should be completed: ${candidate.step.when}`);
684
+ }
471
685
  }
472
686
  if (candidate.step.requires && candidate.step.requires.length > 0) {
473
687
  parts.push(` Required Data: ${candidate.step.requires.join(", ")}`);
@@ -478,8 +692,18 @@ class RoutingEngine {
478
692
  stepDescriptions.push(parts.join("\n"));
479
693
  }
480
694
  await pc.addInstruction(`Available Steps to Transition To:\n${stepDescriptions.join("\n\n")}`);
695
+ // Add step condition context if available
696
+ if (stepConditionContext && stepConditionContext.length > 0) {
697
+ await pc.addInstruction([
698
+ "",
699
+ "Additional step context from conditions:",
700
+ ...stepConditionContext.map(ctx => `- ${ctx}`),
701
+ "",
702
+ "Consider this context when selecting the most appropriate step.",
703
+ ].join("\n"));
704
+ }
481
705
  // Add decision prompt
482
- await pc.addInstruction([
706
+ const decisionRules = [
483
707
  "Task: Decide which step to transition to based on:",
484
708
  "1. The user's current message and intent",
485
709
  "2. The conversation history and context",
@@ -492,16 +716,24 @@ class RoutingEngine {
492
716
  "- If a step requires data we don't have, consider if we should collect it now",
493
717
  "- Choose the step that makes the most sense for moving the conversation forward",
494
718
  "- Steps with skipIf conditions that are met have already been filtered out",
495
- "",
496
- "Return ONLY JSON matching the provided schema.",
497
- ].join("\n"));
719
+ ];
720
+ if (includeEndRoute) {
721
+ decisionRules.push("", `- You can select '${constants_1.END_ROUTE_ID}' to complete this route if:`, " * All required data has been collected", " * The user's intent suggests they're done with this task", " * No further steps are needed to fulfill the user's request");
722
+ }
723
+ decisionRules.push("", "Return ONLY JSON matching the provided schema.");
724
+ await pc.addInstruction(decisionRules.join("\n"));
498
725
  return pc.build();
499
726
  }
500
727
  /**
501
728
  * Build schema for step selection
502
729
  * @private
503
730
  */
504
- buildStepSelectionSchema(validSteps) {
731
+ buildStepSelectionSchema(validSteps, includeEndRoute = false) {
732
+ const stepIds = validSteps.map((s) => s.id);
733
+ // Add END_ROUTE as an option if requested (when required fields are complete)
734
+ if (includeEndRoute) {
735
+ stepIds.push(constants_1.END_ROUTE_ID);
736
+ }
505
737
  return {
506
738
  description: "Step transition decision based on conversation context and collected data",
507
739
  type: "object",
@@ -514,8 +746,10 @@ class RoutingEngine {
514
746
  selectedStepId: {
515
747
  type: "string",
516
748
  nullable: false,
517
- description: "The ID of the selected step to transition to",
518
- enum: validSteps.map((s) => s.id),
749
+ description: includeEndRoute
750
+ ? `The ID of the selected step to transition to, or '${constants_1.END_ROUTE_ID}' to complete the route`
751
+ : "The ID of the selected step to transition to",
752
+ enum: stepIds,
519
753
  },
520
754
  responseDirectives: {
521
755
  type: "array",
@@ -591,8 +825,8 @@ class RoutingEngine {
591
825
  return base;
592
826
  }
593
827
  async buildRoutingPrompt(params) {
594
- const { history, routes, lastMessage, agentOptions, session, activeRouteSteps, context, } = params;
595
- const templateContext = { context, session, history };
828
+ const { history, routes, lastMessage, agentOptions, session, activeRouteSteps, context, routeConditionContext, } = params;
829
+ const templateContext = (0, utils_2.createTemplateContext)({ context, session, history });
596
830
  const pc = new PromptComposer_1.PromptComposer(templateContext);
597
831
  if (agentOptions) {
598
832
  await pc.addAgentMeta(agentOptions);
@@ -644,15 +878,23 @@ class RoutingEngine {
644
878
  "",
645
879
  "Available steps in active route (choose one to transition to):",
646
880
  ];
881
+ const activeStepConditionContext = [];
647
882
  for (const step of activeRouteSteps) {
648
883
  const idx = activeRouteSteps.indexOf(step);
649
884
  stepInfo.push(`${idx + 1}. Step: ${step.id}`);
650
885
  if (step.description) {
651
886
  stepInfo.push(` Description: ${step.description}`);
652
887
  }
653
- const renderedWhen = await (0, template_1.render)(step.when, templateContext);
888
+ // Collect AI context from step conditions
654
889
  if (step.when) {
655
- stepInfo.push(` When this step should be completed: ${renderedWhen}`);
890
+ const whenResult = await step.evaluateWhen(templateContext);
891
+ if (whenResult.aiContextStrings.length > 0) {
892
+ stepInfo.push(` When conditions: ${whenResult.aiContextStrings.join(", ")}`);
893
+ activeStepConditionContext.push(...whenResult.aiContextStrings);
894
+ }
895
+ else if (typeof step.when === 'string') {
896
+ stepInfo.push(` When this step should be completed: ${step.when}`);
897
+ }
656
898
  }
657
899
  if (step.requires && step.requires.length > 0) {
658
900
  stepInfo.push(` Required data: ${step.requires.join(", ")}`);
@@ -668,11 +910,31 @@ class RoutingEngine {
668
910
  stepInfo.push("- The logical next step in the conversation");
669
911
  stepInfo.push("- Whether conditions for steps are met");
670
912
  await pc.addInstruction(stepInfo.join("\n"));
913
+ // Add active step condition context if available
914
+ if (activeStepConditionContext.length > 0) {
915
+ await pc.addInstruction([
916
+ "",
917
+ "Additional context from step conditions:",
918
+ ...activeStepConditionContext.map(ctx => `- ${ctx}`),
919
+ "",
920
+ "Use this context to inform your step selection decision.",
921
+ ].join("\n"));
922
+ }
671
923
  }
672
924
  }
673
925
  await pc.addInteractionHistory(history);
674
926
  await pc.addLastMessage(lastMessage);
675
927
  await pc.addRoutingOverview(routes);
928
+ // Add route condition context if available
929
+ if (routeConditionContext && routeConditionContext.length > 0) {
930
+ await pc.addInstruction([
931
+ "",
932
+ "Additional routing context from route conditions:",
933
+ ...routeConditionContext.map(ctx => `- ${ctx}`),
934
+ "",
935
+ "Consider this context when scoring routes for relevance.",
936
+ ].join("\n"));
937
+ }
676
938
  await pc.addInstruction([
677
939
  "Scoring rules:",
678
940
  "- 90-100: explicit keywords + clear intent",