@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
@@ -53,7 +53,7 @@ export class PersistenceManager<TData = Record<string, unknown>> {
53
53
  status: "active",
54
54
  collectedData: {
55
55
  data: options.initialData || {},
56
- routeHistory: [],
56
+ flowHistory: [],
57
57
  metadata: {},
58
58
  },
59
59
  messageCount: 0,
@@ -125,14 +125,14 @@ export class PersistenceManager<TData = Record<string, unknown>> {
125
125
  }
126
126
 
127
127
  /**
128
- * Update current route and step
128
+ * Update current flow and step
129
129
  */
130
- async updateRouteStep(
130
+ async updateFlowStep(
131
131
  sessionId: string,
132
- route?: string,
132
+ flow?: string,
133
133
  step?: string
134
134
  ): Promise<SessionData<TData> | null> {
135
- return await this.sessionRepository.updateRouteStep(sessionId, route, step);
135
+ return await this.sessionRepository.updateFlowStep(sessionId, flow, step);
136
136
  }
137
137
 
138
138
  /**
@@ -146,7 +146,7 @@ export class PersistenceManager<TData = Record<string, unknown>> {
146
146
  userId,
147
147
  role: options.role,
148
148
  content: options.content,
149
- route: options.route,
149
+ flow: options.flow,
150
150
  step: options.step,
151
151
  toolCalls: options.toolCalls,
152
152
  event: options.event,
@@ -263,7 +263,7 @@ export class PersistenceManager<TData = Record<string, unknown>> {
263
263
  if (existingSession) {
264
264
  // Update existing session
265
265
  return await this.sessionRepository.update(sessionId, {
266
- currentRoute: persistenceData.currentRoute,
266
+ currentFlow: persistenceData.currentFlow,
267
267
  currentStep: persistenceData.currentStep,
268
268
  collectedData: persistenceData.collectedData,
269
269
  lastMessageAt: new Date(),
@@ -276,7 +276,7 @@ export class PersistenceManager<TData = Record<string, unknown>> {
276
276
  ? JSON.stringify(persistenceData.collectedData.metadata?.userId)
277
277
  : this.config.userId,
278
278
  status: "active",
279
- currentRoute: persistenceData.currentRoute,
279
+ currentFlow: persistenceData.currentFlow,
280
280
  currentStep: persistenceData.currentStep,
281
281
  collectedData: persistenceData.collectedData,
282
282
  messageCount: 0,
@@ -1,9 +1,10 @@
1
- import type { Event, Term, Guideline, AgentOptions } from "../types";
2
- import type { Route } from "./Route";
1
+ import type { Event, Term, Instruction, AgentOptions, ScopedInstructions, AppliedInstruction } from "../types";
2
+ import type { Flow } from "./Flow";
3
3
  import { render, renderMany, formatKnowledgeBase, createTemplateContext } from "../utils/template";
4
4
  import { TemplateContext } from "../types/template";
5
- import { extractAIContextStrings, ConditionEvaluator } from "../utils/condition";
5
+ import { ConditionEvaluator } from "../utils/condition";
6
6
  import { PromptSectionCache } from "./PromptSectionCache";
7
+ import { logger } from "../utils";
7
8
 
8
9
  export class PromptComposer<TContext = unknown, TData = unknown> {
9
10
  private parts: string[] = [];
@@ -11,6 +12,9 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
11
12
  private cache: PromptSectionCache | null;
12
13
  private instructionCounter = 0;
13
14
 
15
+ /** Per-turn applied instructions, reset on every `addInstructions` invocation. */
16
+ public lastAppliedInstructions: AppliedInstruction[] = [];
17
+
14
18
  constructor(
15
19
  context: TemplateContext<TContext, TData> = createTemplateContext({}),
16
20
  cache?: PromptSectionCache
@@ -21,47 +25,19 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
21
25
 
22
26
  // Specific, typed sections tailored to the framework
23
27
 
24
- async addAgentMeta(agent: AgentOptions<TContext, TData>): Promise<this> {
28
+ async addAgentMeta(agent: Pick<AgentOptions<TContext, TData>, 'name'> & Partial<AgentOptions<TContext, TData>>): Promise<this> {
25
29
  const compute = async (): Promise<string | null> => {
26
30
  const lines: string[] = [];
27
31
  lines.push("## Agent Identity");
28
32
  lines.push(
29
33
  `You are "${agent.name}". Always refer to yourself by this name.`
30
34
  );
31
- if (agent.identity) {
32
- lines.push(await render(agent.identity, this.renderContext));
33
- }
34
- if (agent.personality) {
35
- lines.push(
36
- `Communicate in the following style: ${await render(
37
- agent.personality,
38
- this.renderContext
39
- )}`
40
- );
35
+ if (agent.persona) {
36
+ lines.push(await render(agent.persona, this.renderContext));
41
37
  }
42
38
  if (agent.goal) {
43
39
  lines.push(`Your primary goal: ${agent.goal}`);
44
40
  }
45
- if (agent.description) {
46
- lines.push(`About you: ${agent.description}`);
47
- }
48
- if (agent.rules?.length) {
49
- const renderedRules = await renderMany(agent.rules, this.renderContext);
50
- lines.push(
51
- `You MUST always follow these rules:\n- ${renderedRules.join("\n- ")}`
52
- );
53
- }
54
- if (agent.prohibitions?.length) {
55
- const renderedProhibitions = await renderMany(
56
- agent.prohibitions,
57
- this.renderContext
58
- );
59
- lines.push(
60
- `You MUST NEVER do the following:\n- ${renderedProhibitions.join(
61
- "\n- "
62
- )}`
63
- );
64
- }
65
41
  return lines.join("\n");
66
42
  };
67
43
 
@@ -74,8 +50,8 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
74
50
  return this;
75
51
  }
76
52
 
77
- async addRoutingOverview(routes: Route<TContext, TData>[]): Promise<this> {
78
- return this.addActiveRoutes(routes);
53
+ async addFlowOverview(flows: Flow<TContext, TData>[]): Promise<this> {
54
+ return this.addActiveFlows(flows);
79
55
  }
80
56
 
81
57
  async addScoringRules(): Promise<this> {
@@ -86,7 +62,7 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
86
62
  "- 50-69: moderate relevance",
87
63
  "- 30-49: weak connection or ambiguous",
88
64
  "- 0-29: minimal/none",
89
- "Return ONLY JSON matching the provided schema. Include scores for ALL routes.",
65
+ "Return ONLY JSON matching the provided schema. Include scores for ALL flows.",
90
66
  ].join("\n")}`;
91
67
  };
92
68
 
@@ -175,80 +151,176 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
175
151
  return this;
176
152
  }
177
153
 
178
- async addGuidelines(guidelines: Guideline<TContext, TData>[]): Promise<this> {
179
- const enabled = guidelines.filter((g) => g.enabled !== false);
180
- if (!enabled.length) return this;
181
-
182
- const compute = async (): Promise<string | null> => {
183
- const evaluator = new ConditionEvaluator(this.renderContext);
184
- const activeGuidelines: Guideline<TContext, TData>[] = [];
185
- const allAIContextStrings: string[] = [];
186
-
187
- // Evaluate guideline conditions to determine which are active
188
- for (const guideline of enabled) {
189
- if (guideline.condition) {
190
- const evaluation = await evaluator.evaluateCondition(guideline.condition, 'AND');
191
-
192
- // Collect AI context strings for prompt
193
- allAIContextStrings.push(...evaluation.aiContextStrings);
194
-
195
- // Include guideline if:
196
- // 1. No programmatic conditions (only strings) - always active
197
- // 2. Programmatic conditions evaluate to true
198
- if (!evaluation.hasProgrammaticConditions || evaluation.programmaticResult) {
199
- activeGuidelines.push(guideline);
200
- }
201
- } else {
202
- // No condition means always active
203
- activeGuidelines.push(guideline);
154
+ async addInstructions(scoped: ScopedInstructions<TContext, TData>): Promise<this> {
155
+ // Reset the per-turn applied set
156
+ this.lastAppliedInstructions = [];
157
+
158
+ const evaluator = new ConditionEvaluator(this.renderContext);
159
+
160
+ /**
161
+ * Evaluate a single instruction's `if` code predicate(s).
162
+ * Returns true if all predicates pass (AND semantics).
163
+ * If `if` is undefined, returns true (always active).
164
+ */
165
+ const evaluateIf = async (ifCondition: Instruction<TContext, TData>['if']): Promise<boolean> => {
166
+ if (ifCondition === undefined) return true;
167
+ const predicates = Array.isArray(ifCondition) ? ifCondition : [ifCondition];
168
+ for (const predicate of predicates) {
169
+ try {
170
+ const result = await predicate({
171
+ context: (this.renderContext.context ?? {}) as TContext,
172
+ data: (this.renderContext.data || {}),
173
+ session: (this.renderContext.session ?? { id: '', data: {}, history: [], metadata: {} }) as import("../types/session").SessionState<TData>,
174
+ history: this.renderContext.history || [],
175
+ });
176
+ if (!result) return false;
177
+ } catch {
178
+ // If a predicate throws, treat it as false (skip the instruction)
179
+ return false;
204
180
  }
205
181
  }
182
+ return true;
183
+ };
206
184
 
207
- if (!activeGuidelines.length && !allAIContextStrings.length) return null;
208
-
209
- const renderedGuidelines = await Promise.all(
210
- activeGuidelines.map(async (g, i) => {
211
- const action = await render(g.action, this.renderContext);
212
- if (g.condition) {
213
- // Use AI context strings if available, otherwise render the condition
214
- const conditionStrings = extractAIContextStrings(g.condition);
215
- if (conditionStrings.length > 0) {
216
- const conditionText = conditionStrings.join(" AND ");
217
- return `- Guideline #${i + 1}: When ${conditionText}, then ${action}`;
218
- }
219
- }
220
- return `- Guideline #${i + 1}: ${action}`;
221
- })
222
- );
185
+ /**
186
+ * Evaluate a single instruction's `when` condition.
187
+ * Returns true if the instruction should be active.
188
+ */
189
+ const evaluateWhen = async (when: Instruction<TContext, TData>['when']): Promise<boolean> => {
190
+ if (when === undefined) return true;
191
+ const evaluation = await evaluator.evaluateCondition(when, 'AND');
192
+ if (!evaluation.hasProgrammaticConditions) return true;
193
+ return evaluation.programmaticResult;
194
+ };
223
195
 
