@falai/agent 1.2.7 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (508) 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 +1196 -1015
  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 +524 -134
  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/GeminiProvider.d.ts +3 -3
  126. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  127. package/dist/cjs/providers/GeminiProvider.js +16 -14
  128. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  129. package/dist/cjs/types/agent.d.ts +183 -54
  130. package/dist/cjs/types/agent.d.ts.map +1 -1
  131. package/dist/cjs/types/agent.js +0 -6
  132. package/dist/cjs/types/agent.js.map +1 -1
  133. package/dist/cjs/types/ai.d.ts +3 -3
  134. package/dist/cjs/types/ai.d.ts.map +1 -1
  135. package/dist/cjs/types/errors.d.ts +15 -0
  136. package/dist/cjs/types/errors.d.ts.map +1 -0
  137. package/dist/cjs/types/errors.js +22 -0
  138. package/dist/cjs/types/errors.js.map +1 -0
  139. package/dist/cjs/types/flow.d.ts +513 -0
  140. package/dist/cjs/types/flow.d.ts.map +1 -0
  141. package/dist/cjs/types/{route.js → flow.js} +2 -2
  142. package/dist/cjs/types/flow.js.map +1 -0
  143. package/dist/cjs/types/index.d.ts +7 -6
  144. package/dist/cjs/types/index.d.ts.map +1 -1
  145. package/dist/cjs/types/index.js +6 -2
  146. package/dist/cjs/types/index.js.map +1 -1
  147. package/dist/cjs/types/persistence.d.ts +11 -7
  148. package/dist/cjs/types/persistence.d.ts.map +1 -1
  149. package/dist/cjs/types/routing.d.ts +1 -1
  150. package/dist/cjs/types/routing.d.ts.map +1 -1
  151. package/dist/cjs/types/session.d.ts +24 -23
  152. package/dist/cjs/types/session.d.ts.map +1 -1
  153. package/dist/cjs/types/signals.d.ts +248 -0
  154. package/dist/cjs/types/signals.d.ts.map +1 -0
  155. package/dist/cjs/types/signals.js +11 -0
  156. package/dist/cjs/types/signals.js.map +1 -0
  157. package/dist/cjs/types/template.d.ts +2 -8
  158. package/dist/cjs/types/template.d.ts.map +1 -1
  159. package/dist/cjs/types/tool.d.ts +36 -29
  160. package/dist/cjs/types/tool.d.ts.map +1 -1
  161. package/dist/cjs/types/tool.js +1 -1
  162. package/dist/cjs/types/tool.js.map +1 -1
  163. package/dist/cjs/utils/condition.d.ts +7 -1
  164. package/dist/cjs/utils/condition.d.ts.map +1 -1
  165. package/dist/cjs/utils/condition.js.map +1 -1
  166. package/dist/cjs/utils/id.d.ts +13 -5
  167. package/dist/cjs/utils/id.d.ts.map +1 -1
  168. package/dist/cjs/utils/id.js +24 -10
  169. package/dist/cjs/utils/id.js.map +1 -1
  170. package/dist/cjs/utils/index.d.ts +2 -2
  171. package/dist/cjs/utils/index.d.ts.map +1 -1
  172. package/dist/cjs/utils/index.js +7 -3
  173. package/dist/cjs/utils/index.js.map +1 -1
  174. package/dist/cjs/utils/session.d.ts +44 -5
  175. package/dist/cjs/utils/session.d.ts.map +1 -1
  176. package/dist/cjs/utils/session.js +197 -38
  177. package/dist/cjs/utils/session.js.map +1 -1
  178. package/dist/constants/index.d.ts +0 -9
  179. package/dist/constants/index.d.ts.map +1 -1
  180. package/dist/constants/index.js +3 -9
  181. package/dist/constants/index.js.map +1 -1
  182. package/dist/core/Agent.d.ts +119 -153
  183. package/dist/core/Agent.d.ts.map +1 -1
  184. package/dist/core/Agent.js +472 -325
  185. package/dist/core/Agent.js.map +1 -1
  186. package/dist/core/AutoChainExecutor.d.ts +107 -0
  187. package/dist/core/AutoChainExecutor.d.ts.map +1 -0
  188. package/dist/core/AutoChainExecutor.js +293 -0
  189. package/dist/core/AutoChainExecutor.js.map +1 -0
  190. package/dist/core/BranchEvaluator.d.ts +54 -0
  191. package/dist/core/BranchEvaluator.d.ts.map +1 -0
  192. package/dist/core/BranchEvaluator.js +126 -0
  193. package/dist/core/BranchEvaluator.js.map +1 -0
  194. package/dist/core/DirectiveBus.d.ts +88 -0
  195. package/dist/core/DirectiveBus.d.ts.map +1 -0
  196. package/dist/core/DirectiveBus.js +192 -0
  197. package/dist/core/DirectiveBus.js.map +1 -0
  198. package/dist/core/DirectiveChainTracker.d.ts +49 -0
  199. package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
  200. package/dist/core/DirectiveChainTracker.js +117 -0
  201. package/dist/core/DirectiveChainTracker.js.map +1 -0
  202. package/dist/core/Flow.d.ts +186 -0
  203. package/dist/core/Flow.d.ts.map +1 -0
  204. package/dist/core/Flow.js +546 -0
  205. package/dist/core/Flow.js.map +1 -0
  206. package/dist/core/FlowRouter.d.ts +182 -0
  207. package/dist/core/FlowRouter.d.ts.map +1 -0
  208. package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
  209. package/dist/core/FlowRouter.js.map +1 -0
  210. package/dist/core/PersistenceManager.d.ts +2 -2
  211. package/dist/core/PersistenceManager.d.ts.map +1 -1
  212. package/dist/core/PersistenceManager.js +7 -7
  213. package/dist/core/PersistenceManager.js.map +1 -1
  214. package/dist/core/PromptComposer.d.ts +21 -8
  215. package/dist/core/PromptComposer.d.ts.map +1 -1
  216. package/dist/core/PromptComposer.js +183 -106
  217. package/dist/core/PromptComposer.js.map +1 -1
  218. package/dist/core/PromptSectionCache.d.ts +1 -1
  219. package/dist/core/PromptSectionCache.js +1 -1
  220. package/dist/core/ResponseEngine.d.ts +18 -8
  221. package/dist/core/ResponseEngine.d.ts.map +1 -1
  222. package/dist/core/ResponseEngine.js +38 -36
  223. package/dist/core/ResponseEngine.js.map +1 -1
  224. package/dist/core/ResponseModal.d.ts +73 -56
  225. package/dist/core/ResponseModal.d.ts.map +1 -1
  226. package/dist/core/ResponseModal.js +1198 -1017
  227. package/dist/core/ResponseModal.js.map +1 -1
  228. package/dist/core/ResponsePipeline.d.ts +124 -26
  229. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  230. package/dist/core/ResponsePipeline.js +524 -135
  231. package/dist/core/ResponsePipeline.js.map +1 -1
  232. package/dist/core/SignalEvaluator.d.ts +86 -0
  233. package/dist/core/SignalEvaluator.d.ts.map +1 -0
  234. package/dist/core/SignalEvaluator.js +326 -0
  235. package/dist/core/SignalEvaluator.js.map +1 -0
  236. package/dist/core/SignalProcessor.d.ts +152 -0
  237. package/dist/core/SignalProcessor.d.ts.map +1 -0
  238. package/dist/core/SignalProcessor.js +555 -0
  239. package/dist/core/SignalProcessor.js.map +1 -0
  240. package/dist/core/Step.d.ts +43 -32
  241. package/dist/core/Step.d.ts.map +1 -1
  242. package/dist/core/Step.js +220 -126
  243. package/dist/core/Step.js.map +1 -1
  244. package/dist/core/StreamingToolExecutor.d.ts +2 -2
  245. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  246. package/dist/core/StreamingToolExecutor.js.map +1 -1
  247. package/dist/core/ToolManager.d.ts +44 -13
  248. package/dist/core/ToolManager.d.ts.map +1 -1
  249. package/dist/core/ToolManager.js +174 -91
  250. package/dist/core/ToolManager.js.map +1 -1
  251. package/dist/core/createAgent.d.ts +35 -0
  252. package/dist/core/createAgent.d.ts.map +1 -0
  253. package/dist/core/createAgent.js +36 -0
  254. package/dist/core/createAgent.js.map +1 -0
  255. package/dist/core/flow-namespace.d.ts +49 -0
  256. package/dist/core/flow-namespace.d.ts.map +1 -0
  257. package/dist/core/flow-namespace.js +168 -0
  258. package/dist/core/flow-namespace.js.map +1 -0
  259. package/dist/index.d.ts +11 -14
  260. package/dist/index.d.ts.map +1 -1
  261. package/dist/index.js +9 -12
  262. package/dist/index.js.map +1 -1
  263. package/dist/providers/GeminiProvider.d.ts +3 -3
  264. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  265. package/dist/providers/GeminiProvider.js +16 -14
  266. package/dist/providers/GeminiProvider.js.map +1 -1
  267. package/dist/types/agent.d.ts +183 -54
  268. package/dist/types/agent.d.ts.map +1 -1
  269. package/dist/types/agent.js +0 -6
  270. package/dist/types/agent.js.map +1 -1
  271. package/dist/types/ai.d.ts +3 -3
  272. package/dist/types/ai.d.ts.map +1 -1
  273. package/dist/types/errors.d.ts +15 -0
  274. package/dist/types/errors.d.ts.map +1 -0
  275. package/dist/types/errors.js +18 -0
  276. package/dist/types/errors.js.map +1 -0
  277. package/dist/types/flow.d.ts +513 -0
  278. package/dist/types/flow.d.ts.map +1 -0
  279. package/dist/types/flow.js +5 -0
  280. package/dist/types/flow.js.map +1 -0
  281. package/dist/types/index.d.ts +7 -6
  282. package/dist/types/index.d.ts.map +1 -1
  283. package/dist/types/index.js +4 -1
  284. package/dist/types/index.js.map +1 -1
  285. package/dist/types/persistence.d.ts +11 -7
  286. package/dist/types/persistence.d.ts.map +1 -1
  287. package/dist/types/routing.d.ts +1 -1
  288. package/dist/types/routing.d.ts.map +1 -1
  289. package/dist/types/session.d.ts +24 -23
  290. package/dist/types/session.d.ts.map +1 -1
  291. package/dist/types/signals.d.ts +248 -0
  292. package/dist/types/signals.d.ts.map +1 -0
  293. package/dist/types/signals.js +10 -0
  294. package/dist/types/signals.js.map +1 -0
  295. package/dist/types/template.d.ts +2 -8
  296. package/dist/types/template.d.ts.map +1 -1
  297. package/dist/types/tool.d.ts +36 -29
  298. package/dist/types/tool.d.ts.map +1 -1
  299. package/dist/types/tool.js +1 -1
  300. package/dist/types/tool.js.map +1 -1
  301. package/dist/utils/condition.d.ts +7 -1
  302. package/dist/utils/condition.d.ts.map +1 -1
  303. package/dist/utils/condition.js.map +1 -1
  304. package/dist/utils/id.d.ts +13 -5
  305. package/dist/utils/id.d.ts.map +1 -1
  306. package/dist/utils/id.js +22 -9
  307. package/dist/utils/id.js.map +1 -1
  308. package/dist/utils/index.d.ts +2 -2
  309. package/dist/utils/index.d.ts.map +1 -1
  310. package/dist/utils/index.js +2 -2
  311. package/dist/utils/index.js.map +1 -1
  312. package/dist/utils/session.d.ts +44 -5
  313. package/dist/utils/session.d.ts.map +1 -1
  314. package/dist/utils/session.js +193 -37
  315. package/dist/utils/session.js.map +1 -1
  316. package/docs/README.md +15 -202
  317. package/docs/concepts/architecture.md +281 -0
  318. package/docs/concepts/directives.md +400 -0
  319. package/docs/concepts/pipeline.md +399 -0
  320. package/docs/guides/branching.md +263 -0
  321. package/docs/guides/compaction.md +163 -0
  322. package/docs/guides/conditions.md +167 -0
  323. package/docs/guides/error-handling.md +176 -0
  324. package/docs/guides/flow-control.md +409 -0
  325. package/docs/guides/instructions.md +210 -0
  326. package/docs/guides/persistence.md +182 -0
  327. package/docs/guides/streaming.md +137 -0
  328. package/docs/migration/README.md +15 -0
  329. package/docs/migration/route-to-flow.md +560 -0
  330. package/docs/migration/v1-to-v2.md +909 -0
  331. package/docs/reference/adapters.md +481 -0
  332. package/docs/reference/branches.md +241 -0
  333. package/docs/reference/create-agent.md +186 -0
  334. package/docs/reference/directive.md +243 -0
  335. package/docs/reference/errors.md +122 -0
  336. package/docs/reference/flow.md +238 -0
  337. package/docs/reference/instruction.md +177 -0
  338. package/docs/reference/pre-directive.md +131 -0
  339. package/docs/reference/providers.md +227 -0
  340. package/docs/reference/signals.md +356 -0
  341. package/docs/reference/step.md +339 -0
  342. package/docs/reference/tool.md +269 -0
  343. package/docs/start/01-install.md +81 -0
  344. package/docs/start/02-first-agent.md +196 -0
  345. package/docs/start/03-collect-data.md +222 -0
  346. package/docs/start/04-add-tools.md +276 -0
  347. package/docs/start/05-go-to-production.md +216 -0
  348. package/examples/01-quickstart.ts +20 -0
  349. package/examples/02-data-extraction.ts +90 -0
  350. package/examples/03-tools.ts +136 -0
  351. package/examples/04-instructions.ts +100 -0
  352. package/examples/05-branching.ts +140 -0
  353. package/examples/06-flow-control.ts +103 -0
  354. package/examples/07-streaming.ts +69 -0
  355. package/examples/08-persistence.ts +98 -0
  356. package/examples/09-signals.ts +144 -0
  357. package/examples/tsconfig.json +30 -0
  358. package/package.json +2 -1
  359. package/src/adapters/MemoryAdapter.ts +3 -3
  360. package/src/adapters/MongoAdapter.ts +3 -3
  361. package/src/adapters/OpenSearchAdapter.ts +10 -8
  362. package/src/adapters/PostgreSQLAdapter.ts +26 -10
  363. package/src/adapters/PrismaAdapter.ts +6 -6
  364. package/src/adapters/RedisAdapter.ts +3 -3
  365. package/src/adapters/SQLiteAdapter.ts +31 -12
  366. package/src/constants/index.ts +2 -10
  367. package/src/core/Agent.ts +585 -374
  368. package/src/core/AutoChainExecutor.ts +440 -0
  369. package/src/core/BranchEvaluator.ts +167 -0
  370. package/src/core/DirectiveBus.ts +248 -0
  371. package/src/core/DirectiveChainTracker.ts +144 -0
  372. package/src/core/Flow.ts +666 -0
  373. package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
  374. package/src/core/PersistenceManager.ts +8 -8
  375. package/src/core/PromptComposer.ts +209 -140
  376. package/src/core/PromptSectionCache.ts +1 -1
  377. package/src/core/ResponseEngine.ts +61 -46
  378. package/src/core/ResponseModal.ts +1458 -1241
  379. package/src/core/ResponsePipeline.ts +675 -173
  380. package/src/core/SignalEvaluator.ts +420 -0
  381. package/src/core/SignalProcessor.ts +723 -0
  382. package/src/core/Step.ts +279 -176
  383. package/src/core/StreamingToolExecutor.ts +4 -4
  384. package/src/core/ToolManager.ts +200 -97
  385. package/src/core/createAgent.ts +40 -0
  386. package/src/core/flow-namespace.ts +219 -0
  387. package/src/index.ts +42 -36
  388. package/src/providers/GeminiProvider.ts +17 -15
  389. package/src/types/agent.ts +182 -53
  390. package/src/types/ai.ts +3 -3
  391. package/src/types/errors.ts +18 -0
  392. package/src/types/flow.ts +590 -0
  393. package/src/types/index.ts +43 -16
  394. package/src/types/persistence.ts +12 -8
  395. package/src/types/routing.ts +1 -1
  396. package/src/types/session.ts +26 -23
  397. package/src/types/signals.ts +321 -0
  398. package/src/types/template.ts +3 -11
  399. package/src/types/tool.ts +50 -42
  400. package/src/utils/condition.ts +13 -4
  401. package/src/utils/id.ts +27 -9
  402. package/src/utils/index.ts +6 -2
  403. package/src/utils/session.ts +238 -42
  404. package/dist/cjs/core/BatchExecutor.d.ts +0 -359
  405. package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
  406. package/dist/cjs/core/BatchExecutor.js +0 -861
  407. package/dist/cjs/core/BatchExecutor.js.map +0 -1
  408. package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
  409. package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
  410. package/dist/cjs/core/BatchPromptBuilder.js +0 -223
  411. package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
  412. package/dist/cjs/core/Route.d.ts +0 -180
  413. package/dist/cjs/core/Route.d.ts.map +0 -1
  414. package/dist/cjs/core/Route.js +0 -542
  415. package/dist/cjs/core/Route.js.map +0 -1
  416. package/dist/cjs/core/RoutingEngine.d.ts +0 -185
  417. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  418. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  419. package/dist/cjs/types/route.d.ts +0 -336
  420. package/dist/cjs/types/route.d.ts.map +0 -1
  421. package/dist/cjs/types/route.js.map +0 -1
  422. package/dist/core/BatchExecutor.d.ts +0 -359
  423. package/dist/core/BatchExecutor.d.ts.map +0 -1
  424. package/dist/core/BatchExecutor.js +0 -856
  425. package/dist/core/BatchExecutor.js.map +0 -1
  426. package/dist/core/BatchPromptBuilder.d.ts +0 -89
  427. package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
  428. package/dist/core/BatchPromptBuilder.js +0 -219
  429. package/dist/core/BatchPromptBuilder.js.map +0 -1
  430. package/dist/core/Route.d.ts +0 -180
  431. package/dist/core/Route.d.ts.map +0 -1
  432. package/dist/core/Route.js +0 -538
  433. package/dist/core/Route.js.map +0 -1
  434. package/dist/core/RoutingEngine.d.ts +0 -185
  435. package/dist/core/RoutingEngine.d.ts.map +0 -1
  436. package/dist/core/RoutingEngine.js.map +0 -1
  437. package/dist/types/route.d.ts +0 -336
  438. package/dist/types/route.d.ts.map +0 -1
  439. package/dist/types/route.js +0 -5
  440. package/dist/types/route.js.map +0 -1
  441. package/docs/CONTRIBUTING.md +0 -521
  442. package/docs/api/README.md +0 -3299
  443. package/docs/api/overview.md +0 -1410
  444. package/docs/architecture/data-extraction-flow.md +0 -360
  445. package/docs/architecture/multi-step-execution.md +0 -277
  446. package/docs/core/agent/README.md +0 -938
  447. package/docs/core/agent/context-management.md +0 -796
  448. package/docs/core/agent/rules-and-prohibitions.md +0 -113
  449. package/docs/core/agent/session-management.md +0 -693
  450. package/docs/core/ai-integration/prompt-composition.md +0 -355
  451. package/docs/core/ai-integration/providers.md +0 -515
  452. package/docs/core/ai-integration/response-processing.md +0 -433
  453. package/docs/core/conversation-flows/data-collection.md +0 -772
  454. package/docs/core/conversation-flows/route-dsl.md +0 -509
  455. package/docs/core/conversation-flows/routes.md +0 -249
  456. package/docs/core/conversation-flows/step-transitions.md +0 -731
  457. package/docs/core/conversation-flows/steps.md +0 -268
  458. package/docs/core/error-handling.md +0 -830
  459. package/docs/core/persistence/adapters.md +0 -255
  460. package/docs/core/persistence/session-storage.md +0 -656
  461. package/docs/core/routing/intelligent-routing.md +0 -470
  462. package/docs/core/tools/enhanced-tool.md +0 -186
  463. package/docs/core/tools/streaming-execution.md +0 -161
  464. package/docs/core/tools/tool-definition.md +0 -970
  465. package/docs/core/tools/tool-scoping.md +0 -819
  466. package/docs/guides/advanced-patterns/publishing.md +0 -186
  467. package/docs/guides/context-compaction.md +0 -96
  468. package/docs/guides/error-handling-patterns.md +0 -578
  469. package/docs/guides/getting-started/README.md +0 -795
  470. package/docs/guides/migration/README.md +0 -101
  471. package/docs/guides/migration/flexible-routing-conditions.md +0 -375
  472. package/docs/guides/migration/multi-step-execution.md +0 -393
  473. package/docs/guides/migration/response-modal-refactor.md +0 -518
  474. package/docs/guides/prompt-optimization.md +0 -164
  475. package/examples/advanced-patterns/context-compaction.ts +0 -223
  476. package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
  477. package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
  478. package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
  479. package/examples/advanced-patterns/streaming-responses.ts +0 -656
  480. package/examples/ai-providers/anthropic-integration.ts +0 -388
  481. package/examples/ai-providers/openai-integration.ts +0 -228
  482. package/examples/condition-patterns/function-only-conditions.ts +0 -365
  483. package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
  484. package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
  485. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  486. package/examples/condition-patterns/string-only-conditions.ts +0 -296
  487. package/examples/conversation-flows/completion-transitions.ts +0 -318
  488. package/examples/core-concepts/basic-agent.ts +0 -503
  489. package/examples/core-concepts/modern-streaming-api.ts +0 -309
  490. package/examples/core-concepts/schema-driven-extraction.ts +0 -332
  491. package/examples/core-concepts/session-management.ts +0 -494
  492. package/examples/integrations/database-integration.ts +0 -631
  493. package/examples/integrations/healthcare-integration.ts +0 -595
  494. package/examples/integrations/search-integration.ts +0 -530
  495. package/examples/integrations/server-session-management.ts +0 -307
  496. package/examples/persistence/custom-adapter.ts +0 -526
  497. package/examples/persistence/database-persistence.ts +0 -583
  498. package/examples/persistence/memory-sessions.ts +0 -495
  499. package/examples/persistence/prisma-schema.example.prisma +0 -74
  500. package/examples/persistence/redis-persistence.ts +0 -488
  501. package/examples/tools/basic-tools.ts +0 -765
  502. package/examples/tools/data-enrichment-tools.ts +0 -593
  503. package/examples/tools/enhanced-tool-metadata.ts +0 -268
  504. package/examples/tools/streaming-tool-execution.ts +0 -283
  505. package/src/core/BatchExecutor.ts +0 -1187
  506. package/src/core/BatchPromptBuilder.ts +0 -299
  507. package/src/core/Route.ts +0 -678
  508. package/src/types/route.ts +0 -392
