@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
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Signals — pre-phase escalation with halt + replyWith, post-phase entity capture with extract.
3
+ * Teaches: Signal, SignalContext, SignalDirective, behavior: 'cooldown', extract schema.
4
+ * Read next: docs/reference/signals.md
5
+ */
6
+
7
+ import {
8
+ createAgent,
9
+ GeminiProvider,
10
+ createSession,
11
+ type Signal,
12
+ type SignalContext,
13
+ type SignalDirective,
14
+ type SignalFiring,
15
+ } from "@falai/agent";
16
+
17
+ // ─── Types ───────────────────────────────────────────────────────────────────
18
+
19
+ interface AppContext {
20
+ supportTier: "free" | "premium";
21
+ }
22
+
23
+ interface AppData {
24
+ topic: string;
25
+ sentiment: string;
26
+ contactName: string;
27
+ contactEmail: string;
28
+ }
29
+
30
+ // ─── Signal 1: Pre-phase escalation with cooldown ────────────────────────────
31
+ // Detects angry messages BEFORE the LLM responds. Halts normal flow and
32
+ // replies with an escalation notice. Cooldown prevents re-triggering for 60s.
33
+
34
+ const escalationSignal: Signal<AppContext, AppData> = {
35
+ id: "escalation",
36
+ title: "Anger Escalation",
37
+ description: "Detects user frustration and halts to escalate.",
38
+ phase: "pre",
39
+
40
+ when: "The user is expressing strong frustration, anger, or threats to leave",
41
+
42
+ behavior: "cooldown",
43
+ cooldownMs: 60_000,
44
+
45
+ handler(ctx: SignalContext<AppContext, AppData>): SignalDirective<AppContext, AppData> {
46
+ // halt: stops the LLM call from running
47
+ // replyWith: sends a canned response instead
48
+ return {
49
+ halt: true,
50
+ replyWith: "I can see this is frustrating — let me connect you with a specialist right away.",
51
+ dataUpdate: { sentiment: "escalated" },
52
+ stopOtherSignals: true,
53
+ };
54
+ },
55
+ };
56
+
57
+ // ─── Signal 2: Post-phase entity capture with extract ────────────────────────
58
+ // After the LLM responds, extracts contact info the user may have provided.
59
+ // Uses `extract` schema so the classifier pulls structured data alongside
60
+ // the match decision.
61
+
62
+ interface ContactExtract {
63
+ name: string | null;
64
+ email: string | null;
65
+ }
66
+
67
+ const contactCaptureSignal: Signal<AppContext, AppData, ContactExtract> = {
68
+ id: "contact_capture",
69
+ title: "Contact Info Capture",
70
+ description: "Extracts name and email from the conversation when mentioned.",
71
+ phase: "post",
72
+
73
+ when: "The user has provided their name or email address in this message",
74
+
75
+ extract: {
76
+ type: "object",
77
+ properties: {
78
+ name: { type: ["string", "null"], description: "The user's full name, or null if not provided" },
79
+ email: { type: ["string", "null"], description: "The user's email address, or null if not provided" },
80
+ },
81
+ required: ["name", "email"],
82
+ } as const,
83
+
84
+ async handler(ctx: SignalContext<AppContext, AppData, ContactExtract>): Promise<void> {
85
+ const { extracted } = ctx;
86
+
87
+ // Only update fields that were actually extracted
88
+ if (extracted.name) {
89
+ await ctx.updateData({ contactName: extracted.name });
90
+ }
91
+ if (extracted.email) {
92
+ await ctx.updateData({ contactEmail: extracted.email });
93
+ }
94
+ },
95
+ };
96
+
97
+ // ─── Agent ───────────────────────────────────────────────────────────────────
98
+
99
+ const agent = createAgent<AppContext, AppData>({
100
+ name: "SupportAgent",
101
+ provider: new GeminiProvider({
102
+ apiKey: process.env.GEMINI_API_KEY!,
103
+ model: "models/gemini-2.5-flash",
104
+ }),
105
+ context: { supportTier: "free" },
106
+ schema: {
107
+ type: "object",
108
+ properties: {
109
+ topic: { type: "string" },
110
+ sentiment: { type: "string" },
111
+ contactName: { type: "string" },
112
+ contactEmail: { type: "string" },
113
+ },
114
+ },
115
+ signals: [escalationSignal, contactCaptureSignal],
116
+ flows: [
117
+ {
118
+ title: "Support",
119
+ when: "User needs help with a product issue",
120
+ steps: [
121
+ { id: "triage", prompt: "Identify the user's issue and ask clarifying questions.", collect: ["topic"] },
122
+ { id: "resolve", prompt: "Provide a solution based on the identified topic." },
123
+ ],
124
+ },
125
+ ],
126
+ });
127
+
128
+ // ─── Run ─────────────────────────────────────────────────────────────────────
129
+
130
+ const session = createSession<AppData>("signals-demo");
131
+
132
+ const response = await agent.respond({
133
+ history: [{ role: "user", content: "This is ridiculous! I've been waiting 3 days. My name is Alex and my email is alex@example.com." }],
134
+ session,
135
+ });
136
+
137
+ console.log(response.message);
138
+
139
+ // Observability: log which signals fired this turn
140
+ if (response.triggeredSignals?.length) {
141
+ for (const firing of response.triggeredSignals as SignalFiring[]) {
142
+ console.log(`[signal] ${firing.id} (${firing.phase}) — ${firing.reason ?? "no reason"}`);
143
+ }
144
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "lib": [
6
+ "ES2022",
7
+ "DOM"
8
+ ],
9
+ "moduleResolution": "bundler",
10
+ "types": [
11
+ "@types/bun"
12
+ ],
13
+ "strict": true,
14
+ "esModuleInterop": true,
15
+ "skipLibCheck": true,
16
+ "forceConsistentCasingInFileNames": true,
17
+ "resolveJsonModule": true,
18
+ "allowSyntheticDefaultImports": true,
19
+ "noEmit": true,
20
+ "paths": {
21
+ "@falai/agent": [
22
+ "../src/index.ts"
23
+ ]
24
+ },
25
+ "baseUrl": "."
26
+ },
27
+ "include": [
28
+ "./*.ts"
29
+ ]
30
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@falai/agent",
3
- "version": "1.2.7",
3
+ "version": "2.0.0",
4
4
  "description": "Standalone, strongly-typed AI Agent framework with route DSL and AI provider strategy",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
