@falai/agent 1.2.7 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (508) hide show
  1. package/README.md +40 -886
  2. package/dist/adapters/MemoryAdapter.js +2 -2
  3. package/dist/adapters/MemoryAdapter.js.map +1 -1
  4. package/dist/adapters/MongoAdapter.js +2 -2
  5. package/dist/adapters/MongoAdapter.js.map +1 -1
  6. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
  7. package/dist/adapters/OpenSearchAdapter.js +9 -7
  8. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  9. package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
  10. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  11. package/dist/adapters/PostgreSQLAdapter.js +25 -9
  12. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  13. package/dist/adapters/PrismaAdapter.js +5 -5
  14. package/dist/adapters/PrismaAdapter.js.map +1 -1
  15. package/dist/adapters/RedisAdapter.js +2 -2
  16. package/dist/adapters/RedisAdapter.js.map +1 -1
  17. package/dist/adapters/SQLiteAdapter.d.ts +17 -0
  18. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  19. package/dist/adapters/SQLiteAdapter.js +30 -11
  20. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  21. package/dist/cjs/adapters/MemoryAdapter.js +2 -2
  22. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  23. package/dist/cjs/adapters/MongoAdapter.js +2 -2
  24. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  25. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  26. package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
  27. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  28. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
  29. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  30. package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
  31. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  32. package/dist/cjs/adapters/PrismaAdapter.js +5 -5
  33. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  34. package/dist/cjs/adapters/RedisAdapter.js +2 -2
  35. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  36. package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
  37. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  38. package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
  39. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  40. package/dist/cjs/constants/index.d.ts +0 -9
  41. package/dist/cjs/constants/index.d.ts.map +1 -1
  42. package/dist/cjs/constants/index.js +2 -11
  43. package/dist/cjs/constants/index.js.map +1 -1
  44. package/dist/cjs/core/Agent.d.ts +119 -153
  45. package/dist/cjs/core/Agent.d.ts.map +1 -1
  46. package/dist/cjs/core/Agent.js +471 -324
  47. package/dist/cjs/core/Agent.js.map +1 -1
  48. package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
  49. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
  50. package/dist/cjs/core/AutoChainExecutor.js +297 -0
  51. package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
  52. package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
  53. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
  54. package/dist/cjs/core/BranchEvaluator.js +130 -0
  55. package/dist/cjs/core/BranchEvaluator.js.map +1 -0
  56. package/dist/cjs/core/DirectiveBus.d.ts +88 -0
  57. package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
  58. package/dist/cjs/core/DirectiveBus.js +196 -0
  59. package/dist/cjs/core/DirectiveBus.js.map +1 -0
  60. package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
  61. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
  62. package/dist/cjs/core/DirectiveChainTracker.js +121 -0
  63. package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
  64. package/dist/cjs/core/Flow.d.ts +186 -0
  65. package/dist/cjs/core/Flow.d.ts.map +1 -0
  66. package/dist/cjs/core/Flow.js +550 -0
  67. package/dist/cjs/core/Flow.js.map +1 -0
  68. package/dist/cjs/core/FlowRouter.d.ts +182 -0
  69. package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
  70. package/dist/cjs/core/{RoutingEngine.js → FlowRouter.js} +323 -306
  71. package/dist/cjs/core/FlowRouter.js.map +1 -0
  72. package/dist/cjs/core/PersistenceManager.d.ts +2 -2
  73. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  74. package/dist/cjs/core/PersistenceManager.js +7 -7
  75. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  76. package/dist/cjs/core/PromptComposer.d.ts +21 -8
  77. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  78. package/dist/cjs/core/PromptComposer.js +182 -105
  79. package/dist/cjs/core/PromptComposer.js.map +1 -1
  80. package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
  81. package/dist/cjs/core/PromptSectionCache.js +1 -1
  82. package/dist/cjs/core/ResponseEngine.d.ts +18 -8
  83. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  84. package/dist/cjs/core/ResponseEngine.js +38 -36
  85. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  86. package/dist/cjs/core/ResponseModal.d.ts +73 -56
  87. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  88. package/dist/cjs/core/ResponseModal.js +1196 -1015
  89. package/dist/cjs/core/ResponseModal.js.map +1 -1
  90. package/dist/cjs/core/ResponsePipeline.d.ts +124 -26
  91. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  92. package/dist/cjs/core/ResponsePipeline.js +524 -134
  93. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  94. package/dist/cjs/core/SignalEvaluator.d.ts +86 -0
  95. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -0
  96. package/dist/cjs/core/SignalEvaluator.js +333 -0
  97. package/dist/cjs/core/SignalEvaluator.js.map +1 -0
  98. package/dist/cjs/core/SignalProcessor.d.ts +152 -0
  99. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -0
  100. package/dist/cjs/core/SignalProcessor.js +562 -0
  101. package/dist/cjs/core/SignalProcessor.js.map +1 -0
  102. package/dist/cjs/core/Step.d.ts +43 -32
  103. package/dist/cjs/core/Step.d.ts.map +1 -1
  104. package/dist/cjs/core/Step.js +221 -126
  105. package/dist/cjs/core/Step.js.map +1 -1
  106. package/dist/cjs/core/StreamingToolExecutor.d.ts +2 -2
  107. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
  108. package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
  109. package/dist/cjs/core/ToolManager.d.ts +44 -13
  110. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  111. package/dist/cjs/core/ToolManager.js +174 -91
  112. package/dist/cjs/core/ToolManager.js.map +1 -1
  113. package/dist/cjs/core/createAgent.d.ts +35 -0
  114. package/dist/cjs/core/createAgent.d.ts.map +1 -0
  115. package/dist/cjs/core/createAgent.js +39 -0
  116. package/dist/cjs/core/createAgent.js.map +1 -0
  117. package/dist/cjs/core/flow-namespace.d.ts +49 -0
  118. package/dist/cjs/core/flow-namespace.d.ts.map +1 -0
  119. package/dist/cjs/core/flow-namespace.js +171 -0
  120. package/dist/cjs/core/flow-namespace.js.map +1 -0
  121. package/dist/cjs/index.d.ts +11 -14
  122. package/dist/cjs/index.d.ts.map +1 -1
  123. package/dist/cjs/index.js +18 -22
  124. package/dist/cjs/index.js.map +1 -1
  125. package/dist/cjs/providers/GeminiProvider.d.ts +3 -3
  126. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  127. package/dist/cjs/providers/GeminiProvider.js +16 -14
  128. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  129. package/dist/cjs/types/agent.d.ts +183 -54
  130. package/dist/cjs/types/agent.d.ts.map +1 -1
  131. package/dist/cjs/types/agent.js +0 -6
  132. package/dist/cjs/types/agent.js.map +1 -1
  133. package/dist/cjs/types/ai.d.ts +3 -3
  134. package/dist/cjs/types/ai.d.ts.map +1 -1
  135. package/dist/cjs/types/errors.d.ts +15 -0
  136. package/dist/cjs/types/errors.d.ts.map +1 -0
  137. package/dist/cjs/types/errors.js +22 -0
  138. package/dist/cjs/types/errors.js.map +1 -0
  139. package/dist/cjs/types/flow.d.ts +513 -0
  140. package/dist/cjs/types/flow.d.ts.map +1 -0
  141. package/dist/cjs/types/{route.js → flow.js} +2 -2
  142. package/dist/cjs/types/flow.js.map +1 -0
  143. package/dist/cjs/types/index.d.ts +7 -6
  144. package/dist/cjs/types/index.d.ts.map +1 -1
  145. package/dist/cjs/types/index.js +6 -2
  146. package/dist/cjs/types/index.js.map +1 -1
  147. package/dist/cjs/types/persistence.d.ts +11 -7
  148. package/dist/cjs/types/persistence.d.ts.map +1 -1
  149. package/dist/cjs/types/routing.d.ts +1 -1
  150. package/dist/cjs/types/routing.d.ts.map +1 -1
  151. package/dist/cjs/types/session.d.ts +24 -23
  152. package/dist/cjs/types/session.d.ts.map +1 -1
  153. package/dist/cjs/types/signals.d.ts +248 -0
  154. package/dist/cjs/types/signals.d.ts.map +1 -0
  155. package/dist/cjs/types/signals.js +11 -0
  156. package/dist/cjs/types/signals.js.map +1 -0
  157. package/dist/cjs/types/template.d.ts +2 -8
  158. package/dist/cjs/types/template.d.ts.map +1 -1
  159. package/dist/cjs/types/tool.d.ts +36 -29
  160. package/dist/cjs/types/tool.d.ts.map +1 -1
  161. package/dist/cjs/types/tool.js +1 -1
  162. package/dist/cjs/types/tool.js.map +1 -1
  163. package/dist/cjs/utils/condition.d.ts +7 -1
  164. package/dist/cjs/utils/condition.d.ts.map +1 -1
  165. package/dist/cjs/utils/condition.js.map +1 -1
  166. package/dist/cjs/utils/id.d.ts +13 -5
  167. package/dist/cjs/utils/id.d.ts.map +1 -1
  168. package/dist/cjs/utils/id.js +24 -10
  169. package/dist/cjs/utils/id.js.map +1 -1
  170. package/dist/cjs/utils/index.d.ts +2 -2
  171. package/dist/cjs/utils/index.d.ts.map +1 -1
  172. package/dist/cjs/utils/index.js +7 -3
  173. package/dist/cjs/utils/index.js.map +1 -1
  174. package/dist/cjs/utils/session.d.ts +44 -5
  175. package/dist/cjs/utils/session.d.ts.map +1 -1
  176. package/dist/cjs/utils/session.js +197 -38
  177. package/dist/cjs/utils/session.js.map +1 -1
  178. package/dist/constants/index.d.ts +0 -9
  179. package/dist/constants/index.d.ts.map +1 -1
  180. package/dist/constants/index.js +3 -9
  181. package/dist/constants/index.js.map +1 -1
  182. package/dist/core/Agent.d.ts +119 -153
  183. package/dist/core/Agent.d.ts.map +1 -1
  184. package/dist/core/Agent.js +472 -325
  185. package/dist/core/Agent.js.map +1 -1
  186. package/dist/core/AutoChainExecutor.d.ts +107 -0
  187. package/dist/core/AutoChainExecutor.d.ts.map +1 -0
  188. package/dist/core/AutoChainExecutor.js +293 -0
  189. package/dist/core/AutoChainExecutor.js.map +1 -0
  190. package/dist/core/BranchEvaluator.d.ts +54 -0
  191. package/dist/core/BranchEvaluator.d.ts.map +1 -0
  192. package/dist/core/BranchEvaluator.js +126 -0
  193. package/dist/core/BranchEvaluator.js.map +1 -0
  194. package/dist/core/DirectiveBus.d.ts +88 -0
  195. package/dist/core/DirectiveBus.d.ts.map +1 -0
  196. package/dist/core/DirectiveBus.js +192 -0
  197. package/dist/core/DirectiveBus.js.map +1 -0
  198. package/dist/core/DirectiveChainTracker.d.ts +49 -0
  199. package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
  200. package/dist/core/DirectiveChainTracker.js +117 -0
  201. package/dist/core/DirectiveChainTracker.js.map +1 -0
  202. package/dist/core/Flow.d.ts +186 -0
  203. package/dist/core/Flow.d.ts.map +1 -0
  204. package/dist/core/Flow.js +546 -0
  205. package/dist/core/Flow.js.map +1 -0
  206. package/dist/core/FlowRouter.d.ts +182 -0
  207. package/dist/core/FlowRouter.d.ts.map +1 -0
  208. package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
  209. package/dist/core/FlowRouter.js.map +1 -0
  210. package/dist/core/PersistenceManager.d.ts +2 -2
  211. package/dist/core/PersistenceManager.d.ts.map +1 -1
  212. package/dist/core/PersistenceManager.js +7 -7
  213. package/dist/core/PersistenceManager.js.map +1 -1
  214. package/dist/core/PromptComposer.d.ts +21 -8
  215. package/dist/core/PromptComposer.d.ts.map +1 -1
  216. package/dist/core/PromptComposer.js +183 -106
  217. package/dist/core/PromptComposer.js.map +1 -1
  218. package/dist/core/PromptSectionCache.d.ts +1 -1
  219. package/dist/core/PromptSectionCache.js +1 -1
  220. package/dist/core/ResponseEngine.d.ts +18 -8
  221. package/dist/core/ResponseEngine.d.ts.map +1 -1
  222. package/dist/core/ResponseEngine.js +38 -36
  223. package/dist/core/ResponseEngine.js.map +1 -1
  224. package/dist/core/ResponseModal.d.ts +73 -56
  225. package/dist/core/ResponseModal.d.ts.map +1 -1
  226. package/dist/core/ResponseModal.js +1198 -1017
  227. package/dist/core/ResponseModal.js.map +1 -1
  228. package/dist/core/ResponsePipeline.d.ts +124 -26
  229. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  230. package/dist/core/ResponsePipeline.js +524 -135
  231. package/dist/core/ResponsePipeline.js.map +1 -1
  232. package/dist/core/SignalEvaluator.d.ts +86 -0
  233. package/dist/core/SignalEvaluator.d.ts.map +1 -0
  234. package/dist/core/SignalEvaluator.js +326 -0
  235. package/dist/core/SignalEvaluator.js.map +1 -0
  236. package/dist/core/SignalProcessor.d.ts +152 -0
  237. package/dist/core/SignalProcessor.d.ts.map +1 -0
  238. package/dist/core/SignalProcessor.js +555 -0
  239. package/dist/core/SignalProcessor.js.map +1 -0
  240. package/dist/core/Step.d.ts +43 -32
  241. package/dist/core/Step.d.ts.map +1 -1
  242. package/dist/core/Step.js +220 -126
  243. package/dist/core/Step.js.map +1 -1
  244. package/dist/core/StreamingToolExecutor.d.ts +2 -2
  245. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  246. package/dist/core/StreamingToolExecutor.js.map +1 -1
  247. package/dist/core/ToolManager.d.ts +44 -13
  248. package/dist/core/ToolManager.d.ts.map +1 -1
  249. package/dist/core/ToolManager.js +174 -91
  250. package/dist/core/ToolManager.js.map +1 -1
  251. package/dist/core/createAgent.d.ts +35 -0
  252. package/dist/core/createAgent.d.ts.map +1 -0
  253. package/dist/core/createAgent.js +36 -0
  254. package/dist/core/createAgent.js.map +1 -0
  255. package/dist/core/flow-namespace.d.ts +49 -0
  256. package/dist/core/flow-namespace.d.ts.map +1 -0
  257. package/dist/core/flow-namespace.js +168 -0
  258. package/dist/core/flow-namespace.js.map +1 -0
  259. package/dist/index.d.ts +11 -14
  260. package/dist/index.d.ts.map +1 -1
  261. package/dist/index.js +9 -12
  262. package/dist/index.js.map +1 -1
  263. package/dist/providers/GeminiProvider.d.ts +3 -3
  264. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  265. package/dist/providers/GeminiProvider.js +16 -14
  266. package/dist/providers/GeminiProvider.js.map +1 -1
  267. package/dist/types/agent.d.ts +183 -54
  268. package/dist/types/agent.d.ts.map +1 -1
  269. package/dist/types/agent.js +0 -6
  270. package/dist/types/agent.js.map +1 -1
  271. package/dist/types/ai.d.ts +3 -3
  272. package/dist/types/ai.d.ts.map +1 -1
  273. package/dist/types/errors.d.ts +15 -0
  274. package/dist/types/errors.d.ts.map +1 -0
  275. package/dist/types/errors.js +18 -0
  276. package/dist/types/errors.js.map +1 -0
  277. package/dist/types/flow.d.ts +513 -0
  278. package/dist/types/flow.d.ts.map +1 -0
  279. package/dist/types/flow.js +5 -0
  280. package/dist/types/flow.js.map +1 -0
  281. package/dist/types/index.d.ts +7 -6
  282. package/dist/types/index.d.ts.map +1 -1
  283. package/dist/types/index.js +4 -1
  284. package/dist/types/index.js.map +1 -1
  285. package/dist/types/persistence.d.ts +11 -7
  286. package/dist/types/persistence.d.ts.map +1 -1
  287. package/dist/types/routing.d.ts +1 -1
  288. package/dist/types/routing.d.ts.map +1 -1
  289. package/dist/types/session.d.ts +24 -23
  290. package/dist/types/session.d.ts.map +1 -1
  291. package/dist/types/signals.d.ts +248 -0
  292. package/dist/types/signals.d.ts.map +1 -0
  293. package/dist/types/signals.js +10 -0
  294. package/dist/types/signals.js.map +1 -0
  295. package/dist/types/template.d.ts +2 -8
  296. package/dist/types/template.d.ts.map +1 -1
  297. package/dist/types/tool.d.ts +36 -29
  298. package/dist/types/tool.d.ts.map +1 -1
  299. package/dist/types/tool.js +1 -1
  300. package/dist/types/tool.js.map +1 -1
  301. package/dist/utils/condition.d.ts +7 -1
  302. package/dist/utils/condition.d.ts.map +1 -1
  303. package/dist/utils/condition.js.map +1 -1
  304. package/dist/utils/id.d.ts +13 -5
  305. package/dist/utils/id.d.ts.map +1 -1
  306. package/dist/utils/id.js +22 -9
  307. package/dist/utils/id.js.map +1 -1
  308. package/dist/utils/index.d.ts +2 -2
  309. package/dist/utils/index.d.ts.map +1 -1
  310. package/dist/utils/index.js +2 -2
  311. package/dist/utils/index.js.map +1 -1
  312. package/dist/utils/session.d.ts +44 -5
  313. package/dist/utils/session.d.ts.map +1 -1
  314. package/dist/utils/session.js +193 -37
  315. package/dist/utils/session.js.map +1 -1
  316. package/docs/README.md +15 -202
  317. package/docs/concepts/architecture.md +281 -0
  318. package/docs/concepts/directives.md +400 -0
  319. package/docs/concepts/pipeline.md +399 -0
  320. package/docs/guides/branching.md +263 -0
  321. package/docs/guides/compaction.md +163 -0
  322. package/docs/guides/conditions.md +167 -0
  323. package/docs/guides/error-handling.md +176 -0
  324. package/docs/guides/flow-control.md +409 -0
  325. package/docs/guides/instructions.md +210 -0
  326. package/docs/guides/persistence.md +182 -0
  327. package/docs/guides/streaming.md +137 -0
  328. package/docs/migration/README.md +15 -0
  329. package/docs/migration/route-to-flow.md +560 -0
  330. package/docs/migration/v1-to-v2.md +909 -0
  331. package/docs/reference/adapters.md +481 -0
  332. package/docs/reference/branches.md +241 -0
  333. package/docs/reference/create-agent.md +186 -0
  334. package/docs/reference/directive.md +243 -0
  335. package/docs/reference/errors.md +122 -0
  336. package/docs/reference/flow.md +238 -0
  337. package/docs/reference/instruction.md +177 -0
  338. package/docs/reference/pre-directive.md +131 -0
  339. package/docs/reference/providers.md +227 -0
  340. package/docs/reference/signals.md +356 -0
  341. package/docs/reference/step.md +339 -0
  342. package/docs/reference/tool.md +269 -0
  343. package/docs/start/01-install.md +81 -0
  344. package/docs/start/02-first-agent.md +196 -0
  345. package/docs/start/03-collect-data.md +222 -0
  346. package/docs/start/04-add-tools.md +276 -0
  347. package/docs/start/05-go-to-production.md +216 -0
  348. package/examples/01-quickstart.ts +20 -0
  349. package/examples/02-data-extraction.ts +90 -0
  350. package/examples/03-tools.ts +136 -0
  351. package/examples/04-instructions.ts +100 -0
  352. package/examples/05-branching.ts +140 -0
  353. package/examples/06-flow-control.ts +103 -0
  354. package/examples/07-streaming.ts +69 -0
  355. package/examples/08-persistence.ts +98 -0
  356. package/examples/09-signals.ts +144 -0
  357. package/examples/tsconfig.json +30 -0
  358. package/package.json +2 -1
  359. package/src/adapters/MemoryAdapter.ts +3 -3
  360. package/src/adapters/MongoAdapter.ts +3 -3
  361. package/src/adapters/OpenSearchAdapter.ts +10 -8
  362. package/src/adapters/PostgreSQLAdapter.ts +26 -10
  363. package/src/adapters/PrismaAdapter.ts +6 -6
  364. package/src/adapters/RedisAdapter.ts +3 -3
  365. package/src/adapters/SQLiteAdapter.ts +31 -12
  366. package/src/constants/index.ts +2 -10
  367. package/src/core/Agent.ts +585 -374
  368. package/src/core/AutoChainExecutor.ts +440 -0
  369. package/src/core/BranchEvaluator.ts +167 -0
  370. package/src/core/DirectiveBus.ts +248 -0
  371. package/src/core/DirectiveChainTracker.ts +144 -0
  372. package/src/core/Flow.ts +666 -0
  373. package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
  374. package/src/core/PersistenceManager.ts +8 -8
  375. package/src/core/PromptComposer.ts +209 -140
  376. package/src/core/PromptSectionCache.ts +1 -1
  377. package/src/core/ResponseEngine.ts +61 -46
  378. package/src/core/ResponseModal.ts +1458 -1241
  379. package/src/core/ResponsePipeline.ts +675 -173
  380. package/src/core/SignalEvaluator.ts +420 -0
  381. package/src/core/SignalProcessor.ts +723 -0
  382. package/src/core/Step.ts +279 -176
  383. package/src/core/StreamingToolExecutor.ts +4 -4
  384. package/src/core/ToolManager.ts +200 -97
  385. package/src/core/createAgent.ts +40 -0
  386. package/src/core/flow-namespace.ts +219 -0
  387. package/src/index.ts +42 -36
  388. package/src/providers/GeminiProvider.ts +17 -15
  389. package/src/types/agent.ts +182 -53
  390. package/src/types/ai.ts +3 -3
  391. package/src/types/errors.ts +18 -0
  392. package/src/types/flow.ts +590 -0
  393. package/src/types/index.ts +43 -16
  394. package/src/types/persistence.ts +12 -8
  395. package/src/types/routing.ts +1 -1
  396. package/src/types/session.ts +26 -23
  397. package/src/types/signals.ts +321 -0
  398. package/src/types/template.ts +3 -11
  399. package/src/types/tool.ts +50 -42
  400. package/src/utils/condition.ts +13 -4
  401. package/src/utils/id.ts +27 -9
  402. package/src/utils/index.ts +6 -2
  403. package/src/utils/session.ts +238 -42
  404. package/dist/cjs/core/BatchExecutor.d.ts +0 -359
  405. package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
  406. package/dist/cjs/core/BatchExecutor.js +0 -861
  407. package/dist/cjs/core/BatchExecutor.js.map +0 -1
  408. package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
  409. package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
  410. package/dist/cjs/core/BatchPromptBuilder.js +0 -223
  411. package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
  412. package/dist/cjs/core/Route.d.ts +0 -180
  413. package/dist/cjs/core/Route.d.ts.map +0 -1
  414. package/dist/cjs/core/Route.js +0 -542
  415. package/dist/cjs/core/Route.js.map +0 -1
  416. package/dist/cjs/core/RoutingEngine.d.ts +0 -185
  417. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  418. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  419. package/dist/cjs/types/route.d.ts +0 -336
  420. package/dist/cjs/types/route.d.ts.map +0 -1
  421. package/dist/cjs/types/route.js.map +0 -1
  422. package/dist/core/BatchExecutor.d.ts +0 -359
  423. package/dist/core/BatchExecutor.d.ts.map +0 -1
  424. package/dist/core/BatchExecutor.js +0 -856
  425. package/dist/core/BatchExecutor.js.map +0 -1
  426. package/dist/core/BatchPromptBuilder.d.ts +0 -89
  427. package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
  428. package/dist/core/BatchPromptBuilder.js +0 -219
  429. package/dist/core/BatchPromptBuilder.js.map +0 -1
  430. package/dist/core/Route.d.ts +0 -180
  431. package/dist/core/Route.d.ts.map +0 -1
  432. package/dist/core/Route.js +0 -538
  433. package/dist/core/Route.js.map +0 -1
  434. package/dist/core/RoutingEngine.d.ts +0 -185
  435. package/dist/core/RoutingEngine.d.ts.map +0 -1
  436. package/dist/core/RoutingEngine.js.map +0 -1
  437. package/dist/types/route.d.ts +0 -336
  438. package/dist/types/route.d.ts.map +0 -1
  439. package/dist/types/route.js +0 -5
  440. package/dist/types/route.js.map +0 -1
  441. package/docs/CONTRIBUTING.md +0 -521
  442. package/docs/api/README.md +0 -3299
  443. package/docs/api/overview.md +0 -1410
  444. package/docs/architecture/data-extraction-flow.md +0 -360
  445. package/docs/architecture/multi-step-execution.md +0 -277
  446. package/docs/core/agent/README.md +0 -938
  447. package/docs/core/agent/context-management.md +0 -796
  448. package/docs/core/agent/rules-and-prohibitions.md +0 -113
  449. package/docs/core/agent/session-management.md +0 -693
  450. package/docs/core/ai-integration/prompt-composition.md +0 -355
  451. package/docs/core/ai-integration/providers.md +0 -515
  452. package/docs/core/ai-integration/response-processing.md +0 -433
  453. package/docs/core/conversation-flows/data-collection.md +0 -772
  454. package/docs/core/conversation-flows/route-dsl.md +0 -509
  455. package/docs/core/conversation-flows/routes.md +0 -249
  456. package/docs/core/conversation-flows/step-transitions.md +0 -731
  457. package/docs/core/conversation-flows/steps.md +0 -268
  458. package/docs/core/error-handling.md +0 -830
  459. package/docs/core/persistence/adapters.md +0 -255
  460. package/docs/core/persistence/session-storage.md +0 -656
  461. package/docs/core/routing/intelligent-routing.md +0 -470
  462. package/docs/core/tools/enhanced-tool.md +0 -186
  463. package/docs/core/tools/streaming-execution.md +0 -161
  464. package/docs/core/tools/tool-definition.md +0 -970
  465. package/docs/core/tools/tool-scoping.md +0 -819
  466. package/docs/guides/advanced-patterns/publishing.md +0 -186
  467. package/docs/guides/context-compaction.md +0 -96
  468. package/docs/guides/error-handling-patterns.md +0 -578
  469. package/docs/guides/getting-started/README.md +0 -795
  470. package/docs/guides/migration/README.md +0 -101
  471. package/docs/guides/migration/flexible-routing-conditions.md +0 -375
  472. package/docs/guides/migration/multi-step-execution.md +0 -393
  473. package/docs/guides/migration/response-modal-refactor.md +0 -518
  474. package/docs/guides/prompt-optimization.md +0 -164
  475. package/examples/advanced-patterns/context-compaction.ts +0 -223
  476. package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
  477. package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
  478. package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
  479. package/examples/advanced-patterns/streaming-responses.ts +0 -656
  480. package/examples/ai-providers/anthropic-integration.ts +0 -388
  481. package/examples/ai-providers/openai-integration.ts +0 -228
  482. package/examples/condition-patterns/function-only-conditions.ts +0 -365
  483. package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
  484. package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
  485. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  486. package/examples/condition-patterns/string-only-conditions.ts +0 -296
  487. package/examples/conversation-flows/completion-transitions.ts +0 -318
  488. package/examples/core-concepts/basic-agent.ts +0 -503
  489. package/examples/core-concepts/modern-streaming-api.ts +0 -309
  490. package/examples/core-concepts/schema-driven-extraction.ts +0 -332
  491. package/examples/core-concepts/session-management.ts +0 -494
  492. package/examples/integrations/database-integration.ts +0 -631
  493. package/examples/integrations/healthcare-integration.ts +0 -595
  494. package/examples/integrations/search-integration.ts +0 -530
  495. package/examples/integrations/server-session-management.ts +0 -307
  496. package/examples/persistence/custom-adapter.ts +0 -526
  497. package/examples/persistence/database-persistence.ts +0 -583
  498. package/examples/persistence/memory-sessions.ts +0 -495
  499. package/examples/persistence/prisma-schema.example.prisma +0 -74
  500. package/examples/persistence/redis-persistence.ts +0 -488
  501. package/examples/tools/basic-tools.ts +0 -765
  502. package/examples/tools/data-enrichment-tools.ts +0 -593
  503. package/examples/tools/enhanced-tool-metadata.ts +0 -268
  504. package/examples/tools/streaming-tool-execution.ts +0 -283
  505. package/src/core/BatchExecutor.ts +0 -1187
  506. package/src/core/BatchPromptBuilder.ts +0 -299
  507. package/src/core/Route.ts +0 -678
  508. package/src/types/route.ts +0 -392
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ /**
3
+ * Branch Evaluator — Resolution Algorithm (Algorithm 2 from design.md)
4
+ *
5
+ * Pure function that evaluates a BranchMap in declaration order.
6
+ * Code-first evaluation: `if` predicates run before `when` (AI) conditions
7
+ * to save tokens. First matching entry wins.
8
+ *
9
+ * @module BranchEvaluator
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createAiConditionEvaluator = createAiConditionEvaluator;
13
+ exports.evaluateBranches = evaluateBranches;
14
+ const utils_1 = require("../utils");
15
+ /**
16
+ * Creates an `AiConditionEvaluator` bound to a provider and conversation context.
17
+ *
18
+ * Reuses the same evaluation pattern as `step.when` array forms: condition
19
+ * strings are passed to the AI provider for evaluation against the conversation
20
+ * history. No new prompt scaffolding — the provider evaluates whether the
21
+ * conditions are met based on the conversation so far.
22
+ *
23
+ * String form (`when: "some condition"`) is normalized to a single-element
24
+ * array by the caller (`evaluateBranches`) for uniformity before reaching
25
+ * this function.
26
+ *
27
+ * @param provider - The AI provider to use for condition evaluation
28
+ * @param history - Conversation history (events) for context
29
+ * @param context - Agent-level context
30
+ * @returns An `AiConditionEvaluator` function
31
+ */
32
+ function createAiConditionEvaluator(provider, history, context) {
33
+ return async (conditions) => {
34
+ if (conditions.length === 0) {
35
+ return true;
36
+ }
37
+ const conditionText = conditions.length === 1
38
+ ? conditions[0]
39
+ : conditions.map((c, i) => `${i + 1}. ${c}`).join("\n");
40
+ const prompt = [
41
+ "Evaluate whether the following condition(s) are met based on the conversation so far.",
42
+ "",
43
+ "Condition(s):",
44
+ conditionText,
45
+ "",
46
+ "Return JSON with a single boolean field `result`: true if ALL conditions are satisfied, false otherwise.",
47
+ ].join("\n");
48
+ const result = await provider.generateMessage({
49
+ prompt,
50
+ history: (0, utils_1.eventsToHistory)(history),
51
+ context,
52
+ parameters: {
53
+ jsonSchema: {
54
+ type: "object",
55
+ properties: {
56
+ result: {
57
+ type: "boolean",
58
+ description: "Whether all conditions are met based on the conversation context",
59
+ },
60
+ },
61
+ required: ["result"],
62
+ additionalProperties: false,
63
+ },
64
+ schemaName: "condition_evaluation",
65
+ },
66
+ });
67
+ return result.structured?.result ?? false;
68
+ };
69
+ }
70
+ /**
71
+ * Evaluates a BranchMap in declaration order, returning the first matching
72
+ * entry's `then` value, or `undefined` if no entry matches.
73
+ *
74
+ * Resolution rules per entry:
75
+ * 1. Unconditional (no `when`, no `if`) → return `then` immediately.
76
+ * 2. `if` first: normalize to array, await each predicate, short-circuit on first falsy.
77
+ * 3. `when` second: only if `if` passed (or absent); call evaluateAi with condition strings.
78
+ * 4. Both passed (or only one set and it passed) → return `then`.
79
+ *
80
+ * Errors in predicates or AI evaluation are caught, logged at ERROR, and
81
+ * cause `evaluateBranches` to return `undefined` (graceful degradation).
82
+ */
83
+ async function evaluateBranches(branches, ctx, evaluateAi) {
84
+ try {
85
+ for (let i = 0; i < branches.length; i++) {
86
+ const entry = branches[i];
87
+ // Unconditional fallback: entry has neither `when` nor `if`.
88
+ // Validation guarantees this is the LAST entry.
89
+ if (!entry.when && !entry.if) {
90
+ return entry.then;
91
+ }
92
+ // Code predicate first (free evaluation)
93
+ if (entry.if) {
94
+ const predicates = Array.isArray(entry.if)
95
+ ? entry.if
96
+ : [entry.if];
97
+ let ifPassed = true;
98
+ for (const predicate of predicates) {
99
+ const result = await predicate(ctx);
100
+ if (!result) {
101
+ ifPassed = false;
102
+ break;
103
+ }
104
+ }
105
+ if (!ifPassed) {
106
+ continue; // skip this entry; do NOT evaluate `when`
107
+ }
108
+ }
109
+ // AI condition (costs tokens — only reached if `if` passed or was absent)
110
+ if (entry.when) {
111
+ const conditions = Array.isArray(entry.when)
112
+ ? entry.when
113
+ : [entry.when];
114
+ const aiResult = await evaluateAi(conditions);
115
+ if (!aiResult) {
116
+ continue; // skip this entry
117
+ }
118
+ }
119
+ // Both passed (or only one was set and it passed)
120
+ return entry.then;
121
+ }
122
+ // No entry matched
123
+ return undefined;
124
+ }
125
+ catch (error) {
126
+ utils_1.logger.error(`[BranchEvaluator] Error during branch evaluation: ${error instanceof Error ? error.message : String(error)}`);
127
+ return undefined;
128
+ }
129
+ }
130
+ //# sourceMappingURL=BranchEvaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BranchEvaluator.js","sourceRoot":"","sources":["../../../src/core/BranchEvaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * DirectiveBus — per-turn collection mechanism for directives emitted by
3
+ * hooks, tools, and branches.
4
+ *
5
+ * Two phases per turn:
6
+ * 1. Pre-LLM: collects from `prepare` hooks and `onEnter` hooks.
7
+ * 2. Post-LLM: collects from `finalize`, tools via `executeToolCalls`,
8
+ * branches via `evaluateBranches`.
9
+ *
10
+ * Each entry is stamped with an emitter ID for debug logging. At phase
11
+ * boundaries, the bus contents are merged using `flow.merge` and the
12
+ * result is returned via `drain()`.
13
+ *
14
+ * Algorithm 4: position precedence `abort > complete > goTo/goToStep > reset`,
15
+ * ties broken by emission order (last wins).
16
+ *
17
+ * **Validates: Requirements 1.3, 10.4, 10.5, 10.6**
18
+ */
19
+ import type { Directive } from "../types/flow";
20
+ /** Phase of the turn pipeline the bus is currently collecting for. */
21
+ export type DirectiveBusPhase = "pre-llm" | "post-llm";
22
+ /** A single entry on the bus, stamped with its emitter for debug logging. */
23
+ export interface DirectiveBusEntry<TContext = unknown, TData = unknown> {
24
+ directive: Directive<TContext, TData>;
25
+ emitterId: string;
26
+ phase: DirectiveBusPhase;
27
+ /** Monotonically increasing emission index within the phase. */
28
+ order: number;
29
+ }
30
+ /**
31
+ * Per-turn directive collection bus.
32
+ *
33
+ * Usage:
34
+ * ```ts
35
+ * const bus = new DirectiveBus();
36
+ * bus.setPhase('pre-llm');
37
+ * bus.emit({ goTo: 'Booking' }, 'step.onEnter:ask_date');
38
+ * bus.emit({ appendPrompt: ['Be concise.'] }, 'step.prepare:ask_date');
39
+ * const merged = bus.drain(); // merges all collected directives
40
+ * bus.setPhase('post-llm');
41
+ * // ... collect post-LLM emissions ...
42
+ * const postMerged = bus.drain();
43
+ * ```
44
+ */
45
+ export declare class DirectiveBus<TContext = unknown, TData = unknown> {
46
+ private entries;
47
+ private currentPhase;
48
+ private orderCounter;
49
+ /** Set the current collection phase. Resets the order counter for the new phase. */
50
+ setPhase(phase: DirectiveBusPhase): void;
51
+ /** Get the current phase. */
52
+ getPhase(): DirectiveBusPhase;
53
+ /**
54
+ * Emit a directive onto the bus.
55
+ *
56
+ * @param directive - The directive to collect.
57
+ * @param emitterId - Human-readable identifier of the emitter (for debug logging).
58
+ */
59
+ emit(directive: Directive<TContext, TData>, emitterId: string): void;
60
+ /**
61
+ * Drain the bus: merge all collected directives for the current phase
62
+ * using Algorithm 4 (position precedence, last-wins tie-breaking,
63
+ * shallow-merge for state writes).
64
+ *
65
+ * Returns `undefined` if no directives were collected.
66
+ * After draining, the entries for the current phase are cleared.
67
+ */
68
+ drain(): Directive<TContext, TData> | undefined;
69
+ /**
70
+ * Drain ALL entries regardless of phase. Used for final turn cleanup.
71
+ * Returns `undefined` if no directives were collected.
72
+ */
73
+ drainAll(): Directive<TContext, TData> | undefined;
74
+ /** Clear all collected entries and reset the bus for a new turn. */
75
+ clear(): void;
76
+ /** Get the number of entries currently on the bus. */
77
+ get size(): number;
78
+ /** Get all entries (for inspection/testing). */
79
+ getEntries(): ReadonlyArray<DirectiveBusEntry<TContext, TData>>;
80
+ /** Check if the bus has any entries for the current phase. */
81
+ hasEntries(): boolean;
82
+ /**
83
+ * Log debug-level conflict warnings when multiple emitters set position
84
+ * fields or reply fields in the same phase.
85
+ */
86
+ private logConflicts;
87
+ }
88
+ //# sourceMappingURL=DirectiveBus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DirectiveBus.d.ts","sourceRoot":"","sources":["../../../src/core/DirectiveBus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI/C,sEAAsE;AACtE,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,UAAU,CAAC;AAEvD,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB,CAAC,QAAQ,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO;IAClE,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,iBAAiB,CAAC;IACzB,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,YAAY,CAAC,QAAQ,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO;IACzD,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,YAAY,CAAK;IAEzB,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAMxC,6BAA6B;IAC7B,QAAQ,IAAI,iBAAiB;IAI7B;;;;;OAKG;IACH,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAyBpE;;;;;;;OAOG;IACH,KAAK,IAAI,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,SAAS;IA4D/C;;;OAGG;IACH,QAAQ,IAAI,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,SAAS;IAgBlD,oEAAoE;IACpE,KAAK,IAAI,IAAI;IAMb,sDAAsD;IACtD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,gDAAgD;IAChD,UAAU,IAAI,aAAa,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAI/D,8DAA8D;IAC9D,UAAU,IAAI,OAAO;IAMrB;;;OAGG;IACH,OAAO,CAAC,YAAY;CAiCvB"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ /**
3
+ * DirectiveBus — per-turn collection mechanism for directives emitted by
4
+ * hooks, tools, and branches.
5
+ *
6
+ * Two phases per turn:
7
+ * 1. Pre-LLM: collects from `prepare` hooks and `onEnter` hooks.
8
+ * 2. Post-LLM: collects from `finalize`, tools via `executeToolCalls`,
9
+ * branches via `evaluateBranches`.
10
+ *
11
+ * Each entry is stamped with an emitter ID for debug logging. At phase
12
+ * boundaries, the bus contents are merged using `flow.merge` and the
13
+ * result is returned via `drain()`.
14
+ *
15
+ * Algorithm 4: position precedence `abort > complete > goTo/goToStep > reset`,
16
+ * ties broken by emission order (last wins).
17
+ *
18
+ * **Validates: Requirements 1.3, 10.4, 10.5, 10.6**
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.DirectiveBus = void 0;
22
+ const flow_namespace_1 = require("./flow-namespace");
23
+ const utils_1 = require("../utils");
24
+ /**
25
+ * Per-turn directive collection bus.
26
+ *
27
+ * Usage:
28
+ * ```ts
29
+ * const bus = new DirectiveBus();
30
+ * bus.setPhase('pre-llm');
31
+ * bus.emit({ goTo: 'Booking' }, 'step.onEnter:ask_date');
32
+ * bus.emit({ appendPrompt: ['Be concise.'] }, 'step.prepare:ask_date');
33
+ * const merged = bus.drain(); // merges all collected directives
34
+ * bus.setPhase('post-llm');
35
+ * // ... collect post-LLM emissions ...
36
+ * const postMerged = bus.drain();
37
+ * ```
38
+ */
39
+ class DirectiveBus {
40
+ constructor() {
41
+ this.entries = [];
42
+ this.currentPhase = "pre-llm";
43
+ this.orderCounter = 0;
44
+ }
45
+ /** Set the current collection phase. Resets the order counter for the new phase. */
46
+ setPhase(phase) {
47
+ this.currentPhase = phase;
48
+ // Order counter is NOT reset — emission order is global within the turn
49
+ // so that cross-phase comparisons (if ever needed) remain consistent.
50
+ }
51
+ /** Get the current phase. */
52
+ getPhase() {
53
+ return this.currentPhase;
54
+ }
55
+ /**
56
+ * Emit a directive onto the bus.
57
+ *
58
+ * @param directive - The directive to collect.
59
+ * @param emitterId - Human-readable identifier of the emitter (for debug logging).
60
+ */
61
+ emit(directive, emitterId) {
62
+ if (!directive || typeof directive !== "object" || Array.isArray(directive)) {
63
+ return; // Silently ignore non-object values (void returns from hooks)
64
+ }
65
+ // Check if the directive has any meaningful fields set
66
+ const hasFields = Object.keys(directive).some((k) => directive[k] !== undefined);
67
+ if (!hasFields) {
68
+ return; // Empty directive — nothing to collect
69
+ }
70
+ this.entries.push({
71
+ directive,
72
+ emitterId,
73
+ phase: this.currentPhase,
74
+ order: this.orderCounter++,
75
+ });
76
+ utils_1.logger.debug(`[DirectiveBus] Collected directive from "${emitterId}" (phase=${this.currentPhase}, order=${this.orderCounter - 1})`);
77
+ }
78
+ /**
79
+ * Drain the bus: merge all collected directives for the current phase
80
+ * using Algorithm 4 (position precedence, last-wins tie-breaking,
81
+ * shallow-merge for state writes).
82
+ *
83
+ * Returns `undefined` if no directives were collected.
84
+ * After draining, the entries for the current phase are cleared.
85
+ */
86
+ drain() {
87
+ const phaseEntries = this.entries.filter((e) => e.phase === this.currentPhase);
88
+ if (phaseEntries.length === 0) {
89
+ return undefined;
90
+ }
91
+ // Log conflicts when multiple emitters set position or reply fields
92
+ this.logConflicts(phaseEntries);
93
+ // Merge all directives in emission order using flow.merge (pairwise reduction).
94
+ // flow.merge implements Algorithm 4: position precedence with last-wins tie-breaking.
95
+ let merged = phaseEntries[0].directive;
96
+ for (let i = 1; i < phaseEntries.length; i++) {
97
+ merged = flow_namespace_1.flow.merge(merged, phaseEntries[i].directive);
98
+ }
99
+ // Strip pre-LLM-only fields from post-LLM phase emissions
100
+ if (this.currentPhase === "post-llm") {
101
+ const asAny = merged;
102
+ const preLlmFields = ["appendPrompt", "injectTools", "halt"];
103
+ // Identify which fields are present BEFORE stripping (the merge may
104
+ // alias phaseEntries[0].directive when there is a single emitter, so
105
+ // we must collect emitter names first).
106
+ const droppedFields = [];
107
+ for (const f of preLlmFields) {
108
+ if (asAny[f] !== undefined) {
109
+ droppedFields.push(f);
110
+ }
111
+ }
112
+ if (droppedFields.length > 0) {
113
+ // Identify emitters that contributed the dropped fields.
114
+ const emitters = phaseEntries
115
+ .filter((e) => {
116
+ const d = e.directive;
117
+ return droppedFields.some((f) => d[f] !== undefined);
118
+ })
119
+ .map((e) => e.emitterId);
120
+ // Now strip the fields from the merged result.
121
+ for (const f of droppedFields) {
122
+ delete asAny[f];
123
+ }
124
+ utils_1.logger.debug(`[DirectiveBus] Dropped pre-LLM-only fields [${droppedFields.join(", ")}] from post-LLM emitters: ${emitters.join(", ")}`);
125
+ }
126
+ }
127
+ // Clear entries for the drained phase
128
+ this.entries = this.entries.filter((e) => e.phase !== this.currentPhase);
129
+ return merged;
130
+ }
131
+ /**
132
+ * Drain ALL entries regardless of phase. Used for final turn cleanup.
133
+ * Returns `undefined` if no directives were collected.
134
+ */
135
+ drainAll() {
136
+ if (this.entries.length === 0) {
137
+ return undefined;
138
+ }
139
+ this.logConflicts(this.entries);
140
+ let merged = this.entries[0].directive;
141
+ for (let i = 1; i < this.entries.length; i++) {
142
+ merged = flow_namespace_1.flow.merge(merged, this.entries[i].directive);
143
+ }
144
+ this.entries = [];
145
+ return merged;
146
+ }
147
+ /** Clear all collected entries and reset the bus for a new turn. */
148
+ clear() {
149
+ this.entries = [];
150
+ this.orderCounter = 0;
151
+ this.currentPhase = "pre-llm";
152
+ }
153
+ /** Get the number of entries currently on the bus. */
154
+ get size() {
155
+ return this.entries.length;
156
+ }
157
+ /** Get all entries (for inspection/testing). */
158
+ getEntries() {
159
+ return this.entries;
160
+ }
161
+ /** Check if the bus has any entries for the current phase. */
162
+ hasEntries() {
163
+ return this.entries.some((e) => e.phase === this.currentPhase);
164
+ }
165
+ // ─── Private helpers ─────────────────────────────────────────────────────
166
+ /**
167
+ * Log debug-level conflict warnings when multiple emitters set position
168
+ * fields or reply fields in the same phase.
169
+ */
170
+ logConflicts(entries) {
171
+ // Check for position field conflicts
172
+ const positionEmitters = [];
173
+ for (const entry of entries) {
174
+ const d = entry.directive;
175
+ for (const field of ["abort", "complete", "goTo", "goToStep", "reset"]) {
176
+ if (d[field] !== undefined) {
177
+ positionEmitters.push({ emitterId: entry.emitterId, field });
178
+ }
179
+ }
180
+ }
181
+ if (positionEmitters.length > 1) {
182
+ const details = positionEmitters
183
+ .map((e) => `${e.emitterId}(${e.field})`)
184
+ .join(", ");
185
+ utils_1.logger.debug(`[DirectiveBus] Multiple position fields in one turn — conflict resolution applied. Emitters: ${details}`);
186
+ }
187
+ // Check for reply conflicts
188
+ const replyEmitters = entries.filter((e) => e.directive.reply !== undefined);
189
+ if (replyEmitters.length > 1) {
190
+ const emitterIds = replyEmitters.map((e) => e.emitterId).join(", ");
191
+ utils_1.logger.debug(`[DirectiveBus] Multiple reply fields in one turn — using last emission. Emitters: ${emitterIds}`);
192
+ }
193
+ }
194
+ }
195
+ exports.DirectiveBus = DirectiveBus;
196
+ //# sourceMappingURL=DirectiveBus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DirectiveBus.js","sourceRoot":"","sources":["../../../src/core/DirectiveBus.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAGH,qDAAwC;AACxC,oCAAkC;AAclC;;;;;;;;;;;;;;GAcG;AACH,MAAa,YAAY;IAAzB;QACY,YAAO,GAAyC,EAAE,CAAC;QACnD,iBAAY,GAAsB,SAAS,CAAC;QAC5C,iBAAY,GAAG,CAAC,CAAC;IAkM7B,CAAC;IAhMG,oFAAoF;IACpF,QAAQ,CAAC,KAAwB;QAC7B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,wEAAwE;QACxE,sEAAsE;IAC1E,CAAC;IAED,6BAA6B;IAC7B,QAAQ;QACJ,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAC,SAAqC,EAAE,SAAiB;QACzD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1E,OAAO,CAAC,8DAA8D;QAC1E,CAAC;QAED,uDAAuD;QACvD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CACzC,CAAC,CAAC,EAAE,EAAE,CAAE,SAAqC,CAAC,CAAC,CAAC,KAAK,SAAS,CACjE,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,OAAO,CAAC,uCAAuC;QACnD,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACd,SAAS;YACT,SAAS;YACT,KAAK,EAAE,IAAI,CAAC,YAAY;YACxB,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE;SAC7B,CAAC,CAAC;QAEH,cAAM,CAAC,KAAK,CACR,4CAA4C,SAAS,YAAY,IAAI,CAAC,YAAY,WAAW,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,CACxH,CAAC;IACN,CAAC;IAED;;;;;;;OAOG;IACH,KAAK;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CACpC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,YAAY,CACvC,CAAC;QAEF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,oEAAoE;QACpE,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAEhC,gFAAgF;QAChF,sFAAsF;QACtF,IAAI,MAAM,GAA+B,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,GAAG,qBAAI,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3D,CAAC;QAED,0DAA0D;QAC1D,IAAI,IAAI,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,MAAiC,CAAC;YAChD,MAAM,YAAY,GAAG,CAAC,cAAc,EAAE,aAAa,EAAE,MAAM,CAAU,CAAC;YAEtE,oEAAoE;YACpE,qEAAqE;YACrE,wCAAwC;YACxC,MAAM,aAAa,GAAa,EAAE,CAAC;YACnC,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;oBACzB,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC1B,CAAC;YACL,CAAC;YAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,yDAAyD;gBACzD,MAAM,QAAQ,GAAG,YAAY;qBACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;oBACV,MAAM,CAAC,GAAG,CAAC,CAAC,SAAoC,CAAC;oBACjD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;gBACzD,CAAC,CAAC;qBACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAE7B,+CAA+C;gBAC/C,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;oBAC5B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC;gBAED,cAAM,CAAC,KAAK,CACR,+CAA+C,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5H,CAAC;YACN,CAAC;QACL,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;QAEzE,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,QAAQ;QACJ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEhC,IAAI,MAAM,GAA+B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,GAAG,qBAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,oEAAoE;IACpE,KAAK;QACD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;IAClC,CAAC;IAED,sDAAsD;IACtD,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED,gDAAgD;IAChD,UAAU;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,8DAA8D;IAC9D,UAAU;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;IACnE,CAAC;IAED,4EAA4E;IAE5E;;;OAGG;IACK,YAAY,CAChB,OAA6C;QAE7C,qCAAqC;QACrC,MAAM,gBAAgB,GAAgD,EAAE,CAAC;QACzE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,SAAoC,CAAC;YACrD,KAAK,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;gBACrE,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;oBACzB,gBAAgB,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBACjE,CAAC;YACL,CAAC;QACL,CAAC;QACD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,gBAAgB;iBAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC;iBACxC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,cAAM,CAAC,KAAK,CACR,gGAAgG,OAAO,EAAE,CAC5G,CAAC;QACN,CAAC;QAED,4BAA4B;QAC5B,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAChC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,SAAqC,CAAC,KAAK,KAAK,SAAS,CACtE,CAAC;QACF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,cAAM,CAAC,KAAK,CACR,qFAAqF,UAAU,EAAE,CACpG,CAAC;QACN,CAAC;IACL,CAAC;CACJ;AArMD,oCAqMC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Per-turn directive chain depth tracker.
3
+ *
4
+ * When directives chain (e.g., tool emits goTo → flow.onEnter emits goTo →
5
+ * flow.onComplete emits complete.next → …), the chain can theoretically loop
6
+ * forever. This tracker counts each directive application within a single turn
7
+ * and throws `FlowConfigurationError` when the configured cap is exceeded.
8
+ *
9
+ * Chain breakers (`abort` mid-chain) stop counting and apply the
10
+ * chain-terminating directive immediately.
11
+ *
12
+ * Validates: Requirements 22.1, 22.2, 22.3
13
+ */
14
+ import type { Directive } from "../types/flow";
15
+ /**
16
+ * Entry in the directive chain log — records what was emitted and by whom.
17
+ */
18
+ export interface DirectiveChainEntry {
19
+ /** Human-readable description of the directive (e.g., "goTo:Booking", "complete", "abort:timeout") */
20
+ description: string;
21
+ /** Identifier of the emitter (e.g., "tool:lookup_order", "hook:onEnter", "pending") */
22
+ emitter: string;
23
+ }
24
+ /**
25
+ * Tracks directive chain depth within a single turn.
26
+ * Create one instance per turn; discard at turn end.
27
+ */
28
+ export declare class DirectiveChainTracker {
29
+ private chain;
30
+ private readonly maxDepth;
31
+ constructor(maxDirectiveChain: number);
32
+ /**
33
+ * Record a directive application in the chain.
34
+ * Throws `FlowConfigurationError` if the chain exceeds `maxDirectiveChain`.
35
+ *
36
+ * @param directive - The directive being applied
37
+ * @param emitter - Identifier of the emitter (for diagnostics)
38
+ * @returns `true` if the directive is a chain breaker (abort) — caller should
39
+ * apply it and stop the chain without further counting.
40
+ */
41
+ record(directive: Directive, emitter: string): boolean;
42
+ /** Current chain depth. */
43
+ get depth(): number;
44
+ /** The full chain log (read-only). */
45
+ get entries(): ReadonlyArray<DirectiveChainEntry>;
46
+ /** Reset the tracker (e.g., for testing or if the turn is restarted). */
47
+ reset(): void;
48
+ }
49
+ //# sourceMappingURL=DirectiveChainTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DirectiveChainTracker.d.ts","sourceRoot":"","sources":["../../../src/core/DirectiveChainTracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,sGAAsG;IACtG,WAAW,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,iBAAiB,EAAE,MAAM;IAIrC;;;;;;;;OAQG;IACH,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAkCtD,2BAA2B;IAC3B,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,sCAAsC;IACtC,IAAI,OAAO,IAAI,aAAa,CAAC,mBAAmB,CAAC,CAEhD;IAED,yEAAyE;IACzE,KAAK,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * Per-turn directive chain depth tracker.
4
+ *
5
+ * When directives chain (e.g., tool emits goTo → flow.onEnter emits goTo →
6
+ * flow.onComplete emits complete.next → …), the chain can theoretically loop
7
+ * forever. This tracker counts each directive application within a single turn
8
+ * and throws `FlowConfigurationError` when the configured cap is exceeded.
9
+ *
10
+ * Chain breakers (`abort` mid-chain) stop counting and apply the
11
+ * chain-terminating directive immediately.
12
+ *
13
+ * Validates: Requirements 22.1, 22.2, 22.3
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.DirectiveChainTracker = void 0;
17
+ const Step_1 = require("./Step");
18
+ const utils_1 = require("../utils");
19
+ /**
20
+ * Tracks directive chain depth within a single turn.
21
+ * Create one instance per turn; discard at turn end.
22
+ */
23
+ class DirectiveChainTracker {
24
+ constructor(maxDirectiveChain) {
25
+ this.chain = [];
26
+ this.maxDepth = maxDirectiveChain;
27
+ }
28
+ /**
29
+ * Record a directive application in the chain.
30
+ * Throws `FlowConfigurationError` if the chain exceeds `maxDirectiveChain`.
31
+ *
32
+ * @param directive - The directive being applied
33
+ * @param emitter - Identifier of the emitter (for diagnostics)
34
+ * @returns `true` if the directive is a chain breaker (abort) — caller should
35
+ * apply it and stop the chain without further counting.
36
+ */
37
+ record(directive, emitter) {
38
+ const description = describeDirective(directive);
39
+ // Check if this is a chain breaker (abort)
40
+ if (directive.abort !== undefined) {
41
+ this.chain.push({ description, emitter });
42
+ utils_1.logger.debug(`[DirectiveChainTracker] Chain breaker (abort) at depth ${this.chain.length}: ${description} from ${emitter}`);
43
+ return true; // Chain breaker — apply and stop
44
+ }
45
+ this.chain.push({ description, emitter });
46
+ if (this.chain.length > this.maxDepth) {
47
+ const chainDescription = this.chain
48
+ .map((entry, i) => ` ${i + 1}. ${entry.description} (from: ${entry.emitter})`)
49
+ .join("\n");
50
+ throw new Step_1.FlowConfigurationError(`[FlowConfigurationError] Directive chain cycle detected: ` +
51
+ `chain depth (${this.chain.length}) exceeded maxDirectiveChain (${this.maxDepth}). ` +
52
+ `Review flow hooks and tool handlers for circular redirections.\n` +
53
+ `Chain (in emission order):\n${chainDescription}`);
54
+ }
55
+ utils_1.logger.debug(`[DirectiveChainTracker] Chain depth ${this.chain.length}/${this.maxDepth}: ${description} from ${emitter}`);
56
+ return false; // Not a chain breaker — continue normally
57
+ }
58
+ /** Current chain depth. */
59
+ get depth() {
60
+ return this.chain.length;
61
+ }
62
+ /** The full chain log (read-only). */
63
+ get entries() {
64
+ return this.chain;
65
+ }
66
+ /** Reset the tracker (e.g., for testing or if the turn is restarted). */
67
+ reset() {
68
+ this.chain = [];
69
+ }
70
+ }
71
+ exports.DirectiveChainTracker = DirectiveChainTracker;
72
+ /**
73
+ * Produce a human-readable one-line description of a directive for diagnostics.
74
+ */
75
+ function describeDirective(directive) {
76
+ if (directive.abort !== undefined) {
77
+ const reason = typeof directive.abort === "string"
78
+ ? directive.abort
79
+ : typeof directive.abort === "object"
80
+ ? directive.abort.reason
81
+ : "";
82
+ return `abort${reason ? `:${reason}` : ""}`;
83
+ }
84
+ if (directive.goTo !== undefined) {
85
+ const target = typeof directive.goTo === "string"
86
+ ? directive.goTo
87
+ : typeof directive.goTo === "object"
88
+ ? directive.goTo.flow ?? "(no flow)"
89
+ : "";
90
+ return `goTo:${target}`;
91
+ }
92
+ if (directive.goToStep !== undefined) {
93
+ const target = typeof directive.goToStep === "string"
94
+ ? directive.goToStep
95
+ : typeof directive.goToStep === "object"
96
+ ? directive.goToStep.step
97
+ : "";
98
+ return `goToStep:${target}`;
99
+ }
100
+ if (directive.complete !== undefined) {
101
+ if (directive.complete === true)
102
+ return "complete";
103
+ if (typeof directive.complete === "object" && directive.complete.next) {
104
+ return "complete(chained)";
105
+ }
106
+ return "complete";
107
+ }
108
+ if (directive.reset !== undefined) {
109
+ return "reset";
110
+ }
111
+ // State-only or reply-only directive
112
+ const parts = [];
113
+ if (directive.reply)
114
+ parts.push("reply");
115
+ if (directive.dataUpdate)
116
+ parts.push("dataUpdate");
117
+ if (directive.contextUpdate)
118
+ parts.push("contextUpdate");
119
+ return parts.length > 0 ? parts.join("+") : "(empty)";
120
+ }
121
+ //# sourceMappingURL=DirectiveChainTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DirectiveChainTracker.js","sourceRoot":"","sources":["../../../src/core/DirectiveChainTracker.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAEH,iCAAgD;AAChD,oCAAkC;AAalC;;;GAGG;AACH,MAAa,qBAAqB;IAI9B,YAAY,iBAAyB;QAH7B,UAAK,GAA0B,EAAE,CAAC;QAItC,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC;IACtC,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,SAAoB,EAAE,OAAe;QACxC,MAAM,WAAW,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAEjD,2CAA2C;QAC3C,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1C,cAAM,CAAC,KAAK,CACR,0DAA0D,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,SAAS,OAAO,EAAE,CAChH,CAAC;YACF,OAAO,IAAI,CAAC,CAAC,iCAAiC;QAClD,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QAE1C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK;iBAC9B,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,WAAW,WAAW,KAAK,CAAC,OAAO,GAAG,CAAC;iBAC9E,IAAI,CAAC,IAAI,CAAC,CAAC;YAEhB,MAAM,IAAI,6BAAsB,CAC5B,2DAA2D;gBAC3D,gBAAgB,IAAI,CAAC,KAAK,CAAC,MAAM,iCAAiC,IAAI,CAAC,QAAQ,KAAK;gBACpF,kEAAkE;gBAClE,+BAA+B,gBAAgB,EAAE,CACpD,CAAC;QACN,CAAC;QAED,cAAM,CAAC,KAAK,CACR,uCAAuC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,SAAS,OAAO,EAAE,CAC9G,CAAC;QAEF,OAAO,KAAK,CAAC,CAAC,0CAA0C;IAC5D,CAAC;IAED,2BAA2B;IAC3B,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,sCAAsC;IACtC,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,yEAAyE;IACzE,KAAK;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IACpB,CAAC;CACJ;AAjED,sDAiEC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,SAAoB;IAC3C,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;YAC9C,CAAC,CAAC,SAAS,CAAC,KAAK;YACjB,CAAC,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;gBACjC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM;gBACxB,CAAC,CAAC,EAAE,CAAC;QACb,OAAO,QAAQ,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAChD,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ;YAC7C,CAAC,CAAC,SAAS,CAAC,IAAI;YAChB,CAAC,CAAC,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ;gBAChC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,WAAW;gBACpC,CAAC,CAAC,EAAE,CAAC;QACb,OAAO,QAAQ,MAAM,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ;YACjD,CAAC,CAAC,SAAS,CAAC,QAAQ;YACpB,CAAC,CAAC,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ;gBACpC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI;gBACzB,CAAC,CAAC,EAAE,CAAC;QACb,OAAO,YAAY,MAAM,EAAE,CAAC;IAChC,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,UAAU,CAAC;QACnD,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpE,OAAO,mBAAmB,CAAC;QAC/B,CAAC;QACD,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,qCAAqC;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,SAAS,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,SAAS,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,SAAS,CAAC,aAAa;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC"}