224
- // Add any additional AI context from inactive guidelines
225
- if (allAIContextStrings.length > 0) {
226
- const uniqueContextStrings = Array.from(new Set(allAIContextStrings));
227
- const contextSection = `\n\n**Additional Context:** ${uniqueContextStrings.join(", ")}`;
228
- return `## Guidelines\n\n${renderedGuidelines.join("\n")}${contextSection}`;
229
- } else {
230
- return `## Guidelines\n\n${renderedGuidelines.join("\n")}`;
196
+ /**
197
+ * Resolve the kind prefix for rendering.
198
+ * Default kind is 'should'.
199
+ */
200
+ const kindPrefix = (kind: Instruction<TContext, TData>['kind']): string => {
201
+ const resolved = kind || 'should';
202
+ return `[${resolved}]`;
203
+ };
204
+
205
+ /**
206
+ * Process a scope bucket: filter enabled, evaluate when, collect active lines and applied records.
207
+ */
208
+ const processScope = async (
209
+ items: Instruction<TContext, TData>[],
210
+ caption: string,
211
+ scope: AppliedInstruction['scope'],
212
+ scopeRef?: string
213
+ ): Promise<string[]> => {
214
+ const lines: string[] = [];
215
+ const enabled = items.filter(g => g.enabled !== false);
216
+
217
+ for (const g of enabled) {
218
+ // Evaluate `if` first (free, code-only). Skip `when` if `if` fails.
219
+ const ifPassed = await evaluateIf(g.if);
220
+ if (!ifPassed) continue;
221
+
222
+ // Evaluate `when` (AI condition) only when `if` passed
223
+ const active = await evaluateWhen(g.when);
224
+ if (!active) continue;
225
+
226
+ const text = await render(g.prompt, this.renderContext);
227
+ if (!text) continue;
228
+
229
+ lines.push(`- ${kindPrefix(g.kind)} ${caption} ${text}`);
230
+ this.lastAppliedInstructions.push({
231
+ id: g.id || '',
232
+ scope,
233
+ scopeRef,
234
+ });
231
235
  }
236
+ return lines;
237
+ };
238
+
239
+ // Compute functions for each scope
240
+ const computeGlobal = async (): Promise<string | null> => {
241
+ const lines = await processScope(scoped.global, '[Always]', 'global');
242
+ return lines.length > 0 ? lines.join('\n') : null;
243
+ };
244
+
245
+ const computeFlow = async (): Promise<string | null> => {
246
+ if (!scoped.flow) return null;
247
+ const caption = `[In: ${scoped.flow.flowTitle}]`;
248
+ const lines = await processScope(scoped.flow.items, caption, 'flow', scoped.flow.flowTitle);
249
+ return lines.length > 0 ? lines.join('\n') : null;
250
+ };
251
+
252
+ const computeStep = async (): Promise<string | null> => {
253
+ if (!scoped.step) return null;
254
+ const caption = `[Step: ${scoped.step.stepId}]`;
255
+ const lines = await processScope(scoped.step.items, caption, 'step', scoped.step.stepId);
256
+ return lines.length > 0 ? lines.join('\n') : null;
232
257
  };
233
258
 
234
259
  if (this.cache) {
235
- this.cache.register("guidelines", "dynamic", compute);
260
+ // Granular three-key approach with header coordination
261
+ // Register header first so it appears before content in resolveAll() output
262
+ this.cache.register('instructionsHeader', 'static', async () => {
263
+ const globalResult = await this.cache!.get('instructionsGlobal');
264
+ const flowResult = scoped.flow ? await this.cache!.get('instructionsFlow') : null;
265
+ const stepResult = scoped.step ? await this.cache!.get('instructionsStep') : null;
266
+ if (globalResult || flowResult || stepResult) {
267
+ return '## Instructions';
268
+ }
269
+ return null;
270
+ });
271
+
272
+ this.cache.register('instructionsGlobal', 'static', computeGlobal);
273
+
274
+ if (scoped.flow) {
275
+ this.cache.register('instructionsFlow', 'static', computeFlow);
276
+ }
277
+
278
+ if (scoped.step) {
279
+ this.cache.register('instructionsStep', 'dynamic', computeStep);
280
+ }
236
281
  } else {
237
- const result = await compute();
238
- if (result) this.parts.push(result);
282
+ // No cache: compute inline and push to parts
283
+ const globalLines = await computeGlobal();
284
+ const flowLines = await computeFlow();
285
+ const stepLines = await computeStep();
286
+
287
+ const allLines = [globalLines, flowLines, stepLines].filter(Boolean).join('\n');
288
+ if (allLines) {
289
+ this.parts.push(`## Instructions\n\n${allLines}`);
290
+ }
239
291
  }
292
+
293
+ // Debug logging
294
+ if (this.lastAppliedInstructions.length > 0) {
295
+ const globalIds = this.lastAppliedInstructions
296
+ .filter(g => g.scope === 'global')
297
+ .map(g => g.id);
298
+ const flowGroup = this.lastAppliedInstructions.filter(g => g.scope === 'flow');
299
+ const stepGroup = this.lastAppliedInstructions.filter(g => g.scope === 'step');
300
+
301
+ const debugPayload: Record<string, unknown> = { global: globalIds };
302
+ if (flowGroup.length > 0) {
303
+ debugPayload.flow = { flowTitle: scoped.flow?.flowTitle, ids: flowGroup.map(g => g.id) };
304
+ }
305
+ if (stepGroup.length > 0) {
306
+ debugPayload.step = { stepId: scoped.step?.stepId, ids: stepGroup.map(g => g.id) };
307
+ }
308
+
309
+ logger.debug('[instructions] applied', debugPayload);
310
+ }
311
+
240
312
  return this;
241
313
  }