@@ -44,6 +44,7 @@
44
44
  "fix:cjs": "echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json",
45
45
  "dev": "tsc --watch",
46
46
  "typecheck": "tsc --noEmit",
47
+ "typecheck:examples": "tsc --noEmit --project examples/tsconfig.json",
47
48
  "lint": "eslint src/**/*.ts",
48
49
  "lint:fix": "eslint src/**/*.ts --fix",
49
50
  "clean": "rm -rf dist",
@@ -171,14 +171,14 @@ class MemorySessionRepository<TData = Record<string, unknown>>
171
171
  return Promise.resolve(null);
172
172
  }
173
173
 
174
- async updateRouteStep(
174
+ async updateFlowStep(
175
175
  id: string,
176
- route?: string,
176
+ flow?: string,
177
177
  step?: string
178
178
  ): Promise<SessionData<TData> | null> {
179
179
  const session = this.sessions.get(id);
180
180
  if (session) {
181
- session.currentRoute = route;
181
+ session.currentFlow = flow;
182
182
  session.currentStep = step;
183
183
  this.sessions.set(id, cloneDeep(session));
184
184
  return Promise.resolve(cloneDeep(session));
@@ -213,13 +213,13 @@ class MongoSessionRepository<TData = Record<string, unknown>>
213
213
  return await this.update(id, { collectedData });
214
214
  }
215
215
 
216
- async updateRouteStep(
216
+ async updateFlowStep(
217
217
  id: string,
218
- route?: string,
218
+ flow?: string,
219
219
  step?: string
220
220
  ): Promise<SessionData<TData> | null> {
221
221
  return await this.update(id, {
222
- currentRoute: route,
222
+ currentFlow: flow,
223
223
  currentStep: step,
224
224
  });
225
225
  }
@@ -194,9 +194,11 @@ export class OpenSearchAdapter<TData = Record<string, unknown>> implements Persi
194
194
  userId: { type: "keyword" },
195
195
  agentName: { type: "keyword" },
196
196
  status: { type: "keyword" },
197
- currentRoute: { type: "keyword" },
197
+ currentFlow: { type: "keyword" },
198
198
  currentStep: { type: "keyword" },
199
199
  collectedData: { type: "object", enabled: false },
200
+ pendingDirective: { type: "object", enabled: false },
201
+ signals: { type: "object", enabled: false },
200
202
  messageCount: { type: "integer" },
201
203
  createdAt: { type: "date" },
202
204
  updatedAt: { type: "date" },
@@ -224,7 +226,7 @@ export class OpenSearchAdapter<TData = Record<string, unknown>> implements Persi
224
226
  userId: { type: "keyword" },
225
227
  role: { type: "keyword" },
226
228
  content: { type: "text" },
227
- route: { type: "keyword" },
229
+ flow: { type: "keyword" },
228
230
  step: { type: "keyword" },
229
231
  toolCalls: { type: "object", enabled: false },
230
232
  event: { type: "object", enabled: false },
@@ -407,17 +409,17 @@ class OpenSearchSessionRepository<TData = Record<string, unknown>>
407
409
  return await this.findById(id);
408
410
  }
409
411
 
410
- async updateRouteStep(
412
+ async updateFlowStep(
411
413
  id: string,
412
- route?: string,
414
+ flow?: string,
413
415
  step?: string
414
416
  ): Promise<SessionData<TData> | null> {
415
417
  const doc: Record<string, unknown> = {
416
418
  updatedAt: new Date().toISOString(),
417
419
  };
418
420
 
419
- if (route !== undefined) {
420
- doc.currentRoute = route;
421
+ if (flow !== undefined) {
422
+ doc.currentFlow = flow;
421
423
  }
422
424
  if (step !== undefined) {
423
425
  doc.currentStep = step;
@@ -479,7 +481,7 @@ class OpenSearchSessionRepository<TData = Record<string, unknown>>
479
481
  userId: doc.userId as string | undefined,
480
482
  agentName: doc.agentName as string | undefined,
481
483
  status: doc.status as SessionData<TData>["status"],
482
- currentRoute: doc.currentRoute as string | undefined,
484
+ currentFlow: doc.currentFlow as string | undefined,
483
485
  currentStep: doc.currentStep as string | undefined,
484
486
  collectedData: doc.collectedData as CollectedStateData<TData> | undefined,
485
487
  messageCount: (doc.messageCount as number) || 0,
@@ -647,7 +649,7 @@ class OpenSearchMessageRepository implements MessageRepository {
647
649
  userId: doc.userId as string | undefined,
648
650
  role: doc.role as MessageData["role"],
649
651
  content: doc.content as string,
650
- route: doc.route as string | undefined,
652
+ flow: doc.flow as string | undefined,
651
653
  step: doc.step as string | undefined,
652
654
  toolCalls: doc.toolCalls as
653
655
  | Array<{ toolName: string; arguments: Record<string, unknown> }>
@@ -1,6 +1,20 @@
1
1
  /**
2
2
  * PostgreSQL adapter for persistence
3
3
  * Raw SQL adapter for PostgreSQL with custom schemas
4
+ *
5
+ * ## v2 Migration
6
+ *
7
+ * If upgrading from v1, run the following migration on your sessions table:
8
+ *
9
+ * ```sql
10
+ * ALTER TABLE agent_sessions DROP COLUMN IF EXISTS pending_transition;
11
+ * ALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS pending_directive JSONB;
12
+ * ALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS signals JSONB;
13
+ * ```
14
+ *
15
+ * `pending_directive` stores the serialized `Directive` that the pipeline
16
+ * applies at the start of the next turn. `signals` is a reserved JSONB column
17
+ * for the v2.x Signals feature — pass-through only in v2.0.
4
18
  */
5
19
 
6
20
  import type {
@@ -111,9 +125,11 @@ export class PostgreSQLAdapter<TData = Record<string, unknown>> implements Persi
111
125
  user_id VARCHAR(255),
112
126
  agent_name VARCHAR(255),
113
127
  status VARCHAR(50) DEFAULT 'active',
114
- current_route VARCHAR(255),
128
+ current_flow VARCHAR(255),
115
129
  current_step VARCHAR(255),
116
130
  collected_data JSONB,
131
+ pending_directive JSONB,
132
+ signals JSONB,
117
133
  message_count INTEGER DEFAULT 0,
118
134
  last_message_at TIMESTAMP,
119
135
  completed_at TIMESTAMP,
@@ -134,7 +150,7 @@ export class PostgreSQLAdapter<TData = Record<string, unknown>> implements Persi
134
150
  user_id VARCHAR(255),
135
151
  role VARCHAR(50) NOT NULL,
136
152
  content TEXT NOT NULL,
137
- route VARCHAR(255),
153
+ flow VARCHAR(255),
138
154
  step VARCHAR(255),
139
155
  tool_calls JSONB,
140
156
  event JSONB,
@@ -242,9 +258,9 @@ class PostgreSQLSessionRepository<TData = Record<string, unknown>>
242
258
  fields.push(`collected_data = $${paramIndex++}`);
243
259
  values.push(JSON.stringify(data.collectedData));
244
260
  }
245
- if (data.currentRoute !== undefined) {
246
- fields.push(`current_route = $${paramIndex++}`);
247
- values.push(data.currentRoute);
261
+ if (data.currentFlow !== undefined) {
262
+ fields.push(`current_flow = $${paramIndex++}`);
263
+ values.push(data.currentFlow);
248
264
  }
249
265
  if (data.currentStep !== undefined) {
250
266
  fields.push(`current_step = $${paramIndex++}`);
@@ -294,13 +310,13 @@ class PostgreSQLSessionRepository<TData = Record<string, unknown>>
294
310
  return await this.update(id, { collectedData });
295
311
  }
296
312
 
297
- async updateRouteStep(
313
+ async updateFlowStep(
298
314
  id: string,
299
- route?: string,
315
+ flow?: string,
300
316
  step?: string
301
317
  ): Promise<SessionData<TData> | null> {
302
318
  return await this.update(id, {
303
- currentRoute: route,
319
+ currentFlow: flow,
304
320
  currentStep: step,
305
321
  });
306
322
  }
@@ -342,7 +358,7 @@ class PostgreSQLMessageRepository implements MessageRepository {
342
358
 
343
359
  const result = await this.client.query<MessageData>(
344
360
  `INSERT INTO ${this.tableName}
345
- (id, session_id, user_id, role, content, route, step, tool_calls, event, created_at)
361
+ (id, session_id, user_id, role, content, flow, step, tool_calls, event, created_at)
346
362
  VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, NOW())
347
363
  RETURNING *`,
348
364
  [
@@ -351,7 +367,7 @@ class PostgreSQLMessageRepository implements MessageRepository {
351
367
  data.userId || null,
352
368
  data.role,
353
369
  data.content,
354
- data.route || null,
370
+ data.flow || null,
355
371
  data.step || null,
356
372
  JSON.stringify(data.toolCalls || null),
357
373
  JSON.stringify(data.event || null),
@@ -248,7 +248,7 @@ class PrismaSessionRepository<TData = Record<string, unknown>>
248
248
  userId: unmapped.userId as string | undefined,
249
249
  agentName: unmapped.agentName as string | undefined,
250
250
  status: unmapped.status as "active" | "completed" | "abandoned",
251
- currentRoute: unmapped.currentRoute as string | undefined,
251
+ currentFlow: unmapped.currentFlow as string | undefined,
252
252
  currentStep: unmapped.currentStep as string | undefined,
253
253
  collectedData: unmapped.collectedData as CollectedStateData<TData>,
254
254
  messageCount: unmapped.messageCount as number | undefined,
@@ -360,16 +360,16 @@ class PrismaSessionRepository<TData = Record<string, unknown>>
360
360
  return this.unmapFields(result);
361
361
  }
362
362
 
363
- async updateRouteStep(
363
+ async updateFlowStep(
364
364
  id: string,
365
- route?: string,
365
+ flow?: string,
366
366
  step?: string
367
367
  ): Promise<SessionData<TData> | null> {
368
368
  const data: Record<string, unknown> = {
369
369
  [this.fieldMap.updatedAt || "updatedAt"]: new Date(),
370
370
  };
371
- if (route !== undefined) {
372
- data[this.fieldMap.currentRoute || "currentRoute"] = route;
371
+ if (flow !== undefined) {
372
+ data[this.fieldMap.currentFlow || "currentFlow"] = flow;
373
373
  }
374
374
  if (step !== undefined) {
375
375
  data[this.fieldMap.currentStep || "currentStep"] = step;
@@ -460,7 +460,7 @@ class PrismaMessageRepository implements MessageRepository {
460
460
  userId: unmapped.userId as string | undefined,
461
461
  role: unmapped.role as MessageRole,
462
462
  content: unmapped.content as string,
463
- route: unmapped.route as string | undefined,
463
+ flow: unmapped.flow as string | undefined,
464
464
  step: unmapped.step as string | undefined,
465
465
  toolCalls: unmapped.toolCalls as
466
466
  | Array<{ toolName: string; arguments: Record<string, unknown> }>
@@ -232,12 +232,12 @@ class RedisSessionRepository<TData = Record<string, unknown>>
232
232
  return this.update(id, { collectedData });
233
233
  }
234
234
 
235
- async updateRouteStep(
235
+ async updateFlowStep(
236
236
  id: string,
237
- route?: string,
237
+ flow?: string,
238
238
  step?: string
239
239
  ): Promise<SessionData<TData> | null> {
240
- return this.update(id, { currentRoute: route, currentStep: step });
240
+ return this.update(id, { currentFlow: flow, currentStep: step });
241
241
  }
242
242
 
243
243
  async incrementMessageCount(id: string): Promise<SessionData<TData> | null> {
@@ -1,6 +1,23 @@
1
1
  /**
2
2
  * SQLite adapter for persistence
3
3
  * Lightweight, file-based database perfect for local development
4
+ *
5
+ * ## v2 Migration
6
+ *
7
+ * If upgrading from v1, run the following migration on your sessions table:
8
+ *
9
+ * ```sql
10
+ * -- SQLite 3.35.0+ supports DROP COLUMN:
11
+ * ALTER TABLE agent_sessions DROP COLUMN pending_transition;
12
+ * -- For older versions, recreate the table without pending_transition.
13
+ *
14
+ * ALTER TABLE agent_sessions ADD COLUMN pending_directive TEXT;
15
+ * ALTER TABLE agent_sessions ADD COLUMN signals TEXT;
16
+ * ```
17
+ *
18
+ * `pending_directive` stores the JSON-serialized `Directive` that the pipeline
19
+ * applies at the start of the next turn. `signals` is a reserved TEXT (JSON)
20
+ * column for the v2.x Signals feature — pass-through only in v2.0.
4
21
  */
5
22
 
6
23
  import type {
@@ -100,9 +117,11 @@ export class SQLiteAdapter<TData = Record<string, unknown>> implements Persisten
100
117
  user_id TEXT,
101
118
  agent_name TEXT,
102
119
  status TEXT DEFAULT 'active',
103
- current_route TEXT,
120
+ current_flow TEXT,
104
121
  current_step TEXT,
105
122
  collected_data TEXT,
123
+ pending_directive TEXT,
124
+ signals TEXT,
106
125
  message_count INTEGER DEFAULT 0,
107
126
  last_message_at TEXT,
108
127
  completed_at TEXT,
@@ -125,7 +144,7 @@ export class SQLiteAdapter<TData = Record<string, unknown>> implements Persisten
125
144
  user_id TEXT,
126
145
  role TEXT NOT NULL,
127
146
  content TEXT NOT NULL,
128
- route TEXT,
147
+ flow TEXT,
129
148
  step TEXT,
130
149
  tool_calls TEXT,
131
150
  event TEXT,
@@ -233,9 +252,9 @@ class SQLiteSessionRepository<TData = Record<string, unknown>>
233
252
  fields.push("collected_data = ?");
234
253
  values.push(JSON.stringify(data.collectedData));
235
254
  }
236
- if (data.currentRoute !== undefined) {
237
- fields.push("current_route = ?");
238
- values.push(data.currentRoute);
255
+ if (data.currentFlow !== undefined) {
256
+ fields.push("current_flow = ?");
257
+ values.push(data.currentFlow);
239
258
  }
240
259
  if (data.currentStep !== undefined) {
241
260
  fields.push("current_step = ?");
@@ -286,13 +305,13 @@ class SQLiteSessionRepository<TData = Record<string, unknown>>
286
305
  return await this.update(id, { collectedData });
287
306
  }
288
307
 
289
- async updateRouteStep(
308
+ async updateFlowStep(
290
309
  id: string,
291
- route?: string,
310
+ flow?: string,
292
311
  step?: string
293
312
  ): Promise<SessionData<TData> | null> {
294
313
  return await this.update(id, {
295
- currentRoute: route,
314
+ currentFlow: flow,
296
315
  currentStep: step,
297
316
  });
298
317
  }
@@ -325,7 +344,7 @@ class SQLiteSessionRepository<TData = Record<string, unknown>>
325
344
  userId: (row.user_id as string) || undefined,
326
345
  agentName: (row.agent_name as string) || undefined,
327
346
  status: row.status as SessionStatus,
328
- currentRoute: (row.current_route as string) || undefined,
347
+ currentFlow: (row.current_flow as string) || undefined,
329
348
  currentStep: (row.current_step as string) || undefined,
330
349
  collectedData: row.collected_data
331
350
  ? (JSON.parse(
@@ -363,7 +382,7 @@ class SQLiteMessageRepository implements MessageRepository {
363
382
 
364
383
  const stmt = this.db.prepare(`
365
384
  INSERT INTO ${this.tableName}
366
- (id, session_id, user_id, role, content, route, step, tool_calls, event, created_at)
385
+ (id, session_id, user_id, role, content, flow, step, tool_calls, event, created_at)
367
386
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
368
387
  `);
369
388
 
@@ -373,7 +392,7 @@ class SQLiteMessageRepository implements MessageRepository {
373
392
  data.userId || null,
374
393
  data.role,
375
394
  data.content,
376
- data.route || null,
395
+ data.flow || null,
377
396
  data.step || null,
378
397
  JSON.stringify(data.toolCalls || null),
379
398
  JSON.stringify(data.event || null),
@@ -442,7 +461,7 @@ class SQLiteMessageRepository implements MessageRepository {
442
461
  userId: (row.user_id as string) || undefined,
443
462
  role: row.role as MessageData["role"],
444
463
  content: row.content as string,
445
- route: (row.route as string) || undefined,
464
+ flow: (row.flow as string) || undefined,
446
465
  step: (row.step as string) || undefined,
447
466
  toolCalls: row.tool_calls
448
467
  ? (JSON.parse(row.tool_calls as string) as MessageData["toolCalls"])
@@ -1,10 +1,2 @@
1
- /**
2
- * Special marker to end a route/journey
3
- */
4
- export const END_ROUTE = Symbol("END_ROUTE");
5
-
6
- /**
7
- * String constant for END_ROUTE comparisons
8
- * Use this when checking if currentStep.id has reached END_ROUTE
9
- */
10
- export const END_ROUTE_ID = "END_ROUTE";
1
+ // Constants module - intentionally empty after END_FLOW removal in v2
2
+ // Flow completion is now implicit: the last step in a flow terminates it.