@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
@@ -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
  */