@falai/agent 1.2.8 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. package/README.md +40 -886
  2. package/dist/adapters/MemoryAdapter.js +2 -2
  3. package/dist/adapters/MemoryAdapter.js.map +1 -1
  4. package/dist/adapters/MongoAdapter.js +2 -2
  5. package/dist/adapters/MongoAdapter.js.map +1 -1
  6. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
  7. package/dist/adapters/OpenSearchAdapter.js +9 -7
  8. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  9. package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
  10. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  11. package/dist/adapters/PostgreSQLAdapter.js +25 -9
  12. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  13. package/dist/adapters/PrismaAdapter.js +5 -5
  14. package/dist/adapters/PrismaAdapter.js.map +1 -1
  15. package/dist/adapters/RedisAdapter.js +2 -2
  16. package/dist/adapters/RedisAdapter.js.map +1 -1
  17. package/dist/adapters/SQLiteAdapter.d.ts +17 -0
  18. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  19. package/dist/adapters/SQLiteAdapter.js +30 -11
  20. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  21. package/dist/cjs/adapters/MemoryAdapter.js +2 -2
  22. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  23. package/dist/cjs/adapters/MongoAdapter.js +2 -2
  24. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  25. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  26. package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
  27. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  28. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
  29. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  30. package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
  31. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  32. package/dist/cjs/adapters/PrismaAdapter.js +5 -5
  33. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  34. package/dist/cjs/adapters/RedisAdapter.js +2 -2
  35. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  36. package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
  37. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  38. package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
  39. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  40. package/dist/cjs/constants/index.d.ts +0 -9
  41. package/dist/cjs/constants/index.d.ts.map +1 -1
  42. package/dist/cjs/constants/index.js +2 -11
  43. package/dist/cjs/constants/index.js.map +1 -1
  44. package/dist/cjs/core/Agent.d.ts +119 -153
  45. package/dist/cjs/core/Agent.d.ts.map +1 -1
  46. package/dist/cjs/core/Agent.js +471 -324
  47. package/dist/cjs/core/Agent.js.map +1 -1
  48. package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
  49. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
  50. package/dist/cjs/core/AutoChainExecutor.js +297 -0
  51. package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
  52. package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
  53. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
  54. package/dist/cjs/core/BranchEvaluator.js +130 -0
  55. package/dist/cjs/core/BranchEvaluator.js.map +1 -0
  56. package/dist/cjs/core/DirectiveBus.d.ts +88 -0
  57. package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
  58. package/dist/cjs/core/DirectiveBus.js +196 -0
  59. package/dist/cjs/core/DirectiveBus.js.map +1 -0
  60. package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
  61. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
  62. package/dist/cjs/core/DirectiveChainTracker.js +121 -0
  63. package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
  64. package/dist/cjs/core/Flow.d.ts +186 -0
  65. package/dist/cjs/core/Flow.d.ts.map +1 -0
  66. package/dist/cjs/core/Flow.js +550 -0
  67. package/dist/cjs/core/Flow.js.map +1 -0
  68. package/dist/cjs/core/FlowRouter.d.ts +182 -0
  69. package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
  70. package/dist/cjs/core/{RoutingEngine.js → FlowRouter.js} +323 -306
  71. package/dist/cjs/core/FlowRouter.js.map +1 -0
  72. package/dist/cjs/core/PersistenceManager.d.ts +2 -2
  73. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  74. package/dist/cjs/core/PersistenceManager.js +7 -7
  75. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  76. package/dist/cjs/core/PromptComposer.d.ts +21 -8
  77. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  78. package/dist/cjs/core/PromptComposer.js +182 -105
  79. package/dist/cjs/core/PromptComposer.js.map +1 -1
  80. package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
  81. package/dist/cjs/core/PromptSectionCache.js +1 -1
  82. package/dist/cjs/core/ResponseEngine.d.ts +18 -8
  83. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  84. package/dist/cjs/core/ResponseEngine.js +38 -36
  85. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  86. package/dist/cjs/core/ResponseModal.d.ts +73 -56
  87. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  88. package/dist/cjs/core/ResponseModal.js +1191 -1014
  89. package/dist/cjs/core/ResponseModal.js.map +1 -1
  90. package/dist/cjs/core/ResponsePipeline.d.ts +124 -26
  91. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  92. package/dist/cjs/core/ResponsePipeline.js +509 -136
  93. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  94. package/dist/cjs/core/SignalEvaluator.d.ts +86 -0
  95. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -0
  96. package/dist/cjs/core/SignalEvaluator.js +333 -0
  97. package/dist/cjs/core/SignalEvaluator.js.map +1 -0
  98. package/dist/cjs/core/SignalProcessor.d.ts +152 -0
  99. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -0
  100. package/dist/cjs/core/SignalProcessor.js +562 -0
  101. package/dist/cjs/core/SignalProcessor.js.map +1 -0
  102. package/dist/cjs/core/Step.d.ts +43 -32
  103. package/dist/cjs/core/Step.d.ts.map +1 -1
  104. package/dist/cjs/core/Step.js +221 -126
  105. package/dist/cjs/core/Step.js.map +1 -1
  106. package/dist/cjs/core/StreamingToolExecutor.d.ts +2 -2
  107. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
  108. package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
  109. package/dist/cjs/core/ToolManager.d.ts +44 -13
  110. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  111. package/dist/cjs/core/ToolManager.js +174 -91
  112. package/dist/cjs/core/ToolManager.js.map +1 -1
  113. package/dist/cjs/core/createAgent.d.ts +35 -0
  114. package/dist/cjs/core/createAgent.d.ts.map +1 -0
  115. package/dist/cjs/core/createAgent.js +39 -0
  116. package/dist/cjs/core/createAgent.js.map +1 -0
  117. package/dist/cjs/core/flow-namespace.d.ts +49 -0
  118. package/dist/cjs/core/flow-namespace.d.ts.map +1 -0
  119. package/dist/cjs/core/flow-namespace.js +171 -0
  120. package/dist/cjs/core/flow-namespace.js.map +1 -0
  121. package/dist/cjs/index.d.ts +11 -14
  122. package/dist/cjs/index.d.ts.map +1 -1
  123. package/dist/cjs/index.js +18 -22
  124. package/dist/cjs/index.js.map +1 -1
  125. package/dist/cjs/providers/AnthropicProvider.d.ts +1 -1
  126. package/dist/cjs/providers/AnthropicProvider.js +1 -1
  127. package/dist/cjs/providers/GeminiProvider.d.ts +1 -1
  128. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  129. package/dist/cjs/providers/GeminiProvider.js +1 -1
  130. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  131. package/dist/cjs/providers/OpenAIProvider.d.ts +1 -1
  132. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  133. package/dist/cjs/providers/OpenAIProvider.js +1 -1
  134. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  135. package/dist/cjs/types/agent.d.ts +183 -54
  136. package/dist/cjs/types/agent.d.ts.map +1 -1
  137. package/dist/cjs/types/agent.js +0 -6
  138. package/dist/cjs/types/agent.js.map +1 -1
  139. package/dist/cjs/types/ai.d.ts +3 -3
  140. package/dist/cjs/types/ai.d.ts.map +1 -1
  141. package/dist/cjs/types/errors.d.ts +15 -0
  142. package/dist/cjs/types/errors.d.ts.map +1 -0
  143. package/dist/cjs/types/errors.js +22 -0
  144. package/dist/cjs/types/errors.js.map +1 -0
  145. package/dist/cjs/types/flow.d.ts +513 -0
  146. package/dist/cjs/types/flow.d.ts.map +1 -0
  147. package/dist/cjs/types/{route.js → flow.js} +2 -2
  148. package/dist/cjs/types/flow.js.map +1 -0
  149. package/dist/cjs/types/index.d.ts +7 -6
  150. package/dist/cjs/types/index.d.ts.map +1 -1
  151. package/dist/cjs/types/index.js +6 -2
  152. package/dist/cjs/types/index.js.map +1 -1
  153. package/dist/cjs/types/persistence.d.ts +11 -7
  154. package/dist/cjs/types/persistence.d.ts.map +1 -1
  155. package/dist/cjs/types/routing.d.ts +1 -1
  156. package/dist/cjs/types/routing.d.ts.map +1 -1
  157. package/dist/cjs/types/session.d.ts +24 -23
  158. package/dist/cjs/types/session.d.ts.map +1 -1
  159. package/dist/cjs/types/signals.d.ts +248 -0
  160. package/dist/cjs/types/signals.d.ts.map +1 -0
  161. package/dist/cjs/types/signals.js +11 -0
  162. package/dist/cjs/types/signals.js.map +1 -0
  163. package/dist/cjs/types/template.d.ts +2 -8
  164. package/dist/cjs/types/template.d.ts.map +1 -1
  165. package/dist/cjs/types/tool.d.ts +36 -29
  166. package/dist/cjs/types/tool.d.ts.map +1 -1
  167. package/dist/cjs/types/tool.js +1 -1
  168. package/dist/cjs/types/tool.js.map +1 -1
  169. package/dist/cjs/utils/condition.d.ts +7 -1
  170. package/dist/cjs/utils/condition.d.ts.map +1 -1
  171. package/dist/cjs/utils/condition.js.map +1 -1
  172. package/dist/cjs/utils/id.d.ts +13 -5
  173. package/dist/cjs/utils/id.d.ts.map +1 -1
  174. package/dist/cjs/utils/id.js +24 -10
  175. package/dist/cjs/utils/id.js.map +1 -1
  176. package/dist/cjs/utils/index.d.ts +2 -2
  177. package/dist/cjs/utils/index.d.ts.map +1 -1
  178. package/dist/cjs/utils/index.js +7 -3
  179. package/dist/cjs/utils/index.js.map +1 -1
  180. package/dist/cjs/utils/session.d.ts +44 -5
  181. package/dist/cjs/utils/session.d.ts.map +1 -1
  182. package/dist/cjs/utils/session.js +197 -38
  183. package/dist/cjs/utils/session.js.map +1 -1
  184. package/dist/constants/index.d.ts +0 -9
  185. package/dist/constants/index.d.ts.map +1 -1
  186. package/dist/constants/index.js +3 -9
  187. package/dist/constants/index.js.map +1 -1
  188. package/dist/core/Agent.d.ts +119 -153
  189. package/dist/core/Agent.d.ts.map +1 -1
  190. package/dist/core/Agent.js +472 -325
  191. package/dist/core/Agent.js.map +1 -1
  192. package/dist/core/AutoChainExecutor.d.ts +107 -0
  193. package/dist/core/AutoChainExecutor.d.ts.map +1 -0
  194. package/dist/core/AutoChainExecutor.js +293 -0
  195. package/dist/core/AutoChainExecutor.js.map +1 -0
  196. package/dist/core/BranchEvaluator.d.ts +54 -0
  197. package/dist/core/BranchEvaluator.d.ts.map +1 -0
  198. package/dist/core/BranchEvaluator.js +126 -0
  199. package/dist/core/BranchEvaluator.js.map +1 -0
  200. package/dist/core/DirectiveBus.d.ts +88 -0
  201. package/dist/core/DirectiveBus.d.ts.map +1 -0
  202. package/dist/core/DirectiveBus.js +192 -0
  203. package/dist/core/DirectiveBus.js.map +1 -0
  204. package/dist/core/DirectiveChainTracker.d.ts +49 -0
  205. package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
  206. package/dist/core/DirectiveChainTracker.js +117 -0
  207. package/dist/core/DirectiveChainTracker.js.map +1 -0
  208. package/dist/core/Flow.d.ts +186 -0
  209. package/dist/core/Flow.d.ts.map +1 -0
  210. package/dist/core/Flow.js +546 -0
  211. package/dist/core/Flow.js.map +1 -0
  212. package/dist/core/FlowRouter.d.ts +182 -0
  213. package/dist/core/FlowRouter.d.ts.map +1 -0
  214. package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
  215. package/dist/core/FlowRouter.js.map +1 -0
  216. package/dist/core/PersistenceManager.d.ts +2 -2
  217. package/dist/core/PersistenceManager.d.ts.map +1 -1
  218. package/dist/core/PersistenceManager.js +7 -7
  219. package/dist/core/PersistenceManager.js.map +1 -1
  220. package/dist/core/PromptComposer.d.ts +21 -8
  221. package/dist/core/PromptComposer.d.ts.map +1 -1
  222. package/dist/core/PromptComposer.js +183 -106
  223. package/dist/core/PromptComposer.js.map +1 -1
  224. package/dist/core/PromptSectionCache.d.ts +1 -1
  225. package/dist/core/PromptSectionCache.js +1 -1
  226. package/dist/core/ResponseEngine.d.ts +18 -8
  227. package/dist/core/ResponseEngine.d.ts.map +1 -1
  228. package/dist/core/ResponseEngine.js +38 -36
  229. package/dist/core/ResponseEngine.js.map +1 -1
  230. package/dist/core/ResponseModal.d.ts +73 -56
  231. package/dist/core/ResponseModal.d.ts.map +1 -1
  232. package/dist/core/ResponseModal.js +1193 -1016
  233. package/dist/core/ResponseModal.js.map +1 -1
  234. package/dist/core/ResponsePipeline.d.ts +124 -26
  235. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  236. package/dist/core/ResponsePipeline.js +509 -137
  237. package/dist/core/ResponsePipeline.js.map +1 -1
  238. package/dist/core/SignalEvaluator.d.ts +86 -0
  239. package/dist/core/SignalEvaluator.d.ts.map +1 -0
  240. package/dist/core/SignalEvaluator.js +326 -0
  241. package/dist/core/SignalEvaluator.js.map +1 -0
  242. package/dist/core/SignalProcessor.d.ts +152 -0
  243. package/dist/core/SignalProcessor.d.ts.map +1 -0
  244. package/dist/core/SignalProcessor.js +555 -0
  245. package/dist/core/SignalProcessor.js.map +1 -0
  246. package/dist/core/Step.d.ts +43 -32
  247. package/dist/core/Step.d.ts.map +1 -1
  248. package/dist/core/Step.js +220 -126
  249. package/dist/core/Step.js.map +1 -1
  250. package/dist/core/StreamingToolExecutor.d.ts +2 -2
  251. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  252. package/dist/core/StreamingToolExecutor.js.map +1 -1
  253. package/dist/core/ToolManager.d.ts +44 -13
  254. package/dist/core/ToolManager.d.ts.map +1 -1
  255. package/dist/core/ToolManager.js +174 -91
  256. package/dist/core/ToolManager.js.map +1 -1
  257. package/dist/core/createAgent.d.ts +35 -0
  258. package/dist/core/createAgent.d.ts.map +1 -0
  259. package/dist/core/createAgent.js +36 -0
  260. package/dist/core/createAgent.js.map +1 -0
  261. package/dist/core/flow-namespace.d.ts +49 -0
  262. package/dist/core/flow-namespace.d.ts.map +1 -0
  263. package/dist/core/flow-namespace.js +168 -0
  264. package/dist/core/flow-namespace.js.map +1 -0
  265. package/dist/index.d.ts +11 -14
  266. package/dist/index.d.ts.map +1 -1
  267. package/dist/index.js +9 -12
  268. package/dist/index.js.map +1 -1
  269. package/dist/providers/AnthropicProvider.d.ts +1 -1
  270. package/dist/providers/AnthropicProvider.js +1 -1
  271. package/dist/providers/GeminiProvider.d.ts +1 -1
  272. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  273. package/dist/providers/GeminiProvider.js +1 -1
  274. package/dist/providers/GeminiProvider.js.map +1 -1
  275. package/dist/providers/OpenAIProvider.d.ts +1 -1
  276. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  277. package/dist/providers/OpenAIProvider.js +1 -1
  278. package/dist/providers/OpenAIProvider.js.map +1 -1
  279. package/dist/types/agent.d.ts +183 -54
  280. package/dist/types/agent.d.ts.map +1 -1
  281. package/dist/types/agent.js +0 -6
  282. package/dist/types/agent.js.map +1 -1
  283. package/dist/types/ai.d.ts +3 -3
  284. package/dist/types/ai.d.ts.map +1 -1
  285. package/dist/types/errors.d.ts +15 -0
  286. package/dist/types/errors.d.ts.map +1 -0
  287. package/dist/types/errors.js +18 -0
  288. package/dist/types/errors.js.map +1 -0
  289. package/dist/types/flow.d.ts +513 -0
  290. package/dist/types/flow.d.ts.map +1 -0
  291. package/dist/types/flow.js +5 -0
  292. package/dist/types/flow.js.map +1 -0
  293. package/dist/types/index.d.ts +7 -6
  294. package/dist/types/index.d.ts.map +1 -1
  295. package/dist/types/index.js +4 -1
  296. package/dist/types/index.js.map +1 -1
  297. package/dist/types/persistence.d.ts +11 -7
  298. package/dist/types/persistence.d.ts.map +1 -1
  299. package/dist/types/routing.d.ts +1 -1
  300. package/dist/types/routing.d.ts.map +1 -1
  301. package/dist/types/session.d.ts +24 -23
  302. package/dist/types/session.d.ts.map +1 -1
  303. package/dist/types/signals.d.ts +248 -0
  304. package/dist/types/signals.d.ts.map +1 -0
  305. package/dist/types/signals.js +10 -0
  306. package/dist/types/signals.js.map +1 -0
  307. package/dist/types/template.d.ts +2 -8
  308. package/dist/types/template.d.ts.map +1 -1
  309. package/dist/types/tool.d.ts +36 -29
  310. package/dist/types/tool.d.ts.map +1 -1
  311. package/dist/types/tool.js +1 -1
  312. package/dist/types/tool.js.map +1 -1
  313. package/dist/utils/condition.d.ts +7 -1
  314. package/dist/utils/condition.d.ts.map +1 -1
  315. package/dist/utils/condition.js.map +1 -1
  316. package/dist/utils/id.d.ts +13 -5
  317. package/dist/utils/id.d.ts.map +1 -1
  318. package/dist/utils/id.js +22 -9
  319. package/dist/utils/id.js.map +1 -1
  320. package/dist/utils/index.d.ts +2 -2
  321. package/dist/utils/index.d.ts.map +1 -1
  322. package/dist/utils/index.js +2 -2
  323. package/dist/utils/index.js.map +1 -1
  324. package/dist/utils/session.d.ts +44 -5
  325. package/dist/utils/session.d.ts.map +1 -1
  326. package/dist/utils/session.js +193 -37
  327. package/dist/utils/session.js.map +1 -1
  328. package/docs/README.md +22 -200
  329. package/docs/concepts/architecture.md +281 -0
  330. package/docs/concepts/directives.md +400 -0
  331. package/docs/concepts/pipeline.md +399 -0
  332. package/docs/guides/branching.md +263 -0
  333. package/docs/guides/compaction.md +163 -0
  334. package/docs/guides/conditions.md +167 -0
  335. package/docs/guides/error-handling.md +176 -0
  336. package/docs/guides/flow-control.md +409 -0
  337. package/docs/guides/instructions.md +210 -0
  338. package/docs/guides/persistence.md +182 -0
  339. package/docs/guides/streaming.md +137 -0
  340. package/docs/migration/README.md +14 -0
  341. package/docs/migration/route-to-flow.md +561 -0
  342. package/docs/migration/v1-to-v2.md +909 -0
  343. package/docs/reference/adapters.md +481 -0
  344. package/docs/reference/branches.md +241 -0
  345. package/docs/reference/create-agent.md +186 -0
  346. package/docs/reference/directive.md +243 -0
  347. package/docs/reference/errors.md +122 -0
  348. package/docs/reference/flow.md +238 -0
  349. package/docs/reference/instruction.md +177 -0
  350. package/docs/reference/pre-directive.md +131 -0
  351. package/docs/reference/providers.md +227 -0
  352. package/docs/reference/signals.md +356 -0
  353. package/docs/reference/step.md +339 -0
  354. package/docs/reference/tool.md +269 -0
  355. package/docs/start/01-install.md +81 -0
  356. package/docs/start/02-first-agent.md +196 -0
  357. package/docs/start/03-collect-data.md +222 -0
  358. package/docs/start/04-add-tools.md +276 -0
  359. package/docs/start/05-go-to-production.md +216 -0
  360. package/examples/01-quickstart.ts +20 -0
  361. package/examples/02-data-extraction.ts +90 -0
  362. package/examples/03-tools.ts +136 -0
  363. package/examples/04-instructions.ts +100 -0
  364. package/examples/05-branching.ts +140 -0
  365. package/examples/06-flow-control.ts +103 -0
  366. package/examples/07-streaming.ts +69 -0
  367. package/examples/08-persistence.ts +98 -0
  368. package/examples/09-signals.ts +144 -0
  369. package/examples/tsconfig.json +30 -0
  370. package/package.json +2 -1
  371. package/src/adapters/MemoryAdapter.ts +3 -3
  372. package/src/adapters/MongoAdapter.ts +3 -3
  373. package/src/adapters/OpenSearchAdapter.ts +10 -8
  374. package/src/adapters/PostgreSQLAdapter.ts +26 -10
  375. package/src/adapters/PrismaAdapter.ts +6 -6
  376. package/src/adapters/RedisAdapter.ts +3 -3
  377. package/src/adapters/SQLiteAdapter.ts +31 -12
  378. package/src/constants/index.ts +2 -10
  379. package/src/core/Agent.ts +585 -374
  380. package/src/core/AutoChainExecutor.ts +440 -0
  381. package/src/core/BranchEvaluator.ts +167 -0
  382. package/src/core/DirectiveBus.ts +248 -0
  383. package/src/core/DirectiveChainTracker.ts +144 -0
  384. package/src/core/Flow.ts +666 -0
  385. package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
  386. package/src/core/PersistenceManager.ts +8 -8
  387. package/src/core/PromptComposer.ts +209 -140
  388. package/src/core/PromptSectionCache.ts +1 -1
  389. package/src/core/ResponseEngine.ts +61 -46
  390. package/src/core/ResponseModal.ts +1453 -1240
  391. package/src/core/ResponsePipeline.ts +655 -175
  392. package/src/core/SignalEvaluator.ts +420 -0
  393. package/src/core/SignalProcessor.ts +723 -0
  394. package/src/core/Step.ts +279 -176
  395. package/src/core/StreamingToolExecutor.ts +4 -4
  396. package/src/core/ToolManager.ts +200 -97
  397. package/src/core/createAgent.ts +40 -0
  398. package/src/core/flow-namespace.ts +219 -0
  399. package/src/index.ts +42 -36
  400. package/src/providers/AnthropicProvider.ts +2 -2
  401. package/src/providers/GeminiProvider.ts +2 -2
  402. package/src/providers/OpenAIProvider.ts +2 -2
  403. package/src/types/agent.ts +182 -53
  404. package/src/types/ai.ts +3 -3
  405. package/src/types/errors.ts +18 -0
  406. package/src/types/flow.ts +590 -0
  407. package/src/types/index.ts +43 -16
  408. package/src/types/persistence.ts +12 -8
  409. package/src/types/routing.ts +1 -1
  410. package/src/types/session.ts +26 -23
  411. package/src/types/signals.ts +321 -0
  412. package/src/types/template.ts +3 -11
  413. package/src/types/tool.ts +50 -42
  414. package/src/utils/condition.ts +13 -4
  415. package/src/utils/id.ts +27 -9
  416. package/src/utils/index.ts +6 -2
  417. package/src/utils/session.ts +238 -42
  418. package/dist/cjs/core/BatchExecutor.d.ts +0 -359
  419. package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
  420. package/dist/cjs/core/BatchExecutor.js +0 -861
  421. package/dist/cjs/core/BatchExecutor.js.map +0 -1
  422. package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
  423. package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
  424. package/dist/cjs/core/BatchPromptBuilder.js +0 -223
  425. package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
  426. package/dist/cjs/core/Route.d.ts +0 -180
  427. package/dist/cjs/core/Route.d.ts.map +0 -1
  428. package/dist/cjs/core/Route.js +0 -542
  429. package/dist/cjs/core/Route.js.map +0 -1
  430. package/dist/cjs/core/RoutingEngine.d.ts +0 -185
  431. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  432. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  433. package/dist/cjs/types/route.d.ts +0 -336
  434. package/dist/cjs/types/route.d.ts.map +0 -1
  435. package/dist/cjs/types/route.js.map +0 -1
  436. package/dist/core/BatchExecutor.d.ts +0 -359
  437. package/dist/core/BatchExecutor.d.ts.map +0 -1
  438. package/dist/core/BatchExecutor.js +0 -856
  439. package/dist/core/BatchExecutor.js.map +0 -1
  440. package/dist/core/BatchPromptBuilder.d.ts +0 -89
  441. package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
  442. package/dist/core/BatchPromptBuilder.js +0 -219
  443. package/dist/core/BatchPromptBuilder.js.map +0 -1
  444. package/dist/core/Route.d.ts +0 -180
  445. package/dist/core/Route.d.ts.map +0 -1
  446. package/dist/core/Route.js +0 -538
  447. package/dist/core/Route.js.map +0 -1
  448. package/dist/core/RoutingEngine.d.ts +0 -185
  449. package/dist/core/RoutingEngine.d.ts.map +0 -1
  450. package/dist/core/RoutingEngine.js.map +0 -1
  451. package/dist/types/route.d.ts +0 -336
  452. package/dist/types/route.d.ts.map +0 -1
  453. package/dist/types/route.js +0 -5
  454. package/dist/types/route.js.map +0 -1
  455. package/docs/CONTRIBUTING.md +0 -521
  456. package/docs/api/README.md +0 -3299
  457. package/docs/api/overview.md +0 -1410
  458. package/docs/architecture/data-extraction-flow.md +0 -360
  459. package/docs/architecture/multi-step-execution.md +0 -277
  460. package/docs/core/agent/README.md +0 -938
  461. package/docs/core/agent/context-management.md +0 -796
  462. package/docs/core/agent/rules-and-prohibitions.md +0 -113
  463. package/docs/core/agent/session-management.md +0 -693
  464. package/docs/core/ai-integration/prompt-composition.md +0 -355
  465. package/docs/core/ai-integration/providers.md +0 -515
  466. package/docs/core/ai-integration/response-processing.md +0 -433
  467. package/docs/core/conversation-flows/data-collection.md +0 -772
  468. package/docs/core/conversation-flows/route-dsl.md +0 -509
  469. package/docs/core/conversation-flows/routes.md +0 -249
  470. package/docs/core/conversation-flows/step-transitions.md +0 -731
  471. package/docs/core/conversation-flows/steps.md +0 -268
  472. package/docs/core/error-handling.md +0 -830
  473. package/docs/core/persistence/adapters.md +0 -255
  474. package/docs/core/persistence/session-storage.md +0 -656
  475. package/docs/core/routing/intelligent-routing.md +0 -470
  476. package/docs/core/tools/enhanced-tool.md +0 -186
  477. package/docs/core/tools/streaming-execution.md +0 -161
  478. package/docs/core/tools/tool-definition.md +0 -970
  479. package/docs/core/tools/tool-scoping.md +0 -819
  480. package/docs/guides/advanced-patterns/publishing.md +0 -186
  481. package/docs/guides/context-compaction.md +0 -96
  482. package/docs/guides/error-handling-patterns.md +0 -578
  483. package/docs/guides/getting-started/README.md +0 -795
  484. package/docs/guides/migration/README.md +0 -101
  485. package/docs/guides/migration/flexible-routing-conditions.md +0 -375
  486. package/docs/guides/migration/multi-step-execution.md +0 -393
  487. package/docs/guides/migration/response-modal-refactor.md +0 -518
  488. package/docs/guides/prompt-optimization.md +0 -164
  489. package/examples/advanced-patterns/context-compaction.ts +0 -223
  490. package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
  491. package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
  492. package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
  493. package/examples/advanced-patterns/streaming-responses.ts +0 -656
  494. package/examples/ai-providers/anthropic-integration.ts +0 -388
  495. package/examples/ai-providers/openai-integration.ts +0 -228
  496. package/examples/condition-patterns/function-only-conditions.ts +0 -365
  497. package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
  498. package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
  499. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  500. package/examples/condition-patterns/string-only-conditions.ts +0 -296
  501. package/examples/conversation-flows/completion-transitions.ts +0 -318
  502. package/examples/core-concepts/basic-agent.ts +0 -503
  503. package/examples/core-concepts/modern-streaming-api.ts +0 -309
  504. package/examples/core-concepts/schema-driven-extraction.ts +0 -332
  505. package/examples/core-concepts/session-management.ts +0 -494
  506. package/examples/integrations/database-integration.ts +0 -631
  507. package/examples/integrations/healthcare-integration.ts +0 -595
  508. package/examples/integrations/search-integration.ts +0 -530
  509. package/examples/integrations/server-session-management.ts +0 -307
  510. package/examples/persistence/custom-adapter.ts +0 -526
  511. package/examples/persistence/database-persistence.ts +0 -583
  512. package/examples/persistence/memory-sessions.ts +0 -495
  513. package/examples/persistence/prisma-schema.example.prisma +0 -74
  514. package/examples/persistence/redis-persistence.ts +0 -488
  515. package/examples/tools/basic-tools.ts +0 -765
  516. package/examples/tools/data-enrichment-tools.ts +0 -593
  517. package/examples/tools/enhanced-tool-metadata.ts +0 -268
  518. package/examples/tools/streaming-tool-execution.ts +0 -283
  519. package/src/core/BatchExecutor.ts +0 -1187
  520. package/src/core/BatchPromptBuilder.ts +0 -299
  521. package/src/core/Route.ts +0 -678
  522. package/src/types/route.ts +0 -392
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
- }