@falai/agent 1.2.8 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. package/README.md +40 -886
  2. package/dist/adapters/MemoryAdapter.js +2 -2
  3. package/dist/adapters/MemoryAdapter.js.map +1 -1
  4. package/dist/adapters/MongoAdapter.js +2 -2
  5. package/dist/adapters/MongoAdapter.js.map +1 -1
  6. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
  7. package/dist/adapters/OpenSearchAdapter.js +9 -7
  8. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  9. package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
  10. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  11. package/dist/adapters/PostgreSQLAdapter.js +25 -9
  12. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  13. package/dist/adapters/PrismaAdapter.js +5 -5
  14. package/dist/adapters/PrismaAdapter.js.map +1 -1
  15. package/dist/adapters/RedisAdapter.js +2 -2
  16. package/dist/adapters/RedisAdapter.js.map +1 -1
  17. package/dist/adapters/SQLiteAdapter.d.ts +17 -0
  18. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  19. package/dist/adapters/SQLiteAdapter.js +30 -11
  20. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  21. package/dist/cjs/adapters/MemoryAdapter.js +2 -2
  22. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  23. package/dist/cjs/adapters/MongoAdapter.js +2 -2
  24. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  25. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  26. package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
  27. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  28. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
  29. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  30. package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
  31. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  32. package/dist/cjs/adapters/PrismaAdapter.js +5 -5
  33. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  34. package/dist/cjs/adapters/RedisAdapter.js +2 -2
  35. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  36. package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
  37. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  38. package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
  39. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  40. package/dist/cjs/constants/index.d.ts +0 -9
  41. package/dist/cjs/constants/index.d.ts.map +1 -1
  42. package/dist/cjs/constants/index.js +2 -11
  43. package/dist/cjs/constants/index.js.map +1 -1
  44. package/dist/cjs/core/Agent.d.ts +119 -153
  45. package/dist/cjs/core/Agent.d.ts.map +1 -1
  46. package/dist/cjs/core/Agent.js +471 -324
  47. package/dist/cjs/core/Agent.js.map +1 -1
  48. package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
  49. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
  50. package/dist/cjs/core/AutoChainExecutor.js +297 -0
  51. package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
  52. package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
  53. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
  54. package/dist/cjs/core/BranchEvaluator.js +130 -0
  55. package/dist/cjs/core/BranchEvaluator.js.map +1 -0
  56. package/dist/cjs/core/DirectiveBus.d.ts +88 -0
  57. package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
  58. package/dist/cjs/core/DirectiveBus.js +196 -0
  59. package/dist/cjs/core/DirectiveBus.js.map +1 -0
  60. package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
  61. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
  62. package/dist/cjs/core/DirectiveChainTracker.js +121 -0
  63. package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
  64. package/dist/cjs/core/Flow.d.ts +186 -0
  65. package/dist/cjs/core/Flow.d.ts.map +1 -0
  66. package/dist/cjs/core/Flow.js +550 -0
  67. package/dist/cjs/core/Flow.js.map +1 -0
  68. package/dist/cjs/core/FlowRouter.d.ts +182 -0
  69. package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
  70. package/dist/cjs/core/{RoutingEngine.js → FlowRouter.js} +323 -306
  71. package/dist/cjs/core/FlowRouter.js.map +1 -0
  72. package/dist/cjs/core/PersistenceManager.d.ts +2 -2
  73. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  74. package/dist/cjs/core/PersistenceManager.js +7 -7
  75. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  76. package/dist/cjs/core/PromptComposer.d.ts +21 -8
  77. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  78. package/dist/cjs/core/PromptComposer.js +182 -105
  79. package/dist/cjs/core/PromptComposer.js.map +1 -1
  80. package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
  81. package/dist/cjs/core/PromptSectionCache.js +1 -1
  82. package/dist/cjs/core/ResponseEngine.d.ts +18 -8
  83. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  84. package/dist/cjs/core/ResponseEngine.js +38 -36
  85. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  86. package/dist/cjs/core/ResponseModal.d.ts +73 -56
  87. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  88. package/dist/cjs/core/ResponseModal.js +1191 -1014
  89. package/dist/cjs/core/ResponseModal.js.map +1 -1
  90. package/dist/cjs/core/ResponsePipeline.d.ts +124 -26
  91. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  92. package/dist/cjs/core/ResponsePipeline.js +509 -136
  93. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  94. package/dist/cjs/core/SignalEvaluator.d.ts +86 -0
  95. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -0
  96. package/dist/cjs/core/SignalEvaluator.js +333 -0
  97. package/dist/cjs/core/SignalEvaluator.js.map +1 -0
  98. package/dist/cjs/core/SignalProcessor.d.ts +152 -0
  99. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -0
  100. package/dist/cjs/core/SignalProcessor.js +562 -0
  101. package/dist/cjs/core/SignalProcessor.js.map +1 -0
  102. package/dist/cjs/core/Step.d.ts +43 -32
  103. package/dist/cjs/core/Step.d.ts.map +1 -1
  104. package/dist/cjs/core/Step.js +221 -126
  105. package/dist/cjs/core/Step.js.map +1 -1
  106. package/dist/cjs/core/StreamingToolExecutor.d.ts +2 -2
  107. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
  108. package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
  109. package/dist/cjs/core/ToolManager.d.ts +44 -13
  110. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  111. package/dist/cjs/core/ToolManager.js +174 -91
  112. package/dist/cjs/core/ToolManager.js.map +1 -1
  113. package/dist/cjs/core/createAgent.d.ts +35 -0
  114. package/dist/cjs/core/createAgent.d.ts.map +1 -0
  115. package/dist/cjs/core/createAgent.js +39 -0
  116. package/dist/cjs/core/createAgent.js.map +1 -0
  117. package/dist/cjs/core/flow-namespace.d.ts +49 -0
  118. package/dist/cjs/core/flow-namespace.d.ts.map +1 -0
  119. package/dist/cjs/core/flow-namespace.js +171 -0
  120. package/dist/cjs/core/flow-namespace.js.map +1 -0
  121. package/dist/cjs/index.d.ts +11 -14
  122. package/dist/cjs/index.d.ts.map +1 -1
  123. package/dist/cjs/index.js +18 -22
  124. package/dist/cjs/index.js.map +1 -1
  125. package/dist/cjs/providers/AnthropicProvider.d.ts +1 -1
  126. package/dist/cjs/providers/AnthropicProvider.js +1 -1
  127. package/dist/cjs/providers/GeminiProvider.d.ts +1 -1
  128. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  129. package/dist/cjs/providers/GeminiProvider.js +1 -1
  130. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  131. package/dist/cjs/providers/OpenAIProvider.d.ts +1 -1
  132. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  133. package/dist/cjs/providers/OpenAIProvider.js +1 -1
  134. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  135. package/dist/cjs/types/agent.d.ts +183 -54
  136. package/dist/cjs/types/agent.d.ts.map +1 -1
  137. package/dist/cjs/types/agent.js +0 -6
  138. package/dist/cjs/types/agent.js.map +1 -1
  139. package/dist/cjs/types/ai.d.ts +3 -3
  140. package/dist/cjs/types/ai.d.ts.map +1 -1
  141. package/dist/cjs/types/errors.d.ts +15 -0
  142. package/dist/cjs/types/errors.d.ts.map +1 -0
  143. package/dist/cjs/types/errors.js +22 -0
  144. package/dist/cjs/types/errors.js.map +1 -0
  145. package/dist/cjs/types/flow.d.ts +513 -0
  146. package/dist/cjs/types/flow.d.ts.map +1 -0
  147. package/dist/cjs/types/{route.js → flow.js} +2 -2
  148. package/dist/cjs/types/flow.js.map +1 -0
  149. package/dist/cjs/types/index.d.ts +7 -6
  150. package/dist/cjs/types/index.d.ts.map +1 -1
  151. package/dist/cjs/types/index.js +6 -2
  152. package/dist/cjs/types/index.js.map +1 -1
  153. package/dist/cjs/types/persistence.d.ts +11 -7
  154. package/dist/cjs/types/persistence.d.ts.map +1 -1
  155. package/dist/cjs/types/routing.d.ts +1 -1
  156. package/dist/cjs/types/routing.d.ts.map +1 -1
  157. package/dist/cjs/types/session.d.ts +24 -23
  158. package/dist/cjs/types/session.d.ts.map +1 -1
  159. package/dist/cjs/types/signals.d.ts +248 -0
  160. package/dist/cjs/types/signals.d.ts.map +1 -0
  161. package/dist/cjs/types/signals.js +11 -0
  162. package/dist/cjs/types/signals.js.map +1 -0
  163. package/dist/cjs/types/template.d.ts +2 -8
  164. package/dist/cjs/types/template.d.ts.map +1 -1
  165. package/dist/cjs/types/tool.d.ts +36 -29
  166. package/dist/cjs/types/tool.d.ts.map +1 -1
  167. package/dist/cjs/types/tool.js +1 -1
  168. package/dist/cjs/types/tool.js.map +1 -1
  169. package/dist/cjs/utils/condition.d.ts +7 -1
  170. package/dist/cjs/utils/condition.d.ts.map +1 -1
  171. package/dist/cjs/utils/condition.js.map +1 -1
  172. package/dist/cjs/utils/id.d.ts +13 -5
  173. package/dist/cjs/utils/id.d.ts.map +1 -1
  174. package/dist/cjs/utils/id.js +24 -10
  175. package/dist/cjs/utils/id.js.map +1 -1
  176. package/dist/cjs/utils/index.d.ts +2 -2
  177. package/dist/cjs/utils/index.d.ts.map +1 -1
  178. package/dist/cjs/utils/index.js +7 -3
  179. package/dist/cjs/utils/index.js.map +1 -1
  180. package/dist/cjs/utils/session.d.ts +44 -5
  181. package/dist/cjs/utils/session.d.ts.map +1 -1
  182. package/dist/cjs/utils/session.js +197 -38
  183. package/dist/cjs/utils/session.js.map +1 -1
  184. package/dist/constants/index.d.ts +0 -9
  185. package/dist/constants/index.d.ts.map +1 -1
  186. package/dist/constants/index.js +3 -9
  187. package/dist/constants/index.js.map +1 -1
  188. package/dist/core/Agent.d.ts +119 -153
  189. package/dist/core/Agent.d.ts.map +1 -1
  190. package/dist/core/Agent.js +472 -325
  191. package/dist/core/Agent.js.map +1 -1
  192. package/dist/core/AutoChainExecutor.d.ts +107 -0
  193. package/dist/core/AutoChainExecutor.d.ts.map +1 -0
  194. package/dist/core/AutoChainExecutor.js +293 -0
  195. package/dist/core/AutoChainExecutor.js.map +1 -0
  196. package/dist/core/BranchEvaluator.d.ts +54 -0
  197. package/dist/core/BranchEvaluator.d.ts.map +1 -0
  198. package/dist/core/BranchEvaluator.js +126 -0
  199. package/dist/core/BranchEvaluator.js.map +1 -0
  200. package/dist/core/DirectiveBus.d.ts +88 -0
  201. package/dist/core/DirectiveBus.d.ts.map +1 -0
  202. package/dist/core/DirectiveBus.js +192 -0
  203. package/dist/core/DirectiveBus.js.map +1 -0
  204. package/dist/core/DirectiveChainTracker.d.ts +49 -0
  205. package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
  206. package/dist/core/DirectiveChainTracker.js +117 -0
  207. package/dist/core/DirectiveChainTracker.js.map +1 -0
  208. package/dist/core/Flow.d.ts +186 -0
  209. package/dist/core/Flow.d.ts.map +1 -0
  210. package/dist/core/Flow.js +546 -0
  211. package/dist/core/Flow.js.map +1 -0
  212. package/dist/core/FlowRouter.d.ts +182 -0
  213. package/dist/core/FlowRouter.d.ts.map +1 -0
  214. package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
  215. package/dist/core/FlowRouter.js.map +1 -0
  216. package/dist/core/PersistenceManager.d.ts +2 -2
  217. package/dist/core/PersistenceManager.d.ts.map +1 -1
  218. package/dist/core/PersistenceManager.js +7 -7
  219. package/dist/core/PersistenceManager.js.map +1 -1
  220. package/dist/core/PromptComposer.d.ts +21 -8
  221. package/dist/core/PromptComposer.d.ts.map +1 -1
  222. package/dist/core/PromptComposer.js +183 -106
  223. package/dist/core/PromptComposer.js.map +1 -1
  224. package/dist/core/PromptSectionCache.d.ts +1 -1
  225. package/dist/core/PromptSectionCache.js +1 -1
  226. package/dist/core/ResponseEngine.d.ts +18 -8
  227. package/dist/core/ResponseEngine.d.ts.map +1 -1
  228. package/dist/core/ResponseEngine.js +38 -36
  229. package/dist/core/ResponseEngine.js.map +1 -1
  230. package/dist/core/ResponseModal.d.ts +73 -56
  231. package/dist/core/ResponseModal.d.ts.map +1 -1
  232. package/dist/core/ResponseModal.js +1193 -1016
  233. package/dist/core/ResponseModal.js.map +1 -1
  234. package/dist/core/ResponsePipeline.d.ts +124 -26
  235. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  236. package/dist/core/ResponsePipeline.js +509 -137
  237. package/dist/core/ResponsePipeline.js.map +1 -1
  238. package/dist/core/SignalEvaluator.d.ts +86 -0
  239. package/dist/core/SignalEvaluator.d.ts.map +1 -0
  240. package/dist/core/SignalEvaluator.js +326 -0
  241. package/dist/core/SignalEvaluator.js.map +1 -0
  242. package/dist/core/SignalProcessor.d.ts +152 -0
  243. package/dist/core/SignalProcessor.d.ts.map +1 -0
  244. package/dist/core/SignalProcessor.js +555 -0
  245. package/dist/core/SignalProcessor.js.map +1 -0
  246. package/dist/core/Step.d.ts +43 -32
  247. package/dist/core/Step.d.ts.map +1 -1
  248. package/dist/core/Step.js +220 -126
  249. package/dist/core/Step.js.map +1 -1
  250. package/dist/core/StreamingToolExecutor.d.ts +2 -2
  251. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  252. package/dist/core/StreamingToolExecutor.js.map +1 -1
  253. package/dist/core/ToolManager.d.ts +44 -13
  254. package/dist/core/ToolManager.d.ts.map +1 -1
  255. package/dist/core/ToolManager.js +174 -91
  256. package/dist/core/ToolManager.js.map +1 -1
  257. package/dist/core/createAgent.d.ts +35 -0
  258. package/dist/core/createAgent.d.ts.map +1 -0
  259. package/dist/core/createAgent.js +36 -0
  260. package/dist/core/createAgent.js.map +1 -0
  261. package/dist/core/flow-namespace.d.ts +49 -0
  262. package/dist/core/flow-namespace.d.ts.map +1 -0
  263. package/dist/core/flow-namespace.js +168 -0
  264. package/dist/core/flow-namespace.js.map +1 -0
  265. package/dist/index.d.ts +11 -14
  266. package/dist/index.d.ts.map +1 -1
  267. package/dist/index.js +9 -12
  268. package/dist/index.js.map +1 -1
  269. package/dist/providers/AnthropicProvider.d.ts +1 -1
  270. package/dist/providers/AnthropicProvider.js +1 -1
  271. package/dist/providers/GeminiProvider.d.ts +1 -1
  272. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  273. package/dist/providers/GeminiProvider.js +1 -1
  274. package/dist/providers/GeminiProvider.js.map +1 -1
  275. package/dist/providers/OpenAIProvider.d.ts +1 -1
  276. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  277. package/dist/providers/OpenAIProvider.js +1 -1
  278. package/dist/providers/OpenAIProvider.js.map +1 -1
  279. package/dist/types/agent.d.ts +183 -54
  280. package/dist/types/agent.d.ts.map +1 -1
  281. package/dist/types/agent.js +0 -6
  282. package/dist/types/agent.js.map +1 -1
  283. package/dist/types/ai.d.ts +3 -3
  284. package/dist/types/ai.d.ts.map +1 -1
  285. package/dist/types/errors.d.ts +15 -0
  286. package/dist/types/errors.d.ts.map +1 -0
  287. package/dist/types/errors.js +18 -0
  288. package/dist/types/errors.js.map +1 -0
  289. package/dist/types/flow.d.ts +513 -0
  290. package/dist/types/flow.d.ts.map +1 -0
  291. package/dist/types/flow.js +5 -0
  292. package/dist/types/flow.js.map +1 -0
  293. package/dist/types/index.d.ts +7 -6
  294. package/dist/types/index.d.ts.map +1 -1
  295. package/dist/types/index.js +4 -1
  296. package/dist/types/index.js.map +1 -1
  297. package/dist/types/persistence.d.ts +11 -7
  298. package/dist/types/persistence.d.ts.map +1 -1
  299. package/dist/types/routing.d.ts +1 -1
  300. package/dist/types/routing.d.ts.map +1 -1
  301. package/dist/types/session.d.ts +24 -23
  302. package/dist/types/session.d.ts.map +1 -1
  303. package/dist/types/signals.d.ts +248 -0
  304. package/dist/types/signals.d.ts.map +1 -0
  305. package/dist/types/signals.js +10 -0
  306. package/dist/types/signals.js.map +1 -0
  307. package/dist/types/template.d.ts +2 -8
  308. package/dist/types/template.d.ts.map +1 -1
  309. package/dist/types/tool.d.ts +36 -29
  310. package/dist/types/tool.d.ts.map +1 -1
  311. package/dist/types/tool.js +1 -1
  312. package/dist/types/tool.js.map +1 -1
  313. package/dist/utils/condition.d.ts +7 -1
  314. package/dist/utils/condition.d.ts.map +1 -1
  315. package/dist/utils/condition.js.map +1 -1
  316. package/dist/utils/id.d.ts +13 -5
  317. package/dist/utils/id.d.ts.map +1 -1
  318. package/dist/utils/id.js +22 -9
  319. package/dist/utils/id.js.map +1 -1
  320. package/dist/utils/index.d.ts +2 -2
  321. package/dist/utils/index.d.ts.map +1 -1
  322. package/dist/utils/index.js +2 -2
  323. package/dist/utils/index.js.map +1 -1
  324. package/dist/utils/session.d.ts +44 -5
  325. package/dist/utils/session.d.ts.map +1 -1
  326. package/dist/utils/session.js +193 -37
  327. package/dist/utils/session.js.map +1 -1
  328. package/docs/README.md +22 -200
  329. package/docs/concepts/architecture.md +281 -0
  330. package/docs/concepts/directives.md +400 -0
  331. package/docs/concepts/pipeline.md +399 -0
  332. package/docs/guides/branching.md +263 -0
  333. package/docs/guides/compaction.md +163 -0
  334. package/docs/guides/conditions.md +167 -0
  335. package/docs/guides/error-handling.md +176 -0
  336. package/docs/guides/flow-control.md +409 -0
  337. package/docs/guides/instructions.md +210 -0
  338. package/docs/guides/persistence.md +182 -0
  339. package/docs/guides/streaming.md +137 -0
  340. package/docs/migration/README.md +14 -0
  341. package/docs/migration/route-to-flow.md +561 -0
  342. package/docs/migration/v1-to-v2.md +909 -0
  343. package/docs/reference/adapters.md +481 -0
  344. package/docs/reference/branches.md +241 -0
  345. package/docs/reference/create-agent.md +186 -0
  346. package/docs/reference/directive.md +243 -0
  347. package/docs/reference/errors.md +122 -0
  348. package/docs/reference/flow.md +238 -0
  349. package/docs/reference/instruction.md +177 -0
  350. package/docs/reference/pre-directive.md +131 -0
  351. package/docs/reference/providers.md +227 -0
  352. package/docs/reference/signals.md +356 -0
  353. package/docs/reference/step.md +339 -0
  354. package/docs/reference/tool.md +269 -0
  355. package/docs/start/01-install.md +81 -0
  356. package/docs/start/02-first-agent.md +196 -0
  357. package/docs/start/03-collect-data.md +222 -0
  358. package/docs/start/04-add-tools.md +276 -0
  359. package/docs/start/05-go-to-production.md +216 -0
  360. package/examples/01-quickstart.ts +20 -0
  361. package/examples/02-data-extraction.ts +90 -0
  362. package/examples/03-tools.ts +136 -0
  363. package/examples/04-instructions.ts +100 -0
  364. package/examples/05-branching.ts +140 -0
  365. package/examples/06-flow-control.ts +103 -0
  366. package/examples/07-streaming.ts +69 -0
  367. package/examples/08-persistence.ts +98 -0
  368. package/examples/09-signals.ts +144 -0
  369. package/examples/tsconfig.json +30 -0
  370. package/package.json +2 -1
  371. package/src/adapters/MemoryAdapter.ts +3 -3
  372. package/src/adapters/MongoAdapter.ts +3 -3
  373. package/src/adapters/OpenSearchAdapter.ts +10 -8
  374. package/src/adapters/PostgreSQLAdapter.ts +26 -10
  375. package/src/adapters/PrismaAdapter.ts +6 -6
  376. package/src/adapters/RedisAdapter.ts +3 -3
  377. package/src/adapters/SQLiteAdapter.ts +31 -12
  378. package/src/constants/index.ts +2 -10
  379. package/src/core/Agent.ts +585 -374
  380. package/src/core/AutoChainExecutor.ts +440 -0
  381. package/src/core/BranchEvaluator.ts +167 -0
  382. package/src/core/DirectiveBus.ts +248 -0
  383. package/src/core/DirectiveChainTracker.ts +144 -0
  384. package/src/core/Flow.ts +666 -0
  385. package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
  386. package/src/core/PersistenceManager.ts +8 -8
  387. package/src/core/PromptComposer.ts +209 -140
  388. package/src/core/PromptSectionCache.ts +1 -1
  389. package/src/core/ResponseEngine.ts +61 -46
  390. package/src/core/ResponseModal.ts +1453 -1240
  391. package/src/core/ResponsePipeline.ts +655 -175
  392. package/src/core/SignalEvaluator.ts +420 -0
  393. package/src/core/SignalProcessor.ts +723 -0
  394. package/src/core/Step.ts +279 -176
  395. package/src/core/StreamingToolExecutor.ts +4 -4
  396. package/src/core/ToolManager.ts +200 -97
  397. package/src/core/createAgent.ts +40 -0
  398. package/src/core/flow-namespace.ts +219 -0
  399. package/src/index.ts +42 -36
  400. package/src/providers/AnthropicProvider.ts +2 -2
  401. package/src/providers/GeminiProvider.ts +2 -2
  402. package/src/providers/OpenAIProvider.ts +2 -2
  403. package/src/types/agent.ts +182 -53
  404. package/src/types/ai.ts +3 -3
  405. package/src/types/errors.ts +18 -0
  406. package/src/types/flow.ts +590 -0
  407. package/src/types/index.ts +43 -16
  408. package/src/types/persistence.ts +12 -8
  409. package/src/types/routing.ts +1 -1
  410. package/src/types/session.ts +26 -23
  411. package/src/types/signals.ts +321 -0
  412. package/src/types/template.ts +3 -11
  413. package/src/types/tool.ts +50 -42
  414. package/src/utils/condition.ts +13 -4
  415. package/src/utils/id.ts +27 -9
  416. package/src/utils/index.ts +6 -2
  417. package/src/utils/session.ts +238 -42
  418. package/dist/cjs/core/BatchExecutor.d.ts +0 -359
  419. package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
  420. package/dist/cjs/core/BatchExecutor.js +0 -861
  421. package/dist/cjs/core/BatchExecutor.js.map +0 -1
  422. package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
  423. package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
  424. package/dist/cjs/core/BatchPromptBuilder.js +0 -223
  425. package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
  426. package/dist/cjs/core/Route.d.ts +0 -180
  427. package/dist/cjs/core/Route.d.ts.map +0 -1
  428. package/dist/cjs/core/Route.js +0 -542
  429. package/dist/cjs/core/Route.js.map +0 -1
  430. package/dist/cjs/core/RoutingEngine.d.ts +0 -185
  431. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  432. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  433. package/dist/cjs/types/route.d.ts +0 -336
  434. package/dist/cjs/types/route.d.ts.map +0 -1
  435. package/dist/cjs/types/route.js.map +0 -1
  436. package/dist/core/BatchExecutor.d.ts +0 -359
  437. package/dist/core/BatchExecutor.d.ts.map +0 -1
  438. package/dist/core/BatchExecutor.js +0 -856
  439. package/dist/core/BatchExecutor.js.map +0 -1
  440. package/dist/core/BatchPromptBuilder.d.ts +0 -89
  441. package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
  442. package/dist/core/BatchPromptBuilder.js +0 -219
  443. package/dist/core/BatchPromptBuilder.js.map +0 -1
  444. package/dist/core/Route.d.ts +0 -180
  445. package/dist/core/Route.d.ts.map +0 -1
  446. package/dist/core/Route.js +0 -538
  447. package/dist/core/Route.js.map +0 -1
  448. package/dist/core/RoutingEngine.d.ts +0 -185
  449. package/dist/core/RoutingEngine.d.ts.map +0 -1
  450. package/dist/core/RoutingEngine.js.map +0 -1
  451. package/dist/types/route.d.ts +0 -336
  452. package/dist/types/route.d.ts.map +0 -1
  453. package/dist/types/route.js +0 -5
  454. package/dist/types/route.js.map +0 -1
  455. package/docs/CONTRIBUTING.md +0 -521
  456. package/docs/api/README.md +0 -3299
  457. package/docs/api/overview.md +0 -1410
  458. package/docs/architecture/data-extraction-flow.md +0 -360
  459. package/docs/architecture/multi-step-execution.md +0 -277
  460. package/docs/core/agent/README.md +0 -938
  461. package/docs/core/agent/context-management.md +0 -796
  462. package/docs/core/agent/rules-and-prohibitions.md +0 -113
  463. package/docs/core/agent/session-management.md +0 -693
  464. package/docs/core/ai-integration/prompt-composition.md +0 -355
  465. package/docs/core/ai-integration/providers.md +0 -515
  466. package/docs/core/ai-integration/response-processing.md +0 -433
  467. package/docs/core/conversation-flows/data-collection.md +0 -772
  468. package/docs/core/conversation-flows/route-dsl.md +0 -509
  469. package/docs/core/conversation-flows/routes.md +0 -249
  470. package/docs/core/conversation-flows/step-transitions.md +0 -731
  471. package/docs/core/conversation-flows/steps.md +0 -268
  472. package/docs/core/error-handling.md +0 -830
  473. package/docs/core/persistence/adapters.md +0 -255
  474. package/docs/core/persistence/session-storage.md +0 -656
  475. package/docs/core/routing/intelligent-routing.md +0 -470
  476. package/docs/core/tools/enhanced-tool.md +0 -186
  477. package/docs/core/tools/streaming-execution.md +0 -161
  478. package/docs/core/tools/tool-definition.md +0 -970
  479. package/docs/core/tools/tool-scoping.md +0 -819
  480. package/docs/guides/advanced-patterns/publishing.md +0 -186
  481. package/docs/guides/context-compaction.md +0 -96
  482. package/docs/guides/error-handling-patterns.md +0 -578
  483. package/docs/guides/getting-started/README.md +0 -795
  484. package/docs/guides/migration/README.md +0 -101
  485. package/docs/guides/migration/flexible-routing-conditions.md +0 -375
  486. package/docs/guides/migration/multi-step-execution.md +0 -393
  487. package/docs/guides/migration/response-modal-refactor.md +0 -518
  488. package/docs/guides/prompt-optimization.md +0 -164
  489. package/examples/advanced-patterns/context-compaction.ts +0 -223
  490. package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
  491. package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
  492. package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
  493. package/examples/advanced-patterns/streaming-responses.ts +0 -656
  494. package/examples/ai-providers/anthropic-integration.ts +0 -388
  495. package/examples/ai-providers/openai-integration.ts +0 -228
  496. package/examples/condition-patterns/function-only-conditions.ts +0 -365
  497. package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
  498. package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
  499. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  500. package/examples/condition-patterns/string-only-conditions.ts +0 -296
  501. package/examples/conversation-flows/completion-transitions.ts +0 -318
  502. package/examples/core-concepts/basic-agent.ts +0 -503
  503. package/examples/core-concepts/modern-streaming-api.ts +0 -309
  504. package/examples/core-concepts/schema-driven-extraction.ts +0 -332
  505. package/examples/core-concepts/session-management.ts +0 -494
  506. package/examples/integrations/database-integration.ts +0 -631
  507. package/examples/integrations/healthcare-integration.ts +0 -595
  508. package/examples/integrations/search-integration.ts +0 -530
  509. package/examples/integrations/server-session-management.ts +0 -307
  510. package/examples/persistence/custom-adapter.ts +0 -526
  511. package/examples/persistence/database-persistence.ts +0 -583
  512. package/examples/persistence/memory-sessions.ts +0 -495
  513. package/examples/persistence/prisma-schema.example.prisma +0 -74
  514. package/examples/persistence/redis-persistence.ts +0 -488
  515. package/examples/tools/basic-tools.ts +0 -765
  516. package/examples/tools/data-enrichment-tools.ts +0 -593
  517. package/examples/tools/enhanced-tool-metadata.ts +0 -268
  518. package/examples/tools/streaming-tool-execution.ts +0 -283
  519. package/src/core/BatchExecutor.ts +0 -1187
  520. package/src/core/BatchPromptBuilder.ts +0 -299
  521. package/src/core/Route.ts +0 -678
  522. package/src/types/route.ts +0 -392
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Tools — defining tools, imperative dispatch, declarative directives, and metadata.
3
+ * Teaches: Tool, ctx.dispatch, ToolResult.directive, isReadOnly.
4
+ * Read next: docs/reference/tool.md
5
+ */
6
+
7
+ import {
8
+ createAgent,
9
+ GeminiProvider,
10
+ createSession,
11
+ type Tool,
12
+ type ToolResult,
13
+ type Directive,
14
+ } from "@falai/agent";
15
+
16
+ // ─── Types ───────────────────────────────────────────────────────────────────
17
+
18
+ interface AppContext { userId: string }
19
+
20
+ interface AppData {
21
+ city: string;
22
+ checkIn: string;
23
+ checkOut: string;
24
+ confirmationId: string;
25
+ }
26
+
27
+ // ─── Tool 1: Read-only lookup (metadata: isReadOnly) ─────────────────────────
28
+
29
+ const checkAvailability: Tool<AppContext, AppData> = {
30
+ id: "check_availability",
31
+ description: "Check hotel room availability for the given dates.",
32
+ parameters: {
33
+ type: "object",
34
+ properties: {
35
+ city: { type: "string" },
36
+ checkIn: { type: "string" },
37
+ checkOut: { type: "string" },
38
+ },
39
+ required: ["city", "checkIn", "checkOut"],
40
+ },
41
+ // Metadata: this tool only reads data — safe to run concurrently.
42
+ isReadOnly: () => true,
43
+
44
+ async handler(_ctx, args) {
45
+ const { city, checkIn, checkOut } = args as Record<string, string>;
46
+ const available = city !== "atlantis";
47
+ return { data: { city, checkIn, checkOut, available } };
48
+ },
49
+ };
50
+
51
+ // ─── Tool 2: Imperative dispatch (ctx.dispatch) ──────────────────────────────
52
+
53
+ const bookRoom: Tool<AppContext, AppData> = {
54
+ id: "book_room",
55
+ description: "Book a hotel room. Requires availability check first.",
56
+ parameters: {
57
+ type: "object",
58
+ properties: {
59
+ city: { type: "string" },
60
+ checkIn: { type: "string" },
61
+ checkOut: { type: "string" },
62
+ },
63
+ required: ["city", "checkIn", "checkOut"],
64
+ },
65
+
66
+ async handler(ctx, args) {
67
+ const { city } = args as Record<string, string>;
68
+
69
+ // Imperative: emit directives mid-handler via ctx.dispatch
70
+ ctx.dispatch({ dataUpdate: { confirmationId: `CONF-${Date.now()}` } });
71
+ ctx.dispatch({ complete: true });
72
+
73
+ return { data: { booked: true, city } };
74
+ },
75
+ };
76
+
77
+ // ─── Tool 3: Declarative directive via ToolResult.directive ──────────────────
78
+
79
+ const cancelBooking: Tool<AppContext, AppData> = {
80
+ id: "cancel_booking",
81
+ description: "Cancel the current booking and reset the flow.",
82
+
83
+ async handler(ctx): Promise<ToolResult<{ cancelled: boolean }, AppContext, AppData>> {
84
+ if (!ctx.getField("confirmationId")) {
85
+ return { success: false, error: "No active booking to cancel." };
86
+ }
87
+ // Declarative: return a directive as part of the tool result
88
+ const directive: Directive<AppContext, AppData> = {
89
+ reset: { clearData: true, reason: "Booking cancelled by user" },
90
+ reply: "Your booking has been cancelled. Let me know if you'd like to start over.",
91
+ };
92
+ return { data: { cancelled: true }, directive };
93
+ },
94
+ };
95
+
96
+ // ─── Agent ───────────────────────────────────────────────────────────────────
97
+
98
+ const agent = createAgent<AppContext, AppData>({
99
+ name: "BookingAgent",
100
+ provider: new GeminiProvider({
101
+ apiKey: process.env.GEMINI_API_KEY!,
102
+ model: "gemini-3.1-flash-lite",
103
+ }),
104
+ schema: {
105
+ type: "object",
106
+ properties: {
107
+ city: { type: "string" },
108
+ checkIn: { type: "string" },
109
+ checkOut: { type: "string" },
110
+ confirmationId: { type: "string" },
111
+ },
112
+ },
113
+ tools: [checkAvailability, bookRoom, cancelBooking],
114
+ flows: [
115
+ {
116
+ title: "Book a Room",
117
+ when: "User wants to book a hotel room",
118
+ requiredFields: ["city", "checkIn", "checkOut"],
119
+ steps: [
120
+ { id: "gather", prompt: "Ask for city, check-in, and check-out dates.", collect: ["city", "checkIn", "checkOut"] },
121
+ { id: "confirm", prompt: "Confirm the booking details and use the book_room tool." },
122
+ ],
123
+ },
124
+ ],
125
+ });
126
+
127
+ // ─── Run ─────────────────────────────────────────────────────────────────────
128
+
129
+ const session = createSession<AppData>("tools-demo");
130
+
131
+ const response = await agent.respond({
132
+ history: [{ role: "user", content: "Book me a room in Tokyo from Jan 5 to Jan 8" }],
133
+ session,
134
+ });
135
+
136
+ console.log(response.message);
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Instructions — behavioral rules at agent, flow, and step scope.
3
+ * Teaches: Instruction, kind (must / never / should), conditional `when`.
4
+ * Read next: docs/guides/instructions.md
5
+ */
6
+
7
+ import { createAgent, GeminiProvider } from "../src";
8
+
9
+ if (!process.env.GEMINI_API_KEY) throw new Error("Set GEMINI_API_KEY");
10
+
11
+ // ─── Types ───────────────────────────────────────────────────────────────────
12
+
13
+ interface SupportData {
14
+ issue: string;
15
+ category: string;
16
+ resolution: string;
17
+ }
18
+
19
+ // ─── Agent with instructions at every scope ──────────────────────────────────
20
+
21
+ const agent = createAgent<unknown, SupportData>({
22
+ name: "SupportBot",
23
+ provider: new GeminiProvider({
24
+ apiKey: process.env.GEMINI_API_KEY,
25
+ model: "gemini-3.1-flash-lite",
26
+ }),
27
+ schema: {
28
+ type: "object",
29
+ properties: {
30
+ issue: { type: "string" },
31
+ category: { type: "string" },
32
+ resolution: { type: "string" },
33
+ },
34
+ },
35
+
36
+ // ── Agent-scope instructions (apply to every flow and step) ──────────
37
+ instructions: [
38
+ // "must" — absolute rule, always enforced
39
+ { kind: "must", prompt: "Always greet the user by name if it appears in the message." },
40
+ // "never" — absolute prohibition
41
+ { kind: "never", prompt: "Share internal ticket IDs or system error codes with the user." },
42
+ // "should" — behavioral nudge, conditionally active
43
+ {
44
+ kind: "should",
45
+ prompt: "Suggest the FAQ article link before escalating to a human.",
46
+ when: "User is asking a common question",
47
+ },
48
+ ],
49
+
50
+ flows: [
51
+ {
52
+ title: "Resolve Issue",
53
+ when: "User reports a problem or asks for help",
54
+ requiredFields: ["issue", "category", "resolution"],
55
+
56
+ // ── Flow-scope instructions (active only in this flow) ────────
57
+ instructions: [
58
+ { kind: "must", prompt: "Classify the issue into a category before proposing a resolution." },
59
+ {
60
+ kind: "should",
61
+ prompt: "Ask clarifying questions if the issue description is under ten words.",
62
+ when: "The user's issue description is vague or very short",
63
+ },
64
+ ],
65
+
66
+ steps: [
67
+ {
68
+ id: "identify",
69
+ prompt: "Ask the user to describe their issue.",
70
+ collect: ["issue", "category"],
71
+
72
+ // ── Step-scope instructions (active only in this step) ─
73
+ instructions: [
74
+ { kind: "never", prompt: "Suggest a resolution before the issue is fully described." },
75
+ {
76
+ kind: "should",
77
+ prompt: "Offer example categories to help the user classify their problem.",
78
+ when: "User seems unsure how to categorize",
79
+ },
80
+ ],
81
+ },
82
+ {
83
+ id: "resolve",
84
+ prompt: "Propose a resolution based on the identified issue and category.",
85
+ collect: ["resolution"],
86
+ },
87
+ ],
88
+ },
89
+ ],
90
+ });
91
+
92
+ // ─── Run ─────────────────────────────────────────────────────────────────────
93
+
94
+ const response = await agent.respond({
95
+ history: [{ role: "user", content: "Hey, my login page keeps showing a blank screen." }],
96
+ });
97
+
98
+ console.log(response.message);
99
+ // The appliedInstructions array shows which instructions were active this turn.
100
+ console.log("Applied:", response.appliedInstructions);
@@ -0,0 +1,140 @@
1
+ /** @intent Demonstrates step.branches — source-local forks with if, when, and Directive targets.
2
+ * @teaches BranchEntry, BranchMap, if-only fork, when-only fork, combined if+when, mixed targets
3
+ * @readAfter docs/guides/branching.md */
4
+ import { createAgent, GeminiProvider } from "../src";
5
+ import type { BranchMap, Directive, FlowOptions, StepOptions } from "../src";
6
+
7
+ // ─── Types ───────────────────────────────────────────────────────────────────
8
+
9
+ interface Context { tier: "free" | "pro" | "enterprise" }
10
+ interface Data { intent: string; query: string; answer: string }
11
+
12
+ // ─── Provider ────────────────────────────────────────────────────────────────
13
+
14
+ const provider = new GeminiProvider({
15
+ apiKey: process.env.GEMINI_API_KEY!,
16
+ model: "gemini-3.1-flash-lite",
17
+ });
18
+
19
+ // ─── Steps with branches ─────────────────────────────────────────────────────
20
+
21
+ // 1. if-only fork — pure code predicate, zero LLM cost
22
+ const triageStep: StepOptions<Context, Data> = {
23
+ id: "triage",
24
+ prompt: "What can I help you with today?",
25
+ collect: ["intent"],
26
+ branches: [
27
+ {
28
+ label: "pro-fast-track",
29
+ if: ({ context }) => context.tier === "pro" || context.tier === "enterprise",
30
+ then: "priority_queue", // resolves as step id in same flow
31
+ },
32
+ {
33
+ label: "free-default",
34
+ then: "general_help", // unconditional fallback (last entry)
35
+ },
36
+ ] satisfies BranchMap<Context, Data>,
37
+ };
38
+
39
+ // 2. when-only fork — AI-evaluated condition (costs tokens)
40
+ const classifyStep: StepOptions<Context, Data> = {
41
+ id: "general_help",
42
+ prompt: "Let me look into that for you.",
43
+ collect: ["query"],
44
+ branches: [
45
+ {
46
+ label: "billing",
47
+ when: "The user is asking about billing, invoices, or payments",
48
+ then: "billing_flow", // resolves as flow id (cross-flow jump)
49
+ },
50
+ {
51
+ label: "technical",
52
+ when: "The user is asking a technical or API question",
53
+ then: "tech_support", // resolves as step id
54
+ },
55
+ {
56
+ label: "fallback",
57
+ then: "tech_support",
58
+ },
59
+ ] satisfies BranchMap<Context, Data>,
60
+ };
61
+
62
+ // 3. Combined if + when — code runs first (free), AI only if code passes
63
+ const priorityStep: StepOptions<Context, Data> = {
64
+ id: "priority_queue",
65
+ prompt: "You have priority support. What do you need?",
66
+ collect: ["query"],
67
+ branches: [
68
+ {
69
+ label: "enterprise-escalation",
70
+ if: ({ context }) => context.tier === "enterprise",
71
+ when: "The user is reporting a production outage or critical bug",
72
+ then: {
73
+ goTo: "escalation_flow",
74
+ dataUpdate: { intent: "escalation" },
75
+ reply: "Routing you to our on-call engineering team now.",
76
+ } satisfies Directive<Context, Data>,
77
+ },
78
+ {
79
+ label: "standard-priority",
80
+ then: "tech_support",
81
+ },
82
+ ] satisfies BranchMap<Context, Data>,
83
+ };
84
+
85
+ // 4. Terminal step — no branches, linear end
86
+ const techSupportStep: StepOptions<Context, Data> = {
87
+ id: "tech_support",
88
+ prompt: "I'll find the answer to your technical question.",
89
+ collect: ["answer"],
90
+ };
91
+
92
+ // ─── Flows ───────────────────────────────────────────────────────────────────
93
+
94
+ const supportFlow: FlowOptions<Context, Data> = {
95
+ id: "support_flow",
96
+ title: "Support",
97
+ description: "Routes users through support triage",
98
+ when: "The user needs help or support",
99
+ steps: [triageStep, classifyStep, priorityStep, techSupportStep],
100
+ requiredFields: ["answer"],
101
+ };
102
+
103
+ const billingFlow: FlowOptions<Context, Data> = {
104
+ id: "billing_flow",
105
+ title: "Billing",
106
+ description: "Handles billing inquiries",
107
+ when: "The user asks about billing",
108
+ steps: [{ id: "billing_help", prompt: "Let me pull up your billing info." }],
109
+ };
110
+
111
+ const escalationFlow: FlowOptions<Context, Data> = {
112
+ id: "escalation_flow",
113
+ title: "Escalation",
114
+ description: "Critical issue escalation for enterprise customers",
115
+ steps: [{ id: "escalate", prompt: "Connecting you to on-call engineering." }],
116
+ };
117
+
118
+ // ─── Agent ───────────────────────────────────────────────────────────────────
119
+
120
+ const agent = createAgent<Context, Data>({
121
+ name: "Support Bot",
122
+ provider,
123
+ context: { tier: "pro" },
124
+ schema: {
125
+ type: "object",
126
+ properties: {
127
+ intent: { type: "string" },
128
+ query: { type: "string" },
129
+ answer: { type: "string" },
130
+ },
131
+ },
132
+ flows: [supportFlow, billingFlow, escalationFlow],
133
+ });
134
+
135
+ // ─── Run ─────────────────────────────────────────────────────────────────────
136
+
137
+ const response = await agent.respond({
138
+ history: [{ role: "user", content: "I need help with my API integration" }],
139
+ });
140
+ console.log(response.message);
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Programmatic flow control via Agent.dispatch and Directive shapes.
3
+ * Teaches: dispatch from outside a turn, complete with next, abort, reply.
4
+ * Read after: docs/guides/flow-control.md
5
+ */
6
+
7
+ import { createAgent, GeminiProvider, type Directive, type History } from "@falai/agent";
8
+
9
+ // ─── Schema ──────────────────────────────────────────────────────────────────
10
+
11
+ interface AppData {
12
+ item: string;
13
+ confirmed: boolean;
14
+ }
15
+
16
+ // ─── Agent setup ─────────────────────────────────────────────────────────────
17
+
18
+ const agent = createAgent<{}, AppData>({
19
+ name: "FlowControlDemo",
20
+ provider: new GeminiProvider({
21
+ apiKey: process.env.GEMINI_API_KEY!,
22
+ model: "gemini-3.1-flash-lite",
23
+ }),
24
+ schema: {
25
+ type: "object",
26
+ properties: {
27
+ item: { type: "string" },
28
+ confirmed: { type: "boolean" },
29
+ },
30
+ },
31
+ flows: [
32
+ {
33
+ title: "Select Item",
34
+ steps: [
35
+ {
36
+ id: "ask_item",
37
+ prompt: "What item would you like?",
38
+ collect: ["item"],
39
+ },
40
+ {
41
+ id: "confirm",
42
+ prompt: "You chose {{data.item}}. Confirm?",
43
+ collect: ["confirmed"],
44
+ requires: ["item"],
45
+ // When the user confirms, complete with a chained directive
46
+ // that moves to the "Checkout" flow.
47
+ hooks: {
48
+ finalize: ({ data }) => {
49
+ if (data.confirmed) {
50
+ const d: Directive<{}, AppData> = {
51
+ complete: { next: { goTo: "Checkout" }, reason: "User confirmed" },
52
+ };
53
+ return d;
54
+ }
55
+ // Not confirmed — abort with a reason
56
+ return { abort: "User declined the item" };
57
+ },
58
+ },
59
+ },
60
+ ],
61
+ },
62
+ {
63
+ title: "Checkout",
64
+ steps: [
65
+ {
66
+ id: "receipt",
67
+ // reply renders a verbatim message without an LLM call
68
+ reply: "Your order for {{data.item}} is confirmed. Thank you!",
69
+ },
70
+ ],
71
+ },
72
+ ],
73
+ });
74
+
75
+ // ─── External dispatch ───────────────────────────────────────────────────────
76
+ // Agent.dispatch queues a directive on a session OUTSIDE a respond() turn.
77
+ // The directive takes effect on the next respond() call.
78
+
79
+ async function externalRedirect() {
80
+ const history: History = [{ role: "user", content: "hello" }];
81
+
82
+ // First turn — enters "Select Item" normally
83
+ const res = await agent.respond({ history });
84
+ const session = res.session!;
85
+
86
+ // An external system decides to force-redirect to Checkout
87
+ const updated = await agent.dispatch({ goTo: "Checkout" }, session);
88
+
89
+ // Next turn picks up the pending directive
90
+ const next = await agent.respond({
91
+ history: [
92
+ ...history,
93
+ { role: "assistant", content: res.message },
94
+ { role: "user", content: "actually, rush my order" },
95
+ ],
96
+ session: updated,
97
+ });
98
+
99
+ console.log(next.message);
100
+ // → "Your order for ... is confirmed. Thank you!"
101
+ }
102
+
103
+ externalRedirect().catch(console.error);
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Real-time streaming with respondStream and final-chunk metadata.
3
+ * Teaches: respondStream, chunk consumption, appliedInstructions, triggeredSignals.
4
+ * Read after: docs/guides/streaming.md
5
+ */
6
+
7
+ import { createAgent, GeminiProvider, createSession, type AgentResponseStreamChunk } from "@falai/agent";
8
+
9
+ // ─── Schema ──────────────────────────────────────────────────────────────────
10
+
11
+ interface AppData {
12
+ topic: string;
13
+ }
14
+
15
+ // ─── Agent setup ─────────────────────────────────────────────────────────────
16
+
17
+ const agent = createAgent<{}, AppData>({
18
+ name: "StreamingDemo",
19
+ provider: new GeminiProvider({
20
+ apiKey: process.env.GEMINI_API_KEY!,
21
+ model: "gemini-3.1-flash-lite",
22
+ }),
23
+ schema: {
24
+ type: "object",
25
+ properties: {
26
+ topic: { type: "string" },
27
+ },
28
+ },
29
+ instructions: [
30
+ { id: "concise", kind: "should", prompt: "Keep answers under 100 words" },
31
+ ],
32
+ flows: [
33
+ {
34
+ title: "Chat",
35
+ steps: [{ id: "talk", prompt: "Discuss the user's topic.", collect: ["topic"] }],
36
+ },
37
+ ],
38
+ });
39
+
40
+ // ─── Stream consumption ──────────────────────────────────────────────────────
41
+
42
+ async function streamResponse() {
43
+ const session = createSession<AppData>("stream-demo");
44
+ const history = [{ role: "user" as const, content: "Explain how tides work" }];
45
+
46
+ const stream = agent.respondStream({ history, session });
47
+
48
+ let finalChunk: AgentResponseStreamChunk<AppData> | undefined;
49
+
50
+ for await (const chunk of stream) {
51
+ // Print each delta as it arrives (real-time UX)
52
+ process.stdout.write(chunk.delta);
53
+
54
+ if (chunk.done) {
55
+ finalChunk = chunk;
56
+ }
57
+ }
58
+
59
+ console.log("\n");
60
+
61
+ // ─── Final-chunk metadata ────────────────────────────────────────────────
62
+ if (finalChunk) {
63
+ console.log("Accumulated:", finalChunk.accumulated.length, "chars");
64
+ console.log("Applied instructions:", finalChunk.appliedInstructions ?? []);
65
+ console.log("Triggered signals:", finalChunk.triggeredSignals ?? []);
66
+ }
67
+ }
68
+
69
+ streamResponse().catch(console.error);
@@ -0,0 +1,98 @@
1
+ /** @intent Session persistence with MemoryAdapter: implicit default, explicit wiring, and sessionId for cross-turn continuity.
2
+ * @teaches MemoryAdapter, PersistenceConfig, sessionId, session resumption
3
+ * @readAfter docs/guides/persistence.md */
4
+ import { createAgent, GeminiProvider, MemoryAdapter } from "../src";
5
+
6
+ if (!process.env.GEMINI_API_KEY) throw new Error("Set GEMINI_API_KEY");
7
+
8
+ const provider = new GeminiProvider({
9
+ apiKey: process.env.GEMINI_API_KEY,
10
+ model: "gemini-3.1-flash-lite",
11
+ });
12
+
13
+ const schema = {
14
+ type: "object" as const,
15
+ properties: {
16
+ city: { type: "string" },
17
+ checkIn: { type: "string" },
18
+ checkOut: { type: "string" },
19
+ },
20
+ };
21
+
22
+ const flows = [{
23
+ title: "Book Hotel",
24
+ requiredFields: ["city", "checkIn", "checkOut"],
25
+ steps: [
26
+ { id: "ask_city", prompt: "Which city are you visiting?", collect: ["city"] },
27
+ { id: "ask_dates", prompt: "What are your check-in and check-out dates?", collect: ["checkIn", "checkOut"] },
28
+ ],
29
+ }];
30
+
31
+ // --- 1. Implicit MemoryAdapter (default when no persistence is specified) ---
32
+ // When you omit `persistence`, the agent uses an internal MemoryAdapter automatically.
33
+ // Great for prototyping — zero config, but data is lost when the process exits.
34
+
35
+ const simpleAgent = createAgent({
36
+ name: "BookingBot",
37
+ provider,
38
+ schema,
39
+ flows,
40
+ });
41
+
42
+ const res1 = await simpleAgent.respond({
43
+ history: [{ role: "user", content: "I'd like to book a hotel in Tokyo" }],
44
+ });
45
+ console.log("[Implicit adapter]", res1.message);
46
+
47
+ // --- 2. Explicit MemoryAdapter with userId ---
48
+ // Wire a MemoryAdapter explicitly to inspect stored sessions during development.
49
+
50
+ const adapter = new MemoryAdapter();
51
+
52
+ const agent = createAgent({
53
+ name: "BookingBot",
54
+ provider,
55
+ schema,
56
+ flows,
57
+ persistence: {
58
+ adapter,
59
+ userId: "user_42",
60
+ },
61
+ });
62
+
63
+ // --- 3. sessionId for cross-turn continuity ---
64
+ // Pass `sessionId` at construct time so the same conversation resumes across calls.
65
+ // In production, swap MemoryAdapter for PrismaAdapter (or Redis, Postgres, etc.)
66
+ // and the session survives process restarts.
67
+
68
+ const persistentAgent = createAgent({
69
+ name: "BookingBot",
70
+ provider,
71
+ schema,
72
+ flows,
73
+ persistence: {
74
+ adapter, // swap to: new PrismaAdapter({ prisma }) for production
75
+ userId: "user_42",
76
+ },
77
+ sessionId: "user_42:thread_001",
78
+ });
79
+
80
+ // Turn 1 — agent collects city
81
+ const turn1 = await persistentAgent.respond({
82
+ history: [{ role: "user", content: "I want to stay in Paris" }],
83
+ });
84
+ console.log("[Turn 1]", turn1.message);
85
+
86
+ // Turn 2 — same sessionId, conversation continues where it left off
87
+ const turn2 = await persistentAgent.respond({
88
+ history: [
89
+ { role: "user", content: "I want to stay in Paris" },
90
+ { role: "assistant", content: turn1.message },
91
+ { role: "user", content: "March 10 to March 14" },
92
+ ],
93
+ });
94
+ console.log("[Turn 2]", turn2.message);
95
+
96
+ // Inspect stored data (MemoryAdapter-only convenience method)
97
+ const snapshot = adapter.getSnapshot();
98
+ console.log("[Sessions]", snapshot.sessions.length);