@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,578 +0,0 @@
1
- # Error Handling Patterns
2
-
3
- This guide provides practical patterns and examples for handling errors in @fali/agent applications, covering streaming operations, route completion, and data synchronization scenarios.
4
-
5
- ## Quick Reference
6
-
7
- | Error Type | Pattern | Recovery Strategy |
8
- |------------|---------|-------------------|
9
- | Streaming Errors | Proper async generator error propagation | Catch and re-throw with context |
10
- | Route Completion | Defensive completion checking | Fallback to incomplete state |
11
- | Data Sync | Bidirectional rollback | Restore previous consistent state |
12
- | Tool Execution | Graceful degradation | Fallback responses with error context |
13
- | Validation | Schema + manual fallback | Progressive fallback strategies |
14
-
15
- ## Streaming Error Patterns
16
-
17
- ### Pattern 1: Provider Error Propagation
18
-
19
- **Problem:** Streaming errors from AI providers need to be properly propagated to the application layer.
20
-
21
- **Solution:**
22
- ```typescript
23
- // ✅ Correct: Proper error propagation in streaming
24
- async function* handleStreamingResponse(provider: AIProvider, prompt: string) {
25
- try {
26
- for await (const chunk of provider.generateMessageStream(prompt)) {
27
- yield { success: true, data: chunk };
28
- }
29
- } catch (error) {
30
- // Log the error but let it propagate
31
- console.error("Streaming error:", error.message);
32
- throw error; // Important: re-throw to stop the stream
33
- }
34
- }
35
-
36
- // Usage
37
- try {
38
- for await (const chunk of handleStreamingResponse(provider, prompt)) {
39
- if (chunk.success) {
40
- process.stdout.write(chunk.data);
41
- }
42
- }
43
- } catch (error) {
44
- console.error("Stream failed:", error.message);
45
- // Handle the error appropriately
46
- }
47
- ```
48
-
49
- **Anti-pattern:**
50
- ```typescript
51
- // ❌ Wrong: Swallowing streaming errors
52
- async function* badStreamingHandler(provider: AIProvider, prompt: string) {
53
- try {
54
- for await (const chunk of provider.generateMessageStream(prompt)) {
55
- yield chunk;
56
- }
57
- } catch (error) {
58
- // Don't do this - error is lost
59
- yield { error: "Something went wrong" };
60
- }
61
- }
62
- ```
63
-
64
- ### Pattern 2: MockProvider Testing
65
-
66
- **Problem:** Testing streaming error scenarios requires proper error configuration.
67
-
68
- **Solution:**
69
- ```typescript
70
- // ✅ Correct: MockProvider with proper error testing
71
- import { MockProvider } from "@falai/agent/testing";
72
-
73
- describe("Streaming Error Handling", () => {
74
- it("should propagate streaming errors correctly", async () => {
75
- const mockProvider = new MockProvider({
76
- streamingError: "Mock provider streaming error for testing"
77
- });
78
-
79
- const agent = new Agent({ provider: mockProvider });
80
-
81
- // Test that the exact error message is propagated
82
- await expect(async () => {
83
- for await (const chunk of agent.respondStream({ message: "test" })) {
84
- // Should throw before yielding any chunks
85
- }
86
- }).rejects.toThrow("Mock provider streaming error for testing");
87
- });
88
- });
89
- ```
90
-
91
- ## Route Completion Patterns
92
-
93
- ### Pattern 1: Defensive Completion Checking
94
-
95
- **Problem:** Route completion logic needs to handle various edge cases including conditional steps and explicit termination.
96
-
97
- **Solution:**
98
- ```typescript
99
- // ✅ Correct: Comprehensive completion checking
100
- const checkRouteCompletion = (route: Route, collectedData: any) => {
101
- try {
102
- // Check 1: All required fields present
103
- const missingFields = route.getMissingRequiredFields(collectedData);
104
- if (missingFields.length === 0) {
105
- return { complete: true, reason: "all_data_collected" };
106
- }
107
-
108
- // Check 2: All steps processed (including skipped ones)
109
- const allStepsProcessed = route.steps.every(step => {
110
- // Skipped steps count as processed
111
- if (step.skipIf && step.skipIf(collectedData)) {
112
- return true;
113
- }
114
- return step.isCompleted;
115
- });
116
-
117
- if (allStepsProcessed) {
118
- return { complete: true, reason: "all_steps_processed" };
119
- }
120
-
121
- // Check 3: Explicit route termination
122
- if (route.hasExplicitEnd()) {
123
- return { complete: true, reason: "explicit_end" };
124
- }
125
-
126
- return { complete: false, missingFields };
127
-
128
- } catch (error) {
129
- console.error("Route completion check failed:", error);
130
- // Safe fallback - assume incomplete
131
- return { complete: false, error: error.message };
132
- }
133
- };
134
- ```
135
-
136
- ### Pattern 2: Conditional Step Handling
137
-
138
- **Problem:** Routes with `skipIf` conditions can complete even when steps are skipped.
139
-
140
- **Solution:**
141
- ```typescript
142
- // ✅ Correct: Handle conditional steps in completion logic
143
- const route = agent.createRoute({
144
- title: "Smart Booking",
145
- requiredFields: ["destination", "dates", "passengers"]
146
- });
147
-
148
- // Steps with smart skipping
149
- const askDestination = route.initialStep.nextStep({
150
- prompt: "Where would you like to go?",
151
- collect: ["destination"],
152
- skipIf: (data) => !!data.destination, // Skip if already collected
153
- });
154
-
155
- const askDates = askDestination.nextStep({
156
- prompt: "When would you like to travel?",
157
- collect: ["dates"],
158
- skipIf: (data) => !!data.dates,
159
- });
160
-
161
- const confirmBooking = askDates.nextStep({
162
- prompt: "Confirm your booking",
163
- requires: ["destination", "dates", "passengers"],
164
- onComplete: () => ({ endRoute: true })
165
- });
166
-
167
- // Handle response where all data is collected at once
168
- const response = await agent.respond({
169
- message: "Book a flight to Tokyo on March 15th for 2 passengers"
170
- });
171
-
172
- // Route should be complete even though steps were skipped
173
- console.log("Route complete:", response.isRouteComplete); // Should be true
174
- ```
175
-
176
- ## Data Synchronization Patterns
177
-
178
- ### Pattern 1: Bidirectional Sync with Rollback
179
-
180
- **Problem:** Agent and session data must stay synchronized with proper error recovery.
181
-
182
- **Solution:**
183
- ```typescript
184
- // ✅ Correct: Bidirectional sync with rollback
185
- class Agent<TContext, TData> {
186
- async updateCollectedData(updates: Partial<TData>): Promise<void> {
187
- const previousAgentData = { ...this.collectedData };
188
- const previousSessionData = this.session ? { ...this.session.getData() } : null;
189
-
190
- try {
191
- // Update agent data first
192
- this.collectedData = { ...this.collectedData, ...updates };
193
-
194
- // Sync with session
195
- if (this.session) {
196
- await this.session.setData(this.collectedData);
197
- }
198
-
199
- } catch (error) {
200
- // Rollback both agent and session data
201
- this.collectedData = previousAgentData;
202
-
203
- if (this.session && previousSessionData) {
204
- try {
205
- await this.session.setData(previousSessionData);
206
- } catch (rollbackError) {
207
- console.error("Failed to rollback session data:", rollbackError);
208
- }
209
- }
210
-
211
- throw new Error(`Data synchronization failed: ${error.message}`);
212
- }
213
- }
214
- }
215
- ```
216
-
217
- ### Pattern 2: Session History with Persistence
218
-
219
- **Problem:** Chat history must be reliably persisted with proper error handling.
220
-
221
- **Solution:**
222
- ```typescript
223
- // ✅ Correct: Reliable history persistence
224
- class Agent<TContext, TData> {
225
- async chat(message: string, sessionId?: string): Promise<AgentResponse<TData>> {
226
- let userMessageAdded = false;
227
-
228
- try {
229
- // Ensure session is loaded
230
- await this.ensureSession(sessionId);
231
-
232
- // Add user message to history BEFORE processing
233
- await this.session.addMessage("user", message);
234
- userMessageAdded = true;
235
-
236
- // Process the message
237
- const response = await this.respond({
238
- message,
239
- sessionId: this.session.id
240
- });
241
-
242
- // Add assistant response to history
243
- if (response.message) {
244
- await this.session.addMessage("assistant", response.message);
245
- }
246
-
247
- return response;
248
-
249
- } catch (error) {
250
- console.error("Chat method failed:", error);
251
-
252
- // Rollback user message if it was added
253
- if (userMessageAdded) {
254
- try {
255
- await this.session.removeLastMessage("user");
256
- } catch (rollbackError) {
257
- console.error("Failed to rollback user message:", rollbackError);
258
- }
259
- }
260
-
261
- throw new Error(`Chat failed: ${error.message}`);
262
- }
263
- }
264
- }
265
- ```
266
-
267
- ## Tool Execution Patterns
268
-
269
- ### Pattern 1: Graceful Tool Degradation
270
-
271
- **Problem:** Tool failures should not break the conversation flow.
272
-
273
- **Solution:**
274
- ```typescript
275
- // ✅ Correct: Graceful tool error handling
276
- const searchFlights: Tool<Context, [], void, FlightData> = {
277
- id: "search_flights",
278
- description: "Search for available flights",
279
- parameters: {
280
- type: "object",
281
- properties: {
282
- destination: { type: "string" },
283
- date: { type: "string" }
284
- }
285
- },
286
- handler: async (toolContext) => {
287
- try {
288
- const { data } = toolContext;
289
-
290
- // Validate inputs
291
- if (!data.destination || !data.date) {
292
- return {
293
- data: "I need both destination and date to search for flights.",
294
- error: "Missing required parameters"
295
- };
296
- }
297
-
298
- // Perform the search
299
- const results = await flightAPI.search(data.destination, data.date);
300
-
301
- return {
302
- data: `Found ${results.length} flights to ${data.destination}`,
303
- dataUpdate: { availableFlights: results }
304
- };
305
-
306
- } catch (error) {
307
- console.error("Flight search failed:", error);
308
-
309
- // Provide helpful error message to user
310
- return {
311
- data: "I'm having trouble searching for flights right now. Please try again in a moment.",
312
- error: error.message,
313
- dataUpdate: { searchError: true }
314
- };
315
- }
316
- }
317
- };
318
- ```
319
-
320
- ### Pattern 2: Tool Retry with Circuit Breaker
321
-
322
- **Problem:** External API failures need retry logic with circuit breaking.
323
-
324
- **Solution:**
325
- ```typescript
326
- // ✅ Correct: Tool with retry and circuit breaker
327
- class ToolExecutor {
328
- private circuitBreaker = new Map<string, CircuitBreaker>();
329
-
330
- async executeTool<T>(tool: Tool, params: any): Promise<T> {
331
- const breaker = this.getCircuitBreaker(tool.id);
332
-
333
- return await breaker.execute(async () => {
334
- return await this.retryWithBackoff(
335
- () => tool.handler(params),
336
- 3, // max retries
337
- 1000 // base delay
338
- );
339
- });
340
- }
341
-
342
- private async retryWithBackoff<T>(
343
- operation: () => Promise<T>,
344
- maxRetries: number,
345
- baseDelay: number
346
- ): Promise<T> {
347
- let lastError: Error;
348
-
349
- for (let attempt = 0; attempt < maxRetries; attempt++) {
350
- try {
351
- return await operation();
352
- } catch (error) {
353
- lastError = error as Error;
354
-
355
- if (attempt < maxRetries - 1) {
356
- const delay = baseDelay * Math.pow(2, attempt);
357
- await new Promise(resolve => setTimeout(resolve, delay));
358
- }
359
- }
360
- }
361
-
362
- throw lastError;
363
- }
364
- }
365
- ```
366
-
367
- ## Validation Patterns
368
-
369
- ### Pattern 1: Progressive Fallback Validation
370
-
371
- **Problem:** Schema validation failures need graceful fallback strategies.
372
-
373
- **Solution:**
374
- ```typescript
375
- // ✅ Correct: Progressive validation fallback
376
- const extractDataWithFallback = async <T>(
377
- response: string,
378
- schema: JSONSchema
379
- ): Promise<{ data: T | null; method: string; error?: string }> => {
380
-
381
- // Try 1: Schema-based extraction
382
- try {
383
- const extracted = await extractWithSchema<T>(response, schema);
384
- const validation = validateSchema(extracted, schema);
385
-
386
- if (validation.valid) {
387
- return { data: extracted, method: "schema" };
388
- } else {
389
- console.warn("Schema validation failed:", validation.errors);
390
- }
391
- } catch (error) {
392
- console.warn("Schema extraction failed:", error.message);
393
- }
394
-
395
- // Try 2: Manual extraction with patterns
396
- try {
397
- const manual = await manualExtraction<T>(response);
398
- return { data: manual, method: "manual" };
399
- } catch (error) {
400
- console.warn("Manual extraction failed:", error.message);
401
- }
402
-
403
- // Try 3: LLM-based extraction as last resort
404
- try {
405
- const llmExtracted = await llmBasedExtraction<T>(response, schema);
406
- return { data: llmExtracted, method: "llm" };
407
- } catch (error) {
408
- console.error("All extraction methods failed:", error.message);
409
- return { data: null, method: "none", error: error.message };
410
- }
411
- };
412
- ```
413
-
414
- ## Error Recovery Strategies
415
-
416
- ### Strategy 1: Exponential Backoff
417
-
418
- ```typescript
419
- const withExponentialBackoff = async <T>(
420
- operation: () => Promise<T>,
421
- maxRetries: number = 3,
422
- baseDelay: number = 1000,
423
- maxDelay: number = 10000
424
- ): Promise<T> => {
425
- let lastError: Error;
426
-
427
- for (let attempt = 0; attempt < maxRetries; attempt++) {
428
- try {
429
- return await operation();
430
- } catch (error) {
431
- lastError = error as Error;
432
-
433
- if (attempt < maxRetries - 1) {
434
- const delay = Math.min(
435
- baseDelay * Math.pow(2, attempt),
436
- maxDelay
437
- );
438
-
439
- console.warn(`Attempt ${attempt + 1} failed, retrying in ${delay}ms:`, error.message);
440
- await new Promise(resolve => setTimeout(resolve, delay));
441
- }
442
- }
443
- }
444
-
445
- throw new Error(`Operation failed after ${maxRetries} attempts: ${lastError.message}`);
446
- };
447
- ```
448
-
449
- ### Strategy 2: Circuit Breaker
450
-
451
- ```typescript
452
- class CircuitBreaker {
453
- private failures = 0;
454
- private lastFailureTime = 0;
455
- private state: 'closed' | 'open' | 'half-open' = 'closed';
456
-
457
- constructor(
458
- private threshold: number = 5,
459
- private timeout: number = 60000
460
- ) {}
461
-
462
- async execute<T>(operation: () => Promise<T>): Promise<T> {
463
- if (this.state === 'open') {
464
- if (Date.now() - this.lastFailureTime > this.timeout) {
465
- this.state = 'half-open';
466
- } else {
467
- throw new Error('Circuit breaker is open - service unavailable');
468
- }
469
- }
470
-
471
- try {
472
- const result = await operation();
473
- this.onSuccess();
474
- return result;
475
- } catch (error) {
476
- this.onFailure();
477
- throw error;
478
- }
479
- }
480
-
481
- private onSuccess(): void {
482
- this.failures = 0;
483
- this.state = 'closed';
484
- }
485
-
486
- private onFailure(): void {
487
- this.failures++;
488
- this.lastFailureTime = Date.now();
489
-
490
- if (this.failures >= this.threshold) {
491
- this.state = 'open';
492
- }
493
- }
494
- }
495
- ```
496
-
497
- ## Testing Error Scenarios
498
-
499
- ### Unit Test Patterns
500
-
501
- ```typescript
502
- describe("Error Handling", () => {
503
- describe("Streaming Errors", () => {
504
- it("should propagate provider streaming errors", async () => {
505
- const mockProvider = new MockProvider({
506
- streamingError: "Test streaming error"
507
- });
508
-
509
- const agent = new Agent({ provider: mockProvider });
510
-
511
- await expect(async () => {
512
- for await (const chunk of agent.respondStream({ message: "test" })) {
513
- // Should throw before yielding
514
- }
515
- }).rejects.toThrow("Test streaming error");
516
- });
517
- });
518
-
519
- describe("Route Completion", () => {
520
- it("should handle completion check errors gracefully", async () => {
521
- const route = createMockRoute();
522
-
523
- // Mock completion check to throw
524
- jest.spyOn(route, 'isComplete').mockImplementation(() => {
525
- throw new Error("Completion check failed");
526
- });
527
-
528
- const result = checkRouteCompletion(route, {});
529
-
530
- expect(result.complete).toBe(false);
531
- expect(result.error).toBe("Completion check failed");
532
- });
533
- });
534
-
535
- describe("Data Synchronization", () => {
536
- it("should rollback on sync failures", async () => {
537
- const agent = new Agent({ sessionId: "test" });
538
- const originalData = { name: "John" };
539
-
540
- // Set initial data
541
- await agent.updateCollectedData(originalData);
542
-
543
- // Mock session setData to fail
544
- jest.spyOn(agent.session, 'setData').mockRejectedValue(
545
- new Error("Persistence failed")
546
- );
547
-
548
- // Attempt update should fail and rollback
549
- await expect(
550
- agent.updateCollectedData({ email: "john@example.com" })
551
- ).rejects.toThrow("Data synchronization failed");
552
-
553
- // Data should be rolled back
554
- expect(agent.getCollectedData()).toEqual(originalData);
555
- });
556
- });
557
- });
558
- ```
559
-
560
- ## Best Practices Summary
561
-
562
- 1. **Always propagate streaming errors** - Don't swallow them in generators
563
- 2. **Use defensive completion checking** - Handle all edge cases gracefully
564
- 3. **Implement bidirectional rollback** - Keep agent and session data consistent
565
- 4. **Provide fallback responses** - Never leave users without feedback
566
- 5. **Log errors with context** - Include relevant metadata for debugging
567
- 6. **Test error scenarios** - Cover all failure modes in your tests
568
- 7. **Use circuit breakers** - Protect against cascading failures
569
- 8. **Implement progressive fallbacks** - Multiple recovery strategies
570
- 9. **Monitor error rates** - Track and alert on error patterns
571
- 10. **Document error handling** - Make error behavior clear to users
572
-
573
- ## Further Reading
574
-
575
- - [Core Error Handling](../core/error-handling.md) - Comprehensive error handling reference
576
- - [Response Processing](../core/ai-integration/response-processing.md) - AI response error handling
577
- - [Session Management](../core/agent/session-management.md) - Session error patterns
578
- - [Route Management](../core/conversation-flows/routes.md) - Route completion error handling