@falai/agent 1.2.8 → 2.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 (522) hide show
  1. package/README.md +40 -886
  2. package/dist/adapters/MemoryAdapter.js +2 -2
  3. package/dist/adapters/MemoryAdapter.js.map +1 -1
  4. package/dist/adapters/MongoAdapter.js +2 -2
  5. package/dist/adapters/MongoAdapter.js.map +1 -1
  6. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
  7. package/dist/adapters/OpenSearchAdapter.js +9 -7
  8. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  9. package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
  10. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  11. package/dist/adapters/PostgreSQLAdapter.js +25 -9
  12. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  13. package/dist/adapters/PrismaAdapter.js +5 -5
  14. package/dist/adapters/PrismaAdapter.js.map +1 -1
  15. package/dist/adapters/RedisAdapter.js +2 -2
  16. package/dist/adapters/RedisAdapter.js.map +1 -1
  17. package/dist/adapters/SQLiteAdapter.d.ts +17 -0
  18. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  19. package/dist/adapters/SQLiteAdapter.js +30 -11
  20. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  21. package/dist/cjs/adapters/MemoryAdapter.js +2 -2
  22. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  23. package/dist/cjs/adapters/MongoAdapter.js +2 -2
  24. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  25. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  26. package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
  27. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  28. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
  29. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  30. package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
  31. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  32. package/dist/cjs/adapters/PrismaAdapter.js +5 -5
  33. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  34. package/dist/cjs/adapters/RedisAdapter.js +2 -2
  35. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  36. package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
  37. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  38. package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
  39. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  40. package/dist/cjs/constants/index.d.ts +0 -9
  41. package/dist/cjs/constants/index.d.ts.map +1 -1
  42. package/dist/cjs/constants/index.js +2 -11
  43. package/dist/cjs/constants/index.js.map +1 -1
  44. package/dist/cjs/core/Agent.d.ts +119 -153
  45. package/dist/cjs/core/Agent.d.ts.map +1 -1
  46. package/dist/cjs/core/Agent.js +471 -324
  47. package/dist/cjs/core/Agent.js.map +1 -1
  48. package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
  49. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
  50. package/dist/cjs/core/AutoChainExecutor.js +297 -0
  51. package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
  52. package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
  53. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
  54. package/dist/cjs/core/BranchEvaluator.js +130 -0
  55. package/dist/cjs/core/BranchEvaluator.js.map +1 -0
  56. package/dist/cjs/core/DirectiveBus.d.ts +88 -0
  57. package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
  58. package/dist/cjs/core/DirectiveBus.js +196 -0
  59. package/dist/cjs/core/DirectiveBus.js.map +1 -0
  60. package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
  61. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
  62. package/dist/cjs/core/DirectiveChainTracker.js +121 -0
  63. package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
  64. package/dist/cjs/core/Flow.d.ts +186 -0
  65. package/dist/cjs/core/Flow.d.ts.map +1 -0
  66. package/dist/cjs/core/Flow.js +550 -0
  67. package/dist/cjs/core/Flow.js.map +1 -0
  68. package/dist/cjs/core/FlowRouter.d.ts +182 -0
  69. package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
  70. package/dist/cjs/core/{RoutingEngine.js → FlowRouter.js} +323 -306
  71. package/dist/cjs/core/FlowRouter.js.map +1 -0
  72. package/dist/cjs/core/PersistenceManager.d.ts +2 -2
  73. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  74. package/dist/cjs/core/PersistenceManager.js +7 -7
  75. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  76. package/dist/cjs/core/PromptComposer.d.ts +21 -8
  77. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  78. package/dist/cjs/core/PromptComposer.js +182 -105
  79. package/dist/cjs/core/PromptComposer.js.map +1 -1
  80. package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
  81. package/dist/cjs/core/PromptSectionCache.js +1 -1
  82. package/dist/cjs/core/ResponseEngine.d.ts +18 -8
  83. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  84. package/dist/cjs/core/ResponseEngine.js +38 -36
  85. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  86. package/dist/cjs/core/ResponseModal.d.ts +73 -56
  87. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  88. package/dist/cjs/core/ResponseModal.js +1191 -1014
  89. package/dist/cjs/core/ResponseModal.js.map +1 -1
  90. package/dist/cjs/core/ResponsePipeline.d.ts +124 -26
  91. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  92. package/dist/cjs/core/ResponsePipeline.js +509 -136
  93. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  94. package/dist/cjs/core/SignalEvaluator.d.ts +86 -0
  95. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -0
  96. package/dist/cjs/core/SignalEvaluator.js +333 -0
  97. package/dist/cjs/core/SignalEvaluator.js.map +1 -0
  98. package/dist/cjs/core/SignalProcessor.d.ts +152 -0
  99. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -0
  100. package/dist/cjs/core/SignalProcessor.js +562 -0
  101. package/dist/cjs/core/SignalProcessor.js.map +1 -0
  102. package/dist/cjs/core/Step.d.ts +43 -32
  103. package/dist/cjs/core/Step.d.ts.map +1 -1
  104. package/dist/cjs/core/Step.js +221 -126
  105. package/dist/cjs/core/Step.js.map +1 -1
  106. package/dist/cjs/core/StreamingToolExecutor.d.ts +2 -2
  107. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
  108. package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
  109. package/dist/cjs/core/ToolManager.d.ts +44 -13
  110. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  111. package/dist/cjs/core/ToolManager.js +174 -91
  112. package/dist/cjs/core/ToolManager.js.map +1 -1
  113. package/dist/cjs/core/createAgent.d.ts +35 -0
  114. package/dist/cjs/core/createAgent.d.ts.map +1 -0
  115. package/dist/cjs/core/createAgent.js +39 -0
  116. package/dist/cjs/core/createAgent.js.map +1 -0
  117. package/dist/cjs/core/flow-namespace.d.ts +49 -0
  118. package/dist/cjs/core/flow-namespace.d.ts.map +1 -0
  119. package/dist/cjs/core/flow-namespace.js +171 -0
  120. package/dist/cjs/core/flow-namespace.js.map +1 -0
  121. package/dist/cjs/index.d.ts +11 -14
  122. package/dist/cjs/index.d.ts.map +1 -1
  123. package/dist/cjs/index.js +18 -22
  124. package/dist/cjs/index.js.map +1 -1
  125. package/dist/cjs/providers/AnthropicProvider.d.ts +1 -1
  126. package/dist/cjs/providers/AnthropicProvider.js +1 -1
  127. package/dist/cjs/providers/GeminiProvider.d.ts +1 -1
  128. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  129. package/dist/cjs/providers/GeminiProvider.js +1 -1
  130. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  131. package/dist/cjs/providers/OpenAIProvider.d.ts +1 -1
  132. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  133. package/dist/cjs/providers/OpenAIProvider.js +1 -1
  134. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  135. package/dist/cjs/types/agent.d.ts +183 -54
  136. package/dist/cjs/types/agent.d.ts.map +1 -1
  137. package/dist/cjs/types/agent.js +0 -6
  138. package/dist/cjs/types/agent.js.map +1 -1
  139. package/dist/cjs/types/ai.d.ts +3 -3
  140. package/dist/cjs/types/ai.d.ts.map +1 -1
  141. package/dist/cjs/types/errors.d.ts +15 -0
  142. package/dist/cjs/types/errors.d.ts.map +1 -0
  143. package/dist/cjs/types/errors.js +22 -0
  144. package/dist/cjs/types/errors.js.map +1 -0
  145. package/dist/cjs/types/flow.d.ts +513 -0
  146. package/dist/cjs/types/flow.d.ts.map +1 -0
  147. package/dist/cjs/types/{route.js → flow.js} +2 -2
  148. package/dist/cjs/types/flow.js.map +1 -0
  149. package/dist/cjs/types/index.d.ts +7 -6
  150. package/dist/cjs/types/index.d.ts.map +1 -1
  151. package/dist/cjs/types/index.js +6 -2
  152. package/dist/cjs/types/index.js.map +1 -1
  153. package/dist/cjs/types/persistence.d.ts +11 -7
  154. package/dist/cjs/types/persistence.d.ts.map +1 -1
  155. package/dist/cjs/types/routing.d.ts +1 -1
  156. package/dist/cjs/types/routing.d.ts.map +1 -1
  157. package/dist/cjs/types/session.d.ts +24 -23
  158. package/dist/cjs/types/session.d.ts.map +1 -1
  159. package/dist/cjs/types/signals.d.ts +248 -0
  160. package/dist/cjs/types/signals.d.ts.map +1 -0
  161. package/dist/cjs/types/signals.js +11 -0
  162. package/dist/cjs/types/signals.js.map +1 -0
  163. package/dist/cjs/types/template.d.ts +2 -8
  164. package/dist/cjs/types/template.d.ts.map +1 -1
  165. package/dist/cjs/types/tool.d.ts +36 -29
  166. package/dist/cjs/types/tool.d.ts.map +1 -1
  167. package/dist/cjs/types/tool.js +1 -1
  168. package/dist/cjs/types/tool.js.map +1 -1
  169. package/dist/cjs/utils/condition.d.ts +7 -1
  170. package/dist/cjs/utils/condition.d.ts.map +1 -1
  171. package/dist/cjs/utils/condition.js.map +1 -1
  172. package/dist/cjs/utils/id.d.ts +13 -5
  173. package/dist/cjs/utils/id.d.ts.map +1 -1
  174. package/dist/cjs/utils/id.js +24 -10
  175. package/dist/cjs/utils/id.js.map +1 -1
  176. package/dist/cjs/utils/index.d.ts +2 -2
  177. package/dist/cjs/utils/index.d.ts.map +1 -1
  178. package/dist/cjs/utils/index.js +7 -3
  179. package/dist/cjs/utils/index.js.map +1 -1
  180. package/dist/cjs/utils/session.d.ts +44 -5
  181. package/dist/cjs/utils/session.d.ts.map +1 -1
  182. package/dist/cjs/utils/session.js +197 -38
  183. package/dist/cjs/utils/session.js.map +1 -1
  184. package/dist/constants/index.d.ts +0 -9
  185. package/dist/constants/index.d.ts.map +1 -1
  186. package/dist/constants/index.js +3 -9
  187. package/dist/constants/index.js.map +1 -1
  188. package/dist/core/Agent.d.ts +119 -153
  189. package/dist/core/Agent.d.ts.map +1 -1
  190. package/dist/core/Agent.js +472 -325
  191. package/dist/core/Agent.js.map +1 -1
  192. package/dist/core/AutoChainExecutor.d.ts +107 -0
  193. package/dist/core/AutoChainExecutor.d.ts.map +1 -0
  194. package/dist/core/AutoChainExecutor.js +293 -0
  195. package/dist/core/AutoChainExecutor.js.map +1 -0
  196. package/dist/core/BranchEvaluator.d.ts +54 -0
  197. package/dist/core/BranchEvaluator.d.ts.map +1 -0
  198. package/dist/core/BranchEvaluator.js +126 -0
  199. package/dist/core/BranchEvaluator.js.map +1 -0
  200. package/dist/core/DirectiveBus.d.ts +88 -0
  201. package/dist/core/DirectiveBus.d.ts.map +1 -0
  202. package/dist/core/DirectiveBus.js +192 -0
  203. package/dist/core/DirectiveBus.js.map +1 -0
  204. package/dist/core/DirectiveChainTracker.d.ts +49 -0
  205. package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
  206. package/dist/core/DirectiveChainTracker.js +117 -0
  207. package/dist/core/DirectiveChainTracker.js.map +1 -0
  208. package/dist/core/Flow.d.ts +186 -0
  209. package/dist/core/Flow.d.ts.map +1 -0
  210. package/dist/core/Flow.js +546 -0
  211. package/dist/core/Flow.js.map +1 -0
  212. package/dist/core/FlowRouter.d.ts +182 -0
  213. package/dist/core/FlowRouter.d.ts.map +1 -0
  214. package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
  215. package/dist/core/FlowRouter.js.map +1 -0
  216. package/dist/core/PersistenceManager.d.ts +2 -2
  217. package/dist/core/PersistenceManager.d.ts.map +1 -1
  218. package/dist/core/PersistenceManager.js +7 -7
  219. package/dist/core/PersistenceManager.js.map +1 -1
  220. package/dist/core/PromptComposer.d.ts +21 -8
  221. package/dist/core/PromptComposer.d.ts.map +1 -1
  222. package/dist/core/PromptComposer.js +183 -106
  223. package/dist/core/PromptComposer.js.map +1 -1
  224. package/dist/core/PromptSectionCache.d.ts +1 -1
  225. package/dist/core/PromptSectionCache.js +1 -1
  226. package/dist/core/ResponseEngine.d.ts +18 -8
  227. package/dist/core/ResponseEngine.d.ts.map +1 -1
  228. package/dist/core/ResponseEngine.js +38 -36
  229. package/dist/core/ResponseEngine.js.map +1 -1
  230. package/dist/core/ResponseModal.d.ts +73 -56
  231. package/dist/core/ResponseModal.d.ts.map +1 -1
  232. package/dist/core/ResponseModal.js +1193 -1016
  233. package/dist/core/ResponseModal.js.map +1 -1
  234. package/dist/core/ResponsePipeline.d.ts +124 -26
  235. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  236. package/dist/core/ResponsePipeline.js +509 -137
  237. package/dist/core/ResponsePipeline.js.map +1 -1
  238. package/dist/core/SignalEvaluator.d.ts +86 -0
  239. package/dist/core/SignalEvaluator.d.ts.map +1 -0
  240. package/dist/core/SignalEvaluator.js +326 -0
  241. package/dist/core/SignalEvaluator.js.map +1 -0
  242. package/dist/core/SignalProcessor.d.ts +152 -0
  243. package/dist/core/SignalProcessor.d.ts.map +1 -0
  244. package/dist/core/SignalProcessor.js +555 -0
  245. package/dist/core/SignalProcessor.js.map +1 -0
  246. package/dist/core/Step.d.ts +43 -32
  247. package/dist/core/Step.d.ts.map +1 -1
  248. package/dist/core/Step.js +220 -126
  249. package/dist/core/Step.js.map +1 -1
  250. package/dist/core/StreamingToolExecutor.d.ts +2 -2
  251. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  252. package/dist/core/StreamingToolExecutor.js.map +1 -1
  253. package/dist/core/ToolManager.d.ts +44 -13
  254. package/dist/core/ToolManager.d.ts.map +1 -1
  255. package/dist/core/ToolManager.js +174 -91
  256. package/dist/core/ToolManager.js.map +1 -1
  257. package/dist/core/createAgent.d.ts +35 -0
  258. package/dist/core/createAgent.d.ts.map +1 -0
  259. package/dist/core/createAgent.js +36 -0
  260. package/dist/core/createAgent.js.map +1 -0
  261. package/dist/core/flow-namespace.d.ts +49 -0
  262. package/dist/core/flow-namespace.d.ts.map +1 -0
  263. package/dist/core/flow-namespace.js +168 -0
  264. package/dist/core/flow-namespace.js.map +1 -0
  265. package/dist/index.d.ts +11 -14
  266. package/dist/index.d.ts.map +1 -1
  267. package/dist/index.js +9 -12
  268. package/dist/index.js.map +1 -1
  269. package/dist/providers/AnthropicProvider.d.ts +1 -1
  270. package/dist/providers/AnthropicProvider.js +1 -1
  271. package/dist/providers/GeminiProvider.d.ts +1 -1
  272. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  273. package/dist/providers/GeminiProvider.js +1 -1
  274. package/dist/providers/GeminiProvider.js.map +1 -1
  275. package/dist/providers/OpenAIProvider.d.ts +1 -1
  276. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  277. package/dist/providers/OpenAIProvider.js +1 -1
  278. package/dist/providers/OpenAIProvider.js.map +1 -1
  279. package/dist/types/agent.d.ts +183 -54
  280. package/dist/types/agent.d.ts.map +1 -1
  281. package/dist/types/agent.js +0 -6
  282. package/dist/types/agent.js.map +1 -1
  283. package/dist/types/ai.d.ts +3 -3
  284. package/dist/types/ai.d.ts.map +1 -1
  285. package/dist/types/errors.d.ts +15 -0
  286. package/dist/types/errors.d.ts.map +1 -0
  287. package/dist/types/errors.js +18 -0
  288. package/dist/types/errors.js.map +1 -0
  289. package/dist/types/flow.d.ts +513 -0
  290. package/dist/types/flow.d.ts.map +1 -0
  291. package/dist/types/flow.js +5 -0
  292. package/dist/types/flow.js.map +1 -0
  293. package/dist/types/index.d.ts +7 -6
  294. package/dist/types/index.d.ts.map +1 -1
  295. package/dist/types/index.js +4 -1
  296. package/dist/types/index.js.map +1 -1
  297. package/dist/types/persistence.d.ts +11 -7
  298. package/dist/types/persistence.d.ts.map +1 -1
  299. package/dist/types/routing.d.ts +1 -1
  300. package/dist/types/routing.d.ts.map +1 -1
  301. package/dist/types/session.d.ts +24 -23
  302. package/dist/types/session.d.ts.map +1 -1
  303. package/dist/types/signals.d.ts +248 -0
  304. package/dist/types/signals.d.ts.map +1 -0
  305. package/dist/types/signals.js +10 -0
  306. package/dist/types/signals.js.map +1 -0
  307. package/dist/types/template.d.ts +2 -8
  308. package/dist/types/template.d.ts.map +1 -1
  309. package/dist/types/tool.d.ts +36 -29
  310. package/dist/types/tool.d.ts.map +1 -1
  311. package/dist/types/tool.js +1 -1
  312. package/dist/types/tool.js.map +1 -1
  313. package/dist/utils/condition.d.ts +7 -1
  314. package/dist/utils/condition.d.ts.map +1 -1
  315. package/dist/utils/condition.js.map +1 -1
  316. package/dist/utils/id.d.ts +13 -5
  317. package/dist/utils/id.d.ts.map +1 -1
  318. package/dist/utils/id.js +22 -9
  319. package/dist/utils/id.js.map +1 -1
  320. package/dist/utils/index.d.ts +2 -2
  321. package/dist/utils/index.d.ts.map +1 -1
  322. package/dist/utils/index.js +2 -2
  323. package/dist/utils/index.js.map +1 -1
  324. package/dist/utils/session.d.ts +44 -5
  325. package/dist/utils/session.d.ts.map +1 -1
  326. package/dist/utils/session.js +193 -37
  327. package/dist/utils/session.js.map +1 -1
  328. package/docs/README.md +22 -200
  329. package/docs/concepts/architecture.md +281 -0
  330. package/docs/concepts/directives.md +400 -0
  331. package/docs/concepts/pipeline.md +399 -0
  332. package/docs/guides/branching.md +263 -0
  333. package/docs/guides/compaction.md +163 -0
  334. package/docs/guides/conditions.md +167 -0
  335. package/docs/guides/error-handling.md +176 -0
  336. package/docs/guides/flow-control.md +409 -0
  337. package/docs/guides/instructions.md +210 -0
  338. package/docs/guides/persistence.md +182 -0
  339. package/docs/guides/streaming.md +137 -0
  340. package/docs/migration/README.md +14 -0
  341. package/docs/migration/route-to-flow.md +561 -0
  342. package/docs/migration/v1-to-v2.md +909 -0
  343. package/docs/reference/adapters.md +481 -0
  344. package/docs/reference/branches.md +241 -0
  345. package/docs/reference/create-agent.md +186 -0
  346. package/docs/reference/directive.md +243 -0
  347. package/docs/reference/errors.md +122 -0
  348. package/docs/reference/flow.md +238 -0
  349. package/docs/reference/instruction.md +177 -0
  350. package/docs/reference/pre-directive.md +131 -0
  351. package/docs/reference/providers.md +227 -0
  352. package/docs/reference/signals.md +356 -0
  353. package/docs/reference/step.md +339 -0
  354. package/docs/reference/tool.md +269 -0
  355. package/docs/start/01-install.md +81 -0
  356. package/docs/start/02-first-agent.md +196 -0
  357. package/docs/start/03-collect-data.md +222 -0
  358. package/docs/start/04-add-tools.md +276 -0
  359. package/docs/start/05-go-to-production.md +216 -0
  360. package/examples/01-quickstart.ts +20 -0
  361. package/examples/02-data-extraction.ts +90 -0
  362. package/examples/03-tools.ts +136 -0
  363. package/examples/04-instructions.ts +100 -0
  364. package/examples/05-branching.ts +140 -0
  365. package/examples/06-flow-control.ts +103 -0
  366. package/examples/07-streaming.ts +69 -0
  367. package/examples/08-persistence.ts +98 -0
  368. package/examples/09-signals.ts +144 -0
  369. package/examples/tsconfig.json +30 -0
  370. package/package.json +2 -1
  371. package/src/adapters/MemoryAdapter.ts +3 -3
  372. package/src/adapters/MongoAdapter.ts +3 -3
  373. package/src/adapters/OpenSearchAdapter.ts +10 -8
  374. package/src/adapters/PostgreSQLAdapter.ts +26 -10
  375. package/src/adapters/PrismaAdapter.ts +6 -6
  376. package/src/adapters/RedisAdapter.ts +3 -3
  377. package/src/adapters/SQLiteAdapter.ts +31 -12
  378. package/src/constants/index.ts +2 -10
  379. package/src/core/Agent.ts +585 -374
  380. package/src/core/AutoChainExecutor.ts +440 -0
  381. package/src/core/BranchEvaluator.ts +167 -0
  382. package/src/core/DirectiveBus.ts +248 -0
  383. package/src/core/DirectiveChainTracker.ts +144 -0
  384. package/src/core/Flow.ts +666 -0
  385. package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
  386. package/src/core/PersistenceManager.ts +8 -8
  387. package/src/core/PromptComposer.ts +209 -140
  388. package/src/core/PromptSectionCache.ts +1 -1
  389. package/src/core/ResponseEngine.ts +61 -46
  390. package/src/core/ResponseModal.ts +1453 -1240
  391. package/src/core/ResponsePipeline.ts +655 -175
  392. package/src/core/SignalEvaluator.ts +420 -0
  393. package/src/core/SignalProcessor.ts +723 -0
  394. package/src/core/Step.ts +279 -176
  395. package/src/core/StreamingToolExecutor.ts +4 -4
  396. package/src/core/ToolManager.ts +200 -97
  397. package/src/core/createAgent.ts +40 -0
  398. package/src/core/flow-namespace.ts +219 -0
  399. package/src/index.ts +42 -36
  400. package/src/providers/AnthropicProvider.ts +2 -2
  401. package/src/providers/GeminiProvider.ts +2 -2
  402. package/src/providers/OpenAIProvider.ts +2 -2
  403. package/src/types/agent.ts +182 -53
  404. package/src/types/ai.ts +3 -3
  405. package/src/types/errors.ts +18 -0
  406. package/src/types/flow.ts +590 -0
  407. package/src/types/index.ts +43 -16
  408. package/src/types/persistence.ts +12 -8
  409. package/src/types/routing.ts +1 -1
  410. package/src/types/session.ts +26 -23
  411. package/src/types/signals.ts +321 -0
  412. package/src/types/template.ts +3 -11
  413. package/src/types/tool.ts +50 -42
  414. package/src/utils/condition.ts +13 -4
  415. package/src/utils/id.ts +27 -9
  416. package/src/utils/index.ts +6 -2
  417. package/src/utils/session.ts +238 -42
  418. package/dist/cjs/core/BatchExecutor.d.ts +0 -359
  419. package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
  420. package/dist/cjs/core/BatchExecutor.js +0 -861
  421. package/dist/cjs/core/BatchExecutor.js.map +0 -1
  422. package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
  423. package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
  424. package/dist/cjs/core/BatchPromptBuilder.js +0 -223
  425. package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
  426. package/dist/cjs/core/Route.d.ts +0 -180
  427. package/dist/cjs/core/Route.d.ts.map +0 -1
  428. package/dist/cjs/core/Route.js +0 -542
  429. package/dist/cjs/core/Route.js.map +0 -1
  430. package/dist/cjs/core/RoutingEngine.d.ts +0 -185
  431. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  432. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  433. package/dist/cjs/types/route.d.ts +0 -336
  434. package/dist/cjs/types/route.d.ts.map +0 -1
  435. package/dist/cjs/types/route.js.map +0 -1
  436. package/dist/core/BatchExecutor.d.ts +0 -359
  437. package/dist/core/BatchExecutor.d.ts.map +0 -1
  438. package/dist/core/BatchExecutor.js +0 -856
  439. package/dist/core/BatchExecutor.js.map +0 -1
  440. package/dist/core/BatchPromptBuilder.d.ts +0 -89
  441. package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
  442. package/dist/core/BatchPromptBuilder.js +0 -219
  443. package/dist/core/BatchPromptBuilder.js.map +0 -1
  444. package/dist/core/Route.d.ts +0 -180
  445. package/dist/core/Route.d.ts.map +0 -1
  446. package/dist/core/Route.js +0 -538
  447. package/dist/core/Route.js.map +0 -1
  448. package/dist/core/RoutingEngine.d.ts +0 -185
  449. package/dist/core/RoutingEngine.d.ts.map +0 -1
  450. package/dist/core/RoutingEngine.js.map +0 -1
  451. package/dist/types/route.d.ts +0 -336
  452. package/dist/types/route.d.ts.map +0 -1
  453. package/dist/types/route.js +0 -5
  454. package/dist/types/route.js.map +0 -1
  455. package/docs/CONTRIBUTING.md +0 -521
  456. package/docs/api/README.md +0 -3299
  457. package/docs/api/overview.md +0 -1410
  458. package/docs/architecture/data-extraction-flow.md +0 -360
  459. package/docs/architecture/multi-step-execution.md +0 -277
  460. package/docs/core/agent/README.md +0 -938
  461. package/docs/core/agent/context-management.md +0 -796
  462. package/docs/core/agent/rules-and-prohibitions.md +0 -113
  463. package/docs/core/agent/session-management.md +0 -693
  464. package/docs/core/ai-integration/prompt-composition.md +0 -355
  465. package/docs/core/ai-integration/providers.md +0 -515
  466. package/docs/core/ai-integration/response-processing.md +0 -433
  467. package/docs/core/conversation-flows/data-collection.md +0 -772
  468. package/docs/core/conversation-flows/route-dsl.md +0 -509
  469. package/docs/core/conversation-flows/routes.md +0 -249
  470. package/docs/core/conversation-flows/step-transitions.md +0 -731
  471. package/docs/core/conversation-flows/steps.md +0 -268
  472. package/docs/core/error-handling.md +0 -830
  473. package/docs/core/persistence/adapters.md +0 -255
  474. package/docs/core/persistence/session-storage.md +0 -656
  475. package/docs/core/routing/intelligent-routing.md +0 -470
  476. package/docs/core/tools/enhanced-tool.md +0 -186
  477. package/docs/core/tools/streaming-execution.md +0 -161
  478. package/docs/core/tools/tool-definition.md +0 -970
  479. package/docs/core/tools/tool-scoping.md +0 -819
  480. package/docs/guides/advanced-patterns/publishing.md +0 -186
  481. package/docs/guides/context-compaction.md +0 -96
  482. package/docs/guides/error-handling-patterns.md +0 -578
  483. package/docs/guides/getting-started/README.md +0 -795
  484. package/docs/guides/migration/README.md +0 -101
  485. package/docs/guides/migration/flexible-routing-conditions.md +0 -375
  486. package/docs/guides/migration/multi-step-execution.md +0 -393
  487. package/docs/guides/migration/response-modal-refactor.md +0 -518
  488. package/docs/guides/prompt-optimization.md +0 -164
  489. package/examples/advanced-patterns/context-compaction.ts +0 -223
  490. package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
  491. package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
  492. package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
  493. package/examples/advanced-patterns/streaming-responses.ts +0 -656
  494. package/examples/ai-providers/anthropic-integration.ts +0 -388
  495. package/examples/ai-providers/openai-integration.ts +0 -228
  496. package/examples/condition-patterns/function-only-conditions.ts +0 -365
  497. package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
  498. package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
  499. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  500. package/examples/condition-patterns/string-only-conditions.ts +0 -296
  501. package/examples/conversation-flows/completion-transitions.ts +0 -318
  502. package/examples/core-concepts/basic-agent.ts +0 -503
  503. package/examples/core-concepts/modern-streaming-api.ts +0 -309
  504. package/examples/core-concepts/schema-driven-extraction.ts +0 -332
  505. package/examples/core-concepts/session-management.ts +0 -494
  506. package/examples/integrations/database-integration.ts +0 -631
  507. package/examples/integrations/healthcare-integration.ts +0 -595
  508. package/examples/integrations/search-integration.ts +0 -530
  509. package/examples/integrations/server-session-management.ts +0 -307
  510. package/examples/persistence/custom-adapter.ts +0 -526
  511. package/examples/persistence/database-persistence.ts +0 -583
  512. package/examples/persistence/memory-sessions.ts +0 -495
  513. package/examples/persistence/prisma-schema.example.prisma +0 -74
  514. package/examples/persistence/redis-persistence.ts +0 -488
  515. package/examples/tools/basic-tools.ts +0 -765
  516. package/examples/tools/data-enrichment-tools.ts +0 -593
  517. package/examples/tools/enhanced-tool-metadata.ts +0 -268
  518. package/examples/tools/streaming-tool-execution.ts +0 -283
  519. package/src/core/BatchExecutor.ts +0 -1187
  520. package/src/core/BatchPromptBuilder.ts +0 -299
  521. package/src/core/Route.ts +0 -678
  522. package/src/types/route.ts +0 -392
