@falai/agent 0.9.2 → 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 (626) hide show
  1. package/README.md +262 -38
  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 +6 -1
  33. package/dist/cjs/core/Agent.d.ts.map +1 -0
  34. package/dist/cjs/{src/core → core}/Agent.js +42 -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 +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 +45 -0
  54. package/dist/cjs/core/ResponseModal.d.ts.map +1 -0
  55. package/dist/cjs/{src/core → core}/ResponseModal.js +686 -66
  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 +11 -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 +6 -1
  135. package/dist/core/Agent.d.ts.map +1 -0
  136. package/dist/{src/core → core}/Agent.js +43 -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 +837 -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 +197 -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 +198 -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 +686 -66
  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 +11 -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/api/README.md +221 -12
  259. package/docs/api/overview.md +202 -3
  260. package/docs/architecture/data-extraction-flow.md +363 -0
  261. package/docs/architecture/multi-step-execution.md +243 -0
  262. package/docs/core/agent/README.md +120 -5
  263. package/docs/core/agent/session-management.md +1 -1
  264. package/docs/core/ai-integration/prompt-composition.md +135 -0
  265. package/docs/core/ai-integration/response-processing.md +146 -0
  266. package/docs/core/conversation-flows/data-collection.md +143 -0
  267. package/docs/core/conversation-flows/routes.md +2 -2
  268. package/docs/core/conversation-flows/step-transitions.md +132 -0
  269. package/docs/core/conversation-flows/steps.md +112 -0
  270. package/docs/core/error-handling.md +193 -0
  271. package/docs/core/routing/intelligent-routing.md +118 -0
  272. package/docs/guides/getting-started/README.md +284 -3
  273. package/docs/guides/migration/README.md +23 -0
  274. package/docs/guides/migration/flexible-routing-conditions.md +375 -0
  275. package/docs/guides/migration/multi-step-execution.md +303 -0
  276. package/examples/advanced-patterns/knowledge-based-agent.ts +101 -24
  277. package/examples/advanced-patterns/persistent-onboarding.ts +40 -5
  278. package/examples/advanced-patterns/route-lifecycle-hooks.ts +82 -12
  279. package/examples/advanced-patterns/streaming-responses.ts +2 -2
  280. package/examples/ai-providers/anthropic-integration.ts +4 -4
  281. package/examples/ai-providers/openai-integration.ts +1 -1
  282. package/examples/condition-patterns/function-only-conditions.ts +365 -0
  283. package/examples/condition-patterns/mixed-array-conditions.ts +477 -0
  284. package/examples/condition-patterns/route-skipif-patterns.ts +468 -0
  285. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  286. package/examples/condition-patterns/string-only-conditions.ts +296 -0
  287. package/examples/conversation-flows/completion-transitions.ts +48 -7
  288. package/examples/core-concepts/basic-agent.ts +54 -33
  289. package/examples/core-concepts/schema-driven-extraction.ts +33 -9
  290. package/examples/core-concepts/session-management.ts +51 -16
  291. package/examples/integrations/database-integration.ts +6 -6
  292. package/examples/integrations/healthcare-integration.ts +10 -10
  293. package/examples/integrations/search-integration.ts +8 -8
  294. package/examples/integrations/server-session-management.ts +8 -8
  295. package/examples/persistence/database-persistence.ts +15 -15
  296. package/examples/persistence/memory-sessions.ts +3 -3
  297. package/examples/persistence/redis-persistence.ts +7 -9
  298. package/examples/tools/data-enrichment-tools.ts +4 -4
  299. package/package.json +6 -4
  300. package/src/adapters/PrismaAdapter.ts +3 -2
  301. package/src/adapters/RedisAdapter.ts +3 -3
  302. package/src/core/Agent.ts +54 -2
  303. package/src/core/BatchExecutor.ts +1156 -0
  304. package/src/core/BatchPromptBuilder.ts +275 -0
  305. package/src/core/PromptComposer.ts +53 -16
  306. package/src/core/ResponseEngine.ts +143 -4
  307. package/src/core/ResponseModal.ts +888 -66
  308. package/src/core/ResponsePipeline.ts +17 -9
  309. package/src/core/Route.ts +223 -22
  310. package/src/core/RoutingEngine.ts +426 -83
  311. package/src/core/Step.ts +144 -16
  312. package/src/index.ts +19 -0
  313. package/src/providers/AnthropicProvider.ts +17 -17
  314. package/src/providers/GeminiProvider.ts +129 -60
  315. package/src/providers/OpenAIProvider.ts +18 -18
  316. package/src/providers/OpenRouterProvider.ts +18 -18
  317. package/src/types/agent.ts +11 -3
  318. package/src/types/index.ts +12 -1
  319. package/src/types/route.ts +131 -12
  320. package/src/types/template.ts +70 -2
  321. package/src/utils/condition.ts +190 -0
  322. package/src/utils/index.ts +12 -0
  323. package/src/utils/json.ts +46 -0
  324. package/src/utils/retry.ts +5 -4
  325. package/src/utils/template.ts +109 -0
  326. package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +0 -1
  327. package/dist/cjs/src/adapters/MemoryAdapter.js.map +0 -1
  328. package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +0 -1
  329. package/dist/cjs/src/adapters/MongoAdapter.js.map +0 -1
  330. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +0 -1
  331. package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +0 -1
  332. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  333. package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +0 -1
  334. package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +0 -1
  335. package/dist/cjs/src/adapters/PrismaAdapter.js.map +0 -1
  336. package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +0 -1
  337. package/dist/cjs/src/adapters/RedisAdapter.js.map +0 -1
  338. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +0 -1
  339. package/dist/cjs/src/adapters/SQLiteAdapter.js.map +0 -1
  340. package/dist/cjs/src/adapters/index.d.ts.map +0 -1
  341. package/dist/cjs/src/adapters/index.js.map +0 -1
  342. package/dist/cjs/src/constants/index.d.ts.map +0 -1
  343. package/dist/cjs/src/constants/index.js.map +0 -1
  344. package/dist/cjs/src/core/Agent.d.ts.map +0 -1
  345. package/dist/cjs/src/core/Agent.js.map +0 -1
  346. package/dist/cjs/src/core/Events.d.ts.map +0 -1
  347. package/dist/cjs/src/core/Events.js.map +0 -1
  348. package/dist/cjs/src/core/PersistenceManager.d.ts.map +0 -1
  349. package/dist/cjs/src/core/PersistenceManager.js.map +0 -1
  350. package/dist/cjs/src/core/PromptComposer.d.ts.map +0 -1
  351. package/dist/cjs/src/core/PromptComposer.js.map +0 -1
  352. package/dist/cjs/src/core/ResponseEngine.d.ts.map +0 -1
  353. package/dist/cjs/src/core/ResponseEngine.js +0 -84
  354. package/dist/cjs/src/core/ResponseEngine.js.map +0 -1
  355. package/dist/cjs/src/core/ResponseModal.d.ts.map +0 -1
  356. package/dist/cjs/src/core/ResponseModal.js.map +0 -1
  357. package/dist/cjs/src/core/ResponsePipeline.d.ts.map +0 -1
  358. package/dist/cjs/src/core/ResponsePipeline.js.map +0 -1
  359. package/dist/cjs/src/core/Route.d.ts.map +0 -1
  360. package/dist/cjs/src/core/Route.js.map +0 -1
  361. package/dist/cjs/src/core/RoutingEngine.d.ts.map +0 -1
  362. package/dist/cjs/src/core/RoutingEngine.js.map +0 -1
  363. package/dist/cjs/src/core/SessionManager.d.ts.map +0 -1
  364. package/dist/cjs/src/core/SessionManager.js.map +0 -1
  365. package/dist/cjs/src/core/Step.d.ts.map +0 -1
  366. package/dist/cjs/src/core/Step.js.map +0 -1
  367. package/dist/cjs/src/core/ToolManager.d.ts.map +0 -1
  368. package/dist/cjs/src/core/ToolManager.js.map +0 -1
  369. package/dist/cjs/src/index.d.ts.map +0 -1
  370. package/dist/cjs/src/index.js.map +0 -1
  371. package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +0 -1
  372. package/dist/cjs/src/providers/AnthropicProvider.js.map +0 -1
  373. package/dist/cjs/src/providers/GeminiProvider.d.ts.map +0 -1
  374. package/dist/cjs/src/providers/GeminiProvider.js.map +0 -1
  375. package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +0 -1
  376. package/dist/cjs/src/providers/OpenAIProvider.js.map +0 -1
  377. package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +0 -1
  378. package/dist/cjs/src/providers/OpenRouterProvider.js.map +0 -1
  379. package/dist/cjs/src/providers/index.d.ts.map +0 -1
  380. package/dist/cjs/src/providers/index.js.map +0 -1
  381. package/dist/cjs/src/types/agent.d.ts.map +0 -1
  382. package/dist/cjs/src/types/agent.js.map +0 -1
  383. package/dist/cjs/src/types/ai.d.ts.map +0 -1
  384. package/dist/cjs/src/types/ai.js.map +0 -1
  385. package/dist/cjs/src/types/history.d.ts.map +0 -1
  386. package/dist/cjs/src/types/history.js.map +0 -1
  387. package/dist/cjs/src/types/index.d.ts.map +0 -1
  388. package/dist/cjs/src/types/index.js.map +0 -1
  389. package/dist/cjs/src/types/persistence.d.ts.map +0 -1
  390. package/dist/cjs/src/types/persistence.js.map +0 -1
  391. package/dist/cjs/src/types/route.d.ts.map +0 -1
  392. package/dist/cjs/src/types/routing.d.ts.map +0 -1
  393. package/dist/cjs/src/types/schema.d.ts.map +0 -1
  394. package/dist/cjs/src/types/session.d.ts.map +0 -1
  395. package/dist/cjs/src/types/session.js.map +0 -1
  396. package/dist/cjs/src/types/template.d.ts +0 -30
  397. package/dist/cjs/src/types/template.d.ts.map +0 -1
  398. package/dist/cjs/src/types/tool.d.ts.map +0 -1
  399. package/dist/cjs/src/types/tool.js.map +0 -1
  400. package/dist/cjs/src/utils/clone.d.ts.map +0 -1
  401. package/dist/cjs/src/utils/clone.js.map +0 -1
  402. package/dist/cjs/src/utils/event.d.ts.map +0 -1
  403. package/dist/cjs/src/utils/event.js.map +0 -1
  404. package/dist/cjs/src/utils/history.d.ts.map +0 -1
  405. package/dist/cjs/src/utils/history.js.map +0 -1
  406. package/dist/cjs/src/utils/id.d.ts.map +0 -1
  407. package/dist/cjs/src/utils/id.js.map +0 -1
  408. package/dist/cjs/src/utils/index.d.ts.map +0 -1
  409. package/dist/cjs/src/utils/index.js.map +0 -1
  410. package/dist/cjs/src/utils/logger.d.ts.map +0 -1
  411. package/dist/cjs/src/utils/logger.js.map +0 -1
  412. package/dist/cjs/src/utils/retry.d.ts.map +0 -1
  413. package/dist/cjs/src/utils/retry.js.map +0 -1
  414. package/dist/cjs/src/utils/session.d.ts.map +0 -1
  415. package/dist/cjs/src/utils/session.js.map +0 -1
  416. package/dist/cjs/src/utils/template.d.ts.map +0 -1
  417. package/dist/cjs/src/utils/template.js.map +0 -1
  418. package/dist/src/adapters/MemoryAdapter.js.map +0 -1
  419. package/dist/src/adapters/MongoAdapter.js.map +0 -1
  420. package/dist/src/adapters/OpenSearchAdapter.js.map +0 -1
  421. package/dist/src/adapters/PostgreSQLAdapter.js.map +0 -1
  422. package/dist/src/adapters/PrismaAdapter.js.map +0 -1
  423. package/dist/src/adapters/RedisAdapter.js.map +0 -1
  424. package/dist/src/adapters/SQLiteAdapter.js.map +0 -1
  425. package/dist/src/adapters/index.js.map +0 -1
  426. package/dist/src/constants/index.js.map +0 -1
  427. package/dist/src/core/Agent.d.ts.map +0 -1
  428. package/dist/src/core/Agent.js.map +0 -1
  429. package/dist/src/core/Events.js.map +0 -1
  430. package/dist/src/core/PersistenceManager.js.map +0 -1
  431. package/dist/src/core/PromptComposer.d.ts.map +0 -1
  432. package/dist/src/core/PromptComposer.js.map +0 -1
  433. package/dist/src/core/ResponseEngine.js +0 -80
  434. package/dist/src/core/ResponseEngine.js.map +0 -1
  435. package/dist/src/core/ResponseModal.d.ts.map +0 -1
  436. package/dist/src/core/ResponseModal.js.map +0 -1
  437. package/dist/src/core/ResponsePipeline.d.ts.map +0 -1
  438. package/dist/src/core/ResponsePipeline.js.map +0 -1
  439. package/dist/src/core/Route.d.ts.map +0 -1
  440. package/dist/src/core/Route.js.map +0 -1
  441. package/dist/src/core/RoutingEngine.d.ts.map +0 -1
  442. package/dist/src/core/RoutingEngine.js.map +0 -1
  443. package/dist/src/core/SessionManager.js.map +0 -1
  444. package/dist/src/core/Step.d.ts.map +0 -1
  445. package/dist/src/core/Step.js.map +0 -1
  446. package/dist/src/core/ToolManager.js.map +0 -1
  447. package/dist/src/index.d.ts.map +0 -1
  448. package/dist/src/index.js.map +0 -1
  449. package/dist/src/providers/AnthropicProvider.js.map +0 -1
  450. package/dist/src/providers/GeminiProvider.js.map +0 -1
  451. package/dist/src/providers/OpenAIProvider.js.map +0 -1
  452. package/dist/src/providers/OpenRouterProvider.js.map +0 -1
  453. package/dist/src/providers/index.js.map +0 -1
  454. package/dist/src/types/agent.d.ts.map +0 -1
  455. package/dist/src/types/agent.js.map +0 -1
  456. package/dist/src/types/history.js.map +0 -1
  457. package/dist/src/types/index.js.map +0 -1
  458. package/dist/src/types/persistence.js.map +0 -1
  459. package/dist/src/types/route.d.ts.map +0 -1
  460. package/dist/src/types/template.d.ts +0 -30
  461. package/dist/src/types/template.d.ts.map +0 -1
  462. package/dist/src/types/tool.js.map +0 -1
  463. package/dist/src/utils/clone.js.map +0 -1
  464. package/dist/src/utils/event.js.map +0 -1
  465. package/dist/src/utils/history.js.map +0 -1
  466. package/dist/src/utils/id.js.map +0 -1
  467. package/dist/src/utils/index.d.ts.map +0 -1
  468. package/dist/src/utils/index.js.map +0 -1
  469. package/dist/src/utils/logger.js.map +0 -1
  470. package/dist/src/utils/retry.d.ts.map +0 -1
  471. package/dist/src/utils/retry.js.map +0 -1
  472. package/dist/src/utils/session.js.map +0 -1
  473. package/dist/src/utils/template.d.ts.map +0 -1
  474. package/dist/src/utils/template.js.map +0 -1
  475. /package/dist/{cjs/src/adapters → adapters}/MemoryAdapter.d.ts +0 -0
  476. /package/dist/{src/adapters → adapters}/MemoryAdapter.js +0 -0
  477. /package/dist/{cjs/src/adapters → adapters}/MongoAdapter.d.ts +0 -0
  478. /package/dist/{src/adapters → adapters}/MongoAdapter.js +0 -0
  479. /package/dist/{cjs/src/adapters → adapters}/OpenSearchAdapter.d.ts +0 -0
  480. /package/dist/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
  481. /package/dist/{cjs/src/adapters → adapters}/PostgreSQLAdapter.d.ts +0 -0
  482. /package/dist/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
  483. /package/dist/{cjs/src/adapters → adapters}/PrismaAdapter.d.ts +0 -0
  484. /package/dist/{cjs/src/adapters → adapters}/RedisAdapter.d.ts +0 -0
  485. /package/dist/{cjs/src/adapters → adapters}/SQLiteAdapter.d.ts +0 -0
  486. /package/dist/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
  487. /package/dist/{cjs/src/adapters → adapters}/index.d.ts +0 -0
  488. /package/dist/{src/adapters → adapters}/index.js +0 -0
  489. /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts +0 -0
  490. /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts.map +0 -0
  491. /package/dist/cjs/{src/adapters → adapters}/MemoryAdapter.js +0 -0
  492. /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts +0 -0
  493. /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts.map +0 -0
  494. /package/dist/cjs/{src/adapters → adapters}/MongoAdapter.js +0 -0
  495. /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts +0 -0
  496. /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts.map +0 -0
  497. /package/dist/cjs/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
  498. /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts +0 -0
  499. /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts.map +0 -0
  500. /package/dist/cjs/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
  501. /package/dist/{src → cjs}/adapters/PrismaAdapter.d.ts +0 -0
  502. /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts +0 -0
  503. /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts.map +0 -0
  504. /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts +0 -0
  505. /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts.map +0 -0
  506. /package/dist/cjs/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
  507. /package/dist/{src → cjs}/adapters/index.d.ts +0 -0
  508. /package/dist/{src → cjs}/adapters/index.d.ts.map +0 -0
  509. /package/dist/cjs/{src/adapters → adapters}/index.js +0 -0
  510. /package/dist/cjs/{src/constants → constants}/index.d.ts +0 -0
  511. /package/dist/{src → cjs}/constants/index.d.ts.map +0 -0
  512. /package/dist/cjs/{src/constants → constants}/index.js +0 -0
  513. /package/dist/cjs/{src/core → core}/Events.d.ts +0 -0
  514. /package/dist/{src → cjs}/core/Events.d.ts.map +0 -0
  515. /package/dist/cjs/{src/core → core}/Events.js +0 -0
  516. /package/dist/cjs/{src/core → core}/PersistenceManager.d.ts +0 -0
  517. /package/dist/{src → cjs}/core/PersistenceManager.d.ts.map +0 -0
  518. /package/dist/cjs/{src/core → core}/PersistenceManager.js +0 -0
  519. /package/dist/cjs/{src/core → core}/ResponseEngine.d.ts +0 -0
  520. /package/dist/cjs/{src/core → core}/SessionManager.d.ts +0 -0
  521. /package/dist/{src → cjs}/core/SessionManager.d.ts.map +0 -0
  522. /package/dist/cjs/{src/core → core}/SessionManager.js +0 -0
  523. /package/dist/cjs/{src/core → core}/ToolManager.d.ts +0 -0
  524. /package/dist/{src → cjs}/core/ToolManager.d.ts.map +0 -0
  525. /package/dist/cjs/{src/core → core}/ToolManager.js +0 -0
  526. /package/dist/cjs/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
  527. /package/dist/{src → cjs}/providers/AnthropicProvider.d.ts.map +0 -0
  528. /package/dist/cjs/{src/providers → providers}/GeminiProvider.d.ts +0 -0
  529. /package/dist/cjs/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
  530. /package/dist/{src → cjs}/providers/OpenAIProvider.d.ts.map +0 -0
  531. /package/dist/cjs/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
  532. /package/dist/{src → cjs}/providers/OpenRouterProvider.d.ts.map +0 -0
  533. /package/dist/cjs/{src/providers → providers}/index.d.ts +0 -0
  534. /package/dist/{src → cjs}/providers/index.d.ts.map +0 -0
  535. /package/dist/cjs/{src/providers → providers}/index.js +0 -0
  536. /package/dist/cjs/{src/types → types}/agent.js +0 -0
  537. /package/dist/cjs/{src/types → types}/ai.d.ts +0 -0
  538. /package/dist/{src → cjs}/types/ai.d.ts.map +0 -0
  539. /package/dist/cjs/{src/types → types}/ai.js +0 -0
  540. /package/dist/cjs/{src/types → types}/history.d.ts +0 -0
  541. /package/dist/{src → cjs}/types/history.d.ts.map +0 -0
  542. /package/dist/cjs/{src/types → types}/history.js +0 -0
  543. /package/dist/cjs/{src/types → types}/persistence.d.ts +0 -0
  544. /package/dist/{src → cjs}/types/persistence.d.ts.map +0 -0
  545. /package/dist/cjs/{src/types → types}/persistence.js +0 -0
  546. /package/dist/cjs/{src/types → types}/route.js +0 -0
  547. /package/dist/cjs/{src/types → types}/routing.d.ts +0 -0
  548. /package/dist/{src → cjs}/types/routing.d.ts.map +0 -0
  549. /package/dist/cjs/{src/types → types}/routing.js +0 -0
  550. /package/dist/{src → cjs}/types/routing.js.map +0 -0
  551. /package/dist/cjs/{src/types → types}/schema.d.ts +0 -0
  552. /package/dist/{src → cjs}/types/schema.d.ts.map +0 -0
  553. /package/dist/cjs/{src/types → types}/schema.js +0 -0
  554. /package/dist/{src → cjs}/types/schema.js.map +0 -0
  555. /package/dist/cjs/{src/types → types}/session.d.ts +0 -0
  556. /package/dist/{src → cjs}/types/session.d.ts.map +0 -0
  557. /package/dist/cjs/{src/types → types}/session.js +0 -0
  558. /package/dist/cjs/{src/types → types}/template.js +0 -0
  559. /package/dist/{src → cjs}/types/template.js.map +0 -0
  560. /package/dist/cjs/{src/types → types}/tool.d.ts +0 -0
  561. /package/dist/{src → cjs}/types/tool.d.ts.map +0 -0
  562. /package/dist/cjs/{src/types → types}/tool.js +0 -0
  563. /package/dist/cjs/{src/utils → utils}/clone.d.ts +0 -0
  564. /package/dist/{src → cjs}/utils/clone.d.ts.map +0 -0
  565. /package/dist/cjs/{src/utils → utils}/clone.js +0 -0
  566. /package/dist/cjs/{src/utils → utils}/event.d.ts +0 -0
  567. /package/dist/{src → cjs}/utils/event.d.ts.map +0 -0
  568. /package/dist/cjs/{src/utils → utils}/event.js +0 -0
  569. /package/dist/cjs/{src/utils → utils}/history.d.ts +0 -0
  570. /package/dist/{src → cjs}/utils/history.d.ts.map +0 -0
  571. /package/dist/cjs/{src/utils → utils}/history.js +0 -0
  572. /package/dist/cjs/{src/utils → utils}/id.d.ts +0 -0
  573. /package/dist/{src → cjs}/utils/id.d.ts.map +0 -0
  574. /package/dist/cjs/{src/utils → utils}/id.js +0 -0
  575. /package/dist/cjs/{src/utils → utils}/logger.d.ts +0 -0
  576. /package/dist/{src → cjs}/utils/logger.d.ts.map +0 -0
  577. /package/dist/cjs/{src/utils → utils}/logger.js +0 -0
  578. /package/dist/cjs/{src/utils → utils}/session.d.ts +0 -0
  579. /package/dist/{src → cjs}/utils/session.d.ts.map +0 -0
  580. /package/dist/cjs/{src/utils → utils}/session.js +0 -0
  581. /package/dist/{src/constants → constants}/index.d.ts +0 -0
  582. /package/dist/{src/constants → constants}/index.js +0 -0
  583. /package/dist/{src/core → core}/Events.d.ts +0 -0
  584. /package/dist/{src/core → core}/Events.js +0 -0
  585. /package/dist/{src/core → core}/PersistenceManager.d.ts +0 -0
  586. /package/dist/{src/core → core}/PersistenceManager.js +0 -0
  587. /package/dist/{src/core → core}/ResponseEngine.d.ts +0 -0
  588. /package/dist/{src/core → core}/SessionManager.d.ts +0 -0
  589. /package/dist/{src/core → core}/SessionManager.js +0 -0
  590. /package/dist/{src/core → core}/ToolManager.d.ts +0 -0
  591. /package/dist/{src/core → core}/ToolManager.js +0 -0
  592. /package/dist/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
  593. /package/dist/{src/providers → providers}/GeminiProvider.d.ts +0 -0
  594. /package/dist/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
  595. /package/dist/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
  596. /package/dist/{src/providers → providers}/index.d.ts +0 -0
  597. /package/dist/{src/providers → providers}/index.js +0 -0
  598. /package/dist/{src/types → types}/agent.js +0 -0
  599. /package/dist/{src/types → types}/ai.d.ts +0 -0
  600. /package/dist/{src/types → types}/ai.js +0 -0
  601. /package/dist/{src/types → types}/history.d.ts +0 -0
  602. /package/dist/{src/types → types}/history.js +0 -0
  603. /package/dist/{src/types → types}/persistence.d.ts +0 -0
  604. /package/dist/{src/types → types}/persistence.js +0 -0
  605. /package/dist/{src/types → types}/route.js +0 -0
  606. /package/dist/{src/types → types}/routing.d.ts +0 -0
  607. /package/dist/{src/types → types}/routing.js +0 -0
  608. /package/dist/{src/types → types}/schema.d.ts +0 -0
  609. /package/dist/{src/types → types}/schema.js +0 -0
  610. /package/dist/{src/types → types}/session.d.ts +0 -0
  611. /package/dist/{src/types → types}/session.js +0 -0
  612. /package/dist/{src/types → types}/template.js +0 -0
  613. /package/dist/{src/types → types}/tool.d.ts +0 -0
  614. /package/dist/{src/types → types}/tool.js +0 -0
  615. /package/dist/{src/utils → utils}/clone.d.ts +0 -0
  616. /package/dist/{src/utils → utils}/clone.js +0 -0
  617. /package/dist/{src/utils → utils}/event.d.ts +0 -0
  618. /package/dist/{src/utils → utils}/event.js +0 -0
  619. /package/dist/{src/utils → utils}/history.d.ts +0 -0
  620. /package/dist/{src/utils → utils}/history.js +0 -0
  621. /package/dist/{src/utils → utils}/id.d.ts +0 -0
  622. /package/dist/{src/utils → utils}/id.js +0 -0
  623. /package/dist/{src/utils → utils}/logger.d.ts +0 -0
  624. /package/dist/{src/utils → utils}/logger.js +0 -0
  625. /package/dist/{src/utils → utils}/session.d.ts +0 -0
  626. /package/dist/{src/utils → utils}/session.js +0 -0
