@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
@@ -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
@@ -0,0 +1,365 @@
1
+ /**
2
+ * Function-Only Conditions Example
3
+ *
4
+ * This example demonstrates using function-only conditions for programmatic routing.
5
+ * Function conditions are perfect when you need precise, deterministic routing logic
6
+ * based on data, state, or complex business rules.
7
+ *
8
+ * Key concepts:
9
+ * - Function conditions provide programmatic evaluation only
10
+ * - Return boolean values for routing decisions
11
+ * - Perfect for data-driven routing scenarios
12
+ * - Ideal for complex business logic and state-based routing
13
+ */
14
+
15
+ import {
16
+ Agent,
17
+ GeminiProvider,
18
+ type Guideline,
19
+ } from "../../src/index";
20
+
21
+ // Context for an e-commerce system
22
+ interface EcommerceContext {
23
+ userId: string;
24
+ userTier: "bronze" | "silver" | "gold" | "platinum";
25
+ accountBalance: number;
26
+ region: string;
27
+ isBusinessAccount: boolean;
28
+ }
29
+
30
+ // Order data schema
31
+ interface OrderData {
32
+ productId?: string;
33
+ quantity?: number;
34
+ totalAmount?: number;
35
+ shippingMethod?: "standard" | "express" | "overnight";
36
+ paymentMethod?: "credit" | "debit" | "paypal" | "crypto";
37
+ discountApplied?: boolean;
38
+ orderComplete?: boolean;
39
+ }
40
+
41
+ const orderSchema = {
42
+ type: "object",
43
+ properties: {
44
+ productId: { type: "string" },
45
+ quantity: { type: "number", minimum: 1 },
46
+ totalAmount: { type: "number", minimum: 0 },
47
+ shippingMethod: { type: "string", enum: ["standard", "express", "overnight"] },
48
+ paymentMethod: { type: "string", enum: ["credit", "debit", "paypal", "crypto"] },
49
+ discountApplied: { type: "boolean" },
50
+ orderComplete: { type: "boolean" },
51
+ },
52
+ };
53
+
54
+ // Create agent with function-only condition examples
55
+ const agent = new Agent<EcommerceContext, OrderData>({
56
+ name: "EcommerceBot",
57
+ description: "An e-commerce bot that uses programmatic logic for routing decisions",
58
+ provider: new GeminiProvider({
59
+ apiKey: process.env.GEMINI_API_KEY || "demo-key",
60
+ model: "models/gemini-2.5-flash",
61
+ }),
62
+ context: {
63
+ userId: "user_12345",
64
+ userTier: "gold",
65
+ accountBalance: 1500.00,
66
+ region: "US",
67
+ isBusinessAccount: false,
68
+ },
69
+ schema: orderSchema,
70
+ });
71
+
72
+ // Guidelines with function-only conditions for programmatic logic
73
+ const guidelines: Guideline<EcommerceContext>[] = [
74
+ {
75
+ // Function-only condition - check user tier for premium features
76
+ condition: (ctx) => ctx.context?.userTier === "platinum",
77
+ action: "Offer premium features like white-glove service, priority support, and exclusive products",
78
+ tags: ["premium", "vip"],
79
+ },
80
+ {
81
+ // Function-only condition - check account balance for payment options
82
+ condition: (ctx) => (ctx.context?.accountBalance || 0) < 100,
83
+ action: "Suggest payment plans or financing options for large purchases",
84
+ tags: ["financing", "payment"],
85
+ },
86
+ {
87
+ // Function-only condition - check business account status
88
+ condition: (ctx) => ctx.context?.isBusinessAccount === true,
89
+ action: "Offer bulk pricing, invoicing options, and business-specific features",
90
+ tags: ["business", "bulk"],
91
+ },
92
+ ];
93
+
94
+ // Add guidelines to agent
95
+ guidelines.forEach(guideline => agent.createGuideline(guideline));
96
+
97
+ // Route 1: VIP Customer Route - Function-only condition
98
+ agent.createRoute({
99
+ title: "VIP Customer Service",
100
+ description: "Special handling for premium customers",
101
+ // Function-only condition - programmatic tier check
102
+ when: (ctx) => ctx.context?.userTier === "platinum" || ctx.context?.userTier === "gold",
103
+ // Skip if customer has active issues
104
+ skipIf: (ctx) => (ctx.data?.totalAmount || 0) > (ctx.context?.accountBalance || 0),
105
+ steps: [
106
+ {
107
+ id: "vip_greeting",
108
+ description: "Provide VIP greeting and priority service",
109
+ prompt: "Welcome back! As a valued VIP customer, you have access to our premium services. How can I assist you today?",
110
+ },
111
+ ],
112
+ });
113
+
114
+ // Route 2: Large Order Processing - Function-only condition
115
+ agent.createRoute({
116
+ title: "Large Order Processing",
117
+ description: "Handle high-value orders with special processing",
118
+ // Function-only condition - check order value
119
+ when: (ctx) => (ctx.data?.totalAmount || 0) > 1000,
120
+ // Skip if insufficient balance
121
+ skipIf: (ctx) => (ctx.data?.totalAmount || 0) > (ctx.context?.accountBalance || 0) * 2,
122
+ requiredFields: ["productId", "quantity", "totalAmount"],
123
+ optionalFields: ["shippingMethod", "paymentMethod"],
124
+ steps: [
125
+ {
126
+ id: "verify_large_order",
127
+ description: "Verify large order details",
128
+ prompt: "I see you're placing a large order. Let me verify the details and check for any available discounts.",
129
+ collect: ["productId", "quantity", "totalAmount"],
130
+ },
131
+ {
132
+ id: "apply_bulk_discount",
133
+ description: "Apply bulk discounts if eligible",
134
+ prompt: "Based on your order size, you're eligible for bulk pricing. Let me apply the best available discount.",
135
+ requires: ["totalAmount"],
136
+ },
137
+ ],
138
+ });
139
+
140
+ // Route 3: Business Account Route - Function-only condition
141
+ agent.createRoute({
142
+ title: "Business Account Services",
143
+ description: "Specialized services for business customers",
144
+ // Function-only condition - check business account status
145
+ when: (ctx) => ctx.context?.isBusinessAccount === true,
146
+ // Skip if personal shopping (small quantities)
147
+ skipIf: (ctx) => (ctx.data?.quantity || 0) < 10,
148
+ steps: [
149
+ {
150
+ id: "business_options",
151
+ description: "Present business-specific options",
152
+ prompt: "I see you're shopping with a business account. Would you like to see bulk pricing, invoicing options, or set up recurring orders?",
153
+ },
154
+ ],
155
+ });
156
+
157
+ // Route 4: Regional Compliance Route - Function-only condition
158
+ agent.createRoute({
159
+ title: "Regional Compliance",
160
+ description: "Handle region-specific requirements and restrictions",
161
+ // Function-only condition - check region for compliance
162
+ when: (ctx) => ctx.context?.region === "EU" || ctx.context?.region === "CA",
163
+ // Skip if already compliant
164
+ skipIf: (ctx) => ctx.data?.orderComplete === true,
165
+ steps: [
166
+ {
167
+ id: "compliance_check",
168
+ description: "Verify regional compliance requirements",
169
+ prompt: "I need to verify some regional compliance requirements for your order. This will just take a moment.",
170
+ },
171
+ ],
172
+ });
173
+
174
+ // Route 5: Payment Method Route - Function-only condition
175
+ agent.createRoute({
176
+ title: "Payment Processing",
177
+ description: "Handle payment method selection and processing",
178
+ // Function-only condition - check if payment method is needed
179
+ when: (ctx) => !ctx.data?.paymentMethod && (ctx.data?.totalAmount || 0) > 0,
180
+ // Skip if order is already complete
181
+ skipIf: (ctx) => ctx.data?.orderComplete === true,
182
+ requiredFields: ["paymentMethod"],
183
+ steps: [
184
+ {
185
+ id: "select_payment_method",
186
+ description: "Help customer select payment method",
187
+ prompt: "What payment method would you like to use for this order?",
188
+ collect: ["paymentMethod"],
189
+ },
190
+ {
191
+ id: "process_payment",
192
+ description: "Process the payment",
193
+ prompt: "Processing your payment now. Please wait a moment...",
194
+ requires: ["paymentMethod", "totalAmount"],
195
+ },
196
+ ],
197
+ });
198
+
199
+ // Route 6: Shipping Options Route - Function-only condition
200
+ agent.createRoute({
201
+ title: "Shipping Selection",
202
+ description: "Handle shipping method selection based on customer tier and order value",
203
+ // Function-only condition - check if shipping is needed
204
+ when: (ctx) => Boolean(!ctx.data?.shippingMethod && ctx.data?.productId),
205
+ // Skip if digital product (no shipping needed)
206
+ skipIf: (ctx) => Boolean(ctx.data?.productId?.startsWith("digital_")),
207
+ optionalFields: ["shippingMethod"],
208
+ steps: [
209
+ {
210
+ id: "shipping_options",
211
+ description: "Present shipping options based on customer tier",
212
+ prompt: "Let me show you the available shipping options for your order.",
213
+ collect: ["shippingMethod"],
214
+ // Function-only when condition for step
215
+ when: (ctx) => {
216
+ // VIP customers get free express shipping
217
+ if (ctx.context?.userTier === "platinum" || ctx.context?.userTier === "gold") {
218
+ return true;
219
+ }
220
+ // Regular customers need to choose
221
+ return (ctx.data?.totalAmount || 0) > 50;
222
+ },
223
+ },
224
+ ],
225
+ });
226
+
227
+ // Route 7: Order Completion Route - Function-only condition
228
+ agent.createRoute({
229
+ title: "Order Completion",
230
+ description: "Finalize and complete the order",
231
+ // Function-only condition - check if order is ready to complete
232
+ when: (ctx) => {
233
+ return !!(ctx.data?.productId &&
234
+ ctx.data?.quantity &&
235
+ ctx.data?.totalAmount &&
236
+ ctx.data?.paymentMethod &&
237
+ !ctx.data?.orderComplete);
238
+ },
239
+ // Never skip order completion
240
+ skipIf: ()=>false,
241
+ steps: [
242
+ {
243
+ id: "finalize_order",
244
+ description: "Complete the order",
245
+ prompt: "Perfect! Let me finalize your order now.",
246
+ requires: ["productId", "quantity", "totalAmount", "paymentMethod"],
247
+ },
248
+ ],
249
+ });
250
+
251
+ // Demonstration function
252
+ async function demonstrateFunctionOnlyConditions() {
253
+ console.log("=== Function-Only Conditions Demo ===\n");
254
+ console.log("This demo shows how function conditions enable precise, programmatic routing decisions.\n");
255
+
256
+ const testScenarios = [
257
+ {
258
+ name: "VIP Customer",
259
+ context: { userTier: "platinum" as const, accountBalance: 5000, region: "US", isBusinessAccount: false },
260
+ message: "I'd like to place an order",
261
+ expectedRoute: "VIP Customer Service"
262
+ },
263
+ {
264
+ name: "Large Order",
265
+ context: { userTier: "silver" as const, accountBalance: 2000, region: "US", isBusinessAccount: false },
266
+ data: { totalAmount: 1500 },
267
+ message: "I want to buy this expensive item",
268
+ expectedRoute: "Large Order Processing"
269
+ },
270
+ {
271
+ name: "Business Account",
272
+ context: { userTier: "bronze" as const, accountBalance: 1000, region: "US", isBusinessAccount: true },
273
+ message: "I need to place a bulk order for my company",
274
+ expectedRoute: "Business Account Services"
275
+ },
276
+ {
277
+ name: "EU Customer",
278
+ context: { userTier: "silver" as const, accountBalance: 800, region: "EU", isBusinessAccount: false },
279
+ message: "I want to place an order",
280
+ expectedRoute: "Regional Compliance"
281
+ },
282
+ {
283
+ name: "Payment Needed",
284
+ context: { userTier: "bronze" as const, accountBalance: 500, region: "US", isBusinessAccount: false },
285
+ data: { productId: "prod_123", quantity: 2, totalAmount: 200 },
286
+ message: "How do I pay for this?",
287
+ expectedRoute: "Payment Processing"
288
+ },
289
+ {
290
+ name: "Shipping Selection",
291
+ context: { userTier: "gold" as const, accountBalance: 1200, region: "US", isBusinessAccount: false },
292
+ data: { productId: "prod_456", quantity: 1, totalAmount: 150, paymentMethod: "credit" as const },
293
+ message: "What shipping options do I have?",
294
+ expectedRoute: "Shipping Selection"
295
+ },
296
+ ];
297
+
298
+ for (const scenario of testScenarios) {
299
+ console.log(`🔍 Testing: ${scenario.name}`);
300
+ console.log(`📝 Message: "${scenario.message}"`);
301
+
302
+ // Create agent with specific context for this scenario
303
+ const testAgent = new Agent<EcommerceContext, OrderData>({
304
+ name: "TestBot",
305
+ description: "Test bot for function conditions",
306
+ provider: new GeminiProvider({
307
+ apiKey: process.env.GEMINI_API_KEY || "demo-key",
308
+ model: "models/gemini-2.5-flash",
309
+ }),
310
+ context: {
311
+ userId: "test_user",
312
+ ...scenario.context,
313
+ },
314
+ schema: orderSchema,
315
+ });
316
+
317
+ // Copy routes from main agent
318
+ agent.getRoutes().forEach(route => {
319
+ testAgent.createRoute(route.toOptions());
320
+ });
321
+
322
+ try {
323
+ const response = await testAgent.respond({
324
+ history: [
325
+ {
326
+ role: "user",
327
+ content: scenario.message,
328
+ name: "Customer",
329
+ },
330
+ ],
331
+ session: scenario.data ? { id: "test-scenario", data: scenario.data } : undefined,
332
+ });
333
+
334
+ console.log(`🎯 Routed to: ${response.session?.currentRoute?.title || "No route"}`);
335
+ console.log(`✅ Expected: ${scenario.expectedRoute}`);
336
+ console.log(`🤖 Response: ${response.message.substring(0, 100)}...`);
337
+ console.log();
338
+ } catch (error) {
339
+ console.log(`❌ Error: ${error}`);
340
+ console.log();
341
+ }
342
+ }
343
+
344
+ console.log("💡 Key Benefits of Function-Only Conditions:");
345
+ console.log(" - Precise, deterministic routing logic");
346
+ console.log(" - Access to full context and data for decisions");
347
+ console.log(" - Complex business rules and state-based routing");
348
+ console.log(" - Type-safe condition evaluation");
349
+ console.log(" - Perfect for data-driven applications");
350
+ }
351
+
352
+ // Run demonstration
353
+ async function main() {
354
+ try {
355
+ await demonstrateFunctionOnlyConditions();
356
+ } catch (error) {
357
+ console.error("Error:", error);
358
+ }
359
+ }
360
+
361
+ if (import.meta.url === `file://${process.argv[1]}`) {
362
+ main().catch(console.error);
363
+ }
364
+
365
+ export { agent, demonstrateFunctionOnlyConditions };