@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
@@ -3,10 +3,8 @@ 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;
@@ -20,9 +18,9 @@ class RoutingEngine {
20
18
  let updatedSession = (0, utils_1.enterRoute)(session, route.id, route.title);
21
19
  if (route.initialData) {
22
20
  updatedSession = (0, utils_1.mergeCollected)(updatedSession, route.initialData);
23
- logger_1.logger.debug(`[RoutingEngine] Merged initial data for route ${route.title}:`, route.initialData);
21
+ utils_2.logger.debug(`[RoutingEngine] Merged initial data for route ${route.title}:`, route.initialData);
24
22
  }
25
- logger_1.logger.debug(`[RoutingEngine] Entered route: ${route.title}`);
23
+ utils_2.logger.debug(`[RoutingEngine] Entered route: ${route.title}`);
26
24
  return updatedSession;
27
25
  }
28
26
  return session;
@@ -39,21 +37,26 @@ class RoutingEngine {
39
37
  const updatedSession = this.enterRouteIfNeeded(session, route);
40
38
  // Check if this single route is complete (use updated session data)
41
39
  const completedRoutes = route.isComplete(updatedSession.data || {}) ? [route] : [];
42
- // Get candidate steps
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
+ });
43
47
  const currentStep = updatedSession.currentStep
44
48
  ? route.getStep(updatedSession.currentStep.id)
45
49
  : undefined;
46
- const candidates = this.getCandidateSteps(route, currentStep, updatedSession.data || {});
50
+ const candidates = await this.getCandidateStepsWithConditions(route, currentStep, templateContext);
47
51
  if (candidates.length === 0) {
48
- logger_1.logger.warn(`[RoutingEngine] Single-route: No valid steps found`);
52
+ utils_2.logger.warn(`[RoutingEngine] Single-route: No valid steps found`);
49
53
  return { selectedRoute, session: updatedSession };
50
54
  }