@@ -8,6 +8,12 @@
8
8
  * 3. Session step management even for stepless conversations
9
9
  * 4. Always-on routing with context awareness
10
10
  * 5. Three-phase pipeline: PREPARATION → ROUTING → RESPONSE
11
+ * 6. NEW: Complex ConditionTemplate patterns for intelligent routing:
12
+ * - Mixed conditions: ["AI context", (ctx) => programmatic_check]
13
+ * - Route skipIf: Dynamic route exclusion based on message content
14
+ * - Function-only conditions: (ctx) => sophisticated_logic
15
+ * - String-only conditions: "simple AI context"
16
+ * - Fallback routing with programmatic logic
11
17
  */
12
18
 
13
19
  import {
@@ -119,7 +125,7 @@ const searchKnowledgeTool: Tool<CompanyContext, UnifiedData> = {
119
125
  ).message.toLowerCase();
120
126
 
121
127
  // Simple keyword matching (in real app, use vector search)
122
- const relevantFaqs = context.context.faqs.filter(
128
+ const relevantFaqs = toolContext.context.faqs.filter(
123
129
  (faq) =>
124
130
  faq.question.toLowerCase().includes(query) ||
125
131
  faq.answer.toLowerCase().includes(query)
@@ -262,12 +268,25 @@ const agent = new Agent<CompanyContext, UnifiedData>({
262
268
  agent.createRoute({
263
269
  title: "Company Information",
264
270
  description: "Answer general questions about Acme Corp",
265
- conditions: [
271
+ // Mixed condition: AI context + programmatic validation
272
+ when: [
266
273
  "User asks about the company",
267
274
  "Questions about company history, size, location",
268
275
  "When was the company founded",
269
276
  "How many employees",
270
277
  "Where is the headquarters",
278
+ (ctx) => {
279
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
280
+ return message.includes('company') || message.includes('acme') || message.includes('founded');
281
+ }
282
+ ],
283
+ // Skip if user is asking about specific products instead
284
+ skipIf: [
285
+ "user is asking about specific products or services",
286
+ (ctx) => {
287
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
288
+ return message.includes('widget') || message.includes('gadget') || message.includes('product');
289
+ }
271
290
  ],
272
291
  // Route-specific knowledge base for company information
273
292
  knowledgeBase: {
@@ -299,12 +318,18 @@ agent.createRoute({
299
318
  agent.createRoute({
300
319
  title: "Product Information",
301
320
  description: "Answer questions about products",
302
- conditions: [
303
- "User asks about products",
304
- "Questions about features, pricing, availability",
305
- "What products do you offer",
306
- "Tell me about your widgets",
307
- ],
321
+ // Function-only condition for programmatic logic
322
+ when: (ctx) => {
323
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
324
+ return message.includes('product') || message.includes('widget') ||
325
+ message.includes('gadget') || message.includes('price') ||
326
+ message.includes('feature');
327
+ },
328
+ // Skip if user is asking about company policies instead
329
+ skipIf: (ctx) => {
330
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
331
+ return message.includes('policy') || message.includes('return') || message.includes('warranty');
332
+ },
308
333
  // NO schema - just answering questions
309
334
  });
310
335
 
@@ -315,11 +340,25 @@ agent.createRoute({
315
340
  agent.createRoute({
316
341
  title: "Policy Information",
317
342
  description: "Answer questions about company policies",
318
- conditions: [
343
+ // Mixed condition: AI context + programmatic check
344
+ when: [
319
345
  "User asks about policies",
320
346
  "Return policy",
321
- "Shipping information",
347
+ "Shipping information",
322
348
  "Warranty questions",
349
+ (ctx) => {
350
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
351
+ return message.includes('policy') || message.includes('return') ||
352
+ message.includes('shipping') || message.includes('warranty');
353
+ }
354
+ ],
355
+ // Skip if user is asking about news or updates
356
+ skipIf: [
357
+ "user wants latest news or updates",
358
+ (ctx) => {
359
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
360
+ return message.includes('news') || message.includes('update') || message.includes('new');
361
+ }
323
362
  ],
324
363
  // NO schema
325
364
  });
@@ -330,12 +369,13 @@ agent.createRoute({
330
369
  const newsRoute = agent.createRoute({
331
370
  title: "Company News",
332
371
  description: "Share latest company news and updates",
333
- conditions: [
334
- "User asks about news",
335
- "What's new",
336
- "Recent updates",
337
- "Latest announcements",
338
- ],
372
+ // String-only condition for AI context
373
+ when: "User asks about news, updates, or recent announcements",
374
+ // Skip if user is asking about general FAQ topics
375
+ skipIf: (ctx) => {
376
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
377
+ return message.includes('how do i') || message.includes('can i') || message.includes('is there');
378
+ },
339
379
  });
340
380
 
341
381
  // Add tool to initial step to fetch news
@@ -351,11 +391,25 @@ fetchNews.nextStep({
351
391
  const faqRoute = agent.createRoute({
352
392
  title: "FAQ Search",
353
393
  description: "Search FAQs for relevant answers",
354
- conditions: [
394
+ // Mixed condition: AI context + programmatic pattern matching
395
+ when: [
355
396
  "User has a question that might be in FAQs",
356
397
  "How do I...",
357
398
  "Can I...",
358
399
  "Is there...",
400
+ (ctx) => {
401
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
402
+ return message.startsWith('how ') || message.startsWith('can ') ||
403
+ message.startsWith('is ') || message.includes('?');
404
+ }
405
+ ],
406
+ // Skip if user is clearly asking for news or company info
407
+ skipIf: [
408
+ "user wants company news or general company information",
409
+ (ctx) => {
410
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
411
+ return message.includes('news') || message.includes('company') || message.includes('founded');
412
+ }
359
413
  ],
360
414
  });
361
415
 
@@ -372,12 +426,15 @@ searchFaqs.nextStep({
372
426
  agent.createRoute({
373
427
  title: "General Conversation",
374
428
  description: "Handle general conversation or unclear questions",
375
- conditions: [
376
- "User message doesn't match other routes",
377
- "Greetings",
378
- "Small talk",
379
- "Unclear intent",
380
- ],
429
+ // Function-only condition for fallback logic
430
+ when: (ctx) => {
431
+ // This route catches everything that doesn't match other routes
432
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
433
+ return !message.includes('product') && !message.includes('policy') &&
434
+ !message.includes('news') && !message.includes('company');
435
+ },
436
+ // Never skip the fallback route
437
+ skipIf: ()=>false,
381
438
  });
382
439
 
383
440
  // Initial step is enough for fallback conversations
@@ -386,7 +443,27 @@ agent.createRoute({
386
443
  const feedbackRoute = agent.createRoute({
387
444
  title: "Collect Feedback",
388
445
  description: "Collect user feedback about their experience",
389
- conditions: ["User wants to leave feedback", "User seems satisfied or upset"],
446
+ // Mixed condition: AI context + sentiment analysis
447
+ when: [
448
+ "User wants to leave feedback",
449
+ "User seems satisfied or upset",
450
+ (ctx) => {
451
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
452
+ return message.includes('feedback') || message.includes('review') ||
453
+ message.includes('satisfied') || message.includes('disappointed');
454
+ }
455
+ ],
456
+ // Skip if user is in the middle of another task
457
+ skipIf: [
458
+ "user is actively getting help with something else",
459
+ (ctx) => {
460
+ const recentMessages = ctx.history?.filter((m) => "content" in m).slice(-3) || [];
461
+ return recentMessages.some(msg =>
462
+ (msg.content as string)?.toLowerCase().includes('help') ||
463
+ (msg.content as string)?.toLowerCase().includes('problem')
464
+ );
465
+ }
466
+ ],
390
467
  // NEW: Required fields for route completion
391
468
  requiredFields: ["rating", "comments"],
392
469
  // NEW: Optional fields
@@ -1,6 +1,13 @@
1
1
  /**
2
2
  * Persistent multi-turn onboarding agent example
3
3
  * Updated for v2 architecture with session step management and schema-first data extraction
4
+ *
5
+ * NEW: Enhanced with flexible ConditionTemplate patterns:
6
+ * - Mixed route conditions: ["AI context", (ctx) => state_check]
7
+ * - Route skipIf: Skip if onboarding already complete
8
+ * - Step skipIf: Enhanced conditional step skipping with AI context
9
+ * - Programmatic when conditions: (ctx) => data_validation
10
+ * - Performance patterns for condition evaluation
4
11
  */
5
12
 
6
13
  import {
@@ -327,7 +334,24 @@ function createPersistentOnboardingAgent(sessionId: string) {
327
334
  const onboardingRoute = agent.createRoute({
328
335
  title: "Business Onboarding",
329
336
  description: "Guide user through business information collection",
330
- conditions: ["User is onboarding their business"],
337
+ // Mixed condition: AI context + programmatic validation
338
+ when: [
339
+ "User is onboarding their business",
340
+ (ctx) => {
341
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
342
+ return message.includes('onboard') || message.includes('register') ||
343
+ message.includes('business') || message.includes('start');
344
+ }
345
+ ],
346
+ // Skip if user already has complete business info
347
+ skipIf: [
348
+ "business information already complete",
349
+ (ctx) => {
350
+ const data = ctx.data;
351
+ return !!(data?.businessName && data?.businessDescription &&
352
+ data?.industry && data?.contactEmail);
353
+ }
354
+ ],
331
355
  // NEW: Required fields for route completion
332
356
  requiredFields: ["businessName", "businessDescription"],
333
357
  // NEW: Optional fields that enhance the experience
@@ -342,7 +366,12 @@ function createPersistentOnboardingAgent(sessionId: string) {
342
366
  const collectBusinessInfo = onboardingRoute.initialStep.nextStep({
343
367
  prompt: "Ask for business name and a brief description",
344
368
  collect: ["businessName", "businessDescription"],
345
- skipIf: (data) => !!data.businessName && !!data.businessDescription,
369
+ // Mixed skipIf: AI context + programmatic check
370
+ skipIf: [
371
+ "business name and description already provided",
372
+ (ctx) => !!ctx.data?.businessName && !!ctx.data.businessDescription
373
+ ],
374
+ // String-only when condition for AI context
346
375
  when: "Need to collect basic business information first",
347
376
  });
348
377
 
@@ -350,14 +379,19 @@ function createPersistentOnboardingAgent(sessionId: string) {
350
379
  const saveBusiness = collectBusinessInfo.nextStep({
351
380
  tools: [saveBusinessInfo],
352
381
  requires: ["businessName", "businessDescription"],
353
- when: "Business name and description provided, save to database",
382
+ // Function-only when condition for programmatic logic
383
+ when: (ctx) => !!ctx.data?.businessName && !!ctx.data?.businessDescription,
354
384
  });
355
385
 
356
386
  // Step 3: Collect industry
357
387
  const collectIndustry = saveBusiness.nextStep({
358
388
  prompt: "Ask what industry the business operates in",
359
389
  collect: ["industry"],
360
- skipIf: (data) => !!data.industry,
390
+ // Mixed skipIf: AI context + programmatic logic
391
+ skipIf: [
392
+ "industry already specified",
393
+ (ctx) => !!ctx.data?.industry
394
+ ],
361
395
  });
362
396
 
363
397
  // Step 4: Save industry (tool execution)
@@ -370,7 +404,8 @@ function createPersistentOnboardingAgent(sessionId: string) {
370
404
  const collectContact = saveIndustryStep.nextStep({
371
405
  prompt: "Ask for their contact email",
372
406
  collect: ["contactEmail"],
373
- skipIf: (data) => !!data.contactEmail,
407
+ // Function-only skipIf for programmatic check
408
+ skipIf: (ctx) => !!ctx.data?.contactEmail,
374
409
  });
375
410
 
376
411
  // Step 6: Save contact (tool execution)
@@ -4,6 +4,14 @@
4
4
  *
5
5
  * Demonstrates how to use rules and prohibitions to control agent behavior
6
6
  * in different conversation routes (e.g., WhatsApp bot with different styles)
7
+ *
8
+ * NEW: Enhanced with complex ConditionTemplate patterns:
9
+ * - Mixed conditions: ["AI context", (ctx) => keyword_detection]
10
+ * - Route skipIf: Dynamic route exclusion based on message analysis
11
+ * - Function-only conditions: (ctx) => sophisticated_routing_logic
12
+ * - String-only conditions: "simple AI context for general chat"
13
+ * - Emergency routing with never-skip logic (skipIf: false)
14
+ * - Performance patterns for real-time condition evaluation
7
15
  */
8
16
 
9
17
  import { Agent, type History, END_ROUTE, OpenAIProvider } from "../../src";
@@ -112,7 +120,23 @@ const agent = new Agent<unknown, ServiceData>({
112
120
  agent.createRoute({
113
121
  title: "Quick Support",
114
122
  description: "Fast answers for common questions",
115
- conditions: ["User has a simple question", "User wants quick help"],
123
+ // Mixed condition: AI context + programmatic validation
124
+ when: [
125
+ "User has a simple question",
126
+ "User wants quick help",
127
+ (ctx) => {
128
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
129
+ return message.includes('quick') || message.includes('simple') || message.length < 50;
130
+ }
131
+ ],
132
+ // Skip if user seems to need detailed help
133
+ skipIf: [
134
+ "user needs detailed or complex assistance",
135
+ (ctx) => {
136
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
137
+ return message.includes('detailed') || message.includes('complex') || message.length > 100;
138
+ }
139
+ ],
116
140
  rules: [
117
141
  "Keep messages extremely short (1-2 lines maximum)",
118
142
  "Use bullet points for lists",
@@ -130,9 +154,21 @@ agent.createRoute({
130
154
  agent.createRoute({
131
155
  title: "Sales Consultation",
132
156
  description: "Help customer discover needs and present solutions",
133
- conditions: [
134
- "User is interested in buying",
135
- "User wants product information",
157
+ // Function-only condition for programmatic sales detection
158
+ when: (ctx) => {
159
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
160
+ return message.includes('buy') || message.includes('purchase') ||
161
+ message.includes('price') || message.includes('cost') ||
162
+ message.includes('product') || message.includes('interested');
163
+ },
164
+ // Skip if user is having technical issues
165
+ skipIf: [
166
+ "user has technical problems that need solving first",
167
+ (ctx) => {
168
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
169
+ return message.includes('broken') || message.includes('error') ||
170
+ message.includes('not working') || message.includes('problem');
171
+ }
136
172
  ],
137
173
  rules: [
138
174
  "Ask open-ended questions to discover needs",
@@ -169,7 +205,22 @@ agent.createRoute({
169
205
  agent.createRoute({
170
206
  title: "Technical Support",
171
207
  description: "Help with technical issues and troubleshooting",
172
- conditions: ["User has technical problem", "User needs step-by-step help"],
208
+ // Mixed condition: AI context + technical keyword detection
209
+ when: [
210
+ "User has technical problem",
211
+ "User needs step-by-step help",
212
+ (ctx) => {
213
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
214
+ return message.includes('help') || message.includes('problem') ||
215
+ message.includes('error') || message.includes('not working') ||
216
+ message.includes('broken') || message.includes('fix');
217
+ }
218
+ ],
219
+ // Skip if user is just browsing or asking about sales
220
+ skipIf: (ctx) => {
221
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
222
+ return message.includes('price') || message.includes('buy') || message.includes('cost');
223
+ },
173
224
  rules: [
174
225
  "Provide clear, numbered steps",
175
226
  "Use simple language for technical concepts",
@@ -209,7 +260,19 @@ techSupportRoute.initialStep
209
260
  agent.createRoute({
210
261
  title: "Emergency Support",
211
262
  description: "Handle urgent customer issues",
212
- conditions: ["Customer is frustrated", "Urgent issue", "Service down"],
263
+ // Mixed condition: AI context + urgency detection
264
+ when: [
265
+ "Customer is frustrated",
266
+ "Urgent issue",
267
+ "Service down",
268
+ (ctx) => {
269
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
270
+ const urgentWords = ['urgent', 'emergency', 'critical', 'down', 'broken', 'frustrated', 'angry'];
271
+ return urgentWords.some(word => message.includes(word)) || message.includes('!!!');
272
+ }
273
+ ],
274
+ // Never skip emergency support
275
+ skipIf: ()=>false,
213
276
  rules: [
214
277
  "Acknowledge the urgency immediately",
215
278
  "Express empathy and understanding",
@@ -229,7 +292,14 @@ agent.createRoute({
229
292
  agent.createRoute({
230
293
  title: "General Chat",
231
294
  description: "Casual conversation and general questions",
232
- conditions: ["User is just chatting", "Greeting", "General question"],
295
+ // String-only condition for AI context
296
+ when: "User is just chatting, greeting, or asking general questions",
297
+ // Skip if user has specific needs that other routes can handle
298
+ skipIf: (ctx) => {
299
+ const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
300
+ return message.includes('help') || message.includes('buy') ||
301
+ message.includes('problem') || message.includes('urgent');
302
+ },
233
303
  rules: [
234
304
  "Be friendly and conversational",
235
305
  "Use emojis naturally 😊",
@@ -262,7 +332,7 @@ async function demonstrateRulesAndProhibitions() {
262
332
  agent.createRoute({
263
333
  title: "Quick Support",
264
334
  description: "Fast answers for common questions",
265
- conditions: ["User has a simple question", "User wants quick help"],
335
+ when: ["User has a simple question", "User wants quick help"],
266
336
  rules: [
267
337
  "Keep messages extremely short (1-2 lines maximum)",
268
338
  "Use bullet points for lists",
@@ -280,7 +350,7 @@ async function demonstrateRulesAndProhibitions() {
280
350
  agent.createRoute({
281
351
  title: "Sales Consultation",
282
352
  description: "Help customer discover needs and present solutions",
283
- conditions: [
353
+ when: [
284
354
  "User is interested in buying",
285
355
  "User wants product information",
286
356
  ],
@@ -303,7 +373,7 @@ async function demonstrateRulesAndProhibitions() {
303
373
  agent.createRoute({
304
374
  title: "Technical Support",
305
375
  description: "Help with technical issues and troubleshooting",
306
- conditions: ["User has technical problem", "User needs step-by-step help"],
376
+ when: ["User has technical problem", "User needs step-by-step help"],
307
377
  rules: [
308
378
  "Provide clear, numbered steps",
309
379
  "Use simple language for technical concepts",
@@ -343,7 +413,7 @@ async function demonstrateRulesAndProhibitions() {
343
413
  agent.createRoute({
344
414
  title: "Emergency Support",
345
415
  description: "Handle urgent customer issues",
346
- conditions: ["Customer is frustrated", "Urgent issue", "Service down"],
416
+ when: ["Customer is frustrated", "Urgent issue", "Service down"],
347
417
  rules: [
348
418
  "Acknowledge the urgency immediately",
349
419
  "Express empathy and understanding",
@@ -363,7 +433,7 @@ async function demonstrateRulesAndProhibitions() {
363
433
  agent.createRoute({
364
434
  title: "General Chat",
365
435
  description: "Casual conversation and general questions",
366
- conditions: ["User is just chatting", "Greeting", "General question"],
436
+ when: ["User is just chatting", "Greeting", "General question"],
367
437
  rules: [
368
438
  "Be friendly and conversational",
369
439
  "Use emojis naturally 😊",
@@ -361,7 +361,7 @@ async function modernStreamingWithRoutes() {
361
361
  const supportRoute = agent.createRoute({
362
362
  title: "Product Support",
363
363
  description: "Help users with product questions",
364
- conditions: ["User asks about product features or issues"],
364
+ when: ["User asks about product features or issues"],
365
365
  });
366
366
 
367
367
  supportRoute.initialStep.nextStep({
@@ -372,7 +372,7 @@ async function modernStreamingWithRoutes() {
372
372
  agent.createRoute({
373
373
  title: "Collect Feedback",
374
374
  description: "Collect user feedback on their support experience",
375
- conditions: ["User wants to provide feedback"],
375
+ when: ["User wants to provide feedback"],
376
376
  // NEW: Required fields for route completion
377
377
  requiredFields: ["rating"],
378
378
  // NEW: Optional fields
@@ -135,7 +135,7 @@ For example: "Research the impact of artificial intelligence on healthcare, comp
135
135
  const askTopic = researchRoute.initialStep.nextStep({
136
136
  prompt: "What topic would you like me to research?",
137
137
  collect: ["topic"],
138
- skipIf: (data) => !!data.topic,
138
+ skipIf: (ctx) => !!ctx.data?.topic,
139
139
  });
140
140
 
141
141
  const askDepth = askTopic.nextStep({
@@ -143,14 +143,14 @@ const askDepth = askTopic.nextStep({
143
143
  "How deep should I go with this research? (overview, detailed, or comprehensive)",
144
144
  collect: ["depth"],
145
145
  requires: ["topic"],
146
- skipIf: (data) => !!data.depth,
146
+ skipIf: (ctx) => !!ctx.data?.depth,
147
147
  });
148
148
 
149
149
  const askSources = askDepth.nextStep({
150
150
  prompt: "How many sources should I analyze? (1-20, default is 5)",
151
151
  collect: ["sources"],
152
152
  requires: ["topic"],
153
- skipIf: (data) => data.sources !== undefined,
153
+ skipIf: (ctx) => ctx.data?.sources !== undefined,
154
154
  });
155
155
 
156
156
  const askFormat = askSources.nextStep({
@@ -158,7 +158,7 @@ const askFormat = askSources.nextStep({
158
158
  "What format would you prefer for the results? (summary, bullet_points, or structured)",
159
159
  collect: ["format"],
160
160
  requires: ["topic"],
161
- skipIf: (data) => !!data.format,
161
+ skipIf: (ctx) => !!ctx.data?.format,
162
162
  });
163
163
 
164
164
  askFormat.nextStep({
@@ -131,7 +131,7 @@ async function main() {
131
131
  const weatherRoute = agent.createRoute({
132
132
  title: "Check Weather",
133
133
  description: "Help user check weather for a location",
134
- conditions: ["User wants to know the weather"],
134
+ when: ["User wants to know the weather"],
135
135
  });
136
136
 
137
137
  // Step 1: Collect location