@falai/agent 1.2.8 → 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 (499) hide show
  1. package/README.md +40 -886
  2. package/dist/adapters/MemoryAdapter.js +2 -2
  3. package/dist/adapters/MemoryAdapter.js.map +1 -1
  4. package/dist/adapters/MongoAdapter.js +2 -2
  5. package/dist/adapters/MongoAdapter.js.map +1 -1
  6. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
  7. package/dist/adapters/OpenSearchAdapter.js +9 -7
  8. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  9. package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
  10. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  11. package/dist/adapters/PostgreSQLAdapter.js +25 -9
  12. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  13. package/dist/adapters/PrismaAdapter.js +5 -5
  14. package/dist/adapters/PrismaAdapter.js.map +1 -1
  15. package/dist/adapters/RedisAdapter.js +2 -2
  16. package/dist/adapters/RedisAdapter.js.map +1 -1
  17. package/dist/adapters/SQLiteAdapter.d.ts +17 -0
  18. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  19. package/dist/adapters/SQLiteAdapter.js +30 -11
  20. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  21. package/dist/cjs/adapters/MemoryAdapter.js +2 -2
  22. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  23. package/dist/cjs/adapters/MongoAdapter.js +2 -2
  24. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  25. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  26. package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
  27. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  28. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
  29. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  30. package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
  31. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  32. package/dist/cjs/adapters/PrismaAdapter.js +5 -5
  33. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  34. package/dist/cjs/adapters/RedisAdapter.js +2 -2
  35. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  36. package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
  37. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  38. package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
  39. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  40. package/dist/cjs/constants/index.d.ts +0 -9
  41. package/dist/cjs/constants/index.d.ts.map +1 -1
  42. package/dist/cjs/constants/index.js +2 -11
  43. package/dist/cjs/constants/index.js.map +1 -1
  44. package/dist/cjs/core/Agent.d.ts +119 -153
  45. package/dist/cjs/core/Agent.d.ts.map +1 -1
  46. package/dist/cjs/core/Agent.js +471 -324
  47. package/dist/cjs/core/Agent.js.map +1 -1
  48. package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
  49. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
  50. package/dist/cjs/core/AutoChainExecutor.js +297 -0
  51. package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
  52. package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
  53. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
  54. package/dist/cjs/core/BranchEvaluator.js +130 -0
  55. package/dist/cjs/core/BranchEvaluator.js.map +1 -0
  56. package/dist/cjs/core/DirectiveBus.d.ts +88 -0
  57. package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
  58. package/dist/cjs/core/DirectiveBus.js +196 -0
  59. package/dist/cjs/core/DirectiveBus.js.map +1 -0
  60. package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
  61. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
  62. package/dist/cjs/core/DirectiveChainTracker.js +121 -0
  63. package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
  64. package/dist/cjs/core/Flow.d.ts +186 -0
  65. package/dist/cjs/core/Flow.d.ts.map +1 -0
  66. package/dist/cjs/core/Flow.js +550 -0
  67. package/dist/cjs/core/Flow.js.map +1 -0
  68. package/dist/cjs/core/FlowRouter.d.ts +182 -0
  69. package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
  70. package/dist/cjs/core/{RoutingEngine.js → FlowRouter.js} +323 -306
  71. package/dist/cjs/core/FlowRouter.js.map +1 -0
  72. package/dist/cjs/core/PersistenceManager.d.ts +2 -2
  73. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  74. package/dist/cjs/core/PersistenceManager.js +7 -7
  75. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  76. package/dist/cjs/core/PromptComposer.d.ts +21 -8
  77. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  78. package/dist/cjs/core/PromptComposer.js +182 -105
  79. package/dist/cjs/core/PromptComposer.js.map +1 -1
  80. package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
  81. package/dist/cjs/core/PromptSectionCache.js +1 -1
  82. package/dist/cjs/core/ResponseEngine.d.ts +18 -8
  83. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  84. package/dist/cjs/core/ResponseEngine.js +38 -36
  85. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  86. package/dist/cjs/core/ResponseModal.d.ts +73 -56
  87. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  88. package/dist/cjs/core/ResponseModal.js +1191 -1014
  89. package/dist/cjs/core/ResponseModal.js.map +1 -1
  90. package/dist/cjs/core/ResponsePipeline.d.ts +124 -26
  91. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  92. package/dist/cjs/core/ResponsePipeline.js +509 -136
  93. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  94. package/dist/cjs/core/SignalEvaluator.d.ts +86 -0
  95. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -0
  96. package/dist/cjs/core/SignalEvaluator.js +333 -0
  97. package/dist/cjs/core/SignalEvaluator.js.map +1 -0
  98. package/dist/cjs/core/SignalProcessor.d.ts +152 -0
  99. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -0
  100. package/dist/cjs/core/SignalProcessor.js +562 -0
  101. package/dist/cjs/core/SignalProcessor.js.map +1 -0
  102. package/dist/cjs/core/Step.d.ts +43 -32
  103. package/dist/cjs/core/Step.d.ts.map +1 -1
  104. package/dist/cjs/core/Step.js +221 -126
  105. package/dist/cjs/core/Step.js.map +1 -1
  106. package/dist/cjs/core/StreamingToolExecutor.d.ts +2 -2
  107. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
  108. package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
  109. package/dist/cjs/core/ToolManager.d.ts +44 -13
  110. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  111. package/dist/cjs/core/ToolManager.js +174 -91
  112. package/dist/cjs/core/ToolManager.js.map +1 -1
  113. package/dist/cjs/core/createAgent.d.ts +35 -0
  114. package/dist/cjs/core/createAgent.d.ts.map +1 -0
  115. package/dist/cjs/core/createAgent.js +39 -0
  116. package/dist/cjs/core/createAgent.js.map +1 -0
  117. package/dist/cjs/core/flow-namespace.d.ts +49 -0
  118. package/dist/cjs/core/flow-namespace.d.ts.map +1 -0
  119. package/dist/cjs/core/flow-namespace.js +171 -0
  120. package/dist/cjs/core/flow-namespace.js.map +1 -0
  121. package/dist/cjs/index.d.ts +11 -14
  122. package/dist/cjs/index.d.ts.map +1 -1
  123. package/dist/cjs/index.js +18 -22
  124. package/dist/cjs/index.js.map +1 -1
  125. package/dist/cjs/types/agent.d.ts +183 -54
  126. package/dist/cjs/types/agent.d.ts.map +1 -1
  127. package/dist/cjs/types/agent.js +0 -6
  128. package/dist/cjs/types/agent.js.map +1 -1
  129. package/dist/cjs/types/ai.d.ts +3 -3
  130. package/dist/cjs/types/ai.d.ts.map +1 -1
  131. package/dist/cjs/types/errors.d.ts +15 -0
  132. package/dist/cjs/types/errors.d.ts.map +1 -0
  133. package/dist/cjs/types/errors.js +22 -0
  134. package/dist/cjs/types/errors.js.map +1 -0
  135. package/dist/cjs/types/flow.d.ts +513 -0
  136. package/dist/cjs/types/flow.d.ts.map +1 -0
  137. package/dist/cjs/types/{route.js → flow.js} +2 -2
  138. package/dist/cjs/types/flow.js.map +1 -0
  139. package/dist/cjs/types/index.d.ts +7 -6
  140. package/dist/cjs/types/index.d.ts.map +1 -1
  141. package/dist/cjs/types/index.js +6 -2
  142. package/dist/cjs/types/index.js.map +1 -1
  143. package/dist/cjs/types/persistence.d.ts +11 -7
  144. package/dist/cjs/types/persistence.d.ts.map +1 -1
  145. package/dist/cjs/types/routing.d.ts +1 -1
  146. package/dist/cjs/types/routing.d.ts.map +1 -1
  147. package/dist/cjs/types/session.d.ts +24 -23
  148. package/dist/cjs/types/session.d.ts.map +1 -1
  149. package/dist/cjs/types/signals.d.ts +248 -0
  150. package/dist/cjs/types/signals.d.ts.map +1 -0
  151. package/dist/cjs/types/signals.js +11 -0
  152. package/dist/cjs/types/signals.js.map +1 -0
  153. package/dist/cjs/types/template.d.ts +2 -8
  154. package/dist/cjs/types/template.d.ts.map +1 -1
  155. package/dist/cjs/types/tool.d.ts +36 -29
  156. package/dist/cjs/types/tool.d.ts.map +1 -1
  157. package/dist/cjs/types/tool.js +1 -1
  158. package/dist/cjs/types/tool.js.map +1 -1
  159. package/dist/cjs/utils/condition.d.ts +7 -1
  160. package/dist/cjs/utils/condition.d.ts.map +1 -1
  161. package/dist/cjs/utils/condition.js.map +1 -1
  162. package/dist/cjs/utils/id.d.ts +13 -5
  163. package/dist/cjs/utils/id.d.ts.map +1 -1
  164. package/dist/cjs/utils/id.js +24 -10
  165. package/dist/cjs/utils/id.js.map +1 -1
  166. package/dist/cjs/utils/index.d.ts +2 -2
  167. package/dist/cjs/utils/index.d.ts.map +1 -1
  168. package/dist/cjs/utils/index.js +7 -3
  169. package/dist/cjs/utils/index.js.map +1 -1
  170. package/dist/cjs/utils/session.d.ts +44 -5
  171. package/dist/cjs/utils/session.d.ts.map +1 -1
  172. package/dist/cjs/utils/session.js +197 -38
  173. package/dist/cjs/utils/session.js.map +1 -1
  174. package/dist/constants/index.d.ts +0 -9
  175. package/dist/constants/index.d.ts.map +1 -1
  176. package/dist/constants/index.js +3 -9
  177. package/dist/constants/index.js.map +1 -1
  178. package/dist/core/Agent.d.ts +119 -153
  179. package/dist/core/Agent.d.ts.map +1 -1
  180. package/dist/core/Agent.js +472 -325
  181. package/dist/core/Agent.js.map +1 -1
  182. package/dist/core/AutoChainExecutor.d.ts +107 -0
  183. package/dist/core/AutoChainExecutor.d.ts.map +1 -0
  184. package/dist/core/AutoChainExecutor.js +293 -0
  185. package/dist/core/AutoChainExecutor.js.map +1 -0
  186. package/dist/core/BranchEvaluator.d.ts +54 -0
  187. package/dist/core/BranchEvaluator.d.ts.map +1 -0
  188. package/dist/core/BranchEvaluator.js +126 -0
  189. package/dist/core/BranchEvaluator.js.map +1 -0
  190. package/dist/core/DirectiveBus.d.ts +88 -0
  191. package/dist/core/DirectiveBus.d.ts.map +1 -0
  192. package/dist/core/DirectiveBus.js +192 -0
  193. package/dist/core/DirectiveBus.js.map +1 -0
  194. package/dist/core/DirectiveChainTracker.d.ts +49 -0
  195. package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
  196. package/dist/core/DirectiveChainTracker.js +117 -0
  197. package/dist/core/DirectiveChainTracker.js.map +1 -0
  198. package/dist/core/Flow.d.ts +186 -0
  199. package/dist/core/Flow.d.ts.map +1 -0
  200. package/dist/core/Flow.js +546 -0
  201. package/dist/core/Flow.js.map +1 -0
  202. package/dist/core/FlowRouter.d.ts +182 -0
  203. package/dist/core/FlowRouter.d.ts.map +1 -0
  204. package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
  205. package/dist/core/FlowRouter.js.map +1 -0
  206. package/dist/core/PersistenceManager.d.ts +2 -2
  207. package/dist/core/PersistenceManager.d.ts.map +1 -1
  208. package/dist/core/PersistenceManager.js +7 -7
  209. package/dist/core/PersistenceManager.js.map +1 -1
  210. package/dist/core/PromptComposer.d.ts +21 -8
  211. package/dist/core/PromptComposer.d.ts.map +1 -1
  212. package/dist/core/PromptComposer.js +183 -106
  213. package/dist/core/PromptComposer.js.map +1 -1
  214. package/dist/core/PromptSectionCache.d.ts +1 -1
  215. package/dist/core/PromptSectionCache.js +1 -1
  216. package/dist/core/ResponseEngine.d.ts +18 -8
  217. package/dist/core/ResponseEngine.d.ts.map +1 -1
  218. package/dist/core/ResponseEngine.js +38 -36
  219. package/dist/core/ResponseEngine.js.map +1 -1
  220. package/dist/core/ResponseModal.d.ts +73 -56
  221. package/dist/core/ResponseModal.d.ts.map +1 -1
  222. package/dist/core/ResponseModal.js +1193 -1016
  223. package/dist/core/ResponseModal.js.map +1 -1
  224. package/dist/core/ResponsePipeline.d.ts +124 -26
  225. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  226. package/dist/core/ResponsePipeline.js +509 -137
  227. package/dist/core/ResponsePipeline.js.map +1 -1
  228. package/dist/core/SignalEvaluator.d.ts +86 -0
  229. package/dist/core/SignalEvaluator.d.ts.map +1 -0
  230. package/dist/core/SignalEvaluator.js +326 -0
  231. package/dist/core/SignalEvaluator.js.map +1 -0
  232. package/dist/core/SignalProcessor.d.ts +152 -0
  233. package/dist/core/SignalProcessor.d.ts.map +1 -0
  234. package/dist/core/SignalProcessor.js +555 -0
  235. package/dist/core/SignalProcessor.js.map +1 -0
  236. package/dist/core/Step.d.ts +43 -32
  237. package/dist/core/Step.d.ts.map +1 -1
  238. package/dist/core/Step.js +220 -126
  239. package/dist/core/Step.js.map +1 -1
  240. package/dist/core/StreamingToolExecutor.d.ts +2 -2
  241. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  242. package/dist/core/StreamingToolExecutor.js.map +1 -1
  243. package/dist/core/ToolManager.d.ts +44 -13
  244. package/dist/core/ToolManager.d.ts.map +1 -1
  245. package/dist/core/ToolManager.js +174 -91
  246. package/dist/core/ToolManager.js.map +1 -1
  247. package/dist/core/createAgent.d.ts +35 -0
  248. package/dist/core/createAgent.d.ts.map +1 -0
  249. package/dist/core/createAgent.js +36 -0
  250. package/dist/core/createAgent.js.map +1 -0
  251. package/dist/core/flow-namespace.d.ts +49 -0
  252. package/dist/core/flow-namespace.d.ts.map +1 -0
  253. package/dist/core/flow-namespace.js +168 -0
  254. package/dist/core/flow-namespace.js.map +1 -0
  255. package/dist/index.d.ts +11 -14
  256. package/dist/index.d.ts.map +1 -1
  257. package/dist/index.js +9 -12
  258. package/dist/index.js.map +1 -1
  259. package/dist/types/agent.d.ts +183 -54
  260. package/dist/types/agent.d.ts.map +1 -1
  261. package/dist/types/agent.js +0 -6
  262. package/dist/types/agent.js.map +1 -1
  263. package/dist/types/ai.d.ts +3 -3
  264. package/dist/types/ai.d.ts.map +1 -1
  265. package/dist/types/errors.d.ts +15 -0
  266. package/dist/types/errors.d.ts.map +1 -0
  267. package/dist/types/errors.js +18 -0
  268. package/dist/types/errors.js.map +1 -0
  269. package/dist/types/flow.d.ts +513 -0
  270. package/dist/types/flow.d.ts.map +1 -0
  271. package/dist/types/flow.js +5 -0
  272. package/dist/types/flow.js.map +1 -0
  273. package/dist/types/index.d.ts +7 -6
  274. package/dist/types/index.d.ts.map +1 -1
  275. package/dist/types/index.js +4 -1
  276. package/dist/types/index.js.map +1 -1
  277. package/dist/types/persistence.d.ts +11 -7
  278. package/dist/types/persistence.d.ts.map +1 -1
  279. package/dist/types/routing.d.ts +1 -1
  280. package/dist/types/routing.d.ts.map +1 -1
  281. package/dist/types/session.d.ts +24 -23
  282. package/dist/types/session.d.ts.map +1 -1
  283. package/dist/types/signals.d.ts +248 -0
  284. package/dist/types/signals.d.ts.map +1 -0
  285. package/dist/types/signals.js +10 -0
  286. package/dist/types/signals.js.map +1 -0
  287. package/dist/types/template.d.ts +2 -8
  288. package/dist/types/template.d.ts.map +1 -1
  289. package/dist/types/tool.d.ts +36 -29
  290. package/dist/types/tool.d.ts.map +1 -1
  291. package/dist/types/tool.js +1 -1
  292. package/dist/types/tool.js.map +1 -1
  293. package/dist/utils/condition.d.ts +7 -1
  294. package/dist/utils/condition.d.ts.map +1 -1
  295. package/dist/utils/condition.js.map +1 -1
  296. package/dist/utils/id.d.ts +13 -5
  297. package/dist/utils/id.d.ts.map +1 -1
  298. package/dist/utils/id.js +22 -9
  299. package/dist/utils/id.js.map +1 -1
  300. package/dist/utils/index.d.ts +2 -2
  301. package/dist/utils/index.d.ts.map +1 -1
  302. package/dist/utils/index.js +2 -2
  303. package/dist/utils/index.js.map +1 -1
  304. package/dist/utils/session.d.ts +44 -5
  305. package/dist/utils/session.d.ts.map +1 -1
  306. package/dist/utils/session.js +193 -37
  307. package/dist/utils/session.js.map +1 -1
  308. package/docs/README.md +15 -202
  309. package/docs/concepts/architecture.md +281 -0
  310. package/docs/concepts/directives.md +400 -0
  311. package/docs/concepts/pipeline.md +399 -0
  312. package/docs/guides/branching.md +263 -0
  313. package/docs/guides/compaction.md +163 -0
  314. package/docs/guides/conditions.md +167 -0
  315. package/docs/guides/error-handling.md +176 -0
  316. package/docs/guides/flow-control.md +409 -0
  317. package/docs/guides/instructions.md +210 -0
  318. package/docs/guides/persistence.md +182 -0
  319. package/docs/guides/streaming.md +137 -0
  320. package/docs/migration/README.md +15 -0
  321. package/docs/migration/route-to-flow.md +560 -0
  322. package/docs/migration/v1-to-v2.md +909 -0
  323. package/docs/reference/adapters.md +481 -0
  324. package/docs/reference/branches.md +241 -0
  325. package/docs/reference/create-agent.md +186 -0
  326. package/docs/reference/directive.md +243 -0
  327. package/docs/reference/errors.md +122 -0
  328. package/docs/reference/flow.md +238 -0
  329. package/docs/reference/instruction.md +177 -0
  330. package/docs/reference/pre-directive.md +131 -0
  331. package/docs/reference/providers.md +227 -0
  332. package/docs/reference/signals.md +356 -0
  333. package/docs/reference/step.md +339 -0
  334. package/docs/reference/tool.md +269 -0
  335. package/docs/start/01-install.md +81 -0
  336. package/docs/start/02-first-agent.md +196 -0
  337. package/docs/start/03-collect-data.md +222 -0
  338. package/docs/start/04-add-tools.md +276 -0
  339. package/docs/start/05-go-to-production.md +216 -0
  340. package/examples/01-quickstart.ts +20 -0
  341. package/examples/02-data-extraction.ts +90 -0
  342. package/examples/03-tools.ts +136 -0
  343. package/examples/04-instructions.ts +100 -0
  344. package/examples/05-branching.ts +140 -0
  345. package/examples/06-flow-control.ts +103 -0
  346. package/examples/07-streaming.ts +69 -0
  347. package/examples/08-persistence.ts +98 -0
  348. package/examples/09-signals.ts +144 -0
  349. package/examples/tsconfig.json +30 -0
  350. package/package.json +2 -1
  351. package/src/adapters/MemoryAdapter.ts +3 -3
  352. package/src/adapters/MongoAdapter.ts +3 -3
  353. package/src/adapters/OpenSearchAdapter.ts +10 -8
  354. package/src/adapters/PostgreSQLAdapter.ts +26 -10
  355. package/src/adapters/PrismaAdapter.ts +6 -6
  356. package/src/adapters/RedisAdapter.ts +3 -3
  357. package/src/adapters/SQLiteAdapter.ts +31 -12
  358. package/src/constants/index.ts +2 -10
  359. package/src/core/Agent.ts +585 -374
  360. package/src/core/AutoChainExecutor.ts +440 -0
  361. package/src/core/BranchEvaluator.ts +167 -0
  362. package/src/core/DirectiveBus.ts +248 -0
  363. package/src/core/DirectiveChainTracker.ts +144 -0
  364. package/src/core/Flow.ts +666 -0
  365. package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
  366. package/src/core/PersistenceManager.ts +8 -8
  367. package/src/core/PromptComposer.ts +209 -140
  368. package/src/core/PromptSectionCache.ts +1 -1
  369. package/src/core/ResponseEngine.ts +61 -46
  370. package/src/core/ResponseModal.ts +1453 -1240
  371. package/src/core/ResponsePipeline.ts +655 -175
  372. package/src/core/SignalEvaluator.ts +420 -0
  373. package/src/core/SignalProcessor.ts +723 -0
  374. package/src/core/Step.ts +279 -176
  375. package/src/core/StreamingToolExecutor.ts +4 -4
  376. package/src/core/ToolManager.ts +200 -97
  377. package/src/core/createAgent.ts +40 -0
  378. package/src/core/flow-namespace.ts +219 -0
  379. package/src/index.ts +42 -36
  380. package/src/types/agent.ts +182 -53
  381. package/src/types/ai.ts +3 -3
  382. package/src/types/errors.ts +18 -0
  383. package/src/types/flow.ts +590 -0
  384. package/src/types/index.ts +43 -16
  385. package/src/types/persistence.ts +12 -8
  386. package/src/types/routing.ts +1 -1
  387. package/src/types/session.ts +26 -23
  388. package/src/types/signals.ts +321 -0
  389. package/src/types/template.ts +3 -11
  390. package/src/types/tool.ts +50 -42
  391. package/src/utils/condition.ts +13 -4
  392. package/src/utils/id.ts +27 -9
  393. package/src/utils/index.ts +6 -2
  394. package/src/utils/session.ts +238 -42
  395. package/dist/cjs/core/BatchExecutor.d.ts +0 -359
  396. package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
  397. package/dist/cjs/core/BatchExecutor.js +0 -861
  398. package/dist/cjs/core/BatchExecutor.js.map +0 -1
  399. package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
  400. package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
  401. package/dist/cjs/core/BatchPromptBuilder.js +0 -223
  402. package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
  403. package/dist/cjs/core/Route.d.ts +0 -180
  404. package/dist/cjs/core/Route.d.ts.map +0 -1
  405. package/dist/cjs/core/Route.js +0 -542
  406. package/dist/cjs/core/Route.js.map +0 -1
  407. package/dist/cjs/core/RoutingEngine.d.ts +0 -185
  408. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  409. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  410. package/dist/cjs/types/route.d.ts +0 -336
  411. package/dist/cjs/types/route.d.ts.map +0 -1
  412. package/dist/cjs/types/route.js.map +0 -1
  413. package/dist/core/BatchExecutor.d.ts +0 -359
  414. package/dist/core/BatchExecutor.d.ts.map +0 -1
  415. package/dist/core/BatchExecutor.js +0 -856
  416. package/dist/core/BatchExecutor.js.map +0 -1
  417. package/dist/core/BatchPromptBuilder.d.ts +0 -89
  418. package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
  419. package/dist/core/BatchPromptBuilder.js +0 -219
  420. package/dist/core/BatchPromptBuilder.js.map +0 -1
  421. package/dist/core/Route.d.ts +0 -180
  422. package/dist/core/Route.d.ts.map +0 -1
  423. package/dist/core/Route.js +0 -538
  424. package/dist/core/Route.js.map +0 -1
  425. package/dist/core/RoutingEngine.d.ts +0 -185
  426. package/dist/core/RoutingEngine.d.ts.map +0 -1
  427. package/dist/core/RoutingEngine.js.map +0 -1
  428. package/dist/types/route.d.ts +0 -336
  429. package/dist/types/route.d.ts.map +0 -1
  430. package/dist/types/route.js +0 -5
  431. package/dist/types/route.js.map +0 -1
  432. package/docs/CONTRIBUTING.md +0 -521
  433. package/docs/api/README.md +0 -3299
  434. package/docs/api/overview.md +0 -1410
  435. package/docs/architecture/data-extraction-flow.md +0 -360
  436. package/docs/architecture/multi-step-execution.md +0 -277
  437. package/docs/core/agent/README.md +0 -938
  438. package/docs/core/agent/context-management.md +0 -796
  439. package/docs/core/agent/rules-and-prohibitions.md +0 -113
  440. package/docs/core/agent/session-management.md +0 -693
  441. package/docs/core/ai-integration/prompt-composition.md +0 -355
  442. package/docs/core/ai-integration/providers.md +0 -515
  443. package/docs/core/ai-integration/response-processing.md +0 -433
  444. package/docs/core/conversation-flows/data-collection.md +0 -772
  445. package/docs/core/conversation-flows/route-dsl.md +0 -509
  446. package/docs/core/conversation-flows/routes.md +0 -249
  447. package/docs/core/conversation-flows/step-transitions.md +0 -731
  448. package/docs/core/conversation-flows/steps.md +0 -268
  449. package/docs/core/error-handling.md +0 -830
  450. package/docs/core/persistence/adapters.md +0 -255
  451. package/docs/core/persistence/session-storage.md +0 -656
  452. package/docs/core/routing/intelligent-routing.md +0 -470
  453. package/docs/core/tools/enhanced-tool.md +0 -186
  454. package/docs/core/tools/streaming-execution.md +0 -161
  455. package/docs/core/tools/tool-definition.md +0 -970
  456. package/docs/core/tools/tool-scoping.md +0 -819
  457. package/docs/guides/advanced-patterns/publishing.md +0 -186
  458. package/docs/guides/context-compaction.md +0 -96
  459. package/docs/guides/error-handling-patterns.md +0 -578
  460. package/docs/guides/getting-started/README.md +0 -795
  461. package/docs/guides/migration/README.md +0 -101
  462. package/docs/guides/migration/flexible-routing-conditions.md +0 -375
  463. package/docs/guides/migration/multi-step-execution.md +0 -393
  464. package/docs/guides/migration/response-modal-refactor.md +0 -518
  465. package/docs/guides/prompt-optimization.md +0 -164
  466. package/examples/advanced-patterns/context-compaction.ts +0 -223
  467. package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
  468. package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
  469. package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
  470. package/examples/advanced-patterns/streaming-responses.ts +0 -656
  471. package/examples/ai-providers/anthropic-integration.ts +0 -388
  472. package/examples/ai-providers/openai-integration.ts +0 -228
  473. package/examples/condition-patterns/function-only-conditions.ts +0 -365
  474. package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
  475. package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
  476. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  477. package/examples/condition-patterns/string-only-conditions.ts +0 -296
  478. package/examples/conversation-flows/completion-transitions.ts +0 -318
  479. package/examples/core-concepts/basic-agent.ts +0 -503
  480. package/examples/core-concepts/modern-streaming-api.ts +0 -309
  481. package/examples/core-concepts/schema-driven-extraction.ts +0 -332
  482. package/examples/core-concepts/session-management.ts +0 -494
  483. package/examples/integrations/database-integration.ts +0 -631
  484. package/examples/integrations/healthcare-integration.ts +0 -595
  485. package/examples/integrations/search-integration.ts +0 -530
  486. package/examples/integrations/server-session-management.ts +0 -307
  487. package/examples/persistence/custom-adapter.ts +0 -526
  488. package/examples/persistence/database-persistence.ts +0 -583
  489. package/examples/persistence/memory-sessions.ts +0 -495
  490. package/examples/persistence/prisma-schema.example.prisma +0 -74
  491. package/examples/persistence/redis-persistence.ts +0 -488
  492. package/examples/tools/basic-tools.ts +0 -765
  493. package/examples/tools/data-enrichment-tools.ts +0 -593
  494. package/examples/tools/enhanced-tool-metadata.ts +0 -268
  495. package/examples/tools/streaming-tool-execution.ts +0 -283
  496. package/src/core/BatchExecutor.ts +0 -1187
  497. package/src/core/BatchPromptBuilder.ts +0 -299
  498. package/src/core/Route.ts +0 -678
  499. 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