@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
@@ -1,14 +1,23 @@
1
- import type { TemplateContext, ConditionTemplate, ConditionEvaluationResult } from "../types/template";
1
+ import type { TemplateContext, ConditionEvaluationResult } from "../types/template";
2
2
  import { createTemplateContext } from "./template";
3
3
  import { logger } from './logger'
4
4
 
5
+ /**
6
+ * Condition template — kept as a private type for internal use by the evaluator.
7
+ * Removed from the public surface in v2.
8
+ */
9
+ type ConditionTemplate<TContext = unknown, TData = unknown> =
10
+ | string
11
+ | ((params: TemplateContext<TContext, TData>) => boolean | Promise<boolean>)
12
+ | ConditionTemplate<TContext, TData>[];
13
+
5
14
  /**
6
15
  * Utility class for evaluating ConditionTemplate instances.
7
16
  * Handles mixed string/function conditions and separates programmatic
8
17
  * evaluation from AI context collection.
9
18
  */
10
19
  export class ConditionEvaluator<TContext = unknown, TData = unknown> {
11
- constructor(private templateContext: TemplateContext<TContext, TData>) {}
20
+ constructor(private templateContext: TemplateContext<TContext, TData>) { }
12
21
 
13
22
  /**
14
23
  * Evaluates a condition template and returns both programmatic results
@@ -102,10 +111,10 @@ export class ConditionEvaluator<TContext = unknown, TData = unknown> {
102
111
 
103
112
  for (const condition of conditions) {
104
113
  const conditionResult = await this.evaluateCondition(condition, logic);
105
-
114
+
106
115
  // Collect AI context strings
107
116
  result.aiContextStrings.push(...conditionResult.aiContextStrings);
108
-
117
+
109
118
  // Track if we have programmatic conditions
110
119
  if (conditionResult.hasProgrammaticConditions) {
111
120
  result.hasProgrammaticConditions = true;
package/src/utils/id.ts CHANGED
@@ -25,32 +25,32 @@ function sanitize(str: string): string {
25
25
  }
26
26
 
27
27
  /**
28
- * Generate a deterministic route ID
29
- * Format: route_{sanitized_title}_{hash}
28
+ * Generate a deterministic flow ID
29
+ * Format: flow_{sanitized_title}_{hash}
30
30
  */
31
- export function generateRouteId(title: string): string {
31
+ export function generateFlowId(title: string): string {
32
32
  const sanitized = sanitize(title);
33
33
  const hash = simpleHash(title);
34
- return `route_${sanitized}_${hash}`;
34
+ return `flow_${sanitized}_${hash}`;
35
35
  }
36
36
 
37
37
  /**
38
38
  * Generate a deterministic step ID
39
- * Format: step_{sanitized_description}_{hash} or step_{routeId}_{index}
39
+ * Format: step_{sanitized_description}_{hash} or step_{flowId}_{index}
40
40
  */
41
41
  export function generateStepId(
42
- routeId: string,
42
+ flowId: string,
43
43
  description?: string,
44
44
  index?: number
45
45
  ): string {
46
46
  if (description) {
47
47
  const sanitized = sanitize(description);
48
- const hash = simpleHash(`${routeId}_${description}`);
48
+ const hash = simpleHash(`${flowId}_${description}`);
49
49
  return `step_${sanitized}_${hash}`;
50
50
  }
51
51
  // Fallback for steps without descriptions
52
- const suffix = index !== undefined ? index : simpleHash(routeId);
53
- return `step_${routeId}_${suffix}`;
52
+ const suffix = index !== undefined ? index : simpleHash(flowId);
53
+ return `step_${flowId}_${suffix}`;
54
54
  }
55
55
 
56
56
  /**
@@ -71,3 +71,21 @@ export function generateInlineToolId(stepId: string): string {
71
71
  const hash = simpleHash(`${stepId}_inline_tool`);
72
72
  return `tool_inline_${stepId}_${hash}`;
73
73
  }
74
+
75
+ /**
76
+ * Generate a deterministic signal ID.
77
+ * Format: signal_{sanitized}_{hash}
78
+ *
79
+ * Uses a combination of the signal's title/description/index to produce
80
+ * a stable id that is deterministic within a session (same inputs → same id).
81
+ */
82
+ export function generateSignalId(
83
+ title?: string,
84
+ description?: string,
85
+ index?: number
86
+ ): string {
87
+ const seed = title || description || `signal_${index ?? 0}`;
88
+ const sanitized = sanitize(seed);
89
+ const hash = simpleHash(`signal_${seed}_${index ?? 0}`);
90
+ return `signal_${sanitized}_${hash}`;
91
+ }
@@ -4,18 +4,22 @@
4
4
 
5
5
  // ID generation
6
6
  export {
7
- generateRouteId,
7
+ generateFlowId,
8
8
  generateStepId,
9
9
  generateToolId,
10
10
  generateInlineToolId,
11
+ generateSignalId,
11
12
  } from "./id";
12
13
 
13
14
  // Session management
14
15
  export {
15
16
  createSession,
16
17
  createSessionId,
17
- enterRoute,
18
+ createPersistedState,
19
+ enterFlow,
18
20
  enterStep,
21
+ completeCurrentFlow,
22
+ isFlowCompletedThisSession,
19
23
  mergeCollected,
20
24
  sessionStepToData,
21
25
  sessionDataToStep,
@@ -1,6 +1,8 @@
1
1
  import { cloneDeep } from "./clone";
2
2
  import type { SessionState } from "../types/session";
3
+ import type { Directive } from "../types/flow";
3
4
  import type { CollectedStateData } from "../types/persistence";
5
+ import { logger } from "./logger";
4
6
 
5
7
  /**
6
8
  * Helper to create a new session
@@ -34,10 +36,11 @@ export function createSession<TData = Record<string, unknown>>(
34
36
  return {
35
37
  id,
36
38
  data: state.data ?? ({} as Partial<TData>),
37
- routeHistory: state.routeHistory ?? [],
38
- currentRoute: state.currentRoute,
39
+ flowHistory: state.flowHistory ?? [],
40
+ currentFlow: state.currentFlow,
39
41
  currentStep: state.currentStep,
40
- pendingTransition: state.pendingTransition,
42
+ pendingDirective: state.pendingDirective,
43
+ signals: state.signals,
41
44
  history: state.history,
42
45
  metadata: {
43
46
  createdAt: now,
@@ -55,7 +58,7 @@ export function createSession<TData = Record<string, unknown>>(
55
58
  return {
56
59
  id,
57
60
  data: {} as Partial<TData>,
58
- routeHistory: [],
61
+ flowHistory: [],
59
62
  metadata: {
60
63
  ...metadata,
61
64
  createdAt: new Date(),
@@ -80,40 +83,40 @@ export function cloneSession<TData>(
80
83
  }
81
84
 
82
85
  /**
83
- * Helper to update session with new route
84
- * With agent-level data, routes share the same data structure
86
+ * Helper to update session with new flow
87
+ * With agent-level data, flows share the same data structure
85
88
  */
86
- export function enterRoute<TData = Record<string, unknown>>(
89
+ export function enterFlow<TData = Record<string, unknown>>(
87
90
  session: SessionState<TData>,
88
- routeId: string,
89
- routeTitle: string
91
+ flowId: string,
92
+ flowTitle: string
90
93
  ): SessionState<TData> {
91
- // Exit current route if exists
92
- const routeHistory = [...(session.routeHistory || [])];
93
- if (session.currentRoute) {
94
- const lastRouteIndex = routeHistory.findIndex(
95
- (r) => r.routeId === session.currentRoute?.id && !r.exitedAt
94
+ // Exit current flow if exists
95
+ const flowHistory = [...(session.flowHistory || [])];
96
+ if (session.currentFlow) {
97
+ const lastFlowIndex = flowHistory.findIndex(
98
+ (r) => r.flowId === session.currentFlow?.id && !r.exitedAt
96
99
  );
97
- if (lastRouteIndex >= 0) {
98
- routeHistory[lastRouteIndex].exitedAt = new Date();
100
+ if (lastFlowIndex >= 0) {
101
+ flowHistory[lastFlowIndex].exitedAt = new Date();
99
102
  }
100
103
  }
101
104
 
102
- // Enter new route - data persists across routes at agent level
105
+ // Enter new flow - data persists across flows at agent level
103
106
  const now = new Date();
104
107
  return {
105
108
  ...session,
106
- currentRoute: {
107
- id: routeId,
108
- title: routeTitle,
109
+ currentFlow: {
110
+ id: flowId,
111
+ title: flowTitle,
109
112
  enteredAt: now,
110
113
  },
111
114
  currentStep: undefined,
112
- // data remains the same - shared across all routes
113
- routeHistory: [
114
- ...routeHistory,
115
+ // data remains the same - shared across all flows
116
+ flowHistory: [
117
+ ...flowHistory,
115
118
  {
116
- routeId,
119
+ flowId: flowId,
117
120
  enteredAt: now,
118
121
  completed: false,
119
122
  },
@@ -147,6 +150,84 @@ export function enterStep<TData = Record<string, unknown>>(
147
150
  };
148
151
  }
149
152
 
153
+ /**
154
+ * Helper to release the session to idle state on flow completion.
155
+ *
156
+ * Marks the active flow's `flowHistory` entry as completed (sets
157
+ * `completed: true` and `exitedAt: <now>`), clears `currentFlow` and
158
+ * `currentStep`, and (when `clearOwnedFields` is provided) removes those
159
+ * fields from `session.data` to support `flow.reentrant` re-entry.
160
+ *
161
+ * Does **not** generate any message, copy, or LLM call. The framework
162
+ * speaks no text of its own at the completion boundary — the developer
163
+ * controls every word emitted to the user via flow steps.
164
+ */
165
+ export function completeCurrentFlow<TData = Record<string, unknown>>(
166
+ session: SessionState<TData>,
167
+ options?: { clearOwnedFields?: ReadonlyArray<keyof TData> }
168
+ ): SessionState<TData> {
169
+ const now = new Date();
170
+ const flowHistory = [...(session.flowHistory || [])];
171
+
172
+ if (session.currentFlow) {
173
+ const lastFlowIndex = flowHistory.findIndex(
174
+ (entry) => entry.flowId === session.currentFlow?.id && !entry.exitedAt
175
+ );
176
+ if (lastFlowIndex >= 0) {
177
+ flowHistory[lastFlowIndex] = {
178
+ ...flowHistory[lastFlowIndex],
179
+ exitedAt: now,
180
+ completed: true,
181
+ };
182
+ }
183
+ }
184
+
185
+ let nextData = session.data;
186
+ if (options?.clearOwnedFields && options.clearOwnedFields.length > 0) {
187
+ const owned = new Set<keyof TData>(options.clearOwnedFields);
188
+ const filtered: Partial<TData> = {};
189
+ for (const key of Object.keys(session.data ?? {}) as (keyof TData)[]) {
190
+ if (!owned.has(key)) {
191
+ (filtered as Record<keyof TData, unknown>)[key] =
192
+ (session.data as Record<keyof TData, unknown>)[key];
193
+ }
194
+ }
195
+ nextData = filtered;
196
+ }
197
+
198
+ return {
199
+ ...session,
200
+ currentFlow: undefined,
201
+ currentStep: undefined,
202
+ flowHistory,
203
+ data: nextData,
204
+ metadata: {
205
+ ...session.metadata,
206
+ lastUpdatedAt: now,
207
+ },
208
+ };
209
+ }
210
+
211
+ /**
212
+ * Returns true when the given flow id has a most-recent `flowHistory`
213
+ * entry marked as completed within this session. Used by the router to
214
+ * exclude completed flows from candidate scoring (unless the flow is
215
+ * `reentrant`).
216
+ */
217
+ export function isFlowCompletedThisSession<TData = Record<string, unknown>>(
218
+ session: SessionState<TData>,
219
+ flowId: string
220
+ ): boolean {
221
+ const history = session.flowHistory ?? [];
222
+ for (let i = history.length - 1; i >= 0; i--) {
223
+ const entry = history[i];
224
+ if (entry.flowId === flowId) {
225
+ return entry.completed === true;
226
+ }
227
+ }
228
+ return false;
229
+ }
230
+
150
231
  /**
151
232
  * Helper to merge collected data into session
152
233
  * Updates agent-level data structure
@@ -177,21 +258,39 @@ export function mergeCollected<TData = Record<string, unknown>>(
177
258
  export function sessionStepToData<TData = Record<string, unknown>>(
178
259
  session: SessionState<TData>
179
260
  ): {
180
- currentRoute?: string;
261
+ currentFlow?: string;
181
262
  currentStep?: string;
182
263
  collectedData: CollectedStateData<TData>;
183
264
  } {
265
+ // Strip PreDirective fields before persisting pendingDirective
266
+ let pendingDirective: SessionState<TData>["pendingDirective"] | undefined;
267
+ if (session.pendingDirective) {
268
+ pendingDirective = stripPreDirectiveFields(session.pendingDirective);
269
+ }
270
+
271
+ const collectedData: CollectedStateData<TData> = {
272
+ data: session.data || {},
273
+ flowHistory: session.flowHistory,
274
+ history: session.history,
275
+ currentFlowTitle: session.currentFlow?.title,
276
+ currentStepDescription: session.currentStep?.description,
277
+ metadata: session.metadata,
278
+ };
279
+
280
+ // Only include pendingDirective when defined (omit key when undefined)
281
+ if (pendingDirective !== undefined) {
282
+ collectedData.pendingDirective = pendingDirective;
283
+ }
284
+
285
+ // Pass through signals bit-identical (reserved for v2.x)
286
+ if (session.signals !== undefined) {
287
+ collectedData.signals = session.signals;
288
+ }
289
+
184
290
  return {
185
- currentRoute: session.currentRoute?.id,
291
+ currentFlow: session.currentFlow?.id,
186
292
  currentStep: session.currentStep?.id,
187
- collectedData: {
188
- data: session.data || {},
189
- routeHistory: session.routeHistory,
190
- history: session.history, // Include conversation history
191
- currentRouteTitle: session.currentRoute?.title,
192
- currentStepDescription: session.currentStep?.description,
193
- metadata: session.metadata,
194
- },
293
+ collectedData,
195
294
  };
196
295
  }
197
296
 
@@ -204,26 +303,26 @@ export function sessionStepToData<TData = Record<string, unknown>>(
204
303
  export function sessionDataToStep<TData = Record<string, unknown>>(
205
304
  sessionId: string,
206
305
  data: {
207
- currentRoute?: string;
306
+ currentFlow?: string;
208
307
  currentStep?: string;
209
308
  collectedData?: CollectedStateData<TData>;
210
309
  }
211
310
  ): SessionState<TData> {
212
311
  const collectedData: CollectedStateData<TData> = data.collectedData || {
213
312
  data: {},
214
- routeHistory: [],
313
+ flowHistory: [],
215
314
  history: [],
216
315
  metadata: {},
217
- currentRouteTitle: undefined,
316
+ currentFlowTitle: undefined,
218
317
  currentStepDescription: undefined,
219
318
  };
220
319
 
221
- return {
320
+ const session: SessionState<TData> = {
222
321
  id: sessionId,
223
- currentRoute: data.currentRoute
322
+ currentFlow: data.currentFlow
224
323
  ? {
225
- id: data.currentRoute,
226
- title: collectedData.currentRouteTitle || data.currentRoute,
324
+ id: data.currentFlow,
325
+ title: collectedData.currentFlowTitle || data.currentFlow,
227
326
  enteredAt: new Date(),
228
327
  }
229
328
  : undefined,
@@ -235,8 +334,105 @@ export function sessionDataToStep<TData = Record<string, unknown>>(
235
334
  }
236
335
  : undefined,
237
336
  data: collectedData.data || {},
238
- routeHistory: collectedData.routeHistory || [],
337
+ flowHistory: collectedData.flowHistory || [],
239
338
  history: collectedData.history || [],
240
339
  metadata: collectedData.metadata || {},
241
340
  };
341
+
342
+ // Restore pendingDirective if present (ignore any legacy pendingTransition — per Req 12.3)
343
+ if (collectedData.pendingDirective !== undefined) {
344
+ session.pendingDirective = collectedData.pendingDirective;
345
+ }
346
+
347
+ // Restore signals bit-identical (reserved for v2.x)
348
+ if (collectedData.signals !== undefined) {
349
+ session.signals = collectedData.signals;
350
+ }
351
+
352
+ return session;
353
+ }
354
+
355
+
356
+ /**
357
+ * Strip PreDirective-only fields from a directive before persistence.
358
+ *
359
+ * `appendPrompt`, `injectTools`, and `halt` are transient (one-turn lifetime)
360
+ * and must not be serialized. This is a belt-and-suspenders safety net —
361
+ * `Agent.dispatch` already strips before setting `pendingDirective`, and the
362
+ * DirectiveBus's post-LLM drain strips from post-LLM emitters. This function
363
+ * ensures the persistence layer never writes these fields regardless of the
364
+ * upstream path.
365
+ */
366
+ function stripPreDirectiveFields<TData>(
367
+ directive: Directive<unknown, TData>
368
+ ): Directive<unknown, TData> {
369
+ const raw = directive as Record<string, unknown>;
370
+ if (!raw.appendPrompt && !raw.injectTools && raw.halt === undefined) {
371
+ return directive;
372
+ }
373
+
374
+ const { appendPrompt, injectTools, halt, ...rest } = raw;
375
+
376
+ const droppedFields = [
377
+ appendPrompt && "appendPrompt",
378
+ injectTools && "injectTools",
379
+ halt !== undefined && "halt",
380
+ ].filter(Boolean);
381
+
382
+ if (droppedFields.length > 0) {
383
+ logger.debug(
384
+ `[createPersistedState] Stripped PreDirective-only fields before persistence: ${droppedFields.join(", ")}`
385
+ );
386
+ }
387
+
388
+ return rest as Directive<unknown, TData>;
389
+ }
390
+
391
+ /**
392
+ * Prepare a session state for persistence by stripping transient fields.
393
+ *
394
+ * This is the shared helper that every persistence adapter should call before
395
+ * writing session state. It ensures:
396
+ * - `pendingDirective` has PreDirective-only fields (`appendPrompt`,
397
+ * `injectTools`, `halt`) stripped (these are one-turn-lifetime and not
398
+ * serializable across turns).
399
+ * - `pendingDirective` is omitted from the result when `undefined` (adapters
400
+ * should not store a null/undefined key).
401
+ * - `signals` is passed through bit-identical (reserved for v2.x Signals).
402
+ * - Never writes `pendingTransition`.
403
+ *
404
+ * @param session - The in-memory session state to prepare for persistence.
405
+ * @returns A new session state object safe for serialization.
406
+ */
407
+ export function createPersistedState<TData = Record<string, unknown>>(
408
+ session: SessionState<TData>
409
+ ): SessionState<TData> {
410
+ let pendingDirective: Directive<unknown, TData> | undefined =
411
+ session.pendingDirective;
412
+
413
+ if (pendingDirective) {
414
+ pendingDirective = stripPreDirectiveFields(pendingDirective);
415
+ }
416
+
417
+ // Build the persisted state — omit pendingDirective key entirely when undefined
418
+ const persisted: SessionState<TData> = {
419
+ id: session.id,
420
+ data: session.data,
421
+ flowHistory: session.flowHistory,
422
+ currentFlow: session.currentFlow,
423
+ currentStep: session.currentStep,
424
+ history: session.history,
425
+ metadata: session.metadata,
426
+ };
427
+
428
+ if (pendingDirective !== undefined) {
429
+ persisted.pendingDirective = pendingDirective;
430
+ }
431
+
432
+ // Pass through signals bit-identical (reserved for v2.x)
433
+ if (session.signals !== undefined) {
434
+ persisted.signals = session.signals;
435
+ }
436
+
437
+ return persisted;
242
438
  }