@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,101 +0,0 @@
1
- # Migration Guides
2
-
3
- This directory contains migration guides for major changes and updates to the `@falai/agent` framework.
4
-
5
- ## Available Migration Guides
6
-
7
- ### [Multi-Step Execution Migration Guide](./multi-step-execution.md)
8
-
9
- **v1.1.0 - Breaking Change** - `maxStepsPerBatch` now defaults to `1` (single-step execution). Set `maxStepsPerBatch: Infinity` to restore v1.0.x batching behavior.
10
-
11
- **v1.0.0 - Major Release** - Guide for understanding and migrating to multi-step batch execution.
12
-
13
- **Breaking Changes:**
14
- - � **History API Simplified**: `createMessageEvent`/`EventSource` replaced with `userMessage`/`assistantMessage`
15
- - 📝 **StepOptions**: `instructions` property renamed to `prompt`
16
-
17
- **What's New:**
18
- - 🚀 **Multi-Step Batching**: Multiple steps execute in a single LLM call
19
- - ⚡ **Reduced LLM Costs**: Fewer calls for the same outcome
20
- - 🎯 **Better UX**: Less back-and-forth in conversations
21
- - 📊 **New Response Fields**: `executedSteps`, `stoppedReason`, `error`
22
-
23
- **Key Changes:**
24
- - Steps batch together when data requirements are satisfied
25
- - Pre-extraction happens before batch determination
26
- - Hook execution order: all prepare → LLM → all finalize
27
- - SkipIf conditions affect batch determination
28
-
29
- **Migration Status:**
30
- - ⚠️ **Breaking Changes**: History API and StepOptions.instructions
31
- - ⚠️ **Behavioral Change**: Execution semantics differ
32
- - ✅ **Gradual Migration**: Review hooks and tests
33
-
34
- ---
35
-
36
- ### [ResponseModal Refactor Migration Guide](./response-modal-refactor.md)
37
-
38
- **Latest Update** - Comprehensive guide for migrating to the new ResponseModal architecture.
39
-
40
- **What's New:**
41
- - 🚀 **Modern Streaming API**: Simple `agent.stream('message')` interface
42
- - 🏗️ **Better Architecture**: Separated response logic from Agent class
43
- - 🔄 **Full Backward Compatibility**: All existing code continues to work
44
- - ⚡ **Performance Improvements**: Unified response logic and optimizations
45
-
46
- **Key Benefits:**
47
- - Automatic session management with `stream()` API
48
- - Simplified streaming interface compared to `respondStream()`
49
- - Better error handling with `ResponseGenerationError`
50
- - Improved maintainability and testability
51
-
52
- **Migration Status:**
53
- - ✅ **Backward Compatible**: No breaking changes
54
- - ✅ **Gradual Migration**: Adopt new APIs at your own pace
55
- - ✅ **Production Ready**: New APIs are fully tested and stable
56
-
57
- ---
58
-
59
- ## Migration Philosophy
60
-
61
- Our migration approach prioritizes:
62
-
63
- 1. **🔄 Backward Compatibility**: Existing code continues to work without changes
64
- 2. **📈 Gradual Adoption**: New features can be adopted incrementally
65
- 3. **📚 Clear Documentation**: Comprehensive guides with examples
66
- 4. **🛠️ Developer Experience**: Improved APIs that are easier to use
67
- 5. **⚡ Performance**: Better performance without breaking existing functionality
68
-
69
- ## Getting Help
70
-
71
- - **📖 Documentation**: Each migration guide includes detailed examples and comparisons
72
- - **💡 Examples**: Check the [examples directory](../../../examples/) for updated code samples
73
- - **🐛 Issues**: Report migration issues on [GitHub Issues](https://github.com/falai-dev/agent/issues)
74
- - **💬 Discussions**: Ask questions in [GitHub Discussions](https://github.com/falai-dev/agent/discussions)
75
-
76
- ## Best Practices
77
-
78
- ### Before Migrating
79
-
80
- 1. **Read the migration guide** thoroughly
81
- 2. **Test in development** before applying to production
82
- 3. **Review examples** to understand new patterns
83
- 4. **Check for breaking changes** (though we avoid them when possible)
84
-
85
- ### During Migration
86
-
87
- 1. **Migrate gradually** - don't change everything at once
88
- 2. **Keep existing code working** while adopting new APIs
89
- 3. **Test thoroughly** after each migration step
90
- 4. **Monitor performance** to ensure improvements
91
-
92
- ### After Migration
93
-
94
- 1. **Update documentation** to reflect new patterns
95
- 2. **Train team members** on new APIs and best practices
96
- 3. **Monitor for issues** and report any problems
97
- 4. **Share feedback** to help improve future migrations
98
-
99
- ---
100
-
101
- **Stay Updated**: Watch the repository for new migration guides and updates.
@@ -1,375 +0,0 @@
1
- # Migration Guide: Flexible Routing Conditions
2
-
3
- This guide helps you migrate from the previous routing condition system to the new `ConditionTemplate` system introduced in version X.X.X.
4
-
5
- ## Overview of Changes
6
-
7
- The routing system has been enhanced with a new `ConditionTemplate` type that supports:
8
-
9
- - **String conditions**: AI context for routing decisions
10
- - **Function conditions**: Programmatic boolean evaluation
11
- - **Array conditions**: Mix of strings and functions with logical operators
12
- - **Route skipIf**: New functionality to exclude routes dynamically
13
- - **Enhanced Step conditions**: More flexible step control
14
-
15
- ## Breaking Changes
16
-
17
- ### 1. Route Conditions → Route When
18
-
19
- **Before:**
20
- ```typescript
21
- agent.createRoute({
22
- title: "Customer Support",
23
- conditions: ["User needs help", "User asks questions"],
24
- // ...
25
- });
26
- ```
27
-
28
- **After:**
29
- ```typescript
30
- agent.createRoute({
31
- title: "Customer Support",
32
- when: ["User needs help", "User asks questions"], // Renamed from 'conditions'
33
- // ...
34
- });
35
- ```
36
-
37
- **Migration:** Simply rename `conditions` to `when` in all route definitions.
38
-
39
- ### 2. Step When Conditions
40
-
41
- **Before:**
42
- ```typescript
43
- // String-based when condition
44
- step.nextStep({
45
- when: "User wants to continue",
46
- prompt: "Let's continue..."
47
- });
48
-
49
- // Function-based when condition (returned string)
50
- step.nextStep({
51
- when: (ctx) => ctx.data?.readyToContinue ? "Ready to proceed" : null,
52
- prompt: "Let's continue..."
53
- });
54
- ```
55
-
56
- **After:**
57
- ```typescript
58
- // String-based when condition (unchanged)
59
- step.nextStep({
60
- when: "User wants to continue",
61
- prompt: "Let's continue..."
62
- });
63
-
64
- // Function-based when condition (now returns boolean)
65
- step.nextStep({
66
- when: (ctx) => ctx.data?.readyToContinue === true, // Returns boolean
67
- prompt: "Let's continue..."
68
- });
69
-
70
- // Mixed array condition (new capability)
71
- step.nextStep({
72
- when: [
73
- "User is ready to proceed", // AI context
74
- (ctx) => ctx.data?.readyToContinue === true // Programmatic check
75
- ],
76
- prompt: "Let's continue..."
77
- });
78
- ```
79
-
80
- **Migration:** Update function-based `when` conditions to return boolean instead of string.
81
-
82
- ### 3. Step SkipIf Conditions
83
-
84
- **Before:**
85
- ```typescript
86
- step.nextStep({
87
- skipIf: (data) => data.alreadyCompleted === true, // Function only
88
- prompt: "Complete this step"
89
- });
90
- ```
91
-
92
- **After:**
93
- ```typescript
94
- // Function-only skipIf (unchanged signature, but now uses full context)
95
- step.nextStep({
96
- skipIf: (ctx) => ctx.data?.alreadyCompleted === true, // Full context access
97
- prompt: "Complete this step"
98
- });
99
-
100
- // String-only skipIf (new capability)
101
- step.nextStep({
102
- skipIf: "Step already completed",
103
- prompt: "Complete this step"
104
- });
105
-
106
- // Mixed array skipIf (new capability)
107
- step.nextStep({
108
- skipIf: [
109
- "Step already completed", // AI context
110
- (ctx) => ctx.data?.alreadyCompleted === true // Programmatic check
111
- ],
112
- prompt: "Complete this step"
113
- });
114
- ```
115
-
116
- **Migration:** Update `skipIf` functions to use full `TemplateContext` instead of just data.
117
-
118
- ### 4. Guideline Conditions
119
-
120
- **Before:**
121
- ```typescript
122
- agent.addGuideline({
123
- condition: "User seems frustrated", // Template type
124
- action: "Be extra helpful"
125
- });
126
-
127
- agent.addGuideline({
128
- condition: (ctx) => `User type is ${ctx.userType}`, // Function returning string
129
- action: "Adjust tone accordingly"
130
- });
131
- ```
132
-
133
- **After:**
134
- ```typescript
135
- // String condition (unchanged)
136
- agent.addGuideline({
137
- condition: "User seems frustrated",
138
- action: "Be extra helpful"
139
- });
140
-
141
- // Function condition (now returns boolean)
142
- agent.addGuideline({
143
- condition: (ctx) => ctx.data?.userType === 'premium', // Returns boolean
144
- action: "Provide premium support"
145
- });
146
-
147
- // Mixed array condition (new capability)
148
- agent.addGuideline({
149
- condition: [
150
- "User needs special assistance", // AI context
151
- (ctx) => ctx.data?.userType === 'premium' // Programmatic check
152
- ],
153
- action: "Provide premium support with priority handling"
154
- });
155
- ```
156
-
157
- **Migration:** Update function-based guideline conditions to return boolean instead of string.
158
-
159
- ## New Features
160
-
161
- ### Route SkipIf
162
-
163
- Routes can now be excluded from consideration:
164
-
165
- ```typescript
166
- agent.createRoute({
167
- title: "Premium Features",
168
- when: ["User wants premium features"],
169
- skipIf: [
170
- "Premium features are under maintenance", // AI context
171
- (ctx) => ctx.context?.maintenanceMode === true // Programmatic check
172
- ],
173
- // ...
174
- });
175
- ```
176
-
177
- ### Enhanced Context Access
178
-
179
- All condition functions now receive full `TemplateContext`:
180
-
181
- ```typescript
182
- interface TemplateContext<TContext, TData> {
183
- context?: TContext; // Agent context
184
- session?: SessionState<TData>; // Session state
185
- history?: Event[]; // Conversation history
186
- data?: Partial<TData>; // Convenience alias for session.data
187
- }
188
-
189
- // Use in conditions
190
- const condition = (ctx) => {
191
- return ctx.context?.userTier === 'premium' &&
192
- ctx.data?.issueType === 'billing' &&
193
- ctx.session?.currentRoute?.id !== 'billing_route';
194
- };
195
- ```
196
-
197
- ## Migration Steps
198
-
199
- ### Step 1: Update Route Definitions
200
-
201
- ```typescript
202
- // Before
203
- const routes = [
204
- {
205
- title: "Support",
206
- conditions: ["User needs help"],
207
- // ...
208
- }
209
- ];
210
-
211
- // After
212
- const routes = [
213
- {
214
- title: "Support",
215
- when: ["User needs help"], // Renamed
216
- // ...
217
- }
218
- ];
219
- ```
220
-
221
- ### Step 2: Update Function-Based Conditions
222
-
223
- ```typescript
224
- // Before - functions returned strings
225
- when: (ctx) => ctx.data?.ready ? "User is ready" : null,
226
- skipIf: (data) => data.completed === true,
227
-
228
- // After - functions return booleans
229
- when: (ctx) => ctx.data?.ready === true,
230
- skipIf: (ctx) => ctx.data?.completed === true,
231
- ```
232
-
233
- ### Step 3: Update Guideline Conditions
234
-
235
- ```typescript
236
- // Before
237
- guidelines: [
238
- {
239
- condition: (ctx) => `User is ${ctx.userType}`,
240
- action: "Adjust tone"
241
- }
242
- ]
243
-
244
- // After
245
- guidelines: [
246
- {
247
- condition: (ctx) => ctx.data?.userType === 'premium',
248
- action: "Provide premium tone and service"
249
- }
250
- ]
251
- ```
252
-
253
- ### Step 4: Leverage New Capabilities
254
-
255
- ```typescript
256
- // Add Route skipIf where appropriate
257
- agent.createRoute({
258
- title: "Payment Processing",
259
- when: ["User wants to make payment"],
260
- skipIf: [
261
- "Payment system is down", // AI context
262
- (ctx) => ctx.context?.paymentSystemDown === true // Programmatic
263
- ]
264
- });
265
-
266
- // Use mixed array conditions for complex logic
267
- step.nextStep({
268
- when: [
269
- "User is ready for advanced features", // AI context
270
- (ctx) => ctx.data?.experienceLevel === 'advanced', // Programmatic
271
- (ctx) => ctx.context?.featuresEnabled === true // Context check
272
- ],
273
- prompt: "Let's explore advanced features"
274
- });
275
- ```
276
-
277
- ## Testing Your Migration
278
-
279
- ### 1. Verify Route Selection
280
-
281
- Test that routes are selected correctly with new `when` conditions:
282
-
283
- ```typescript
284
- // Test route selection
285
- const response = await agent.respond("I need help with billing");
286
- expect(response.session?.currentRoute?.title).toBe("Billing Support");
287
- ```
288
-
289
- ### 2. Test SkipIf Logic
290
-
291
- Verify that routes and steps are properly skipped:
292
-
293
- ```typescript
294
- // Test route skipIf
295
- const contextWithMaintenance = { maintenanceMode: true };
296
- const response = await agent.respond("I want premium features", {
297
- contextOverride: contextWithMaintenance
298
- });
299
- // Should not select premium route due to skipIf
300
- ```
301
-
302
- ### 3. Validate Guideline Activation
303
-
304
- Test that guidelines activate correctly with new conditions:
305
-
306
- ```typescript
307
- // Test guideline conditions
308
- const premiumContext = { userType: 'premium' };
309
- const response = await agent.respond("I need help", {
310
- contextOverride: premiumContext
311
- });
312
- // Should apply premium guidelines
313
- ```
314
-
315
- ## Common Issues
316
-
317
- ### Issue 1: Function Conditions Not Working
318
-
319
- **Problem:** Function conditions that previously returned strings now need to return booleans.
320
-
321
- **Solution:**
322
- ```typescript
323
- // Wrong
324
- when: (ctx) => ctx.data?.ready ? "User is ready" : null,
325
-
326
- // Correct
327
- when: (ctx) => ctx.data?.ready === true,
328
- ```
329
-
330
- ### Issue 2: SkipIf Context Access
331
-
332
- **Problem:** `skipIf` functions now receive full context instead of just data.
333
-
334
- **Solution:**
335
- ```typescript
336
- // Wrong
337
- skipIf: (data) => data.completed,
338
-
339
- // Correct
340
- skipIf: (ctx) => ctx.data?.completed === true,
341
- ```
342
-
343
- ### Issue 3: Guideline Condition Types
344
-
345
- **Problem:** Guideline conditions that returned strings need to return booleans.
346
-
347
- **Solution:**
348
- ```typescript
349
- // Wrong
350
- condition: (ctx) => `User is ${ctx.userType}`,
351
-
352
- // Correct
353
- condition: (ctx) => ctx.data?.userType === 'premium',
354
- ```
355
-
356
- ## Benefits of Migration
357
-
358
- After migration, you'll have access to:
359
-
360
- - **Hybrid Logic**: Combine AI understanding with programmatic precision
361
- - **Better Performance**: Functions execute first, strings only used when needed
362
- - **Route Exclusion**: Use `skipIf` to dynamically exclude routes
363
- - **Enhanced Context**: Access full context in all condition functions
364
- - **Flexible Arrays**: Mix strings and functions for optimal control
365
-
366
- ## Support
367
-
368
- If you encounter issues during migration:
369
-
370
- 1. Check the [API Reference](../../api/README.md) for updated interfaces
371
- 2. Review [examples](../../../examples/) for migration patterns
372
- 3. Test incrementally - migrate one route at a time
373
- 4. Use TypeScript for compile-time validation of new signatures
374
-
375
- The new `ConditionTemplate` system provides much more flexibility while maintaining backward compatibility where possible.