@@ -1,470 +0,0 @@
1
- # Intelligent Routing System
2
-
3
- The AI routing system is the core intelligence layer of @falai/agent that enables dynamic, context-aware conversation flows. Unlike traditional state machines, the routing system uses AI to intelligently select routes and steps based on user intent, conversation history, and collected data.
4
-
5
- ## Overview
6
-
7
- The `RoutingEngine` class powers two key decision-making processes:
8
-
9
- 1. **Route Selection**: When multiple routes are available, AI analyzes the conversation to score and select the most appropriate route
10
- 2. **Step Selection**: Within an active route, AI determines the best next step from available candidates
11
-
12
- ## How It Works
13
-
14
- ### Route Selection Process
15
-
16
- When an agent has multiple routes defined, the routing engine:
17
-
18
- 1. **Analyzes Context**: Evaluates conversation history, user intent, and current session state
19
- 2. **Scores Routes**: Uses AI to score each route (0-100) based on relevance and semantic fit
20
- 3. **Applies Thresholds**: Considers switching costs and maintains conversation continuity
21
- 4. **Selects Winner**: Chooses the highest-scoring route or stays with the current route
22
-
23
- ### Step Selection Process
24
-
25
- Within an active route, the routing engine:
26
-
27
- 1. **Finds Candidates**: Traverses the step chain to identify valid next steps
28
- 2. **Evaluates Conditions**: Respects `skipIf` conditions and `requires` dependencies
29
- 3. **AI Decision**: When multiple candidates exist, uses AI to select the optimal step
30
- 4. **Handles Completion**: Detects route completion and manages transitions
31
-
32
- ## Enhanced Condition System
33
-
34
- ### ConditionTemplate for Routes and Steps
35
-
36
- The routing system now supports the powerful `ConditionTemplate` type for both route activation and step control:
37
-
38
- ```typescript
39
- // Route with mixed condition types
40
- agent.createRoute({
41
- title: "Premium Support",
42
- when: [
43
- "User needs premium or priority support", // AI context
44
- (ctx) => ctx.context?.accountTier === 'premium' // Programmatic check
45
- ],
46
- skipIf: [
47
- "Support system is under maintenance", // AI context
48
- (ctx) => ctx.context?.maintenanceMode === true // Programmatic check
49
- ],
50
- steps: [
51
- {
52
- id: "priority_greeting",
53
- when: "User should receive priority treatment", // AI context only
54
- prompt: "Welcome to premium support! How can I assist you today?",
55
- collect: ["issueType"]
56
- },
57
- {
58
- id: "technical_help",
59
- when: [
60
- "User needs technical assistance", // AI context
61
- (ctx) => ctx.data?.issueType === 'technical' // Programmatic check
62
- ],
63
- skipIf: (ctx) => ctx.data?.issueResolved === true, // Function-only skipIf
64
- prompt: "Let me help you with your technical issue",
65
- collect: ["issueDescription"]
66
- }
67
- ]
68
- });
69
- ```
70
-
71
- ### Condition Evaluation Logic
72
-
73
- **Route `when` conditions (AND logic):**
74
- - All function conditions must return `true`
75
- - String conditions provide AI context for route scoring
76
- - Arrays require all functions to pass
77
-
78
- **Route `skipIf` conditions (OR logic):**
79
- - Any function returning `true` excludes the route
80
- - String conditions provide AI context about exclusion reasons
81
- - Arrays skip if any function returns `true`
82
-
83
- **Step `when` conditions (AND logic):**
84
- - All function conditions must return `true` for step to be eligible
85
- - String conditions help AI understand step purpose
86
- - Arrays require all functions to pass
87
-
88
- **Step `skipIf` conditions (OR logic):**
89
- - Any function returning `true` skips the step
90
- - String conditions provide AI context about why step is skipped
91
- - Arrays skip if any function returns `true`
92
-
93
- ### Hybrid Evaluation Process
94
-
95
- The routing engine now performs a two-phase evaluation:
96
-
97
- 1. **Programmatic Phase**: Execute all function conditions for boolean results
98
- 2. **AI Context Phase**: Include string conditions in AI prompts for intelligent decision-making
99
-
100
- ```typescript
101
- // Example evaluation flow:
102
- const routeCondition = [
103
- "User wants to upgrade their account", // → AI context
104
- (ctx) => ctx.context?.accountTier !== 'enterprise' // → Must be true
105
- ];
106
-
107
- // Programmatic: Check if user can upgrade (not already enterprise)
108
- // AI Context: "User wants to upgrade their account" helps AI understand intent
109
- // Result: Route eligible if function passes AND AI scores it highly
110
- ```
111
-
112
- ### Context-Aware Routing
113
-
114
- Conditions can access comprehensive context:
115
-
116
- ```typescript
117
- interface RoutingContext {
118
- userId: string;
119
- accountTier: 'free' | 'premium' | 'enterprise';
120
- supportHistory: SupportTicket[];
121
- currentTime: Date;
122
- }
123
-
124
- interface AgentData {
125
- customerName?: string;
126
- issueType?: string;
127
- priority?: 'low' | 'medium' | 'high';
128
- previousAttempts?: number;
129
- }
130
-
131
- // Route with context-aware conditions
132
- agent.createRoute({
133
- title: "Escalation Support",
134
- when: [
135
- "User needs escalated support or is frustrated", // AI context
136
- (ctx) => ctx.data?.previousAttempts > 2, // Data check
137
- (ctx) => ctx.context?.supportHistory.length > 5 // Context check
138
- ],
139
- skipIf: [
140
- "Issue has been resolved recently", // AI context
141
- (ctx) => {
142
- const lastTicket = ctx.context?.supportHistory[0];
143
- return lastTicket?.status === 'resolved' &&
144
- (Date.now() - lastTicket.resolvedAt.getTime()) < 24 * 60 * 60 * 1000;
145
- }
146
- ]
147
- });
148
- ```
149
-
150
- ## Key Features
151
-
152
- ### Intelligent Route Scoring
153
-
154
- Routes are scored based on multiple factors:
155
-
156
- ```typescript
157
- // Routes receive scores 0-100 based on:
158
- - Explicit keyword matches (90-100)
159
- - Contextual evidence (70-89)
160
- - Moderate relevance (50-69)
161
- - Weak connections (30-49)
162
- - Minimal relevance (0-29)
163
- ```
164
-
165
- ### Smart Step Traversal
166
-
167
- The system intelligently traverses step chains:
168
-
169
- - **Skip Logic**: Automatically skips steps where `skipIf` conditions are met
170
- - **Dependency Checking**: Ensures required data is present before allowing step progression
171
- - **Loop Prevention**: Uses visited sets to prevent infinite traversal
172
- - **Branch Resolution**: Handles complex branching logic with AI assistance
173
-
174
- ### Context-Aware Decisions
175
-
176
- All routing decisions consider:
177
-
178
- - **Conversation History**: Full dialogue context
179
- - **Agent-Level Data**: Centralized information gathered across all routes
180
- - **Session State**: Current route and step position with cross-route data access
181
- - **Route Completion**: Progress toward required fields for each route
182
- - **Agent Knowledge**: Guidelines, terms, and domain knowledge
183
-
184
- ## Route Selection API
185
-
186
- ### Single Route Optimization
187
-
188
- For agents with only one route, the system optimizes by skipping expensive route scoring:
189
-
190
- ```typescript
191
- // Single route - direct step selection
192
- const result = await routingEngine.decideSingleRouteStep({
193
- route: userOnboardingRoute,
194
- session,
195
- history,
196
- agentOptions,
197
- provider,
198
- context,
199
- });
200
- ```
201
-
202
- ### Multi-Route Orchestration
203
-
204
- For complex agents with multiple routes:
205
-
206
- ```typescript
207
- // Multiple routes - full AI-powered selection
208
- const result = await routingEngine.decideRouteAndStep({
209
- routes: [onboardingRoute, supportRoute, salesRoute],
210
- session,
211
- history,
212
- agentOptions,
213
- provider,
214
- context,
215
- });
216
- ```
217
-
218
- ## Step Candidate Logic
219
-
220
- ### Finding Valid Steps
221
-
222
- The `getCandidateSteps()` method implements sophisticated logic:
223
-
224
- ```typescript
225
- // Find valid next steps considering:
226
- const candidates = routingEngine.getCandidateSteps(
227
- route, // Current route
228
- currentStep, // Current step (or null for route start)
229
- agentData // Agent-level data collected across all routes
230
- );
231
- ```
232
-
233
- ### SkipIf Processing
234
-
235
- Steps are automatically filtered based on agent-level data conditions:
236
-
237
- ```typescript
238
- // Step definition with skipIf using agent data
239
- initialStep: {
240
- prompt: "What's your name?",
241
- collect: ["name"],
242
- skipIf: (data) => data.name !== undefined // Skip if name already collected by any route
243
- }
244
-
245
- // Cross-route skipping example
246
- const emailStep = {
247
- prompt: "What's your email?",
248
- collect: ["email"],
249
- skipIf: (data) => data.email !== undefined // Skip if collected in different route
250
- }
251
- ```
252
-
253
- ### Recursive Traversal
254
-
255
- The system recursively traverses step chains to find valid paths:
256
-
257
- ```typescript
258
- // Handles complex scenarios like:
259
- // Step A (skipIf: condition) -> Step B -> Step C (requires: data)
260
- // If Step A is skipped, system continues to Step B, then evaluates Step C
261
- ```
262
-
263
- ## Prompt Engineering
264
-
265
- ### Route Selection Prompts
266
-
267
- The system builds comprehensive prompts for route selection:
268
-
269
- ```typescript
270
- const routingPrompt = await routingEngine.buildRoutingPrompt({
271
- history,
272
- routes,
273
- lastMessage,
274
- agentOptions,
275
- session,
276
- activeRouteSteps,
277
- context,
278
- });
279
- ```
280
-
281
- Prompts include:
282
-
283
- - Agent identity and personality
284
- - Available routes with descriptions and required fields
285
- - Session context and agent-level collected data
286
- - Route completion progress (e.g., "2/3 required fields collected")
287
- - Scoring guidelines (90-100 scale)
288
- - Conversation history and directives
289
-
290
- ### Step Selection Prompts
291
-
292
- For step selection within routes:
293
-
294
- ```typescript
295
- const stepPrompt = await routingEngine.buildStepSelectionPrompt({
296
- route,
297
- currentStep,
298
- candidates,
299
- data: agent.getCollectedData(), // Agent-level data
300
- history,
301
- lastMessage,
302
- agentOptions,
303
- context,
304
- session,
305
- });
306
- ```
307
-
308
- ## Response Processing
309
-
310
- ### Structured Scoring
311
-
312
- AI responses use JSON schemas for reliable parsing:
313
-
314
- ```typescript
315
- // Route scoring schema
316
- {
317
- context: "Brief summary of user intent",
318
- routes: {
319
- "route-id-1": 85, // Score 0-100
320
- "route-id-2": 72,
321
- "route-id-3": 45
322
- },
323
- responseDirectives: ["Focus on pricing", "Be helpful"]
324
- }
325
- ```
326
-
327
- ### Step Selection Schema
328
-
329
- ```typescript
330
- // Step selection schema
331
- {
332
- reasoning: "Why this step was selected",
333
- selectedStepId: "step-id",
334
- responseDirectives: ["Address concerns", "Provide options"]
335
- }
336
- ```
337
-
338
- ## Integration with Agent Flow
339
-
340
- ### Response Pipeline Integration
341
-
342
- The routing engine integrates seamlessly with the response pipeline:
343
-
344
- ```typescript
345
- // In Agent.respondStream():
346
- 1. Prepare context and session
347
- 2. Call routingEngine.decideRouteAndStep()
348
- 3. Execute prepare() functions on current step
349
- 4. Generate AI response with selected route/step
350
- 5. Process tool calls and data collection
351
- 6. Handle route completion and transitions
352
- ```
353
-
354
- ### Session State Management
355
-
356
- Routing decisions update session state:
357
-
358
- ```typescript
359
- // Session updates include:
360
- - Current route transitions
361
- - Step progression
362
- - Initial data merging
363
- - Route completion handling
364
- - Pending transition management
365
- ```
366
-
367
- ## Performance Optimizations
368
-
369
- ### Single Route Fast Path
370
-
371
- For agents with one route, skips route scoring entirely:
372
-
373
- ```typescript
374
- if (routes.length === 1) {
375
- return this.decideSingleRouteStep(/* optimized path */);
376
- }
377
- ```
378
-
379
- ### Sticky Route Switching
380
-
381
- When the agent is already on a route, it won't switch unless an alternative route scores higher by a configurable margin. This prevents flip-flopping on marginal score differences:
382
-
383
- ```typescript
384
- const agent = new Agent({
385
- // ...
386
- routeSwitchMargin: 15, // default: 15, range 0-100
387
- });
388
- ```
389
-
390
- A margin of 15 means the best alternative must outscore the current route by at least 15 points before a switch occurs.
391
-
392
- ## Error Handling & Resilience
393
-
394
- ### Backup Model Support
395
-
396
- When primary AI models fail, automatically tries backup models:
397
-
398
- ```typescript
399
- // Automatic fallback to backup models
400
- // Error classification (rate limits, overloads, etc.)
401
- // Timeout and retry logic
402
- ```
403
-
404
- ### Validation & Fallbacks
405
-
406
- Robust validation ensures system stability:
407
-
408
- ```typescript
409
- // Invalid responses fallback to first candidate
410
- // Missing data handled gracefully
411
- // Circular dependencies prevented
412
- ```
413
-
414
- ## Configuration Options
415
-
416
- ### Routing Configuration
417
-
418
- ```typescript
419
- const agent = new Agent({
420
- // ...
421
- routeSwitchMargin: 15, // Score margin before switching routes (0-100, default: 15)
422
- });
423
- ```
424
-
425
- ## Best Practices
426
-
427
- ### Route Design
428
-
429
- 1. **Clear Conditions**: Define specific conditions for route activation
430
- 2. **Distinct Purposes**: Ensure routes serve different user intents
431
- 3. **Progressive Disclosure**: Use step dependencies to control information flow
432
- 4. **Completion Handling**: Define clear end states and transitions
433
-
434
- ### Step Design
435
-
436
- 1. **Atomic Actions**: Each step should accomplish one clear goal
437
- 2. **Smart Skipping**: Use `skipIf` to avoid redundant questions
438
- 3. **Data Dependencies**: Use `requires` to enforce logical flow
439
- 4. **Branch Wisely**: AI can handle branching but prefer linear flows when possible
440
-
441
- ### Performance
442
-
443
- 1. **Limit Routes**: Too many routes increase AI evaluation time
444
- 2. **Optimize Prompts**: Keep route/step descriptions concise
445
- 3. **Cache Context**: Reuse context when possible
446
- 4. **Monitor Scores**: Track route selection accuracy and adjust conditions
447
-
448
- ## Debugging & Monitoring
449
-
450
- ### Route Selection Logging
451
-
452
- ```typescript
453
- // Debug logging shows:
454
- - Route scores and reasoning
455
- - Selected routes and steps
456
- - Candidate evaluation process
457
- - Context analysis results
458
- ```
459
-
460
- ### Performance Metrics
461
-
462
- ```typescript
463
- // Track:
464
- - Route selection accuracy
465
- - Step transition success rates
466
- - AI call latency and costs
467
- - User satisfaction scores
468
- ```
469
-
470
- The intelligent routing system transforms traditional conversation design from static flows into dynamic, AI-driven experiences that adapt to user needs and context.
@@ -1,186 +0,0 @@
1
- # EnhancedTool Interface
2
-
3
- `EnhancedTool` extends the existing `Tool` interface with optional metadata for concurrency control, permission gating, input validation, and result size management. All additional methods are optional — plain `Tool` objects remain fully compatible.
4
-
5
- ## Interface
6
-
7
- ```typescript
8
- interface EnhancedTool<TContext = any, TData = any, TResult = any>
9
- extends Tool<TContext, TData, TResult> {
10
-
11
- // Concurrency & safety
12
- isConcurrencySafe?(input?: Record<string, unknown>): boolean;
13
- isReadOnly?(input?: Record<string, unknown>): boolean;
14
- isDestructive?(input?: Record<string, unknown>): boolean;
15
-
16
- // Execution control
17
- interruptBehavior?(): 'cancel' | 'block';
18
- maxResultSizeChars?: number;
19
-
20
- // Validation & permissions
21
- validateInput?(
22
- input: Record<string, unknown>,
23
- context: ToolContext<TContext, TData>
24
- ): Promise<ToolValidationResult> | ToolValidationResult;
25
-
26
- checkPermissions?(
27
- input: Record<string, unknown>,
28
- context: ToolContext<TContext, TData>
29
- ): Promise<ToolPermissionResult> | ToolPermissionResult;
30
- }
31
- ```
32
-
33
- ## Methods & Properties
34
-
35
- ### isConcurrencySafe
36
-
37
- Returns `true` if this tool can safely run in parallel with other concurrency-safe tools. The `StreamingToolExecutor` evaluates this once at queue time and caches the result.
38
-
39
- Default (when absent): `false` — the tool runs serially.
40
-
41
- ```typescript
42
- const listFiles: EnhancedTool = {
43
- id: "list-files",
44
- name: "list_files",
45
- description: "List files in a directory",
46
- handler: async (ctx, args) => { /* ... */ },
47
- isConcurrencySafe: () => true,
48
- };
49
- ```
50
-
51
- The method receives the tool's input arguments, so concurrency safety can be input-dependent:
52
-
53
- ```typescript
54
- isConcurrencySafe: (input) => {
55
- // Safe for read paths, not safe for write paths
56
- return input?.mode === "read";
57
- },
58
- ```
59
-
60
- ### isReadOnly / isDestructive
61
-
62
- Informational metadata. `isReadOnly` indicates the tool has no side effects; `isDestructive` indicates irreversible operations. Both default to `false` when absent.
63
-
64
- ```typescript
65
- isReadOnly: () => true,
66
- isDestructive: () => false,
67
- ```
68
-
69
- ### interruptBehavior
70
-
71
- Controls how the tool responds to abort signals (sibling failure or parent cancellation):
72
-
73
- - `'cancel'` — immediately abort the tool
74
- - `'block'` — allow the tool to finish (default when absent)
75
-
76
- ```typescript
77
- interruptBehavior: () => "cancel",
78
- ```
79
-
80
- ### maxResultSizeChars
81
-
82
- Maximum characters for the tool result. Results exceeding this limit are truncated with a notice like `[Truncated: 12000 chars total, showing first 5000]`.
83
-
84
- ```typescript
85
- maxResultSizeChars: 50_000,
86
- ```
87
-
88
- ### validateInput
89
-
90
- Called before the tool handler. If it returns `{ valid: false }`, the handler is never invoked and a validation error is returned instead.
91
-
92
- ```typescript
93
- validateInput: async (input, ctx) => {
94
- if (!input.resourceId || typeof input.resourceId !== "string") {
95
- return { valid: false, error: "resourceId must be a non-empty string" };
96
- }
97
- return { valid: true };
98
- },
99
- ```
100
-
101
- The return type:
102
-
103
- ```typescript
104
- interface ToolValidationResult {
105
- valid: boolean;
106
- error?: string;
107
- correctedInput?: Record<string, unknown>;
108
- }
109
- ```
110
-
111
- ### checkPermissions
112
-
113
- Called before the tool handler (after validation). If it returns `{ allowed: false }`, the handler is never invoked and a permission error is returned.
114
-
115
- ```typescript
116
- checkPermissions: async (input, ctx) => {
117
- const role = (ctx.context as any)?.userRole;
118
- if (role !== "admin") {
119
- return { allowed: false, reason: "Only admins can delete resources", canOverride: false };
120
- }
121
- return { allowed: true };
122
- },
123
- ```
124
-
125
- The return type:
126
-
127
- ```typescript
128
- interface ToolPermissionResult {
129
- allowed: boolean;
130
- reason?: string;
131
- canOverride?: boolean;
132
- }
133
- ```
134
-
135
- ## Full Example
136
-
137
- ```typescript
138
- const deleteTool: EnhancedTool = {
139
- id: "delete-resource",
140
- name: "delete_resource",
141
- description: "Delete a resource permanently",
142
- parameters: {
143
- type: "object",
144
- properties: { resourceId: { type: "string" } },
145
- required: ["resourceId"],
146
- },
147
- handler: async (ctx, args) => {
148
- await deleteResource(args?.resourceId as string);
149
- return { success: true };
150
- },
151
-
152
- isConcurrencySafe: () => false,
153
- isReadOnly: () => false,
154
- isDestructive: () => true,
155
- interruptBehavior: () => "block",
156
- maxResultSizeChars: 500,
157
-
158
- validateInput: async (input) => {
159
- if (!input.resourceId || typeof input.resourceId !== "string") {
160
- return { valid: false, error: "resourceId must be a non-empty string" };
161
- }
162
- return { valid: true };
163
- },
164
-
165
- checkPermissions: async (input, ctx) => {
166
- const role = (ctx.context as any)?.userRole;
167
- if (role !== "admin") {
168
- return { allowed: false, reason: "Only admins can delete resources" };
169
- }
170
- return { allowed: true };
171
- },
172
- };
173
- ```
174
-
175
- ## Backward Compatibility
176
-
177
- Plain `Tool` objects without any `EnhancedTool` methods work exactly as before. The framework applies these defaults:
178
-
179
- | Property | Default |
180
- |---|---|
181
- | `isConcurrencySafe` | `false` |
182
- | `isReadOnly` | `false` |
183
- | `isDestructive` | `false` |
184
- | `interruptBehavior` | `'block'` |
185
- | `validateInput` | skipped |
186
- | `checkPermissions` | skipped |