242
314
 
243
315
  async addKnowledgeBase(
244
316
  agentKnowledgeBase?: Record<string, unknown>,
245
- routeKnowledgeBase?: Record<string, unknown>
317
+ flowKnowledgeBase?: Record<string, unknown>
246
318
  ): Promise<this> {
247
319
  const compute = (): string | null => {
248
- // Merge agent and route knowledge bases (route takes precedence for conflicts)
320
+ // Merge agent and flow knowledge bases (flow takes precedence for conflicts)
249
321
  const mergedKnowledge = {
250
322
  ...(agentKnowledgeBase || {}),
251
- ...(routeKnowledgeBase || {}),
323
+ ...(flowKnowledgeBase || {}),
252
324
  };
253
325
 
254
326
  // Only add section if there's knowledge data
@@ -267,53 +339,34 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
267
339
  return Promise.resolve(this);
268
340
  }
269
341
 
270
- async addActiveRoutes(routes: Route<TContext, TData>[]): Promise<this> {
271
- if (!routes.length) return this;
342
+ addActiveFlows(flows: Flow<TContext, TData>[]): Promise<this> {
343
+ if (!flows.length) return Promise.resolve(this);
272
344
 
273
- const compute = async (): Promise<string | null> => {
274
- const renderedRoutes = await Promise.all(
275
- routes.map(async (r, i) => {
276
- const whenContextStrings = r.when ? extractAIContextStrings(r.when) : [];
277
- const conditions =
278
- whenContextStrings.length > 0
279
- ? `\n\n **Triggered when:** ${whenContextStrings.join(" OR ")}`
280
- : "";
281
- const skipIfContextStrings = r.skipIf ? extractAIContextStrings(r.skipIf) : [];
282
- const skipConditions =
283
- skipIfContextStrings.length > 0
284
- ? `\n\n **Skip when:** ${skipIfContextStrings.join(" OR ")}`
285
- : "";
286
- const desc = r.description
287
- ? `\n\n **Description:** ${r.description}`
345
+ const compute = (): string | null => {
346
+ const renderedFlows = flows.map((r, i) => {
347
+ // v2: `when` is string | string[] (AI-evaluated). Extract directly.
348
+ const whenContextStrings: string[] = r.when
349
+ ? (Array.isArray(r.when) ? r.when : [r.when])
350
+ : [];
351
+ const conditions =
352
+ whenContextStrings.length > 0
353
+ ? `\n\n **Triggered when:** ${whenContextStrings.join(" OR ")}`
288
354
  : "";
289
- const rules = await renderMany(r.getRules(), this.renderContext);
290
- const prohibitions = await renderMany(
291
- r.getProhibitions(),
292
- this.renderContext
293
- );
294
- const rulesInfo =
295
- rules.length > 0
296
- ? `\n\n **Rules:**\n ${rules.map((x) => ` - ${x}`).join("\n ")}`
297
- : "";
298
- const prohibitionsInfo =
299
- prohibitions.length > 0
300
- ? `\n\n **Prohibitions:**\n ${prohibitions
301
- .map((x) => ` - ${x}`)
302
- .join("\n ")}`
303
- : "";
304
- return `### Route ${i + 1}: ${r.title} (ID: ${r.id})${desc}${conditions}${skipConditions}${rulesInfo}${prohibitionsInfo}`;
305
- })
306
- );
307
- return `## Available Routes\n\n${renderedRoutes.join("\n\n")}`;
355
+ const desc = r.description
356
+ ? `\n\n **Description:** ${r.description}`
357
+ : "";
358
+ return `### Flow ${i + 1}: ${r.title} (ID: ${r.id})${desc}${conditions}`;
359
+ });
360
+ return `## Available Flows\n\n${renderedFlows.join("\n\n")}`;
308
361
  };
309
362
 
310
363
  if (this.cache) {
311
- this.cache.register("activeRoutes", "static", compute);
364
+ this.cache.register("activeFlows", "static", compute);
312
365
  } else {
313
- const result = await compute();
366
+ const result = compute();
314
367
  if (result) this.parts.push(result);
315
368
  }
316
- return this;
369
+ return Promise.resolve(this);
317
370
  }
318
371
 
319
372
  async addDirectives(directives?: string[]): Promise<this> {
@@ -362,16 +415,32 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
362
415
  return Promise.resolve(this);
363
416
  }
364
417
 
365
- async build(): Promise<string> {
418
+ /**
419
+ * Build the final prompt string.
420
+ *
421
+ * @param options.transientAppendage - Per-turn sentences from merged
422
+ * PreDirective.appendPrompt arrays (outer-to-inner: agent.onEnter →
423
+ * flow.onEnter → step.onEnter → step.prepare). Appended after all
424
+ * other sections. Fresh every turn, never cached, never persisted.
425
+ * **Validates: Requirements 2.2, 2.8, 2.11, 27.1, 27.2, 27.4**
426
+ */
427
+ async build(options?: { transientAppendage?: string[] }): Promise<string> {
428
+ let sections: string[];
429
+
366
430
  if (this.cache) {
367
- const sections = await this.cache.resolveAll();
368
- const prompt = sections
369
- .filter((s): s is string => s != null && s !== "")
370
- .join("\n\n")
371
- .trim();
372
- return prompt;
431
+ const resolved = await this.cache.resolveAll();
432
+ sections = resolved.filter((s): s is string => s != null && s !== "");
433
+ } else {
434
+ sections = this.parts.filter(Boolean);
373
435
  }
374
- const prompt = this.parts.filter(Boolean).join("\n\n").trim();
375
- return Promise.resolve(prompt);
436
+
437
+ // Append transient per-turn sentences (from PreDirective.appendPrompt).
438
+ // These are never cached — they are a fresh slot built per turn.
439
+ if (options?.transientAppendage && options.transientAppendage.length > 0) {
440
+ const appendageBlock = options.transientAppendage.join("\n");
441
+ sections.push(appendageBlock);
442
+ }
443
+
444
+ return sections.join("\n\n").trim();
376
445
  }
377
446
  }
@@ -2,7 +2,7 @@
2
2
  * PromptSectionCache - Memoizes static prompt sections across turns,
3
3
  * recomputing only dynamic sections per-turn.
4
4
  *
5
- * Static sections (agent identity, glossary, knowledge base, route descriptions)
5
+ * Static sections (agent identity, glossary, knowledge base, flow descriptions)
6
6
  * are cached after first computation. Dynamic sections (current step context,
7
7
  * directives, available tools) are recomputed on every resolveAll() call.
8
8
  */