51
- // If only one candidate, no need for AI selection
55
+ // If only one candidate, check if it's a completion marker
52
56
  if (candidates.length === 1) {
53
57
  const candidate = candidates[0];
54
- const isRouteComplete = candidate.isRouteComplete;
55
- if (isRouteComplete) {
56
- logger_1.logger.debug(`[RoutingEngine] Single-route: Route complete - all data collected, END_ROUTE reached`);
58
+ if (candidate.isRouteComplete) {
59
+ utils_2.logger.debug(`[RoutingEngine] Single-route: Route complete - all required fields collected or END_ROUTE reached`);
57
60
  // Don't return a selectedStep when route is complete - there's no step to enter
58
61
  return {
59
62
  selectedRoute,
@@ -64,7 +67,7 @@ class RoutingEngine {
64
67
  };
65
68
  }
66
69
  else {
67
- logger_1.logger.debug(`[RoutingEngine] Single-route: Only one valid step: ${candidate.step.id}`);
70
+ utils_2.logger.debug(`[RoutingEngine] Single-route: Only one valid step: ${candidate.step.id}`);
68
71
  return {
69
72
  selectedRoute,
70
73
  selectedStep: candidate.step,
@@ -76,17 +79,27 @@ class RoutingEngine {
76
79
  }
77
80
  // No candidates means route is likely complete or has no valid next steps
78
81
  if (candidates.length === 0) {
79
- logger_1.logger.debug(`[RoutingEngine] Single-route: No valid steps found, route may be complete`);
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'})`);
80
85
  return {
81
86
  selectedRoute,
82
87
  selectedStep: undefined,
83
88
  session: updatedSession,
84
- isRouteComplete: true, // Assume complete if no valid steps
89
+ isRouteComplete: dataComplete,
85
90
  completedRoutes,
86
91
  };
87
92
  }
88
93
  // Multiple candidates - use AI to select best step
89
- 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);
90
103
  const stepPrompt = await this.buildStepSelectionPrompt({
91
104
  route,
92
105
  currentStep,
@@ -97,8 +110,10 @@ class RoutingEngine {
97
110
  agentOptions,
98
111
  context,
99
112
  session: updatedSession,
113
+ stepConditionContext,
114
+ includeEndRoute: hasCompletionOption,
100
115
  });
101
- const stepSchema = this.buildStepSelectionSchema(candidates.map((c) => c.step));
116
+ const stepSchema = this.buildStepSelectionSchema(candidates.filter(c => !c.isRouteComplete).map((c) => c.step), hasCompletionOption);
102
117
  const stepResult = await provider.generateMessage({
103
118
  prompt: stepPrompt,
104
119
  history,
@@ -110,13 +125,26 @@ class RoutingEngine {
110
125
  },
111
126
  });
112
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
+ }
113
141
  const selectedStep = candidates.find((c) => c.step.id === selectedStepId);
114
142
  if (selectedStep) {
115
- logger_1.logger.debug(`[RoutingEngine] Single-route: AI selected step: ${selectedStep.step.id}`);
116
- 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}`);
117
145
  }
118
146
  else {
119
- 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`);
120
148
  }
121
149
  return {
122
150
  selectedRoute,
@@ -127,16 +155,17 @@ class RoutingEngine {
127
155
  };
128
156
  }
129
157
  /**
130
- * 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
131
159
  * @private
132
160
  */
133
- findFirstValidStepRecursive(currentStep, data, visited) {
161
+ async findFirstValidStepRecursiveWithConditions(currentStep, templateContext, visited) {
134
162
  // Prevent infinite loops
135
163
  if (visited.has(currentStep.id)) {
136
- return {};
164
+ return { aiContextStrings: [] };
137
165
  }
138
166
  visited.add(currentStep.id);
139
167
  const transitions = currentStep.getTransitions();
168
+ const allAiContextStrings = [];
140
169
  for (const transition of transitions) {
141
170
  const target = transition;
142
171
  // Check for END_ROUTE transition
@@ -144,43 +173,72 @@ class RoutingEngine {
144
173
  // Found END_ROUTE - route is complete
145
174
  return {
146
175
  isRouteComplete: true,
176
+ aiContextStrings: allAiContextStrings,
147
177
  };
148
178
  }
149
179
  if (!target)
150
180
  continue;
181
+ // Evaluate skipIf condition using new system
182
+ const skipResult = await target.evaluateSkipIf(templateContext);
183
+ allAiContextStrings.push(...skipResult.aiContextStrings);
151
184
  // If target should NOT be skipped, we found our step
152
- if (!target.shouldSkip(data)) {
153
- 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}`);
154
187
  return {
155
188
  step: target,
156
189
  isRouteComplete: false,
190
+ aiContextStrings: allAiContextStrings,
157
191
  };
158
192
  }
159
193
  // Target should be skipped too - recurse deeper
160
- logger_1.logger.debug(`[RoutingEngine] Skipping step ${target.id} (skipIf condition met), continuing traversal...`);
161
- 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
+ }
162
200
  // If we found something (a valid step or END_ROUTE), return it
163
201
  if (result.step || result.isRouteComplete) {
164
- return result;
202
+ return {
203
+ ...result,
204
+ aiContextStrings: allAiContextStrings,
205
+ };
165
206
  }
166
207
  }
167
208
  // No valid steps or END_ROUTE found in this branch
168
- return {};
209
+ return { aiContextStrings: allAiContextStrings };
169
210
  }
170
211
  /**
171
- * Identify valid next candidate steps based on current step and collected data
212
+ * Identify valid next candidate steps using new condition evaluation system
172
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
173
216
  */
174
- getCandidateSteps(route, currentStep, data) {
217
+ async getCandidateStepsWithConditions(route, currentStep, templateContext) {
175
218
  const candidates = [];
219
+ const data = templateContext.data || {};
220
+ // Check if all required fields are collected
221
+ const allRequiredFieldsCollected = route.isComplete(data);
176
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
+ }
177
234
  const initialStep = route.initialStep;
178
- if (initialStep.shouldSkip(data)) {
235
+ const skipResult = await initialStep.evaluateSkipIf(templateContext);
236
+ if (skipResult.shouldSkip) {
179
237
  // Initial step should be skipped - recursively traverse to find first non-skipped step or END_ROUTE
180
- const result = this.findFirstValidStepRecursive(initialStep, data, new Set());
238
+ const result = await this.findFirstValidStepRecursiveWithConditions(initialStep, templateContext, new Set());
181
239
  if (result.isRouteComplete) {
182
240
  // All steps are skipped and we reached END_ROUTE
183
- 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`);
184
242
  candidates.push({
185
243
  step: initialStep,
186
244
  isRouteComplete: true,
@@ -203,6 +261,55 @@ class RoutingEngine {
203
261
  }
204
262
  return candidates;
205
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
206
313
  const transitions = currentStep.getTransitions();
207
314
  let hasEndRoute = false;
208
315
  for (const transition of transitions) {
@@ -214,10 +321,11 @@ class RoutingEngine {
214
321
  }
215
322
  if (!target)
216
323
  continue;
217
- if (target.shouldSkip(data)) {
218
- 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)`);
219
327
  // Recursively traverse to find next valid step or END_ROUTE
220
- 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
221
329
  );
222
330
  if (result.isRouteComplete) {
223
331
  hasEndRoute = true;
@@ -240,7 +348,7 @@ class RoutingEngine {
240
348
  if (candidates.length === 0) {
241
349
  // If current step has END_ROUTE transition, the route is complete
242
350
  if (hasEndRoute) {
243
- 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`);
244
352
  // Return current step with completion flag
245
353
  return [
246
354
  {
@@ -250,7 +358,8 @@ class RoutingEngine {
250
358
  ];
251
359
  }
252
360
  // Otherwise, stay in current step if it's still valid
253
- if (!currentStep.shouldSkip(data)) {
361
+ const currentSkipResult = await currentStep.evaluateSkipIf(templateContext);
362
+ if (!currentSkipResult.shouldSkip) {
254
363
  candidates.push({
255
364
  step: currentStep,
256
365
  isRouteComplete: hasEndRoute || false,
@@ -275,7 +384,7 @@ class RoutingEngine {
275
384
  const completedRoutes = this.evaluateRouteCompletions(routes, session.data || {});
276
385
  // Log completed routes
277
386
  if (completedRoutes.length > 0) {
278
- 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(', ')}`);
279
388
  }
280
389
  // OPTIMIZATION: Single route - skip route scoring, only do step selection
281
390
  if (routes.length === 1) {
@@ -293,39 +402,70 @@ class RoutingEngine {
293
402
  completedRoutes,
294
403
  };
295
404
  }
296
- 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`);
297
420
  let activeRouteSteps;
298
421
  let activeRoute;
299
422
  let isRouteComplete = false;
423
+ let updatedSession = session;
300
424
  if (session.currentRoute) {
301
- activeRoute = routes.find((r) => r.id === session.currentRoute?.id);
425
+ activeRoute = eligibleRoutes.find((r) => r.id === session.currentRoute?.id);
302
426
  if (activeRoute) {
303
427
  const currentStep = session.currentStep
304
428
  ? activeRoute.getStep(session.currentStep.id)
305
429
  : undefined;
306
- 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);
307
436
  // Check if route is complete
437
+ // getCandidateStepsWithConditions now automatically handles completion when required fields are collected
308
438
  if (candidates.length === 1 && candidates[0].isRouteComplete) {
309
439
  isRouteComplete = true;
310
- 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`);
311
441
  // Don't include steps in routing if route is complete
312
442
  activeRouteSteps = undefined;
313
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
+ }
314
452
  else {
453
+ // Multiple candidates or single non-complete candidate
315
454
  activeRouteSteps = candidates.map((c) => c.step);
316
- 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`);
317
456
  }
318
457
  }
319
458
  }
320
- const routingSchema = this.buildDynamicRoutingSchema(routes, undefined, activeRouteSteps);
459
+ const routingSchema = this.buildDynamicRoutingSchema(eligibleRoutes, undefined, activeRouteSteps);
321
460
  const routingPrompt = await this.buildRoutingPrompt({
322
461
  history,
323
- routes,
462
+ routes: eligibleRoutes,
324
463
  lastMessage: lastUserMessage,
325
464
  agentOptions,
326
465
  session,
327
466
  activeRouteSteps,
328
467
  context,
468
+ routeConditionContext, // Pass AI context strings from route conditions
329
469
  });
330
470
  const routingResult = await provider.generateMessage({
331
471
  prompt: routingPrompt,
@@ -340,31 +480,38 @@ class RoutingEngine {
340
480
  let selectedRoute;
341
481
  let selectedStep;
342
482
  let responseDirectives;
343
- let updatedSession = session;
344
483
  if (routingResult.structured?.routes) {
345
484
  // Use cross-route completion evaluation to select optimal route
346
- const optimalRoute = this.selectOptimalRoute(routes, updatedSession.data || {}, routingResult.structured.routes);
347
- // Fall back to traditional scoring if no optimal route found
348
- selectedRoute = optimalRoute || (() => {
349
- const decision = this.decideRouteFromScores({
350
- context: routingResult.structured.context,
351
- routes: routingResult.structured.routes,
352
- responseDirectives: routingResult.structured.responseDirectives,
353
- });
354
- return routes.find((r) => r.id === decision.routeId);
355
- })();
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
+ }
356
503
  responseDirectives = routingResult.structured.responseDirectives;
357
504
  if (selectedRoute === activeRoute &&
358
505
  routingResult.structured.selectedStepId &&
359
506
  activeRoute) {
360
507
  selectedStep = activeRoute.getStep(routingResult.structured.selectedStepId);
361
508
  if (selectedStep) {
362
- logger_1.logger.debug(`[RoutingEngine] AI selected step: ${selectedStep.id} in active route`);
363
- 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}`);
364
511
  }
365
512
  }
366
513
  if (selectedRoute) {
367
- logger_1.logger.debug(`[RoutingEngine] Selected route: ${selectedRoute.title}`);
514
+ utils_2.logger.debug(`[RoutingEngine] Selected route: ${selectedRoute.title}`);
368
515
  updatedSession = this.enterRouteIfNeeded(updatedSession, selectedRoute);
369
516
  }
370
517
  }
@@ -377,6 +524,52 @@ class RoutingEngine {
377
524
  completedRoutes,
378
525
  };
379
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
+ }
380
573
  /**
381
574
  * Evaluate all routes for completion based on collected data
382
575
  * @param routes - All available routes
@@ -403,6 +596,7 @@ class RoutingEngine {
403
596
  /**
404
597
  * Find the best route to continue based on completion status and user intent
405
598
  * Prioritizes routes that are partially complete but not finished
599
+ * IMPORTANT: Completed routes are excluded to prevent re-entering finished tasks
406
600
  * @param routes - All available routes
407
601
  * @param data - Currently collected agent-level data
408
602
  * @param routeScores - AI-generated route scores from routing decision
@@ -415,8 +609,10 @@ class RoutingEngine {
415
609
  for (const route of routes) {
416
610
  const aiScore = routeScores[route.id] || 0;
417
611
  const completionProgress = completionStatus.get(route.id) || 0;
418
- // Skip fully completed routes unless they have very high AI scores
419
- 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)`);
420
616
  continue;
421
617
  }
422
618
  // Boost partially complete routes that match user intent
@@ -430,7 +626,7 @@ class RoutingEngine {
430
626
  // Sort by weighted score and return the best option
431
627
  weightedScores.sort((a, b) => b.score - a.score);
432
628
  if (weightedScores.length > 0) {
433
- 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} ` +
434
630
  `(AI: ${routeScores[weightedScores[0].route.id]}, ` +
435
631
  `Completion: ${(completionStatus.get(weightedScores[0].route.id) || 0) * 100}%, ` +
436
632
  `Weighted: ${weightedScores[0].score})`);
@@ -443,8 +639,8 @@ class RoutingEngine {
443
639
  * @private
444
640
  */
445
641
  async buildStepSelectionPrompt(params) {
446
- const { route, currentStep, candidates, data, history, lastMessage, agentOptions, context, session, } = params;
447
- 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 });
448
644
  const pc = new PromptComposer_1.PromptComposer(templateContext);
449
645
  // Add agent metadata
450
646
  if (agentOptions) {
@@ -469,7 +665,7 @@ class RoutingEngine {
469
665
  // Add conversation history
470
666
  await pc.addInteractionHistory(history);
471
667
  await pc.addLastMessage(lastMessage);
472
- // Add candidate steps
668
+ // Add candidate steps with condition context
473
669
  const stepDescriptions = [];
474
670
  for (const candidate of candidates) {
475
671
  const idx = candidates.indexOf(candidate);
@@ -477,9 +673,15 @@ class RoutingEngine {
477
673
  `${idx + 1}. Step ID: ${candidate.step.id}`,
478
674
  ` Description: ${candidate.step.description || "N/A"}`,
479
675
  ];
676
+ // Add when condition context
480
677
  if (candidate.step.when) {
481
- const renderedWhen = await (0, template_1.render)(candidate.step.when, templateContext);
482
- 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
+ }
483
685
  }
484
686
  if (candidate.step.requires && candidate.step.requires.length > 0) {
485
687
  parts.push(` Required Data: ${candidate.step.requires.join(", ")}`);
@@ -490,8 +692,18 @@ class RoutingEngine {
490
692
  stepDescriptions.push(parts.join("\n"));
491
693
  }
492
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
+ }
493
705
  // Add decision prompt
494
- await pc.addInstruction([
706
+ const decisionRules = [
495
707
  "Task: Decide which step to transition to based on:",
496
708
  "1. The user's current message and intent",
497
709
  "2. The conversation history and context",
@@ -504,16 +716,24 @@ class RoutingEngine {
504
716
  "- If a step requires data we don't have, consider if we should collect it now",
505
717
  "- Choose the step that makes the most sense for moving the conversation forward",
506
718
  "- Steps with skipIf conditions that are met have already been filtered out",
507
- "",
508
- "Return ONLY JSON matching the provided schema.",
509
- ].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"));
510
725
  return pc.build();
511
726
  }
512
727
  /**
513
728
  * Build schema for step selection
514
729
  * @private
515
730
  */
516
- 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
+ }
517
737
  return {
518
738
  description: "Step transition decision based on conversation context and collected data",
519
739
  type: "object",
@@ -526,8 +746,10 @@ class RoutingEngine {
526
746
  selectedStepId: {
527
747
  type: "string",
528
748
  nullable: false,
529
- description: "The ID of the selected step to transition to",
530
- 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,
531
753
  },
532
754
  responseDirectives: {
533
755
  type: "array",
@@ -603,8 +825,8 @@ class RoutingEngine {
603
825
  return base;
604
826
  }
605
827
  async buildRoutingPrompt(params) {
606
- const { history, routes, lastMessage, agentOptions, session, activeRouteSteps, context, } = params;
607
- 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 });
608
830
  const pc = new PromptComposer_1.PromptComposer(templateContext);
609
831
  if (agentOptions) {
610
832
  await pc.addAgentMeta(agentOptions);
@@ -656,15 +878,23 @@ class RoutingEngine {
656
878
  "",
657
879
  "Available steps in active route (choose one to transition to):",
658
880
  ];
881
+ const activeStepConditionContext = [];
659
882
  for (const step of activeRouteSteps) {
660
883
  const idx = activeRouteSteps.indexOf(step);
661
884
  stepInfo.push(`${idx + 1}. Step: ${step.id}`);
662
885
  if (step.description) {
663
886
  stepInfo.push(` Description: ${step.description}`);
664
887
  }
665
- const renderedWhen = await (0, template_1.render)(step.when, templateContext);
888
+ // Collect AI context from step conditions
666
889
  if (step.when) {
667
- 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
+ }
668
898
  }
669
899
  if (step.requires && step.requires.length > 0) {
670
900
  stepInfo.push(` Required data: ${step.requires.join(", ")}`);
@@ -680,11 +910,31 @@ class RoutingEngine {
680
910
  stepInfo.push("- The logical next step in the conversation");
681
911
  stepInfo.push("- Whether conditions for steps are met");
682
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
+ }
683
923
  }
684
924
  }
685
925
  await pc.addInteractionHistory(history);
686
926
  await pc.addLastMessage(lastMessage);
687
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
+ }
688
938
  await pc.addInstruction([
689
939
  "Scoring rules:",
690
940
  "- 90-100: explicit keywords + clear intent",