@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
package/src/core/Route.ts DELETED
@@ -1,678 +0,0 @@
1
- /**
2
- * Route (Journey) DSL implementation
3
- */
4
-
5
- import type {
6
- RouteOptions,
7
- RouteRef,
8
- StepOptions,
9
- StepResult,
10
- RouteTransitionConfig,
11
- RouteCompletionHandler,
12
- RouteLifecycleHooks,
13
- StructuredSchema,
14
- Guideline,
15
- GuidelineMatch,
16
- Term,
17
- Tool,
18
- Template,
19
- ConditionTemplate,
20
- TemplateContext,
21
- ConditionEvaluationResult,
22
- SessionState,
23
- Event,
24
- } from "../types";
25
-
26
- import { createConditionEvaluator, generateRouteId, logger } from "../utils";
27
-
28
- import { Step } from "./Step";
29
- import { Agent } from './Agent'
30
- import { END_ROUTE } from "../constants";
31
-
32
- /**
33
- * Represents a conversational route/journey
34
- */
35
- export class Route<TContext = unknown, TData = unknown> {
36
- public readonly id: string;
37
- public readonly title: string;
38
- public readonly description?: string;
39
- public readonly identity?: Template<TContext, TData>;
40
- public readonly personality?: Template<TContext, TData>;
41
- public readonly when?: ConditionTemplate<TContext, TData>;
42
- public readonly skipIf?: ConditionTemplate<TContext, TData>;
43
- public readonly rules: Template<TContext, TData>[];
44
- public readonly prohibitions: Template<TContext, TData>[];
45
- public readonly initialStep: Step<TContext, TData>;
46
- public readonly endStepSpec: Omit<
47
- StepOptions<TContext, TData>,
48
- "step" | "condition" | "skipIf"
49
- >;
50
- public readonly responseOutputSchema?: StructuredSchema;
51
- public readonly initialData?: Partial<TData>;
52
- public readonly requiredFields?: (keyof TData)[];
53
- public readonly optionalFields?: (keyof TData)[];
54
- public readonly onComplete?:
55
- | string
56
- | RouteTransitionConfig<TContext, TData>
57
- | RouteCompletionHandler<TContext, TData>;
58
- public readonly hooks?: RouteLifecycleHooks<TContext, TData>;
59
- public routingExtrasSchema?: StructuredSchema;
60
- public guidelines: Guideline<TContext, TData>[] = [];
61
- public terms: Term<TContext>[] = [];
62
- public tools: Tool<TContext, TData>[] = [];
63
- public knowledgeBase: Record<string, unknown> = {};
64
-
65
- // Reference to parent agent for ToolManager access
66
- private parentAgent?: Agent<TContext, TData>;
67
-
68
- constructor(options: RouteOptions<TContext, TData>, parentAgent?: Agent<TContext, TData>) {
69
- // Use provided ID or generate a deterministic one from the title
70
- this.id = options.id || generateRouteId(options.title);
71
- this.title = options.title;
72
- this.description = options.description;
73
- this.identity = options.identity;
74
- this.personality = options.personality;
75
- this.when = options.when;
76
- this.skipIf = options.skipIf;
77
- this.rules = options.rules || [];
78
- this.prohibitions = options.prohibitions || [];
79
-
80
- // Store reference to parent agent for ToolManager access
81
- this.parentAgent = parentAgent;
82
-
83
- // Handle initial step logic
84
- let initialStepOptions = options.initialStep;
85
- let stepsToChain: StepOptions<TContext, TData>[] = [];
86
-
87
- if (options.steps && options.steps.length > 0) {
88
- // If steps are provided but no initialStep, use first step as initial
89
- if (!options.initialStep) {
90
- initialStepOptions = options.steps[0];
91
- stepsToChain = options.steps.slice(1);
92
- } else {
93
- // Both initialStep and steps provided - chain steps after initial
94
- stepsToChain = options.steps;
95
- }
96
- }
97
-
98
- this.initialStep = new Step<TContext, TData>(this.id, initialStepOptions, this.parentAgent);
99
-
100
- // Store endStep spec (will be used when route completes)
101
- this.endStepSpec = options.endStep || {
102
- prompt:
103
- "Summarize what was accomplished and confirm completion based on the conversation history and collected data",
104
- };
105
- this.routingExtrasSchema = options.routingExtrasSchema;
106
- this.responseOutputSchema = options.responseOutputSchema;
107
- this.initialData = options.initialData;
108
- this.requiredFields = options.requiredFields;
109
- this.optionalFields = options.optionalFields;
110
- this.onComplete = options.onComplete;
111
- this.hooks = options.hooks;
112
-
113
- // Initialize knowledge base
114
- if (options.knowledgeBase) {
115
- this.knowledgeBase = { ...options.knowledgeBase };
116
- }
117
-
118
- // Initialize guidelines from options
119
- if (options.guidelines) {
120
- options.guidelines.forEach((guideline) => {
121
- this.createGuideline(guideline);
122
- });
123
- }
124
-
125
- // Initialize terms from options
126
- if (options.terms) {
127
- options.terms.forEach((term) => {
128
- this.createTerm(term);
129
- });
130
- }
131
-
132
- // Initialize tools from options
133
- if (options.tools) {
134
- options.tools.forEach((toolRef) => {
135
- if (typeof toolRef === 'string') {
136
- // Tool ID - try to resolve from ToolManager
137
- if (this.parentAgent?.tool) {
138
- const registeredTool = this.parentAgent.tool.find(toolRef);
139
- if (registeredTool) {
140
- this.createTool(registeredTool);
141
- } else {
142
- // Tool not found - log warning but don't fail
143
- logger.warn(`[Route] Tool ID '${toolRef}' not found in any scope for route ${this.title}`);
144
- }
145
- } else {
146
- logger.warn(`[Route] No agent available to resolve tool ID '${toolRef}' for route ${this.title}`);
147
- }
148
- } else {
149
- // Inline tool object - validate and use directly
150
- if (toolRef && toolRef.id && typeof toolRef.handler === 'function') {
151
- this.createTool(toolRef);
152
- } else {
153
- logger.warn(`[Route] Invalid inline tool object in route ${this.title}:`, toolRef);
154
- }
155
- }
156
- });
157
- }
158
-
159
- // Build sequential steps if provided
160
- if (stepsToChain.length > 0) {
161
- this.buildSequentialSteps(stepsToChain);
162
- }
163
- }
164
-
165
- /**
166
- * Build a sequential step machine from an array of steps
167
- * @private
168
- */
169
- private buildSequentialSteps(
170
- steps: Array<StepOptions<TContext, TData> | typeof END_ROUTE>
171
- ): void {
172
- let currentStepResult: StepResult<TContext, TData> = this.initialStep.asStepResult();
173
-
174
- for (const step of steps) {
175
- if (step === END_ROUTE) {
176
- currentStepResult.nextStep({ step: END_ROUTE });
177
- } else {
178
- currentStepResult = currentStepResult.nextStep(step);
179
- }
180
- }
181
- }
182
-
183
- /**
184
- * Evaluate the when condition for this route
185
- * @param templateContext - Context for condition evaluation
186
- * @returns Evaluation result with programmatic result and AI context strings
187
- */
188
- async evaluateWhen(
189
- templateContext: TemplateContext<TContext, TData>
190
- ): Promise<ConditionEvaluationResult> {
191
- if (!this.when) {
192
- return {
193
- programmaticResult: true, // No condition means always eligible
194
- aiContextStrings: [],
195
- hasProgrammaticConditions: false,
196
- };
197
- }
198
-
199
- const evaluator = createConditionEvaluator(templateContext);
200
- return await evaluator.evaluateCondition(this.when, 'AND');
201
- }
202
-
203
- /**
204
- * Evaluate the skipIf condition for this route
205
- * @param templateContext - Context for condition evaluation
206
- * @returns Evaluation result with programmatic result and AI context strings
207
- */
208
- async evaluateSkipIf(
209
- templateContext: TemplateContext<TContext, TData>
210
- ): Promise<ConditionEvaluationResult> {
211
- if (!this.skipIf) {
212
- return {
213
- programmaticResult: false, // No skipIf means never skip
214
- aiContextStrings: [],
215
- hasProgrammaticConditions: false,
216
- };
217
- }
218
-
219
- const evaluator = createConditionEvaluator(templateContext);
220
- return await evaluator.evaluateCondition(this.skipIf, 'OR');
221
- }
222
-
223
- /**
224
- * Create a guideline specific to this route
225
- */
226
- createGuideline(guideline: Guideline<TContext, TData>): this {
227
- this.guidelines.push({
228
- ...guideline,
229
- id: guideline.id || `guideline_${this.id}_${this.guidelines.length}`,
230
- enabled: guideline.enabled !== false, // Default to true
231
- });
232
- return this;
233
- }
234
-
235
- /**
236
- * Create a term for the route's domain glossary
237
- */
238
- createTerm(term: Term<TContext>): this {
239
- this.terms.push(term);
240
- return this;
241
- }
242
-
243
- /**
244
- * Register a tool for this route
245
- */
246
- createTool(tool: Tool<TContext, TData>): this {
247
- // Validate tool before adding
248
- if (!tool || !tool.id || !tool.handler) {
249
- throw new Error(`Invalid tool: must have id and handler properties`);
250
- }
251
-
252
- this.tools.push(tool);
253
- return this;
254
- }
255
-
256
- /**
257
- * Register multiple tools for this route
258
- */
259
- registerTools(tools: Tool<TContext, TData>[]): this {
260
- tools.forEach((tool) => this.createTool(tool));
261
- return this;
262
- }
263
-
264
- /**
265
- * Add a tool to this route using the ToolManager API
266
- * Creates and adds the tool to route scope in one operation
267
- */
268
- addTool(
269
- tool: Tool<TContext, TData>
270
- ): this {
271
- if (this.parentAgent && this.parentAgent.tool) {
272
- // Use ToolManager to add to route scope - no casting needed with unified interface
273
- this.parentAgent.tool.addToRoute(this, tool);
274
- } else {
275
- // Fallback: add tool directly to route tools
276
- this.createTool(tool);
277
- }
278
- return this;
279
- }
280
-
281
- /**
282
- * Get all guidelines for this route
283
- */
284
- getGuidelines(): Guideline<TContext, TData>[] {
285
- return [...this.guidelines];
286
- }
287
-
288
- /**
289
- * Evaluate and match active guidelines based on their conditions
290
- * Returns guidelines that should be active given the current context
291
- */
292
- async evaluateGuidelines(
293
- context?: TContext,
294
- session?: SessionState<TData>,
295
- history?: Event[]
296
- ): Promise<GuidelineMatch<TContext, TData>[]> {
297
- const templateContext = { context, session, history, data: session?.data };
298
- const evaluator = createConditionEvaluator(templateContext);
299
- const matches: GuidelineMatch<TContext, TData>[] = [];
300
-
301
- for (const guideline of this.guidelines) {
302
- // Skip disabled guidelines
303
- if (guideline.enabled === false) {
304
- continue;
305
- }
306
-
307
- if (guideline.condition) {
308
- const evaluation = await evaluator.evaluateCondition(guideline.condition, 'AND');
309
-
310
- // Include guideline if:
311
- // 1. No programmatic conditions (only strings) - always active
312
- // 2. Programmatic conditions evaluate to true
313
- if (!evaluation.hasProgrammaticConditions || evaluation.programmaticResult) {
314
- const rationale = evaluation.aiContextStrings.length > 0
315
- ? `Condition met: ${evaluation.aiContextStrings.join(" AND ")}`
316
- : evaluation.hasProgrammaticConditions
317
- ? "Programmatic condition evaluated to true"
318
- : "Always active (no conditions)";
319
-
320
- matches.push({
321
- guideline,
322
- rationale
323
- });
324
- }
325
- } else {
326
- // No condition means always active
327
- matches.push({
328
- guideline,
329
- rationale: "Always active (no conditions)"
330
- });
331
- }
332
- }
333
-
334
- return matches;
335
- }
336
-
337
- /**
338
- * Get all terms for this route
339
- */
340
- getTerms(): Term<TContext>[] {
341
- return [...this.terms];
342
- }
343
-
344
- /**
345
- * Get all tools for this route
346
- */
347
- getTools(): Tool<TContext, TData>[] {
348
- return [...this.tools];
349
- }
350
-
351
- /**
352
- * Get the route's knowledge base
353
- */
354
- getKnowledgeBase(): Record<string, unknown> {
355
- return { ...this.knowledgeBase };
356
- }
357
-
358
- /**
359
- * Get rules for this route
360
- */
361
- getRules(): Template<TContext, TData>[] {
362
- return [...this.rules];
363
- }
364
-
365
- /**
366
- * Get prohibitions for this route
367
- */
368
- getProhibitions(): Template<TContext, TData>[] {
369
- return [...this.prohibitions];
370
- }
371
-
372
- /**
373
- * Get optional extras schema requested during routing
374
- */
375
- getRoutingExtrasSchema(): StructuredSchema | undefined {
376
- return this.routingExtrasSchema;
377
- }
378
-
379
- /**
380
- * Get optional structured response schema for this route's message
381
- */
382
- getResponseOutputSchema(): StructuredSchema | undefined {
383
- return this.responseOutputSchema;
384
- }
385
-
386
- getSteps(): Step<TContext, TData>[] {
387
- return this.getAllSteps();
388
- }
389
-
390
- /**
391
- * Get route reference
392
- */
393
- getRef(): RouteRef {
394
- return {
395
- id: this.id,
396
- };
397
- }
398
-
399
- /**
400
- * Get all steps in this route (via traversal from initial step)
401
- */
402
- getAllSteps(): Step<TContext, TData>[] {
403
- const visited = new Set<string>();
404
- const steps: Step<TContext, TData>[] = [];
405
- const queue: Step<TContext, TData>[] = [this.initialStep];
406
-
407
- while (queue.length > 0) {
408
- const current = queue.shift()!;
409
-
410
- if (visited.has(current.id)) {
411
- continue;
412
- }
413
-
414
- visited.add(current.id);
415
- steps.push(current);
416
-
417
- // Add target steps from transitions
418
- for (const nextStep of current.getTransitions()) {
419
- if (nextStep && !visited.has(nextStep.id)) {
420
- queue.push(nextStep);
421
- }
422
- }
423
- }
424
-
425
- return steps;
426
- }
427
-
428
- /**
429
- * Get a specific step by ID
430
- * @param stepId - The step ID to find
431
- * @returns The step if found, undefined otherwise
432
- */
433
- getStep(stepId: string): Step<TContext, TData> | undefined {
434
- const steps = this.getAllSteps();
435
- return steps.find((step) => step.id === stepId);
436
- }
437
-
438
- /**
439
- * Get a description of the route structure for debugging
440
- */
441
- describe(): string {
442
- const lines: string[] = [
443
- `Route: ${this.title}`,
444
- `ID: ${this.id}`,
445
- `Description: ${this.description || "N/A"}`,
446
- `When: ${this.when ? (typeof this.when === 'string' ? this.when : Array.isArray(this.when) ? '[Array]' : '[Function]') : "None"}`,
447
- `SkipIf: ${this.skipIf ? (typeof this.skipIf === 'string' ? this.skipIf : Array.isArray(this.skipIf) ? '[Array]' : '[Function]') : "None"}`,
448
- "",
449
- "Steps:",
450
- ];
451
-
452
- const steps = this.getAllSteps();
453
- for (const step of steps) {
454
- lines.push(
455
- ` - ${step.id}${step.description ? `: ${step.description}` : ""}`
456
- );
457
-
458
- const transitions = step.getTransitions();
459
- for (const transition of transitions) {
460
- lines.push(
461
- ` -> ${transition.id}${transition.description ? `: ${transition.description}` : ""
462
- }`
463
- );
464
- }
465
- }
466
-
467
- return lines.join("\n");
468
- }
469
-
470
- /**
471
- * Handle data updates for this route, calling the onDataUpdate hook if configured
472
- * @param data - New collected data
473
- * @param previousCollected - Previously collected data
474
- * @returns Modified data after hook processing, or original data if no hook
475
- */
476
- async handleDataUpdate(
477
- data: Partial<TData>,
478
- previousCollected: Partial<TData>
479
- ): Promise<Partial<TData>> {
480
- // Call route-specific onDataUpdate hook if configured
481
- if (this.hooks?.onDataUpdate) {
482
- return await this.hooks.onDataUpdate(data, previousCollected);
483
- }
484
-
485
- // Return original data if no hook
486
- return data;
487
- }
488
-
489
- /**
490
- * Handle context updates for this route, calling the onContextUpdate hook if configured
491
- * @param newContext - New context
492
- * @param previousContext - Previous context
493
- */
494
- async handleContextUpdate(
495
- newContext: TContext,
496
- previousContext: TContext
497
- ): Promise<void> {
498
- // Call route-specific onContextUpdate hook if configured
499
- if (this.hooks?.onContextUpdate) {
500
- await this.hooks.onContextUpdate(newContext, previousContext);
501
- }
502
- }
503
-
504
- /**
505
- * Export route configuration as RouteOptions for copying/cloning
506
- * @returns RouteOptions that can be used to create a new route with identical configuration
507
- */
508
- toOptions(): RouteOptions<TContext, TData> {
509
- // Convert steps to StepOptions
510
- const steps = this.getAllSteps()
511
- .filter(step => step.id !== this.initialStep.id) // Exclude initial step
512
- .map(step => ({
513
- id: step.id,
514
- description: step.description,
515
- prompt: step.prompt,
516
- tools: step.tools,
517
- prepare: step.prepare,
518
- finalize: step.finalize,
519
- collect: step.collect,
520
- skipIf: step.skipIf,
521
- requires: step.requires,
522
- when: step.when,
523
- guidelines: step.getGuidelines(),
524
- }));
525
-
526
- return {
527
- id: this.id,
528
- title: this.title,
529
- description: this.description,
530
- identity: this.identity,
531
- personality: this.personality,
532
- when: this.when,
533
- skipIf: this.skipIf,
534
- guidelines: this.getGuidelines(),
535
- terms: this.getTerms(),
536
- tools: this.getTools(),
537
- rules: this.rules,
538
- prohibitions: this.prohibitions,
539
- routingExtrasSchema: this.routingExtrasSchema,
540
- responseOutputSchema: this.responseOutputSchema,
541
- requiredFields: this.requiredFields,
542
- optionalFields: this.optionalFields,
543
- initialData: this.initialData,
544
- steps: steps.length > 0 ? steps : undefined,
545
- initialStep: {
546
- id: this.initialStep.id,
547
- description: this.initialStep.description,
548
- prompt: this.initialStep.prompt,
549
- tools: this.initialStep.tools,
550
- prepare: this.initialStep.prepare,
551
- finalize: this.initialStep.finalize,
552
- collect: this.initialStep.collect,
553
- skipIf: this.initialStep.skipIf,
554
- requires: this.initialStep.requires,
555
- when: this.initialStep.when,
556
- guidelines: this.initialStep.getGuidelines(),
557
- },
558
- endStep: this.endStepSpec,
559
- onComplete: this.onComplete,
560
- hooks: this.hooks,
561
- knowledgeBase: this.knowledgeBase,
562
- };
563
- }
564
-
565
- /**
566
- * Check if this route is complete based on the provided data
567
- * @param data - Currently collected agent-level data
568
- * @returns true if all required fields are present, false otherwise
569
- *
570
- * Note: Routes with no requiredFields (whether they have optionalFields or not)
571
- * are never complete based on data — they can only complete via END_ROUTE.
572
- */
573
- isComplete(data: Partial<TData>): boolean {
574
- // If route has required fields, check if they're all collected
575
- if (this.requiredFields && this.requiredFields.length > 0) {
576
- return this.requiredFields.every(field => {
577
- const value = data[field];
578
- return value !== undefined && value !== null && value !== '';
579
- });
580
- }
581
-
582
- // If route has optional fields but no required fields, it's NOT complete
583
- // Optional-only routes can only complete via END_ROUTE
584
- if (this.optionalFields && this.optionalFields.length > 0) {
585
- return false;
586
- }
587
-
588
- // No required or optional fields - route doesn't complete based on data
589
- // It can only complete by reaching END_ROUTE in step flow
590
- return false;
591
- }
592
-
593
- /**
594
- * Get the list of missing required fields for this route
595
- * @param data - Currently collected agent-level data
596
- * @returns Array of missing required field keys
597
- */
598
- getMissingRequiredFields(data: Partial<TData>): (keyof TData)[] {
599
- if (!this.requiredFields || this.requiredFields.length === 0) {
600
- return [];
601
- }
602
-
603
- return this.requiredFields.filter(field => {
604
- const value = data[field];
605
- return value === undefined || value === null || value === '';
606
- });
607
- }
608
-
609
- /**
610
- * Get the completion progress for this route as a percentage
611
- * @param data - Currently collected agent-level data
612
- * @returns Completion progress as a number between 0 and 1
613
- *
614
- * Note: Must be consistent with isComplete() logic
615
- */
616
- getCompletionProgress(data: Partial<TData>): number {
617
- // If route has required fields, calculate progress
618
- if (this.requiredFields && this.requiredFields.length > 0) {
619
- const completedFields = this.requiredFields.filter(field => {
620
- const value = data[field];
621
- return value !== undefined && value !== null && value !== '';
622
- });
623
- return completedFields.length / this.requiredFields.length;
624
- }
625
-
626
- // If route has optional fields but no required fields, it's NOT complete
627
- // Optional-only routes can only complete via END_ROUTE, progress is 0
628
- if (this.optionalFields && this.optionalFields.length > 0) {
629
- return 0;
630
- }
631
-
632
- // No required or optional fields - route doesn't complete based on data
633
- // Progress is 0 (must reach END_ROUTE in step flow)
634
- return 0;
635
- }
636
-
637
- /**
638
- * Evaluate the onComplete handler and return transition config
639
- * @param session - Current session step
640
- * @param context - Agent context
641
- * @returns Transition config or undefined if no transition
642
- */
643
- async evaluateOnComplete(
644
- session: { data?: Partial<TData> },
645
- context?: TContext
646
- ): Promise<RouteTransitionConfig<TContext, TData> | undefined> {
647
- if (!this.onComplete) {
648
- return undefined;
649
- }
650
-
651
- // String form: just route ID/title
652
- if (typeof this.onComplete === "string") {
653
- return {
654
- nextStep: this.onComplete,
655
- };
656
- }
657
-
658
- // Function form: execute and normalize result
659
- if (typeof this.onComplete === "function") {
660
- const result = await this.onComplete(session, context);
661
-
662
- if (!result) {
663
- return undefined;
664
- }
665
-
666
- if (typeof result === "string") {
667
- return {
668
- nextStep: result,
669
- };
670
- }
671
-
672
- return result;
673
- }
674
-
675
- // Object form: return as-is
676
- return this.onComplete;
677
- }
678
- }