@@ -1,830 +0,0 @@
1
- # Error Handling
2
-
3
- @fali/agent provides comprehensive error handling mechanisms for streaming operations, route completion detection, and agent-session data synchronization. This document covers error propagation patterns, recovery strategies, and best practices.
4
-
5
- ## Overview
6
-
7
- The framework handles errors across multiple layers:
8
-
9
- - **Streaming Error Propagation** - Proper error handling in streaming AI responses
10
- - **Route Completion Logic** - Accurate detection of route completion states
11
- - **Session Data Synchronization** - Consistent error handling for agent-session data operations
12
- - **Tool Execution Errors** - Graceful handling of tool failures
13
- - **Validation Errors** - Schema and data validation error recovery
14
- - **Batch Execution Errors** - Error handling during multi-step batch execution
15
-
16
- ## Batch Execution Error Handling
17
-
18
- When executing multiple steps in a batch, errors are handled according to their category and severity.
19
-
20
- ### Error Categories
21
-
22
- | Error Type | Severity | Behavior |
23
- |------------|----------|----------|
24
- | `pre_extraction` | Warning | Log warning, continue with empty extraction |
25
- | `skipif_evaluation` | Warning | Treat step as non-skippable, include in batch |
26
- | `prepare_hook` | Fatal | Stop batch execution, return error response |
27
- | `llm_call` | Fatal | Stop batch, preserve last successful session state |
28
- | `data_validation` | Non-fatal | Include errors in response, preserve partial data |
29
- | `finalize_hook` | Non-fatal | Log error, continue with remaining hooks |
30
-
31
- ### Pre-Extraction Errors
32
-
33
- Failures during data extraction from user message:
34
-
35
- ```typescript
36
- // Pre-extraction is an optimization; failure shouldn't block execution
37
- try {
38
- const preExtracted = await preExtractData(message, route);
39
- session = mergeCollected(session, preExtracted);
40
- } catch (error) {
41
- // Log warning but continue
42
- console.warn("Pre-extraction failed:", error.message);
43
- // Continue with empty extraction result
44
- }
45
- ```
46
-
47
- ### SkipIf Evaluation Errors
48
-
49
- Exceptions thrown by skipIf conditions:
50
-
51
- ```typescript
52
- // Safer to execute than skip when condition is indeterminate
53
- let shouldSkip = false;
54
- try {
55
- shouldSkip = await step.evaluateSkipIf(context);
56
- } catch (error) {
57
- console.warn(`skipIf error for step ${step.id}, treating as non-skippable`);
58
- shouldSkip = false; // Include step in batch
59
- }
60
- ```
61
-
62
- ### Prepare Hook Errors
63
-
64
- Failures in step prepare hooks stop batch execution:
65
-
66
- ```typescript
67
- const response = await agent.respond("Process my request");
68
-
69
- if (response.stoppedReason === 'prepare_error') {
70
- console.error("Prepare hook failed:", response.error);
71
- // {
72
- // type: 'prepare_hook',
73
- // message: 'Validation failed in prepare hook',
74
- // stepId: 'validate-step',
75
- // details: { ... }
76
- // }
77
-
78
- // Session state is preserved from before the failed hook
79
- console.log(response.session); // Last successful state
80
- }
81
- ```
82
-
83
- ### LLM Call Errors
84
-
85
- Provider failures, timeouts, and rate limits:
86
-
87
- ```typescript
88
- const response = await agent.respond("Generate response");
89
-
90
- if (response.stoppedReason === 'llm_error') {
91
- console.error("LLM call failed:", response.error);
92
- // {
93
- // type: 'llm_call',
94
- // message: 'Rate limit exceeded',
95
- // details: { ... }
96
- // }
97
-
98
- // Session preserved from before LLM call
99
- // Can retry with same session
100
- }
101
- ```
102
-
103
- ### Data Validation Errors
104
-
105
- Schema validation failures for collected data:
106
-
107
- ```typescript
108
- const response = await agent.respond("Book for 100 guests");
109
-
110
- if (response.stoppedReason === 'validation_error') {
111
- console.warn("Validation failed:", response.error);
112
- // {
113
- // type: 'data_validation',
114
- // message: 'Validation failed for 1 field(s): guests',
115
- // details: [
116
- // { field: 'guests', value: 100, message: 'Exceeds maximum of 10' }
117
- // ]
118
- // }
119
-
120
- // Valid partial data is still preserved
121
- console.log(response.session.data); // Contains valid fields
122
- }
123
- ```
124
-
125
- ### Finalize Hook Errors
126
-
127
- Failures in finalize hooks are logged but don't stop execution:
128
-
129
- ```typescript
130
- // Finalize hooks are for cleanup; one failure shouldn't block others
131
- const response = await agent.respond("Complete booking");
132
-
133
- // Even if finalize hooks fail, response is returned
134
- // Errors are logged and included in response.error if present
135
- if (response.error?.type === 'finalize_hook') {
136
- console.warn("Some finalize hooks failed:", response.error.details);
137
- }
138
- ```
139
-
140
- ### Partial Progress Preservation
141
-
142
- Errors preserve partial progress:
143
-
144
- ```typescript
145
- // Batch: [step1, step2, step3]
146
- // step2's prepare hook fails
147
-
148
- const response = await agent.respond("Process all steps");
149
-
150
- // step1 completed successfully
151
- // step2 failed during prepare
152
- // step3 never executed
153
-
154
- console.log(response.executedSteps);
155
- // [{ id: "step1", routeId: "route" }]
156
-
157
- console.log(response.stoppedReason);
158
- // "prepare_error"
159
-
160
- // Session contains data from step1
161
- console.log(response.session.data);
162
- ```
163
-
164
- ### Error Response Structure
165
-
166
- ```typescript
167
- interface BatchExecutionError {
168
- /** Type of error that occurred */
169
- type: 'pre_extraction' | 'skipif_evaluation' | 'prepare_hook' |
170
- 'llm_call' | 'data_validation' | 'finalize_hook';
171
- /** Error message */
172
- message: string;
173
- /** Step where error occurred (if applicable) */
174
- stepId?: string;
175
- /** Additional error details */
176
- details?: unknown;
177
- }
178
- ```
179
-
180
- ### Handling Batch Errors
181
-
182
- ```typescript
183
- const response = await agent.respond(message);
184
-
185
- // Check for errors
186
- if (response.error) {
187
- switch (response.error.type) {
188
- case 'prepare_hook':
189
- // Fatal - batch stopped
190
- await handlePrepareError(response.error);
191
- break;
192
- case 'llm_call':
193
- // Fatal - can retry
194
- await retryWithBackoff(() => agent.respond(message));
195
- break;
196
- case 'data_validation':
197
- // Non-fatal - ask user to correct
198
- await promptForCorrection(response.error.details);
199
- break;
200
- case 'finalize_hook':
201
- // Non-fatal - log and continue
202
- console.warn("Finalize error:", response.error);
203
- break;
204
- }
205
- }
206
- ```
207
-
208
- ## Streaming Error Propagation
209
-
210
- ### Error Handling in Streaming Responses
211
-
212
- When using streaming AI providers, errors must be properly propagated from the underlying provider to the application layer:
213
-
214
- ```typescript
215
- import { Agent, OpenAIProvider } from "@falai/agent";
216
-
217
- const agent = new Agent({
218
- provider: new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }),
219
- });
220
-
221
- try {
222
- // Streaming response with proper error handling
223
- for await (const chunk of agent.respondStream({
224
- message: "Hello",
225
- sessionId: "user-123"
226
- })) {
227
- if (chunk.error) {
228
- // Handle streaming errors properly
229
- console.error("Streaming error:", chunk.error);
230
- break;
231
- }
232
-
233
- if (chunk.delta) {
234
- process.stdout.write(chunk.delta);
235
- }
236
- }
237
- } catch (error) {
238
- // Catch provider-level streaming errors
239
- console.error("Provider streaming error:", error.message);
240
- }
241
- ```
242
-
243
- ### MockProvider Error Testing
244
-
245
- For testing streaming error scenarios, the MockProvider properly propagates configured errors:
246
-
247
- ```typescript
248
- import { MockProvider } from "@falai/agent/testing";
249
-
250
- const mockProvider = new MockProvider({
251
- streamingError: "Mock provider streaming error for testing"
252
- });
253
-
254
- const agent = new Agent({ provider: mockProvider });
255
-
256
- try {
257
- for await (const chunk of agent.respondStream({ message: "test" })) {
258
- // This will throw the configured streaming error
259
- }
260
- } catch (error) {
261
- // Error message will be exactly: "Mock provider streaming error for testing"
262
- expect(error.message).toBe("Mock provider streaming error for testing");
263
- }
264
- ```
265
-
266
- **Key Points:**
267
- - Streaming errors are thrown from the async generator itself
268
- - Error messages are preserved exactly as configured
269
- - Test logic catches actual provider errors, not test-generated errors
270
-
271
- ## Route Completion Error Handling
272
-
273
- ### Proper Route Completion Detection
274
-
275
- Routes with conditional steps and `endRoute()` calls require careful completion detection:
276
-
277
- ```typescript
278
- const route = agent.createRoute({
279
- title: "Conditional Route",
280
- requiredFields: ["name", "email"]
281
- });
282
-
283
- // Step with skipIf condition
284
- const askName = route.initialStep.nextStep({
285
- prompt: "What's your name?",
286
- collect: ["name"],
287
- skipIf: (data) => !!data.name, // Skip if name already collected
288
- });
289
-
290
- // Step that calls endRoute()
291
- const confirmDetails = askName.nextStep({
292
- prompt: "Confirm your details",
293
- requires: ["name", "email"],
294
- onComplete: () => {
295
- // This step calls endRoute() when complete
296
- return { endRoute: true };
297
- }
298
- });
299
-
300
- // Check route completion properly
301
- const response = await agent.respond({
302
- message: "My name is John and email is john@example.com",
303
- sessionId: "user-123"
304
- });
305
-
306
- // Route should be marked complete when all steps are processed
307
- if (response.isRouteComplete) {
308
- console.log("Route completed successfully");
309
- } else {
310
- console.log("Route still in progress");
311
- }
312
- ```
313
-
314
- ### Handling Route Completion Edge Cases
315
-
316
- ```typescript
317
- // Route completion with error handling
318
- const checkRouteCompletion = (route: Route, collectedData: any) => {
319
- try {
320
- // Required fields are a prerequisite for completion, not the trigger itself
321
- const missingFields = route.getMissingRequiredFields(collectedData);
322
-
323
- if (missingFields.length > 0) {
324
- return { complete: false, missingFields };
325
- }
326
-
327
- // Check if route explicitly ended
328
- if (route.hasExplicitEnd()) {
329
- return { complete: true, reason: "explicit_end" };
330
- }
331
-
332
- // Check if all steps are skipped/completed
333
- if (route.allStepsProcessed()) {
334
- return { complete: true, reason: "all_steps_processed" };
335
- }
336
-
337
- return { complete: false, missingFields };
338
- } catch (error) {
339
- console.error("Route completion check failed:", error);
340
- return { complete: false, error: error.message };
341
- }
342
- };
343
- ```
344
-
345
- ## Agent-Session Data Synchronization
346
-
347
- ### Bidirectional Data Sync Error Handling
348
-
349
- Agent and session data must remain synchronized with proper error handling:
350
-
351
- ```typescript
352
- class Agent<TContext, TData> {
353
- async updateCollectedData(updates: Partial<TData>): Promise<void> {
354
- try {
355
- // Update agent data
356
- this.collectedData = { ...this.collectedData, ...updates };
357
-
358
- // Sync with session data
359
- if (this.session) {
360
- await this.session.setData(this.collectedData);
361
- }
362
- } catch (error) {
363
- // Rollback agent data on session sync failure
364
- console.error("Failed to sync data with session:", error);
365
- // Restore previous state
366
- throw new Error(`Data synchronization failed: ${error.message}`);
367
- }
368
- }
369
-
370
- getCollectedData(): Partial<TData> {
371
- try {
372
- // Ensure session data is in sync
373
- if (this.session) {
374
- const sessionData = this.session.getData<TData>();
375
- if (sessionData && Object.keys(sessionData).length > 0) {
376
- this.collectedData = { ...this.collectedData, ...sessionData };
377
- }
378
- }
379
- return this.collectedData;
380
- } catch (error) {
381
- console.error("Failed to retrieve collected data:", error);
382
- return this.collectedData; // Return agent data as fallback
383
- }
384
- }
385
- }
386
- ```
387
-
388
- ### Session Data Operations with Error Recovery
389
-
390
- ```typescript
391
- class SessionManager<TData> {
392
- async setData(data: Partial<TData>): Promise<void> {
393
- try {
394
- // Validate data before setting
395
- if (this.schema) {
396
- this.validateData(data);
397
- }
398
-
399
- // Update session data
400
- this.session.data = { ...this.session.data, ...data };
401
-
402
- // Sync with agent if available
403
- if (this.agent) {
404
- this.agent.collectedData = { ...this.agent.collectedData, ...data };
405
- }
406
-
407
- // Persist changes
408
- await this.save();
409
- } catch (error) {
410
- console.error("Session data update failed:", error);
411
- // Restore previous session state
412
- await this.restore();
413
- throw new Error(`Session data update failed: ${error.message}`);
414
- }
415
- }
416
-
417
- private async restore(): Promise<void> {
418
- try {
419
- // Reload session from persistence
420
- const restored = await this.adapter.getSession(this.session.id);
421
- if (restored) {
422
- this.session = restored;
423
- }
424
- } catch (error) {
425
- console.error("Failed to restore session state:", error);
426
- }
427
- }
428
- }
429
- ```
430
-
431
- ## Session History Error Handling
432
-
433
- ### Chat Method with Proper History Management
434
-
435
- ```typescript
436
- class Agent<TContext, TData> {
437
- async chat(message: string, sessionId?: string): Promise<AgentResponse<TData>> {
438
- try {
439
- // Ensure session exists
440
- if (!this.session || this.session.id !== sessionId) {
441
- await this.loadSession(sessionId);
442
- }
443
-
444
- // Add user message to history BEFORE processing
445
- await this.session.addMessage("user", message);
446
-
447
- // Process the message
448
- const response = await this.respond({
449
- message,
450
- sessionId: this.session.id
451
- });
452
-
453
- // Add assistant response to history
454
- if (response.message) {
455
- await this.session.addMessage("assistant", response.message);
456
- }
457
-
458
- return response;
459
- } catch (error) {
460
- console.error("Chat method failed:", error);
461
-
462
- // Try to remove the user message if response failed
463
- try {
464
- await this.session.removeLastMessage("user");
465
- } catch (rollbackError) {
466
- console.error("Failed to rollback user message:", rollbackError);
467
- }
468
-
469
- throw new Error(`Chat failed: ${error.message}`);
470
- }
471
- }
472
- }
473
- ```
474
-
475
- ### History Persistence with Error Recovery
476
-
477
- ```typescript
478
- class SessionManager<TData> {
479
- async addMessage(role: "user" | "assistant", content: string): Promise<void> {
480
- try {
481
- const message: HistoryItem = {
482
- role,
483
- content,
484
- timestamp: new Date().toISOString()
485
- };
486
-
487
- // Add to in-memory history
488
- this.session.history.push(message);
489
-
490
- // Persist immediately
491
- await this.save();
492
- } catch (error) {
493
- // Remove from in-memory history on persistence failure
494
- this.session.history.pop();
495
- console.error("Failed to persist message:", error);
496
- throw new Error(`Message persistence failed: ${error.message}`);
497
- }
498
- }
499
-
500
- async getHistory(): Promise<HistoryItem[]> {
501
- try {
502
- // Ensure we have the latest history from persistence
503
- await this.refresh();
504
- return this.session.history || [];
505
- } catch (error) {
506
- console.error("Failed to retrieve history:", error);
507
- // Return in-memory history as fallback
508
- return this.session.history || [];
509
- }
510
- }
511
- }
512
- ```
513
-
514
- ## Tool Execution Error Handling
515
-
516
- ### Graceful Tool Error Recovery
517
-
518
- ```typescript
519
- import { Tool } from "@falai/agent";
520
-
521
- const searchFlights: Tool<Context, [], void, FlightData> = {
522
- id: "search_flights",
523
- description: "Search for available flights",
524
- parameters: {
525
- type: "object",
526
- properties: {
527
- destination: { type: "string" },
528
- date: { type: "string" }
529
- },
530
- required: ["destination", "date"]
531
- },
532
- handler: async (toolContext) => {
533
- try {
534
- const { data } = toolContext;
535
-
536
- // Validate required data
537
- if (!data.destination || !data.date) {
538
- return {
539
- error: "Missing required flight search parameters",
540
- data: undefined
541
- };
542
- }
543
-
544
- // Perform search
545
- const results = await flightSearchAPI.search({
546
- destination: data.destination,
547
- date: data.date
548
- });
549
-
550
- return {
551
- data: "Flight search completed successfully",
552
- dataUpdate: {
553
- availableFlights: results,
554
- searchPerformed: true
555
- }
556
- };
557
- } catch (error) {
558
- console.error("Flight search failed:", error);
559
-
560
- return {
561
- error: `Flight search failed: ${error.message}`,
562
- data: "I encountered an error while searching for flights. Please try again.",
563
- dataUpdate: {
564
- searchError: error.message,
565
- searchPerformed: false
566
- }
567
- };
568
- }
569
- }
570
- };
571
- ```
572
-
573
- ## Validation Error Handling
574
-
575
- ### Schema Validation with Fallback
576
-
577
- ```typescript
578
- const validateAndExtractData = <T>(response: string, schema: JSONSchema): T | null => {
579
- try {
580
- // Try to extract structured data
581
- const extracted = extractStructuredData<T>(response, schema);
582
-
583
- // Validate against schema
584
- const validation = validateSchema(extracted, schema);
585
-
586
- if (validation.valid) {
587
- return extracted;
588
- } else {
589
- console.warn("Schema validation failed:", validation.errors);
590
- // Fall back to manual extraction
591
- return manualExtraction<T>(response);
592
- }
593
- } catch (error) {
594
- console.error("Data extraction failed:", error);
595
- // Return null to indicate extraction failure
596
- return null;
597
- }
598
- };
599
- ```
600
-
601
- ## Error Recovery Strategies
602
-
603
- ### Automatic Retry with Backoff
604
-
605
- ```typescript
606
- const retryWithBackoff = async <T>(
607
- operation: () => Promise<T>,
608
- maxRetries: number = 3,
609
- baseDelay: number = 1000
610
- ): Promise<T> => {
611
- let lastError: Error;
612
-
613
- for (let attempt = 0; attempt < maxRetries; attempt++) {
614
- try {
615
- return await operation();
616
- } catch (error) {
617
- lastError = error as Error;
618
-
619
- if (attempt < maxRetries - 1) {
620
- const delay = baseDelay * Math.pow(2, attempt);
621
- console.warn(`Operation failed, retrying in ${delay}ms:`, error.message);
622
- await new Promise(resolve => setTimeout(resolve, delay));
623
- }
624
- }
625
- }
626
-
627
- throw new Error(`Operation failed after ${maxRetries} attempts: ${lastError.message}`);
628
- };
629
-
630
- // Usage
631
- const response = await retryWithBackoff(
632
- () => agent.respond({ message: "Hello", sessionId: "user-123" }),
633
- 3,
634
- 1000
635
- );
636
- ```
637
-
638
- ### Circuit Breaker Pattern
639
-
640
- ```typescript
641
- class CircuitBreaker {
642
- private failures = 0;
643
- private lastFailureTime = 0;
644
- private state: 'closed' | 'open' | 'half-open' = 'closed';
645
-
646
- constructor(
647
- private threshold: number = 5,
648
- private timeout: number = 60000
649
- ) {}
650
-
651
- async execute<T>(operation: () => Promise<T>): Promise<T> {
652
- if (this.state === 'open') {
653
- if (Date.now() - this.lastFailureTime > this.timeout) {
654
- this.state = 'half-open';
655
- } else {
656
- throw new Error('Circuit breaker is open');
657
- }
658
- }
659
-
660
- try {
661
- const result = await operation();
662
- this.onSuccess();
663
- return result;
664
- } catch (error) {
665
- this.onFailure();
666
- throw error;
667
- }
668
- }
669
-
670
- private onSuccess(): void {
671
- this.failures = 0;
672
- this.state = 'closed';
673
- }
674
-
675
- private onFailure(): void {
676
- this.failures++;
677
- this.lastFailureTime = Date.now();
678
-
679
- if (this.failures >= this.threshold) {
680
- this.state = 'open';
681
- }
682
- }
683
- }
684
- ```
685
-
686
- ## Best Practices
687
-
688
- ### Error Logging and Monitoring
689
-
690
- ```typescript
691
- import { Logger } from "@falai/agent/utils";
692
-
693
- const logger = new Logger("agent-errors");
694
-
695
- // Structured error logging
696
- const logError = (context: string, error: Error, metadata?: any) => {
697
- logger.error({
698
- context,
699
- message: error.message,
700
- stack: error.stack,
701
- metadata,
702
- timestamp: new Date().toISOString()
703
- });
704
- };
705
-
706
- // Usage in error handlers
707
- try {
708
- await agent.respond({ message, sessionId });
709
- } catch (error) {
710
- logError("agent-response", error, { message, sessionId });
711
- throw error;
712
- }
713
- ```
714
-
715
- ### Error Boundaries for Route Execution
716
-
717
- ```typescript
718
- const executeRouteWithErrorBoundary = async (route: Route, context: any) => {
719
- try {
720
- return await route.execute(context);
721
- } catch (error) {
722
- // Log the error
723
- logError("route-execution", error, { routeId: route.id });
724
-
725
- // Provide fallback response
726
- return {
727
- message: "I encountered an error processing your request. Please try again.",
728
- isRouteComplete: false,
729
- error: error.message
730
- };
731
- }
732
- };
733
- ```
734
-
735
- ### Graceful Degradation
736
-
737
- ```typescript
738
- const respondWithFallback = async (agent: Agent, message: string) => {
739
- try {
740
- // Try normal response
741
- return await agent.respond({ message });
742
- } catch (error) {
743
- console.warn("Normal response failed, using fallback:", error.message);
744
-
745
- // Fallback to simple response without routing
746
- return {
747
- message: "I'm experiencing some technical difficulties. How can I help you?",
748
- isRouteComplete: false,
749
- session: agent.session
750
- };
751
- }
752
- };
753
- ```
754
-
755
- ## Testing Error Scenarios
756
-
757
- ### Unit Tests for Error Handling
758
-
759
- ```typescript
760
- describe("Error Handling", () => {
761
- it("should handle streaming errors properly", async () => {
762
- const mockProvider = new MockProvider({
763
- streamingError: "Test streaming error"
764
- });
765
-
766
- const agent = new Agent({ provider: mockProvider });
767
-
768
- await expect(async () => {
769
- for await (const chunk of agent.respondStream({ message: "test" })) {
770
- // Should throw before yielding any chunks
771
- }
772
- }).rejects.toThrow("Test streaming error");
773
- });
774
-
775
- it("should handle route completion errors", async () => {
776
- const route = agent.createRoute({
777
- title: "Test Route",
778
- requiredFields: ["name"]
779
- });
780
-
781
- // Mock route completion logic to throw
782
- jest.spyOn(route, 'isComplete').mockImplementation(() => {
783
- throw new Error("Completion check failed");
784
- });
785
-
786
- const response = await agent.respond({ message: "Hello" });
787
-
788
- // Should handle error gracefully
789
- expect(response.isRouteComplete).toBe(false);
790
- });
791
- });
792
- ```
793
-
794
- ## Monitoring and Observability
795
-
796
- ### Error Metrics Collection
797
-
798
- ```typescript
799
- class ErrorMetrics {
800
- private errorCounts = new Map<string, number>();
801
- private errorRates = new Map<string, number[]>();
802
-
803
- recordError(type: string, error: Error): void {
804
- // Count errors by type
805
- this.errorCounts.set(type, (this.errorCounts.get(type) || 0) + 1);
806
-
807
- // Track error rates
808
- const now = Date.now();
809
- const rates = this.errorRates.get(type) || [];
810
- rates.push(now);
811
-
812
- // Keep only last hour of data
813
- const oneHourAgo = now - 3600000;
814
- this.errorRates.set(type, rates.filter(time => time > oneHourAgo));
815
- }
816
-
817
- getErrorRate(type: string): number {
818
- const rates = this.errorRates.get(type) || [];
819
- return rates.length; // Errors per hour
820
- }
821
-
822
- getTopErrors(limit: number = 10): Array<[string, number]> {
823
- return Array.from(this.errorCounts.entries())
824
- .sort(([,a], [,b]) => b - a)
825
- .slice(0, limit);
826
- }
827
- }
828
- ```
829
-
830
- This comprehensive error handling documentation covers all the key areas identified in the task requirements, providing practical examples and best practices for handling errors in streaming operations, route completion logic, and agent-session data synchronization.