@falai/agent 3.4.4 → 4.0.0-alpha.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 (847) hide show
  1. package/README.md +41 -34
  2. package/dist/cjs/core/Agent.d.ts +22 -378
  3. package/dist/cjs/core/Agent.d.ts.map +1 -1
  4. package/dist/cjs/core/Agent.js +104 -1178
  5. package/dist/cjs/core/Agent.js.map +1 -1
  6. package/dist/cjs/core/CompactionEngine.d.ts.map +1 -1
  7. package/dist/cjs/core/CompactionEngine.js +5 -3
  8. package/dist/cjs/core/CompactionEngine.js.map +1 -1
  9. package/dist/cjs/core/FlowSpec.d.ts +136 -0
  10. package/dist/cjs/core/FlowSpec.d.ts.map +1 -0
  11. package/dist/cjs/core/FlowSpec.js +522 -0
  12. package/dist/cjs/core/FlowSpec.js.map +1 -0
  13. package/dist/cjs/core/Migrate.d.ts +38 -0
  14. package/dist/cjs/core/Migrate.d.ts.map +1 -0
  15. package/dist/cjs/core/Migrate.js +270 -0
  16. package/dist/cjs/core/Migrate.js.map +1 -0
  17. package/dist/cjs/core/Prompt.d.ts +54 -0
  18. package/dist/cjs/core/Prompt.d.ts.map +1 -0
  19. package/dist/cjs/core/Prompt.js +143 -0
  20. package/dist/cjs/core/Prompt.js.map +1 -0
  21. package/dist/cjs/core/Runner.d.ts +160 -0
  22. package/dist/cjs/core/Runner.d.ts.map +1 -0
  23. package/dist/cjs/core/Runner.js +1131 -0
  24. package/dist/cjs/core/Runner.js.map +1 -0
  25. package/dist/cjs/core/Speak.d.ts +37 -0
  26. package/dist/cjs/core/Speak.d.ts.map +1 -0
  27. package/dist/cjs/core/Speak.js +364 -0
  28. package/dist/cjs/core/Speak.js.map +1 -0
  29. package/dist/cjs/core/Understand.d.ts +28 -0
  30. package/dist/cjs/core/Understand.d.ts.map +1 -0
  31. package/dist/cjs/core/Understand.js +353 -0
  32. package/dist/cjs/core/Understand.js.map +1 -0
  33. package/dist/cjs/core/contracts.d.ts +122 -0
  34. package/dist/cjs/core/contracts.d.ts.map +1 -0
  35. package/dist/cjs/core/contracts.js +11 -0
  36. package/dist/cjs/core/contracts.js.map +1 -0
  37. package/dist/cjs/core/falai.d.ts +57 -0
  38. package/dist/cjs/core/falai.d.ts.map +1 -0
  39. package/dist/cjs/core/falai.js +43 -0
  40. package/dist/cjs/core/falai.js.map +1 -0
  41. package/dist/cjs/core/predicate.d.ts +9 -0
  42. package/dist/cjs/core/predicate.d.ts.map +1 -0
  43. package/dist/cjs/core/predicate.js +58 -0
  44. package/dist/cjs/core/predicate.js.map +1 -0
  45. package/dist/cjs/index.d.ts +26 -31
  46. package/dist/cjs/index.d.ts.map +1 -1
  47. package/dist/cjs/index.js +46 -68
  48. package/dist/cjs/index.js.map +1 -1
  49. package/dist/cjs/persistence/MemoryStore.d.ts +15 -0
  50. package/dist/cjs/persistence/MemoryStore.d.ts.map +1 -0
  51. package/dist/cjs/persistence/MemoryStore.js +39 -0
  52. package/dist/cjs/persistence/MemoryStore.js.map +1 -0
  53. package/dist/cjs/persistence/MongoStore.d.ts +42 -0
  54. package/dist/cjs/persistence/MongoStore.d.ts.map +1 -0
  55. package/dist/cjs/persistence/MongoStore.js +60 -0
  56. package/dist/cjs/persistence/MongoStore.js.map +1 -0
  57. package/dist/cjs/persistence/OpenSearchStore.d.ts +86 -0
  58. package/dist/cjs/persistence/OpenSearchStore.d.ts.map +1 -0
  59. package/dist/cjs/persistence/OpenSearchStore.js +120 -0
  60. package/dist/cjs/persistence/OpenSearchStore.js.map +1 -0
  61. package/dist/cjs/persistence/PostgresStore.d.ts +41 -0
  62. package/dist/cjs/persistence/PostgresStore.d.ts.map +1 -0
  63. package/dist/cjs/persistence/PostgresStore.js +58 -0
  64. package/dist/cjs/persistence/PostgresStore.js.map +1 -0
  65. package/dist/cjs/persistence/PrismaStore.d.ts +65 -0
  66. package/dist/cjs/persistence/PrismaStore.d.ts.map +1 -0
  67. package/dist/cjs/persistence/PrismaStore.js +95 -0
  68. package/dist/cjs/persistence/PrismaStore.js.map +1 -0
  69. package/dist/cjs/persistence/RedisStore.d.ts +34 -0
  70. package/dist/cjs/persistence/RedisStore.d.ts.map +1 -0
  71. package/dist/cjs/persistence/RedisStore.js +61 -0
  72. package/dist/cjs/persistence/RedisStore.js.map +1 -0
  73. package/dist/cjs/persistence/SQLiteStore.d.ts +45 -0
  74. package/dist/cjs/persistence/SQLiteStore.d.ts.map +1 -0
  75. package/dist/cjs/persistence/SQLiteStore.js +74 -0
  76. package/dist/cjs/persistence/SQLiteStore.js.map +1 -0
  77. package/dist/cjs/persistence/sessionRow.d.ts +14 -0
  78. package/dist/cjs/persistence/sessionRow.d.ts.map +1 -0
  79. package/dist/cjs/persistence/sessionRow.js +50 -0
  80. package/dist/cjs/persistence/sessionRow.js.map +1 -0
  81. package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
  82. package/dist/cjs/providers/DeepSeekProvider.js +8 -3
  83. package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
  84. package/dist/cjs/providers/GeminiProvider.d.ts +4 -3
  85. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  86. package/dist/cjs/providers/GeminiProvider.js +4 -3
  87. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  88. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +4 -0
  89. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  90. package/dist/cjs/providers/OpenAICompatibleProvider.js +2 -0
  91. package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -1
  92. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  93. package/dist/cjs/providers/OpenRouterProvider.js +2 -4
  94. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  95. package/dist/cjs/providers/ProviderAdapter.d.ts +1 -1
  96. package/dist/cjs/providers/ProviderAdapter.d.ts.map +1 -1
  97. package/dist/cjs/providers/ProviderAdapter.js +33 -10
  98. package/dist/cjs/providers/ProviderAdapter.js.map +1 -1
  99. package/dist/cjs/types/agent.d.ts +153 -383
  100. package/dist/cjs/types/agent.d.ts.map +1 -1
  101. package/dist/cjs/types/agent.js +1 -1
  102. package/dist/cjs/types/ai.d.ts +32 -1
  103. package/dist/cjs/types/ai.d.ts.map +1 -1
  104. package/dist/cjs/types/compaction.d.ts +3 -1
  105. package/dist/cjs/types/compaction.d.ts.map +1 -1
  106. package/dist/cjs/types/errors.d.ts +9 -12
  107. package/dist/cjs/types/errors.d.ts.map +1 -1
  108. package/dist/cjs/types/errors.js +14 -17
  109. package/dist/cjs/types/errors.js.map +1 -1
  110. package/dist/cjs/types/flow.d.ts +265 -513
  111. package/dist/cjs/types/flow.d.ts.map +1 -1
  112. package/dist/cjs/types/flow.js +7 -1
  113. package/dist/cjs/types/flow.js.map +1 -1
  114. package/dist/cjs/types/history.d.ts +7 -18
  115. package/dist/cjs/types/history.d.ts.map +1 -1
  116. package/dist/cjs/types/history.js.map +1 -1
  117. package/dist/cjs/types/index.d.ts +9 -15
  118. package/dist/cjs/types/index.d.ts.map +1 -1
  119. package/dist/cjs/types/index.js +4 -14
  120. package/dist/cjs/types/index.js.map +1 -1
  121. package/dist/cjs/types/session.d.ts +94 -64
  122. package/dist/cjs/types/session.d.ts.map +1 -1
  123. package/dist/cjs/types/session.js +5 -1
  124. package/dist/cjs/types/session.js.map +1 -1
  125. package/dist/cjs/types/tool.d.ts +37 -207
  126. package/dist/cjs/types/tool.d.ts.map +1 -1
  127. package/dist/cjs/types/tool.js +5 -14
  128. package/dist/cjs/types/tool.js.map +1 -1
  129. package/dist/cjs/utils/clock.d.ts +28 -0
  130. package/dist/cjs/utils/clock.d.ts.map +1 -0
  131. package/dist/cjs/utils/clock.js +64 -0
  132. package/dist/cjs/utils/clock.js.map +1 -0
  133. package/dist/cjs/utils/duration.d.ts +11 -0
  134. package/dist/cjs/utils/duration.d.ts.map +1 -0
  135. package/dist/cjs/utils/duration.js +31 -0
  136. package/dist/cjs/utils/duration.js.map +1 -0
  137. package/dist/cjs/utils/history.d.ts +4 -1
  138. package/dist/cjs/utils/history.d.ts.map +1 -1
  139. package/dist/cjs/utils/history.js +2 -2
  140. package/dist/cjs/utils/history.js.map +1 -1
  141. package/dist/cjs/utils/index.d.ts +4 -10
  142. package/dist/cjs/utils/index.d.ts.map +1 -1
  143. package/dist/cjs/utils/index.js +14 -61
  144. package/dist/cjs/utils/index.js.map +1 -1
  145. package/dist/cjs/utils/json.d.ts +2 -0
  146. package/dist/cjs/utils/json.d.ts.map +1 -1
  147. package/dist/cjs/utils/json.js +5 -0
  148. package/dist/cjs/utils/json.js.map +1 -1
  149. package/dist/cjs/utils/outcomes.d.ts +48 -0
  150. package/dist/cjs/utils/outcomes.d.ts.map +1 -0
  151. package/dist/cjs/utils/outcomes.js +51 -0
  152. package/dist/cjs/utils/outcomes.js.map +1 -0
  153. package/dist/cjs/utils/schema.d.ts +50 -0
  154. package/dist/cjs/utils/schema.d.ts.map +1 -0
  155. package/dist/cjs/utils/schema.js +138 -0
  156. package/dist/cjs/utils/schema.js.map +1 -0
  157. package/dist/cjs/utils/streamingMessage.d.ts +3 -2
  158. package/dist/cjs/utils/streamingMessage.d.ts.map +1 -1
  159. package/dist/cjs/utils/streamingMessage.js +38 -4
  160. package/dist/cjs/utils/streamingMessage.js.map +1 -1
  161. package/dist/cjs/utils/template.d.ts +13 -149
  162. package/dist/cjs/utils/template.d.ts.map +1 -1
  163. package/dist/cjs/utils/template.js +31 -363
  164. package/dist/cjs/utils/template.js.map +1 -1
  165. package/dist/cjs/utils/usage.d.ts +19 -0
  166. package/dist/cjs/utils/usage.d.ts.map +1 -0
  167. package/dist/cjs/utils/usage.js +35 -0
  168. package/dist/cjs/utils/usage.js.map +1 -0
  169. package/dist/core/Agent.d.ts +22 -378
  170. package/dist/core/Agent.d.ts.map +1 -1
  171. package/dist/core/Agent.js +107 -1181
  172. package/dist/core/Agent.js.map +1 -1
  173. package/dist/core/CompactionEngine.d.ts.map +1 -1
  174. package/dist/core/CompactionEngine.js +5 -3
  175. package/dist/core/CompactionEngine.js.map +1 -1
  176. package/dist/core/FlowSpec.d.ts +136 -0
  177. package/dist/core/FlowSpec.d.ts.map +1 -0
  178. package/dist/core/FlowSpec.js +516 -0
  179. package/dist/core/FlowSpec.js.map +1 -0
  180. package/dist/core/Migrate.d.ts +38 -0
  181. package/dist/core/Migrate.d.ts.map +1 -0
  182. package/dist/core/Migrate.js +264 -0
  183. package/dist/core/Migrate.js.map +1 -0
  184. package/dist/core/Prompt.d.ts +54 -0
  185. package/dist/core/Prompt.d.ts.map +1 -0
  186. package/dist/core/Prompt.js +133 -0
  187. package/dist/core/Prompt.js.map +1 -0
  188. package/dist/core/Runner.d.ts +160 -0
  189. package/dist/core/Runner.d.ts.map +1 -0
  190. package/dist/core/Runner.js +1127 -0
  191. package/dist/core/Runner.js.map +1 -0
  192. package/dist/core/Speak.d.ts +37 -0
  193. package/dist/core/Speak.d.ts.map +1 -0
  194. package/dist/core/Speak.js +360 -0
  195. package/dist/core/Speak.js.map +1 -0
  196. package/dist/core/Understand.d.ts +28 -0
  197. package/dist/core/Understand.d.ts.map +1 -0
  198. package/dist/core/Understand.js +349 -0
  199. package/dist/core/Understand.js.map +1 -0
  200. package/dist/core/contracts.d.ts +122 -0
  201. package/dist/core/contracts.d.ts.map +1 -0
  202. package/dist/core/contracts.js +10 -0
  203. package/dist/core/contracts.js.map +1 -0
  204. package/dist/core/falai.d.ts +57 -0
  205. package/dist/core/falai.d.ts.map +1 -0
  206. package/dist/core/falai.js +40 -0
  207. package/dist/core/falai.js.map +1 -0
  208. package/dist/core/predicate.d.ts +9 -0
  209. package/dist/core/predicate.d.ts.map +1 -0
  210. package/dist/core/predicate.js +54 -0
  211. package/dist/core/predicate.js.map +1 -0
  212. package/dist/index.d.ts +26 -31
  213. package/dist/index.d.ts.map +1 -1
  214. package/dist/index.js +19 -24
  215. package/dist/index.js.map +1 -1
  216. package/dist/persistence/MemoryStore.d.ts +15 -0
  217. package/dist/persistence/MemoryStore.d.ts.map +1 -0
  218. package/dist/persistence/MemoryStore.js +35 -0
  219. package/dist/persistence/MemoryStore.js.map +1 -0
  220. package/dist/persistence/MongoStore.d.ts +42 -0
  221. package/dist/persistence/MongoStore.d.ts.map +1 -0
  222. package/dist/persistence/MongoStore.js +56 -0
  223. package/dist/persistence/MongoStore.js.map +1 -0
  224. package/dist/persistence/OpenSearchStore.d.ts +86 -0
  225. package/dist/persistence/OpenSearchStore.d.ts.map +1 -0
  226. package/dist/persistence/OpenSearchStore.js +116 -0
  227. package/dist/persistence/OpenSearchStore.js.map +1 -0
  228. package/dist/persistence/PostgresStore.d.ts +41 -0
  229. package/dist/persistence/PostgresStore.d.ts.map +1 -0
  230. package/dist/persistence/PostgresStore.js +54 -0
  231. package/dist/persistence/PostgresStore.js.map +1 -0
  232. package/dist/persistence/PrismaStore.d.ts +65 -0
  233. package/dist/persistence/PrismaStore.d.ts.map +1 -0
  234. package/dist/persistence/PrismaStore.js +91 -0
  235. package/dist/persistence/PrismaStore.js.map +1 -0
  236. package/dist/persistence/RedisStore.d.ts +34 -0
  237. package/dist/persistence/RedisStore.d.ts.map +1 -0
  238. package/dist/persistence/RedisStore.js +57 -0
  239. package/dist/persistence/RedisStore.js.map +1 -0
  240. package/dist/persistence/SQLiteStore.d.ts +45 -0
  241. package/dist/persistence/SQLiteStore.d.ts.map +1 -0
  242. package/dist/persistence/SQLiteStore.js +70 -0
  243. package/dist/persistence/SQLiteStore.js.map +1 -0
  244. package/dist/persistence/sessionRow.d.ts +14 -0
  245. package/dist/persistence/sessionRow.d.ts.map +1 -0
  246. package/dist/persistence/sessionRow.js +45 -0
  247. package/dist/persistence/sessionRow.js.map +1 -0
  248. package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
  249. package/dist/providers/DeepSeekProvider.js +8 -3
  250. package/dist/providers/DeepSeekProvider.js.map +1 -1
  251. package/dist/providers/GeminiProvider.d.ts +4 -3
  252. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  253. package/dist/providers/GeminiProvider.js +4 -3
  254. package/dist/providers/GeminiProvider.js.map +1 -1
  255. package/dist/providers/OpenAICompatibleProvider.d.ts +4 -0
  256. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  257. package/dist/providers/OpenAICompatibleProvider.js +2 -0
  258. package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
  259. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  260. package/dist/providers/OpenRouterProvider.js +2 -4
  261. package/dist/providers/OpenRouterProvider.js.map +1 -1
  262. package/dist/providers/ProviderAdapter.d.ts +1 -1
  263. package/dist/providers/ProviderAdapter.d.ts.map +1 -1
  264. package/dist/providers/ProviderAdapter.js +34 -11
  265. package/dist/providers/ProviderAdapter.js.map +1 -1
  266. package/dist/types/agent.d.ts +153 -383
  267. package/dist/types/agent.d.ts.map +1 -1
  268. package/dist/types/agent.js +1 -1
  269. package/dist/types/ai.d.ts +32 -1
  270. package/dist/types/ai.d.ts.map +1 -1
  271. package/dist/types/compaction.d.ts +3 -1
  272. package/dist/types/compaction.d.ts.map +1 -1
  273. package/dist/types/errors.d.ts +9 -12
  274. package/dist/types/errors.d.ts.map +1 -1
  275. package/dist/types/errors.js +12 -15
  276. package/dist/types/errors.js.map +1 -1
  277. package/dist/types/flow.d.ts +265 -513
  278. package/dist/types/flow.d.ts.map +1 -1
  279. package/dist/types/flow.js +7 -1
  280. package/dist/types/flow.js.map +1 -1
  281. package/dist/types/history.d.ts +7 -18
  282. package/dist/types/history.d.ts.map +1 -1
  283. package/dist/types/history.js.map +1 -1
  284. package/dist/types/index.d.ts +9 -15
  285. package/dist/types/index.d.ts.map +1 -1
  286. package/dist/types/index.js +2 -7
  287. package/dist/types/index.js.map +1 -1
  288. package/dist/types/session.d.ts +94 -64
  289. package/dist/types/session.d.ts.map +1 -1
  290. package/dist/types/session.js +5 -1
  291. package/dist/types/session.js.map +1 -1
  292. package/dist/types/tool.d.ts +37 -207
  293. package/dist/types/tool.d.ts.map +1 -1
  294. package/dist/types/tool.js +6 -13
  295. package/dist/types/tool.js.map +1 -1
  296. package/dist/utils/clock.d.ts +28 -0
  297. package/dist/utils/clock.d.ts.map +1 -0
  298. package/dist/utils/clock.js +59 -0
  299. package/dist/utils/clock.js.map +1 -0
  300. package/dist/utils/duration.d.ts +11 -0
  301. package/dist/utils/duration.d.ts.map +1 -0
  302. package/dist/utils/duration.js +26 -0
  303. package/dist/utils/duration.js.map +1 -0
  304. package/dist/utils/history.d.ts +4 -1
  305. package/dist/utils/history.d.ts.map +1 -1
  306. package/dist/utils/history.js +2 -2
  307. package/dist/utils/history.js.map +1 -1
  308. package/dist/utils/index.d.ts +4 -10
  309. package/dist/utils/index.d.ts.map +1 -1
  310. package/dist/utils/index.js +4 -21
  311. package/dist/utils/index.js.map +1 -1
  312. package/dist/utils/json.d.ts +2 -0
  313. package/dist/utils/json.d.ts.map +1 -1
  314. package/dist/utils/json.js +4 -0
  315. package/dist/utils/json.js.map +1 -1
  316. package/dist/utils/outcomes.d.ts +48 -0
  317. package/dist/utils/outcomes.d.ts.map +1 -0
  318. package/dist/utils/outcomes.js +48 -0
  319. package/dist/utils/outcomes.js.map +1 -0
  320. package/dist/utils/schema.d.ts +50 -0
  321. package/dist/utils/schema.d.ts.map +1 -0
  322. package/dist/utils/schema.js +129 -0
  323. package/dist/utils/schema.js.map +1 -0
  324. package/dist/utils/streamingMessage.d.ts +3 -2
  325. package/dist/utils/streamingMessage.d.ts.map +1 -1
  326. package/dist/utils/streamingMessage.js +38 -4
  327. package/dist/utils/streamingMessage.js.map +1 -1
  328. package/dist/utils/template.d.ts +13 -149
  329. package/dist/utils/template.d.ts.map +1 -1
  330. package/dist/utils/template.js +28 -355
  331. package/dist/utils/template.js.map +1 -1
  332. package/dist/utils/usage.d.ts +19 -0
  333. package/dist/utils/usage.d.ts.map +1 -0
  334. package/dist/utils/usage.js +31 -0
  335. package/dist/utils/usage.js.map +1 -0
  336. package/docs/README.md +37 -19
  337. package/docs/concepts/architecture.md +117 -239
  338. package/docs/concepts/collection.md +170 -0
  339. package/docs/concepts/pipeline.md +132 -378
  340. package/docs/concepts/runs-and-waits.md +192 -0
  341. package/docs/guides/actions-and-events.md +276 -0
  342. package/docs/guides/branching.md +119 -208
  343. package/docs/guides/compaction.md +63 -158
  344. package/docs/guides/conditions.md +164 -128
  345. package/docs/guides/error-handling.md +168 -164
  346. package/docs/guides/flow-control.md +210 -349
  347. package/docs/guides/flows-from-json.md +224 -0
  348. package/docs/guides/instructions.md +125 -161
  349. package/docs/guides/persistence.md +182 -206
  350. package/docs/guides/streaming.md +50 -114
  351. package/docs/guides/testing.md +284 -0
  352. package/docs/guides/triggers.md +401 -0
  353. package/docs/migration/README.md +8 -15
  354. package/docs/migration/v1-to-v2.md +1 -1
  355. package/docs/migration/v2-3-to-v2-4.md +2 -2
  356. package/docs/migration/v2-6-to-v2-7.md +4 -4
  357. package/docs/migration/v3-to-v4.md +452 -0
  358. package/docs/reference/actions-events-conditions.md +396 -0
  359. package/docs/reference/agent.md +244 -0
  360. package/docs/reference/branches.md +75 -203
  361. package/docs/reference/errors.md +188 -144
  362. package/docs/reference/fields.md +125 -0
  363. package/docs/reference/flow-spec.md +248 -0
  364. package/docs/reference/flow.md +104 -192
  365. package/docs/reference/instruction.md +83 -137
  366. package/docs/reference/outcomes.md +273 -0
  367. package/docs/reference/providers.md +525 -302
  368. package/docs/reference/session.md +210 -0
  369. package/docs/reference/step.md +194 -312
  370. package/docs/reference/stores.md +496 -0
  371. package/docs/reference/tool.md +162 -231
  372. package/docs/reference/trigger.md +180 -0
  373. package/docs/rfc/v4-one-flow.md +477 -0
  374. package/docs/start/01-install.md +59 -44
  375. package/docs/start/02-first-agent.md +97 -147
  376. package/docs/start/03-collect-data.md +78 -183
  377. package/docs/start/04-add-tools.md +159 -227
  378. package/docs/start/05-go-to-production.md +167 -164
  379. package/examples/01-quickstart.ts +26 -16
  380. package/examples/02-fields.ts +75 -0
  381. package/examples/03-tools.ts +79 -119
  382. package/examples/04-instructions.ts +60 -87
  383. package/examples/05-branches.ts +78 -0
  384. package/examples/06-triggers-and-waits.ts +148 -0
  385. package/examples/07-streaming.ts +34 -60
  386. package/examples/08-store-and-migration.ts +97 -0
  387. package/examples/09-flows-from-json.ts +107 -0
  388. package/package.json +9 -6
  389. package/src/core/Agent.ts +116 -1512
  390. package/src/core/CompactionEngine.ts +7 -4
  391. package/src/core/FlowSpec.ts +712 -0
  392. package/src/core/Migrate.ts +256 -0
  393. package/src/core/Prompt.ts +156 -0
  394. package/src/core/Runner.ts +1181 -0
  395. package/src/core/Speak.ts +451 -0
  396. package/src/core/Understand.ts +422 -0
  397. package/src/core/contracts.ts +111 -0
  398. package/src/core/falai.ts +86 -0
  399. package/src/core/predicate.ts +56 -0
  400. package/src/index.ts +119 -147
  401. package/src/persistence/MemoryStore.ts +37 -0
  402. package/src/persistence/MongoStore.ts +89 -0
  403. package/src/persistence/OpenSearchStore.ts +153 -0
  404. package/src/persistence/PostgresStore.ts +89 -0
  405. package/src/persistence/PrismaStore.ts +127 -0
  406. package/src/persistence/RedisStore.ts +90 -0
  407. package/src/persistence/SQLiteStore.ts +103 -0
  408. package/src/persistence/sessionRow.ts +45 -0
  409. package/src/providers/DeepSeekProvider.ts +8 -3
  410. package/src/providers/GeminiProvider.ts +4 -3
  411. package/src/providers/OpenAICompatibleProvider.ts +6 -0
  412. package/src/providers/OpenRouterProvider.ts +2 -4
  413. package/src/providers/ProviderAdapter.ts +36 -8
  414. package/src/types/agent.ts +124 -397
  415. package/src/types/ai.ts +33 -1
  416. package/src/types/compaction.ts +3 -1
  417. package/src/types/errors.ts +13 -16
  418. package/src/types/flow.ts +249 -550
  419. package/src/types/history.ts +7 -20
  420. package/src/types/index.ts +87 -139
  421. package/src/types/session.ts +135 -70
  422. package/src/types/tool.ts +42 -267
  423. package/src/utils/clock.ts +70 -0
  424. package/src/utils/duration.ts +33 -0
  425. package/src/utils/history.ts +3 -2
  426. package/src/utils/index.ts +8 -66
  427. package/src/utils/json.ts +5 -0
  428. package/src/utils/outcomes.ts +56 -0
  429. package/src/utils/schema.ts +145 -0
  430. package/src/utils/streamingMessage.ts +34 -4
  431. package/src/utils/template.ts +32 -423
  432. package/src/utils/usage.ts +37 -0
  433. package/dist/adapters/MemoryAdapter.d.ts +0 -47
  434. package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
  435. package/dist/adapters/MemoryAdapter.js +0 -204
  436. package/dist/adapters/MemoryAdapter.js.map +0 -1
  437. package/dist/adapters/MongoAdapter.d.ts +0 -97
  438. package/dist/adapters/MongoAdapter.d.ts.map +0 -1
  439. package/dist/adapters/MongoAdapter.js +0 -196
  440. package/dist/adapters/MongoAdapter.js.map +0 -1
  441. package/dist/adapters/OpenSearchAdapter.d.ts +0 -169
  442. package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
  443. package/dist/adapters/OpenSearchAdapter.js +0 -471
  444. package/dist/adapters/OpenSearchAdapter.js.map +0 -1
  445. package/dist/adapters/PostgreSQLAdapter.d.ts +0 -85
  446. package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  447. package/dist/adapters/PostgreSQLAdapter.js +0 -308
  448. package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
  449. package/dist/adapters/PrismaAdapter.d.ts +0 -115
  450. package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
  451. package/dist/adapters/PrismaAdapter.js +0 -406
  452. package/dist/adapters/PrismaAdapter.js.map +0 -1
  453. package/dist/adapters/RedisAdapter.d.ts +0 -72
  454. package/dist/adapters/RedisAdapter.d.ts.map +0 -1
  455. package/dist/adapters/RedisAdapter.js +0 -286
  456. package/dist/adapters/RedisAdapter.js.map +0 -1
  457. package/dist/adapters/SQLiteAdapter.d.ts +0 -86
  458. package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
  459. package/dist/adapters/SQLiteAdapter.js +0 -337
  460. package/dist/adapters/SQLiteAdapter.js.map +0 -1
  461. package/dist/adapters/index.d.ts +0 -17
  462. package/dist/adapters/index.d.ts.map +0 -1
  463. package/dist/adapters/index.js +0 -11
  464. package/dist/adapters/index.js.map +0 -1
  465. package/dist/adapters/sessionRow.d.ts +0 -22
  466. package/dist/adapters/sessionRow.d.ts.map +0 -1
  467. package/dist/adapters/sessionRow.js +0 -48
  468. package/dist/adapters/sessionRow.js.map +0 -1
  469. package/dist/cjs/adapters/MemoryAdapter.d.ts +0 -47
  470. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
  471. package/dist/cjs/adapters/MemoryAdapter.js +0 -208
  472. package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
  473. package/dist/cjs/adapters/MongoAdapter.d.ts +0 -97
  474. package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
  475. package/dist/cjs/adapters/MongoAdapter.js +0 -200
  476. package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
  477. package/dist/cjs/adapters/OpenSearchAdapter.d.ts +0 -169
  478. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
  479. package/dist/cjs/adapters/OpenSearchAdapter.js +0 -475
  480. package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
  481. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +0 -85
  482. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  483. package/dist/cjs/adapters/PostgreSQLAdapter.js +0 -312
  484. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
  485. package/dist/cjs/adapters/PrismaAdapter.d.ts +0 -115
  486. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
  487. package/dist/cjs/adapters/PrismaAdapter.js +0 -410
  488. package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
  489. package/dist/cjs/adapters/RedisAdapter.d.ts +0 -72
  490. package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
  491. package/dist/cjs/adapters/RedisAdapter.js +0 -290
  492. package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
  493. package/dist/cjs/adapters/SQLiteAdapter.d.ts +0 -86
  494. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
  495. package/dist/cjs/adapters/SQLiteAdapter.js +0 -341
  496. package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
  497. package/dist/cjs/adapters/index.d.ts +0 -17
  498. package/dist/cjs/adapters/index.d.ts.map +0 -1
  499. package/dist/cjs/adapters/index.js +0 -21
  500. package/dist/cjs/adapters/index.js.map +0 -1
  501. package/dist/cjs/adapters/sessionRow.d.ts +0 -22
  502. package/dist/cjs/adapters/sessionRow.d.ts.map +0 -1
  503. package/dist/cjs/adapters/sessionRow.js +0 -52
  504. package/dist/cjs/adapters/sessionRow.js.map +0 -1
  505. package/dist/cjs/constants/index.d.ts +0 -1
  506. package/dist/cjs/constants/index.d.ts.map +0 -1
  507. package/dist/cjs/constants/index.js +0 -4
  508. package/dist/cjs/constants/index.js.map +0 -1
  509. package/dist/cjs/core/AutoChainExecutor.d.ts +0 -97
  510. package/dist/cjs/core/AutoChainExecutor.d.ts.map +0 -1
  511. package/dist/cjs/core/AutoChainExecutor.js +0 -288
  512. package/dist/cjs/core/AutoChainExecutor.js.map +0 -1
  513. package/dist/cjs/core/BranchEvaluator.d.ts +0 -55
  514. package/dist/cjs/core/BranchEvaluator.d.ts.map +0 -1
  515. package/dist/cjs/core/BranchEvaluator.js +0 -125
  516. package/dist/cjs/core/BranchEvaluator.js.map +0 -1
  517. package/dist/cjs/core/DirectiveChainTracker.d.ts +0 -49
  518. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +0 -1
  519. package/dist/cjs/core/DirectiveChainTracker.js +0 -121
  520. package/dist/cjs/core/DirectiveChainTracker.js.map +0 -1
  521. package/dist/cjs/core/Events.d.ts +0 -26
  522. package/dist/cjs/core/Events.d.ts.map +0 -1
  523. package/dist/cjs/core/Events.js +0 -144
  524. package/dist/cjs/core/Events.js.map +0 -1
  525. package/dist/cjs/core/Flow.d.ts +0 -183
  526. package/dist/cjs/core/Flow.d.ts.map +0 -1
  527. package/dist/cjs/core/Flow.js +0 -551
  528. package/dist/cjs/core/Flow.js.map +0 -1
  529. package/dist/cjs/core/FlowRouter.d.ts +0 -183
  530. package/dist/cjs/core/FlowRouter.d.ts.map +0 -1
  531. package/dist/cjs/core/FlowRouter.js +0 -1047
  532. package/dist/cjs/core/FlowRouter.js.map +0 -1
  533. package/dist/cjs/core/PersistenceManager.d.ts +0 -114
  534. package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
  535. package/dist/cjs/core/PersistenceManager.js +0 -336
  536. package/dist/cjs/core/PersistenceManager.js.map +0 -1
  537. package/dist/cjs/core/PromptComposer.d.ts +0 -47
  538. package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
  539. package/dist/cjs/core/PromptComposer.js +0 -397
  540. package/dist/cjs/core/PromptComposer.js.map +0 -1
  541. package/dist/cjs/core/PromptSectionCache.d.ts +0 -48
  542. package/dist/cjs/core/PromptSectionCache.d.ts.map +0 -1
  543. package/dist/cjs/core/PromptSectionCache.js +0 -108
  544. package/dist/cjs/core/PromptSectionCache.js.map +0 -1
  545. package/dist/cjs/core/ResponseEngine.d.ts +0 -43
  546. package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
  547. package/dist/cjs/core/ResponseEngine.js +0 -235
  548. package/dist/cjs/core/ResponseEngine.js.map +0 -1
  549. package/dist/cjs/core/ResponseGenerationError.d.ts +0 -30
  550. package/dist/cjs/core/ResponseGenerationError.d.ts.map +0 -1
  551. package/dist/cjs/core/ResponseGenerationError.js +0 -35
  552. package/dist/cjs/core/ResponseGenerationError.js.map +0 -1
  553. package/dist/cjs/core/ResponseModal.d.ts +0 -305
  554. package/dist/cjs/core/ResponseModal.d.ts.map +0 -1
  555. package/dist/cjs/core/ResponseModal.js +0 -1414
  556. package/dist/cjs/core/ResponseModal.js.map +0 -1
  557. package/dist/cjs/core/ResponsePipeline.d.ts +0 -220
  558. package/dist/cjs/core/ResponsePipeline.d.ts.map +0 -1
  559. package/dist/cjs/core/ResponsePipeline.js +0 -1040
  560. package/dist/cjs/core/ResponsePipeline.js.map +0 -1
  561. package/dist/cjs/core/SessionFinalizer.d.ts +0 -34
  562. package/dist/cjs/core/SessionFinalizer.d.ts.map +0 -1
  563. package/dist/cjs/core/SessionFinalizer.js +0 -88
  564. package/dist/cjs/core/SessionFinalizer.js.map +0 -1
  565. package/dist/cjs/core/SessionManager.d.ts +0 -112
  566. package/dist/cjs/core/SessionManager.d.ts.map +0 -1
  567. package/dist/cjs/core/SessionManager.js +0 -308
  568. package/dist/cjs/core/SessionManager.js.map +0 -1
  569. package/dist/cjs/core/SignalCoordinator.d.ts +0 -103
  570. package/dist/cjs/core/SignalCoordinator.d.ts.map +0 -1
  571. package/dist/cjs/core/SignalCoordinator.js +0 -207
  572. package/dist/cjs/core/SignalCoordinator.js.map +0 -1
  573. package/dist/cjs/core/SignalEvaluator.d.ts +0 -86
  574. package/dist/cjs/core/SignalEvaluator.d.ts.map +0 -1
  575. package/dist/cjs/core/SignalEvaluator.js +0 -319
  576. package/dist/cjs/core/SignalEvaluator.js.map +0 -1
  577. package/dist/cjs/core/SignalProcessor.d.ts +0 -152
  578. package/dist/cjs/core/SignalProcessor.d.ts.map +0 -1
  579. package/dist/cjs/core/SignalProcessor.js +0 -505
  580. package/dist/cjs/core/SignalProcessor.js.map +0 -1
  581. package/dist/cjs/core/Step.d.ts +0 -184
  582. package/dist/cjs/core/Step.d.ts.map +0 -1
  583. package/dist/cjs/core/Step.js +0 -599
  584. package/dist/cjs/core/Step.js.map +0 -1
  585. package/dist/cjs/core/StepLifecycle.d.ts +0 -43
  586. package/dist/cjs/core/StepLifecycle.d.ts.map +0 -1
  587. package/dist/cjs/core/StepLifecycle.js +0 -180
  588. package/dist/cjs/core/StepLifecycle.js.map +0 -1
  589. package/dist/cjs/core/StreamingToolExecutor.d.ts +0 -142
  590. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +0 -1
  591. package/dist/cjs/core/StreamingToolExecutor.js +0 -490
  592. package/dist/cjs/core/StreamingToolExecutor.js.map +0 -1
  593. package/dist/cjs/core/ToolLoopExecutor.d.ts +0 -133
  594. package/dist/cjs/core/ToolLoopExecutor.d.ts.map +0 -1
  595. package/dist/cjs/core/ToolLoopExecutor.js +0 -568
  596. package/dist/cjs/core/ToolLoopExecutor.js.map +0 -1
  597. package/dist/cjs/core/ToolManager.d.ts +0 -250
  598. package/dist/cjs/core/ToolManager.d.ts.map +0 -1
  599. package/dist/cjs/core/ToolManager.js +0 -1104
  600. package/dist/cjs/core/ToolManager.js.map +0 -1
  601. package/dist/cjs/core/createAgent.d.ts +0 -35
  602. package/dist/cjs/core/createAgent.d.ts.map +0 -1
  603. package/dist/cjs/core/createAgent.js +0 -39
  604. package/dist/cjs/core/createAgent.js.map +0 -1
  605. package/dist/cjs/core/flow-namespace.d.ts +0 -64
  606. package/dist/cjs/core/flow-namespace.d.ts.map +0 -1
  607. package/dist/cjs/core/flow-namespace.js +0 -182
  608. package/dist/cjs/core/flow-namespace.js.map +0 -1
  609. package/dist/cjs/core/toolGates.d.ts +0 -24
  610. package/dist/cjs/core/toolGates.d.ts.map +0 -1
  611. package/dist/cjs/core/toolGates.js +0 -52
  612. package/dist/cjs/core/toolGates.js.map +0 -1
  613. package/dist/cjs/types/persistence.d.ts +0 -254
  614. package/dist/cjs/types/persistence.d.ts.map +0 -1
  615. package/dist/cjs/types/persistence.js +0 -7
  616. package/dist/cjs/types/persistence.js.map +0 -1
  617. package/dist/cjs/types/prompt-cache.d.ts +0 -15
  618. package/dist/cjs/types/prompt-cache.d.ts.map +0 -1
  619. package/dist/cjs/types/prompt-cache.js +0 -6
  620. package/dist/cjs/types/prompt-cache.js.map +0 -1
  621. package/dist/cjs/types/signals.d.ts +0 -263
  622. package/dist/cjs/types/signals.d.ts.map +0 -1
  623. package/dist/cjs/types/signals.js +0 -11
  624. package/dist/cjs/types/signals.js.map +0 -1
  625. package/dist/cjs/types/template.d.ts +0 -84
  626. package/dist/cjs/types/template.d.ts.map +0 -1
  627. package/dist/cjs/types/template.js +0 -3
  628. package/dist/cjs/types/template.js.map +0 -1
  629. package/dist/cjs/utils/condition.d.ts +0 -63
  630. package/dist/cjs/utils/condition.d.ts.map +0 -1
  631. package/dist/cjs/utils/condition.js +0 -239
  632. package/dist/cjs/utils/condition.js.map +0 -1
  633. package/dist/cjs/utils/event.d.ts +0 -6
  634. package/dist/cjs/utils/event.d.ts.map +0 -1
  635. package/dist/cjs/utils/event.js +0 -20
  636. package/dist/cjs/utils/event.js.map +0 -1
  637. package/dist/cjs/utils/id.d.ts +0 -33
  638. package/dist/cjs/utils/id.d.ts.map +0 -1
  639. package/dist/cjs/utils/id.js +0 -84
  640. package/dist/cjs/utils/id.js.map +0 -1
  641. package/dist/cjs/utils/serialize.d.ts +0 -36
  642. package/dist/cjs/utils/serialize.d.ts.map +0 -1
  643. package/dist/cjs/utils/serialize.js +0 -77
  644. package/dist/cjs/utils/serialize.js.map +0 -1
  645. package/dist/cjs/utils/session.d.ts +0 -124
  646. package/dist/cjs/utils/session.d.ts.map +0 -1
  647. package/dist/cjs/utils/session.js +0 -396
  648. package/dist/cjs/utils/session.js.map +0 -1
  649. package/dist/constants/index.d.ts +0 -2
  650. package/dist/constants/index.d.ts.map +0 -1
  651. package/dist/constants/index.js +0 -4
  652. package/dist/constants/index.js.map +0 -1
  653. package/dist/core/AutoChainExecutor.d.ts +0 -97
  654. package/dist/core/AutoChainExecutor.d.ts.map +0 -1
  655. package/dist/core/AutoChainExecutor.js +0 -284
  656. package/dist/core/AutoChainExecutor.js.map +0 -1
  657. package/dist/core/BranchEvaluator.d.ts +0 -55
  658. package/dist/core/BranchEvaluator.d.ts.map +0 -1
  659. package/dist/core/BranchEvaluator.js +0 -121
  660. package/dist/core/BranchEvaluator.js.map +0 -1
  661. package/dist/core/DirectiveChainTracker.d.ts +0 -49
  662. package/dist/core/DirectiveChainTracker.d.ts.map +0 -1
  663. package/dist/core/DirectiveChainTracker.js +0 -117
  664. package/dist/core/DirectiveChainTracker.js.map +0 -1
  665. package/dist/core/Events.d.ts +0 -26
  666. package/dist/core/Events.d.ts.map +0 -1
  667. package/dist/core/Events.js +0 -137
  668. package/dist/core/Events.js.map +0 -1
  669. package/dist/core/Flow.d.ts +0 -183
  670. package/dist/core/Flow.d.ts.map +0 -1
  671. package/dist/core/Flow.js +0 -547
  672. package/dist/core/Flow.js.map +0 -1
  673. package/dist/core/FlowRouter.d.ts +0 -183
  674. package/dist/core/FlowRouter.d.ts.map +0 -1
  675. package/dist/core/FlowRouter.js +0 -1043
  676. package/dist/core/FlowRouter.js.map +0 -1
  677. package/dist/core/PersistenceManager.d.ts +0 -114
  678. package/dist/core/PersistenceManager.d.ts.map +0 -1
  679. package/dist/core/PersistenceManager.js +0 -332
  680. package/dist/core/PersistenceManager.js.map +0 -1
  681. package/dist/core/PromptComposer.d.ts +0 -47
  682. package/dist/core/PromptComposer.d.ts.map +0 -1
  683. package/dist/core/PromptComposer.js +0 -393
  684. package/dist/core/PromptComposer.js.map +0 -1
  685. package/dist/core/PromptSectionCache.d.ts +0 -48
  686. package/dist/core/PromptSectionCache.d.ts.map +0 -1
  687. package/dist/core/PromptSectionCache.js +0 -104
  688. package/dist/core/PromptSectionCache.js.map +0 -1
  689. package/dist/core/ResponseEngine.d.ts +0 -43
  690. package/dist/core/ResponseEngine.d.ts.map +0 -1
  691. package/dist/core/ResponseEngine.js +0 -231
  692. package/dist/core/ResponseEngine.js.map +0 -1
  693. package/dist/core/ResponseGenerationError.d.ts +0 -30
  694. package/dist/core/ResponseGenerationError.d.ts.map +0 -1
  695. package/dist/core/ResponseGenerationError.js +0 -31
  696. package/dist/core/ResponseGenerationError.js.map +0 -1
  697. package/dist/core/ResponseModal.d.ts +0 -305
  698. package/dist/core/ResponseModal.d.ts.map +0 -1
  699. package/dist/core/ResponseModal.js +0 -1410
  700. package/dist/core/ResponseModal.js.map +0 -1
  701. package/dist/core/ResponsePipeline.d.ts +0 -220
  702. package/dist/core/ResponsePipeline.d.ts.map +0 -1
  703. package/dist/core/ResponsePipeline.js +0 -1035
  704. package/dist/core/ResponsePipeline.js.map +0 -1
  705. package/dist/core/SessionFinalizer.d.ts +0 -34
  706. package/dist/core/SessionFinalizer.d.ts.map +0 -1
  707. package/dist/core/SessionFinalizer.js +0 -84
  708. package/dist/core/SessionFinalizer.js.map +0 -1
  709. package/dist/core/SessionManager.d.ts +0 -112
  710. package/dist/core/SessionManager.d.ts.map +0 -1
  711. package/dist/core/SessionManager.js +0 -301
  712. package/dist/core/SessionManager.js.map +0 -1
  713. package/dist/core/SignalCoordinator.d.ts +0 -103
  714. package/dist/core/SignalCoordinator.d.ts.map +0 -1
  715. package/dist/core/SignalCoordinator.js +0 -203
  716. package/dist/core/SignalCoordinator.js.map +0 -1
  717. package/dist/core/SignalEvaluator.d.ts +0 -86
  718. package/dist/core/SignalEvaluator.d.ts.map +0 -1
  719. package/dist/core/SignalEvaluator.js +0 -312
  720. package/dist/core/SignalEvaluator.js.map +0 -1
  721. package/dist/core/SignalProcessor.d.ts +0 -152
  722. package/dist/core/SignalProcessor.d.ts.map +0 -1
  723. package/dist/core/SignalProcessor.js +0 -498
  724. package/dist/core/SignalProcessor.js.map +0 -1
  725. package/dist/core/Step.d.ts +0 -184
  726. package/dist/core/Step.d.ts.map +0 -1
  727. package/dist/core/Step.js +0 -594
  728. package/dist/core/Step.js.map +0 -1
  729. package/dist/core/StepLifecycle.d.ts +0 -43
  730. package/dist/core/StepLifecycle.d.ts.map +0 -1
  731. package/dist/core/StepLifecycle.js +0 -176
  732. package/dist/core/StepLifecycle.js.map +0 -1
  733. package/dist/core/StreamingToolExecutor.d.ts +0 -142
  734. package/dist/core/StreamingToolExecutor.d.ts.map +0 -1
  735. package/dist/core/StreamingToolExecutor.js +0 -483
  736. package/dist/core/StreamingToolExecutor.js.map +0 -1
  737. package/dist/core/ToolLoopExecutor.d.ts +0 -133
  738. package/dist/core/ToolLoopExecutor.d.ts.map +0 -1
  739. package/dist/core/ToolLoopExecutor.js +0 -564
  740. package/dist/core/ToolLoopExecutor.js.map +0 -1
  741. package/dist/core/ToolManager.d.ts +0 -250
  742. package/dist/core/ToolManager.d.ts.map +0 -1
  743. package/dist/core/ToolManager.js +0 -1098
  744. package/dist/core/ToolManager.js.map +0 -1
  745. package/dist/core/createAgent.d.ts +0 -35
  746. package/dist/core/createAgent.d.ts.map +0 -1
  747. package/dist/core/createAgent.js +0 -36
  748. package/dist/core/createAgent.js.map +0 -1
  749. package/dist/core/flow-namespace.d.ts +0 -64
  750. package/dist/core/flow-namespace.d.ts.map +0 -1
  751. package/dist/core/flow-namespace.js +0 -179
  752. package/dist/core/flow-namespace.js.map +0 -1
  753. package/dist/core/toolGates.d.ts +0 -24
  754. package/dist/core/toolGates.d.ts.map +0 -1
  755. package/dist/core/toolGates.js +0 -49
  756. package/dist/core/toolGates.js.map +0 -1
  757. package/dist/types/persistence.d.ts +0 -254
  758. package/dist/types/persistence.d.ts.map +0 -1
  759. package/dist/types/persistence.js +0 -6
  760. package/dist/types/persistence.js.map +0 -1
  761. package/dist/types/prompt-cache.d.ts +0 -15
  762. package/dist/types/prompt-cache.d.ts.map +0 -1
  763. package/dist/types/prompt-cache.js +0 -5
  764. package/dist/types/prompt-cache.js.map +0 -1
  765. package/dist/types/signals.d.ts +0 -263
  766. package/dist/types/signals.d.ts.map +0 -1
  767. package/dist/types/signals.js +0 -10
  768. package/dist/types/signals.js.map +0 -1
  769. package/dist/types/template.d.ts +0 -84
  770. package/dist/types/template.d.ts.map +0 -1
  771. package/dist/types/template.js +0 -2
  772. package/dist/types/template.js.map +0 -1
  773. package/dist/utils/condition.d.ts +0 -63
  774. package/dist/utils/condition.d.ts.map +0 -1
  775. package/dist/utils/condition.js +0 -230
  776. package/dist/utils/condition.js.map +0 -1
  777. package/dist/utils/event.d.ts +0 -6
  778. package/dist/utils/event.d.ts.map +0 -1
  779. package/dist/utils/event.js +0 -17
  780. package/dist/utils/event.js.map +0 -1
  781. package/dist/utils/id.d.ts +0 -33
  782. package/dist/utils/id.d.ts.map +0 -1
  783. package/dist/utils/id.js +0 -77
  784. package/dist/utils/id.js.map +0 -1
  785. package/dist/utils/serialize.d.ts +0 -36
  786. package/dist/utils/serialize.d.ts.map +0 -1
  787. package/dist/utils/serialize.js +0 -72
  788. package/dist/utils/serialize.js.map +0 -1
  789. package/dist/utils/session.d.ts +0 -124
  790. package/dist/utils/session.d.ts.map +0 -1
  791. package/dist/utils/session.js +0 -379
  792. package/dist/utils/session.js.map +0 -1
  793. package/docs/concepts/directives.md +0 -369
  794. package/docs/reference/adapters.md +0 -543
  795. package/docs/reference/create-agent.md +0 -216
  796. package/docs/reference/directive.md +0 -242
  797. package/docs/reference/signals.md +0 -368
  798. package/examples/02-data-extraction.ts +0 -90
  799. package/examples/05-branching.ts +0 -140
  800. package/examples/06-flow-control.ts +0 -103
  801. package/examples/08-persistence.ts +0 -98
  802. package/examples/09-signals.ts +0 -144
  803. package/src/adapters/MemoryAdapter.ts +0 -281
  804. package/src/adapters/MongoAdapter.ts +0 -341
  805. package/src/adapters/OpenSearchAdapter.ts +0 -693
  806. package/src/adapters/PostgreSQLAdapter.ts +0 -487
  807. package/src/adapters/PrismaAdapter.ts +0 -617
  808. package/src/adapters/RedisAdapter.ts +0 -439
  809. package/src/adapters/SQLiteAdapter.ts +0 -496
  810. package/src/adapters/index.ts +0 -43
  811. package/src/adapters/sessionRow.ts +0 -57
  812. package/src/constants/index.ts +0 -2
  813. package/src/core/AutoChainExecutor.ts +0 -397
  814. package/src/core/BranchEvaluator.ts +0 -161
  815. package/src/core/DirectiveChainTracker.ts +0 -144
  816. package/src/core/Events.ts +0 -164
  817. package/src/core/Flow.ts +0 -665
  818. package/src/core/FlowRouter.ts +0 -1540
  819. package/src/core/PersistenceManager.ts +0 -446
  820. package/src/core/PromptComposer.ts +0 -448
  821. package/src/core/PromptSectionCache.ts +0 -125
  822. package/src/core/ResponseEngine.ts +0 -338
  823. package/src/core/ResponseGenerationError.ts +0 -53
  824. package/src/core/ResponseModal.ts +0 -1902
  825. package/src/core/ResponsePipeline.ts +0 -1404
  826. package/src/core/SessionFinalizer.ts +0 -108
  827. package/src/core/SessionManager.ts +0 -372
  828. package/src/core/SignalCoordinator.ts +0 -263
  829. package/src/core/SignalEvaluator.ts +0 -404
  830. package/src/core/SignalProcessor.ts +0 -663
  831. package/src/core/Step.ts +0 -782
  832. package/src/core/StepLifecycle.ts +0 -242
  833. package/src/core/StreamingToolExecutor.ts +0 -609
  834. package/src/core/ToolLoopExecutor.ts +0 -749
  835. package/src/core/ToolManager.ts +0 -1379
  836. package/src/core/createAgent.ts +0 -40
  837. package/src/core/flow-namespace.ts +0 -227
  838. package/src/core/toolGates.ts +0 -72
  839. package/src/types/persistence.ts +0 -303
  840. package/src/types/prompt-cache.ts +0 -17
  841. package/src/types/signals.ts +0 -338
  842. package/src/types/template.ts +0 -98
  843. package/src/utils/condition.ts +0 -296
  844. package/src/utils/event.ts +0 -16
  845. package/src/utils/id.ts +0 -91
  846. package/src/utils/serialize.ts +0 -86
  847. package/src/utils/session.ts +0 -501
@@ -1,1047 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FlowRouter = void 0;
4
- const index_js_1 = require("../types/index.js");
5
- const index_js_2 = require("../utils/index.js");
6
- const PromptComposer_js_1 = require("./PromptComposer.js");
7
- const index_js_3 = require("../utils/index.js");
8
- class FlowRouter {
9
- constructor(options) {
10
- this.options = options;
11
- }
12
- /**
13
- * Check whether the history contains any user messages.
14
- * Used to detect "session resume" scenarios where a flow/step was
15
- * pre-set programmatically and the conversation starts with only
16
- * system messages (or no messages at all).
17
- * @private
18
- */
19
- hasUserMessages(history) {
20
- return history.some((event) => event.source === index_js_1.MessageRole.USER);
21
- }
22
- /**
23
- * Handle the "session resume" fast-path: when a session already has a
24
- * pre-set currentFlow (and optionally currentStep) and the conversation
25
- * history contains no user messages, honor the pre-set position instead
26
- * of running AI flow/step selection.
27
- *
28
- * Returns `undefined` when the fast-path does not apply.
29
- * @private
30
- */
31
- async handleSessionResume(params) {
32
- const { flows, session, history, context } = params;
33
- // Fast-path only applies when:
34
- // 1. Session already has a currentFlow set
35
- // 2. There are no user messages in the history (system-only or empty)
36
- if (!session.currentFlow || this.hasUserMessages(history)) {
37
- return undefined;
38
- }
39
- // Find the pre-set flow among available flows
40
- const presetFlow = flows.find((r) => r.id === session.currentFlow.id);
41
- if (!presetFlow) {
42
- index_js_3.logger.warn(`[FlowConfigurationError] Pre-set flow not found: session references flow "${session.currentFlow.id}" which does not exist among available flows. Falling back to normal routing. Remove the stale session reference or register the missing flow.`);
43
- return undefined;
44
- }
45
- index_js_3.logger.debug(`[FlowRouter] Session resume: honoring pre-set flow '${presetFlow.title}' (no user messages in history)`);
46
- // Enter flow if needed (merges initialData, no-op if already entered)
47
- const updatedSession = this.enterFlowIfNeeded(session, presetFlow);
48
- // Evaluate cross-flow completions
49
- const completedFlows = this.evaluateFlowCompletions(flows, updatedSession.data || {});
50
- // If a currentStep is also pre-set, honor it — stay on that step
51
- if (session.currentStep) {
52
- const presetStep = presetFlow.getStep(session.currentStep.id);
53
- if (presetStep) {
54
- index_js_3.logger.debug(`[FlowRouter] Session resume: honoring pre-set step '${presetStep.id}'`);
55
- return {
56
- selectedFlow: presetFlow,
57
- selectedStep: presetStep,
58
- session: updatedSession,
59
- isFlowComplete: false,
60
- completedFlows,
61
- };
62
- }
63
- index_js_3.logger.warn(`[FlowConfigurationError] Pre-set step not found: session references step "${session.currentStep.id}" which does not exist in flow "${presetFlow.title}". Resolving from initial step. Remove the stale step reference or register the missing step.`);
64
- }
65
- // No currentStep pre-set (or it wasn't found) — resolve from initialStep
66
- // using the standard candidate logic (handles skipIf, etc.)
67
- const templateContext = (0, index_js_3.createTemplateContext)({
68
- context,
69
- session: updatedSession,
70
- history,
71
- data: updatedSession.data,
72
- });
73
- const candidates = await this.getCandidateStepsWithConditions(presetFlow, undefined, // No current step — start from beginning
74
- templateContext);
75
- if (candidates.length === 0) {
76
- index_js_3.logger.warn(`[FlowConfigurationError] No valid steps found: all steps in flow "${presetFlow.title}" are skipped by their conditions. Check skip/when conditions on the flow's steps.`);
77
- return {
78
- selectedFlow: presetFlow,
79
- selectedStep: undefined,
80
- session: updatedSession,
81
- isFlowComplete: false,
82
- completedFlows,
83
- };
84
- }
85
- const candidate = candidates[0];
86
- if (candidate.isFlowComplete) {
87
- index_js_3.logger.debug(`[FlowRouter] Session resume: flow '${presetFlow.title}' is already complete`);
88
- return {
89
- selectedFlow: presetFlow,
90
- selectedStep: undefined,
91
- session: updatedSession,
92
- isFlowComplete: true,
93
- completedFlows,
94
- };
95
- }
96
- index_js_3.logger.debug(`[FlowRouter] Session resume: resolved initial step '${candidate.step.id}'`);
97
- return {
98
- selectedFlow: presetFlow,
99
- selectedStep: candidate.step,
100
- session: updatedSession,
101
- isFlowComplete: false,
102
- completedFlows,
103
- };
104
- }
105
- /**
106
- * Enter a flow if not already in it, merging initial data.
107
- *
108
- * When the flow is `reentrant` and was previously completed in this
109
- * session, clears every field declared in the flow's `requiredFields`
110
- * and `optionalFields` before entering — so the flow starts fresh from
111
- * its initial step instead of being instantly marked complete by stale
112
- * data. Fields not owned by this flow are preserved.
113
- *
114
- * @private
115
- */
116
- enterFlowIfNeeded(session, route) {
117
- if (!session.currentFlow || session.currentFlow.id !== route.id) {
118
- let workingSession = session;
119
- // Re-entry into a `reentrant` flow that previously completed:
120
- // clear owned fields so completion logic doesn't short-circuit on
121
- // stale data from the prior run.
122
- const previouslyCompleted = (0, index_js_2.isFlowCompletedThisSession)(session, route.id);
123
- if (previouslyCompleted && route.reentrant) {
124
- const ownedFields = [
125
- ...(route.requiredFields ?? []),
126
- ...(route.optionalFields ?? []),
127
- ];
128
- if (ownedFields.length > 0) {
129
- const owned = new Set(ownedFields);
130
- const filtered = {};
131
- for (const key of Object.keys(session.data ?? {})) {
132
- if (!owned.has(key)) {
133
- filtered[key] =
134
- session.data[key];
135
- }
136
- }
137
- workingSession = { ...session, data: filtered };
138
- index_js_3.logger.debug(`[FlowRouter] Re-entering reentrant flow ${route.title}: cleared ${ownedFields.length} owned field(s)`);
139
- }
140
- }
141
- let updatedSession = (0, index_js_2.enterFlow)(workingSession, route.id, route.title);
142
- if (route.initialData) {
143
- updatedSession = (0, index_js_2.mergeCollected)(updatedSession, route.initialData);
144
- index_js_3.logger.debug(`[FlowRouter] Merged initial data for flow ${route.title}:`, route.initialData);
145
- }
146
- index_js_3.logger.debug(`[FlowRouter] Entered flow: ${route.title}`);
147
- this.options?.onFlowSwitch?.();
148
- return updatedSession;
149
- }
150
- return session;
151
- }
152
- /**
153
- * Optimized decision for single-flow scenarios
154
- * Skips flow scoring and only does step selection
155
- * @private
156
- */
157
- async decideSingleFlowStep(params) {
158
- const { route, session, history, agentOptions, provider, context, signal } = params;
159
- const selectedFlow = route;
160
- // Enter flow if not already in it (this may merge initial data)
161
- const updatedSession = this.enterFlowIfNeeded(session, route);
162
- // Check if this single flow is complete (use updated session data)
163
- const completedFlows = route.isComplete(updatedSession.data || {}) ? [route] : [];
164
- // Get candidate steps using new condition evaluation
165
- const templateContext = (0, index_js_3.createTemplateContext)({
166
- context,
167
- session: updatedSession,
168
- history,
169
- data: updatedSession.data
170
- });
171
- const currentStep = updatedSession.currentStep
172
- ? route.getStep(updatedSession.currentStep.id)
173
- : undefined;
174
- const candidates = await this.getCandidateStepsWithConditions(route, currentStep, templateContext);
175
- if (candidates.length === 0) {
176
- index_js_3.logger.warn(`[FlowConfigurationError] No valid steps found: all candidates in the single-flow agent are skipped. Check step skip/when conditions.`);
177
- return { selectedFlow, session: updatedSession };
178
- }
179
- // If only one candidate, check if it's a completion marker
180
- if (candidates.length === 1) {
181
- const candidate = candidates[0];
182
- if (candidate.isFlowComplete) {
183
- index_js_3.logger.debug(`[FlowRouter] Single-flow: Flow complete - all required fields collected or last step reached`);
184
- // Don't return a selectedStep when flow is complete - there's no step to enter
185
- return {
186
- selectedFlow,
187
- selectedStep: undefined,
188
- session: updatedSession,
189
- isFlowComplete: true,
190
- completedFlows,
191
- };
192
- }
193
- else {
194
- index_js_3.logger.debug(`[FlowRouter] Single-flow: Only one valid step: ${candidate.step.id}`);
195
- return {
196
- selectedFlow,
197
- selectedStep: candidate.step,
198
- session: updatedSession,
199
- isFlowComplete: false,
200
- completedFlows,
201
- };
202
- }
203
- }
204
- // Multiple candidates - use AI to select best step
205
- const lastUserMessage = (0, index_js_3.getLastMessageFromHistory)(history);
206
- // Collect AI context strings from step conditions
207
- const stepConditionContext = [];
208
- const stepExclusionContext = [];
209
- for (const candidate of candidates) {
210
- const whenResult = await candidate.step.evaluateWhen(templateContext);
211
- stepConditionContext.push(...whenResult.aiContextStrings);
212
- stepExclusionContext.push(...whenResult.aiExclusionStrings);
213
- }
214
- // Check if any candidate is a completion marker (isFlowComplete = true)
215
- const hasCompletionOption = candidates.some(c => c.isFlowComplete);
216
- const stepPrompt = await this.buildStepSelectionPrompt({
217
- flow: route,
218
- currentStep,
219
- candidates,
220
- data: updatedSession.data || {},
221
- history,
222
- lastMessage: lastUserMessage,
223
- agentOptions,
224
- context,
225
- session: updatedSession,
226
- stepConditionContext,
227
- stepExclusionContext,
228
- includeCompletion: hasCompletionOption,
229
- });
230
- const stepSchema = this.buildStepSelectionSchema(candidates.filter(c => !c.isFlowComplete).map((c) => c.step), hasCompletionOption);
231
- const stepResult = await provider.generateMessage({
232
- prompt: stepPrompt,
233
- history: (0, index_js_3.eventsToHistory)(history),
234
- context,
235
- signal,
236
- parameters: {
237
- jsonSchema: stepSchema,
238
- schemaName: "step_selection",
239
- },
240
- });
241
- const selectedStepId = stepResult.structured?.selectedStepId;
242
- // Check if AI selected flow completion
243
- if (selectedStepId === '__COMPLETE__') {
244
- index_js_3.logger.debug(`[FlowRouter] Single-flow: AI selected flow completion`);
245
- index_js_3.logger.debug(`[FlowRouter] Single-flow: Reasoning: ${stepResult.structured?.reasoning}`);
246
- return {
247
- selectedFlow,
248
- selectedStep: undefined,
249
- responseDirectives: stepResult.structured?.responseDirectives,
250
- session: updatedSession,
251
- isFlowComplete: true,
252
- completedFlows,
253
- };
254
- }
255
- const selectedStep = candidates.find((c) => c.step.id === selectedStepId);
256
- if (selectedStep) {
257
- index_js_3.logger.debug(`[FlowRouter] Single-flow: AI selected step: ${selectedStep.step.id}`);
258
- index_js_3.logger.debug(`[FlowRouter] Single-flow: Reasoning: ${stepResult.structured?.reasoning}`);
259
- }
260
- else {
261
- index_js_3.logger.warn(`[FlowConfigurationError] Invalid step ID returned: AI router returned a step ID that does not match any candidate. Falling back to first candidate. Check flow step ids and router configuration.`);
262
- }
263
- return {
264
- selectedFlow,
265
- selectedStep: selectedStep?.step || candidates[0].step,
266
- responseDirectives: stepResult.structured?.responseDirectives,
267
- session: updatedSession,
268
- completedFlows,
269
- };
270
- }
271
- /**
272
- * Recursively traverse step chain to find first non-skipped step using new condition evaluation
273
- * @private
274
- */
275
- async findFirstValidStepRecursiveWithConditions(currentStep, templateContext, visited) {
276
- // Prevent infinite loops
277
- if (visited.has(currentStep.id)) {
278
- return { aiContextStrings: [] };
279
- }
280
- visited.add(currentStep.id);
281
- const transitions = currentStep.getTransitions();
282
- const allAiContextStrings = [];
283
- // No transitions means implicit terminus — flow is complete
284
- if (transitions.length === 0) {
285
- return {
286
- isFlowComplete: true,
287
- aiContextStrings: allAiContextStrings,
288
- };
289
- }
290
- for (const transition of transitions) {
291
- const target = transition;
292
- if (!target)
293
- continue;
294
- // Evaluate skip condition (code-only, if-shape)
295
- const skipResult = await target.evaluateSkip(templateContext);
296
- allAiContextStrings.push(...skipResult.aiContextStrings);
297
- // If target should NOT be skipped, we found our step
298
- if (!skipResult.shouldSkip) {
299
- index_js_3.logger.debug(`[FlowRouter] Found valid step after skipping: ${target.id}`);
300
- return {
301
- step: target,
302
- isFlowComplete: false,
303
- aiContextStrings: allAiContextStrings,
304
- };
305
- }
306
- // Target should be skipped too - recurse deeper
307
- index_js_3.logger.debug(`[FlowRouter] Skipping step ${target.id} (skipIf condition met), continuing traversal...`);
308
- const result = await this.findFirstValidStepRecursiveWithConditions(target, templateContext, visited);
309
- // Collect AI context from recursive call
310
- if (result.aiContextStrings) {
311
- allAiContextStrings.push(...result.aiContextStrings);
312
- }
313
- // If we found something (a valid step or flow complete), return it
314
- if (result.step || result.isFlowComplete) {
315
- return {
316
- ...result,
317
- aiContextStrings: allAiContextStrings,
318
- };
319
- }
320
- }
321
- // No valid steps found in this branch — all skipped with no further transitions
322
- return {
323
- isFlowComplete: true,
324
- aiContextStrings: allAiContextStrings,
325
- };
326
- }
327
- /**
328
- * Identify valid next candidate steps using new condition evaluation system
329
- * Returns step with isFlowComplete flag if flow is complete (all steps skipped or no transitions remain)
330
- *
331
- * Flow completion is implicit: when the last step has no transitions, the flow is done.
332
- */
333
- async getCandidateStepsWithConditions(route, currentStep, templateContext) {
334
- const candidates = [];
335
- if (!currentStep) {
336
- // Entering flow for the first time — always start the step flow
337
- const initialStep = route.initialStep;
338
- const skipResult = await initialStep.evaluateSkip(templateContext);
339
- if (skipResult.shouldSkip) {
340
- // Initial step should be skipped - recursively traverse to find first non-skipped step
341
- const result = await this.findFirstValidStepRecursiveWithConditions(initialStep, templateContext, new Set());
342
- if (result.isFlowComplete) {
343
- // All steps are skipped and no transitions remain
344
- index_js_3.logger.debug(`[FlowRouter] Flow complete on entry: all steps skipped, no transitions remain`);
345
- candidates.push({
346
- step: initialStep,
347
- isFlowComplete: true,
348
- });
349
- }
350
- else if (result.step) {
351
- // Found a non-skipped step
352
- candidates.push({
353
- step: result.step,
354
- isFlowComplete: result.isFlowComplete || false,
355
- });
356
- }
357
- // If no step found and not complete, fall through to return empty candidates
358
- }
359
- else {
360
- candidates.push({
361
- step: initialStep,
362
- isFlowComplete: false,
363
- });
364
- }
365
- return candidates;
366
- }
367
- // Continue normal step progression — flows complete when last step has no transitions (implicit terminus)
368
- const transitions = currentStep.getTransitions();
369
- // No transitions means this is the last step — flow is complete
370
- if (transitions.length === 0) {
371
- index_js_3.logger.debug(`[FlowRouter] Flow complete: current step has no transitions (implicit terminus)`);
372
- return [
373
- {
374
- step: currentStep,
375
- isFlowComplete: true,
376
- },
377
- ];
378
- }
379
- for (const transition of transitions) {
380
- const target = transition;
381
- if (!target)
382
- continue;
383
- const skipResult = await target.evaluateSkip(templateContext);
384
- if (skipResult.shouldSkip) {
385
- index_js_3.logger.debug(`[FlowRouter] Skipping step ${target.id} (skip condition met)`);
386
- // Recursively traverse to find next valid step
387
- const result = await this.findFirstValidStepRecursiveWithConditions(target, templateContext, new Set([currentStep.id]) // Already visited current step
388
- );
389
- if (result.isFlowComplete) {
390
- // All forward paths lead to terminus
391
- candidates.push({
392
- step: currentStep,
393
- isFlowComplete: true,
394
- });
395
- }
396
- else if (result.step) {
397
- // Found a non-skipped step deeper in the chain
398
- candidates.push({
399
- step: result.step,
400
- isFlowComplete: false,
401
- });
402
- }
403
- continue;
404
- }
405
- candidates.push({
406
- step: target,
407
- isFlowComplete: false,
408
- });
409
- }
410
- // If no valid candidates found after evaluating all transitions
411
- if (candidates.length === 0) {
412
- // All transitions were skipped — flow is complete
413
- index_js_3.logger.debug(`[FlowRouter] Flow complete: all transitions skipped`);
414
- return [
415
- {
416
- step: currentStep,
417
- isFlowComplete: true,
418
- },
419
- ];
420
- }
421
- return candidates;
422
- }
423
- /**
424
- * Full routing orchestration: builds prompt and schema, calls AI, selects route/step,
425
- * and updates the session (including initialData merge when entering a new flow).
426
- *
427
- * OPTIMIZATION: If there's only 1 route, skips route scoring and only does step selection.
428
- * CROSS-FLOW COMPLETION: Evaluates all flows for completion based on collected data.
429
- */
430
- async decideFlowAndStep(params) {
431
- const { flows, session, history, agentOptions, provider, context, signal, } = params;
432
- if (flows.length === 0) {
433
- return { session };
434
- }
435
- // SESSION RESUME: If the session has a pre-set flow and there are no user
436
- // messages in the history, honor the pre-set position without AI routing.
437
- // This supports programmatic session setup and persistence-based resume.
438
- const resumeResult = await this.handleSessionResume({
439
- flows,
440
- session,
441
- history,
442
- context,
443
- });
444
- if (resumeResult) {
445
- return resumeResult;
446
- }
447
- // Exclude flows that completed earlier in this session unless explicitly
448
- // re-entrant. A completed flow surrenders the conversation back to
449
- // routing — it cannot be re-selected without `flow.reentrant: true`.
450
- const reEntryFiltered = flows.filter((f) => !(0, index_js_2.isFlowCompletedThisSession)(session, f.id) || f.reentrant === true);
451
- const excludedFlows = flows.length - reEntryFiltered.length;
452
- if (excludedFlows > 0) {
453
- index_js_3.logger.debug(`[FlowRouter] Excluded ${excludedFlows} completed (non-reentrant) flow(s) from routing candidates`);
454
- }
455
- // CROSS-FLOW COMPLETION EVALUATION: Check all eligible flows for completion
456
- const completedFlows = this.evaluateFlowCompletions(reEntryFiltered, session.data || {});
457
- // Log completed flows
458
- if (completedFlows.length > 0) {
459
- index_js_3.logger.debug(`[FlowRouter] Found ${completedFlows.length} completed routes: ${completedFlows.map(r => r.title).join(', ')}`);
460
- }
461
- // OPTIMIZATION: Single flow - skip flow scoring, only do step selection
462
- if (reEntryFiltered.length === 1) {
463
- const result = await this.decideSingleFlowStep({
464
- route: reEntryFiltered[0],
465
- session,
466
- history,
467
- agentOptions,
468
- provider,
469
- context,
470
- signal,
471
- });
472
- return {
473
- ...result,
474
- completedFlows,
475
- };
476
- }
477
- // No eligible flows after re-entry filtering — caller falls back to the
478
- // generic non-flow response path.
479
- if (reEntryFiltered.length === 0) {
480
- index_js_3.logger.debug(`[FlowRouter] All flows completed and none are reentrant — releasing session to fallback`);
481
- return { session, completedFlows };
482
- }
483
- const lastUserMessage = (0, index_js_3.getLastMessageFromHistory)(history);
484
- const templateContext = (0, index_js_3.createTemplateContext)({
485
- context,
486
- session,
487
- history,
488
- data: session.data
489
- });
490
- // Apply flow filtering with new condition evaluation system
491
- const whenResult = await this.filterFlowsByWhen(reEntryFiltered, templateContext);
492
- // Use filtered flows for further processing
493
- const eligibleRoutes = whenResult.eligibleRoutes;
494
- index_js_3.logger.debug(`[FlowRouter] Flow filtering: ${flows.length} total → ${reEntryFiltered.length} after re-entry filter → ${eligibleRoutes.length} after when`);
495
- let activeFlowSteps;
496
- let activeFlow;
497
- let isFlowComplete = false;
498
- let updatedSession = session;
499
- if (session.currentFlow) {
500
- activeFlow = eligibleRoutes.find((r) => r.id === session.currentFlow?.id);
501
- if (activeFlow) {
502
- const currentStep = session.currentStep
503
- ? activeFlow.getStep(session.currentStep.id)
504
- : undefined;
505
- const activeTemplateContext = (0, index_js_3.createTemplateContext)({
506
- ...templateContext,
507
- session: updatedSession,
508
- data: updatedSession.data
509
- });
510
- const candidates = await this.getCandidateStepsWithConditions(activeFlow, currentStep, activeTemplateContext);
511
- // Check if flow is complete
512
- // getCandidateStepsWithConditions now automatically handles completion when required fields are collected
513
- if (candidates.length === 1 && candidates[0].isFlowComplete) {
514
- isFlowComplete = true;
515
- index_js_3.logger.debug(`[FlowRouter] Flow ${activeFlow.title} is complete - all required fields collected or last step reached`);
516
- // Don't include steps in routing if route is complete
517
- activeFlowSteps = undefined;
518
- }
519
- else if (candidates.length === 0) {
520
- // No candidates available — don't end flow based on data alone
521
- index_js_3.logger.debug(`[FlowRouter] Flow ${activeFlow.title} has no valid candidate steps`);
522
- activeFlowSteps = undefined;
523
- }
524
- else {
525
- // Multiple candidates or single non-complete candidate
526
- activeFlowSteps = candidates.map((c) => c.step);
527
- index_js_3.logger.debug(`[FlowRouter] Found ${activeFlowSteps.length} candidate steps for active route`);
528
- }
529
- }
530
- }
531
- const routingSchema = this.buildDynamicFlowSchema(eligibleRoutes, undefined, activeFlowSteps);
532
- const routingPrompt = await this.buildRoutingPrompt({
533
- history,
534
- flows: eligibleRoutes,
535
- lastMessage: lastUserMessage,
536
- agentOptions,
537
- session,
538
- activeFlowSteps,
539
- context,
540
- });
541
- const routingResult = await provider.generateMessage({
542
- prompt: routingPrompt,
543
- history: (0, index_js_3.eventsToHistory)(history),
544
- context,
545
- signal,
546
- parameters: {
547
- jsonSchema: routingSchema,
548
- schemaName: "routing_output",
549
- },
550
- });
551
- let selectedFlow;
552
- let selectedStep;
553
- let responseDirectives;
554
- if (routingResult.structured?.flows) {
555
- // Use cross-flow completion evaluation to select optimal flow
556
- const optimalRoute = this.selectOptimalFlow(eligibleRoutes, updatedSession.data || {}, routingResult.structured.flows, updatedSession.currentFlow?.id);
557
- // If no optimal flow found, check why
558
- if (!optimalRoute) {
559
- if (eligibleRoutes.length === 0) {
560
- // No flows passed filtering
561
- index_js_3.logger.debug(`[FlowRouter] No eligible flows available - all flows filtered out`);
562
- selectedFlow = undefined;
563
- }
564
- else {
565
- // Routes exist but selectOptimalFlow returned undefined
566
- // This means all flows are 100% complete
567
- index_js_3.logger.debug(`[FlowRouter] No optimal route found - all ${eligibleRoutes.length} eligible routes are complete`);
568
- selectedFlow = undefined;
569
- }
570
- }
571
- else {
572
- selectedFlow = optimalRoute;
573
- }
574
- responseDirectives = routingResult.structured.responseDirectives;
575
- if (selectedFlow === activeFlow &&
576
- routingResult.structured.selectedStepId &&
577
- activeFlow) {
578
- selectedStep = activeFlow.getStep(routingResult.structured.selectedStepId);
579
- if (selectedStep) {
580
- index_js_3.logger.debug(`[FlowRouter] AI selected step: ${selectedStep.id} in active route`);
581
- index_js_3.logger.debug(`[FlowRouter] Step reasoning: ${routingResult.structured.stepReasoning}`);
582
- }
583
- }
584
- if (selectedFlow) {
585
- index_js_3.logger.debug(`[FlowRouter] Selected route: ${selectedFlow.title}`);
586
- updatedSession = this.enterFlowIfNeeded(updatedSession, selectedFlow);
587
- }
588
- }
589
- else {
590
- // Routing LLM output could not be parsed into the expected structured
591
- // shape (no `flows` payload). The turn degrades to a fallback response
592
- // with the flow position untouched — surface that loudly instead of
593
- // failing silently.
594
- const rawSnippet = (routingResult.message ?? "").trim().slice(0, 120);
595
- index_js_3.logger.warn(`[FlowRouter] Routing output unparseable: routing LLM returned no structured "flows" payload` +
596
- `${rawSnippet ? `; raw output: "${rawSnippet}"` : ""}. ` +
597
- `This turn degrades to a generic fallback response and the flow position is left unchanged. ` +
598
- `Check the provider's structured-output/JSON support or inspect the routing prompt for schema violations.`);
599
- }
600
- return {
601
- selectedFlow,
602
- selectedStep,
603
- responseDirectives,
604
- session: updatedSession,
605
- isFlowComplete,
606
- completedFlows,
607
- };
608
- }
609
- /**
610
- * Filter flows based on when conditions
611
- * @param routes - Flows that passed skipIf filtering
612
- * @param templateContext - Context for condition evaluation
613
- * @returns Object with eligible flows and collected AI context strings
614
- */
615
- async filterFlowsByWhen(routes, templateContext) {
616
- const eligibleRoutes = [];
617
- const aiContextStrings = [];
618
- for (const route of routes) {
619
- const whenResult = await route.evaluateWhen(templateContext);
620
- // Collect AI context strings from when conditions
621
- aiContextStrings.push(...whenResult.aiContextStrings);
622
- // If flow has no programmatic conditions or they evaluate to true, it's eligible
623
- if (!whenResult.hasProgrammaticConditions || whenResult.programmaticResult) {
624
- eligibleRoutes.push(route);
625
- }
626
- else {
627
- index_js_3.logger.debug(`[FlowRouter] Flow ${route.title} not eligible (when condition not met)`);
628
- }
629
- }
630
- return { eligibleRoutes, aiContextStrings };
631
- }
632
- /**
633
- * Evaluate all flows for completion based on collected data
634
- * @param routes - All available flows
635
- * @param data - Currently collected agent-level data
636
- * @returns Array of flows that are complete
637
- */
638
- evaluateFlowCompletions(routes, data) {
639
- return routes.filter(route => route.isComplete(data));
640
- }
641
- /**
642
- * Get completion status for all flows
643
- * @param routes - All available flows
644
- * @param data - Currently collected agent-level data
645
- * @returns Map of flow ID to completion progress (0-1)
646
- */
647
- getFlowCompletionStatus(routes, data) {
648
- const completionStatus = new Map();
649
- for (const route of routes) {
650
- const progress = route.getCompletionProgress(data);
651
- completionStatus.set(route.id, progress);
652
- }
653
- return completionStatus;
654
- }
655
- /**
656
- * Find the best flow to continue based on completion status and user intent
657
- * Prioritizes flows that are partially complete but not finished
658
- * IMPORTANT: Completed flows are excluded to prevent re-entering finished tasks
659
- * @param routes - All available flows
660
- * @param data - Currently collected agent-level data
661
- * @param routeScores - AI-generated route scores from routing decision
662
- * @returns Flow that should be prioritized for continuation
663
- */
664
- selectOptimalFlow(routes, data, routeScores, currentRouteId) {
665
- const completionStatus = this.getFlowCompletionStatus(routes, data);
666
- const switchMargin = this.options?.flowSwitchMargin ?? 15;
667
- // Create weighted scores combining AI intent scores with completion progress
668
- const weightedScores = [];
669
- for (const route of routes) {
670
- const aiScore = routeScores[route.id] || 0;
671
- const completionProgress = completionStatus.get(route.id) || 0;
672
- // ALWAYS skip fully completed flows to prevent re-entering finished tasks
673
- if (completionProgress >= 1.0) {
674
- index_js_3.logger.debug(`[FlowRouter] Excluding completed flow: ${route.title} (100% complete)`);
675
- continue;
676
- }
677
- // Boost partially complete flows that match user intent
678
- let weightedScore = aiScore;
679
- if (completionProgress > 0 && completionProgress < 1.0) {
680
- weightedScore += (completionProgress * 20); // Up to 20 point boost
681
- }
682
- weightedScores.push({ route, score: weightedScore });
683
- }
684
- // Sort by weighted score descending
685
- weightedScores.sort((a, b) => b.score - a.score);
686
- if (weightedScores.length === 0) {
687
- return undefined;
688
- }
689
- // Apply sticky routing: if there's a current route, only switch if the
690
- // best alternative exceeds the current flow's score by the configured margin.
691
- // The margin applies symmetrically: even when the current flow has no
692
- // weighted entry (the AI scored it 0 or omitted it), switching away
693
- // requires clearing the margin over a zero baseline — shared agent-level
694
- // data can otherwise zero out a mid-conversation flow.
695
- if (currentRouteId) {
696
- const currentEntry = weightedScores.find(e => e.route.id === currentRouteId);
697
- const bestEntry = weightedScores[0];
698
- if (bestEntry && bestEntry.route.id !== currentRouteId) {
699
- const currentScore = currentEntry ? currentEntry.score : 0;
700
- if (bestEntry.score < currentScore + switchMargin) {
701
- const currentRoute = currentEntry?.route ?? routes.find(r => r.id === currentRouteId);
702
- if (currentRoute) {
703
- index_js_3.logger.debug(`[FlowRouter] Staying on current flow: ${currentRoute.title} ` +
704
- `(current: ${currentScore}, best alternative: ${bestEntry.score}, ` +
705
- `margin required: ${switchMargin})`);
706
- return currentRoute;
707
- }
708
- index_js_3.logger.debug(`[FlowRouter] Current flow ${currentRouteId} is no longer routable — selecting best alternative: ${bestEntry.route.title}`);
709
- }
710
- else {
711
- index_js_3.logger.debug(`[FlowRouter] Switching flow: ${currentEntry?.route.title ?? currentRouteId} → ${bestEntry.route.title} ` +
712
- `(current: ${currentScore}, alternative: ${bestEntry.score}, ` +
713
- `margin: ${switchMargin})`);
714
- }
715
- }
716
- }
717
- index_js_3.logger.debug(`[FlowRouter] Selected optimal route: ${weightedScores[0].route.title} ` +
718
- `(AI: ${routeScores[weightedScores[0].route.id]}, ` +
719
- `Completion: ${(completionStatus.get(weightedScores[0].route.id) || 0) * 100}%, ` +
720
- `Weighted: ${weightedScores[0].score})`);
721
- return weightedScores[0].route;
722
- }
723
- /**
724
- * Build prompt for step selection within a single flow
725
- * @private
726
- */
727
- async buildStepSelectionPrompt(params) {
728
- const { flow: route, currentStep, candidates, data, history, lastMessage, agentOptions, context, session, stepConditionContext, stepExclusionContext, includeCompletion = false, } = params;
729
- const templateContext = (0, index_js_3.createTemplateContext)({ context, session, history });
730
- const pc = new PromptComposer_js_1.PromptComposer(templateContext, this.options?.promptSectionCache);
731
- // Add agent metadata
732
- if (agentOptions) {
733
- await pc.addAgentMeta(agentOptions);
734
- }
735
- // Add flow context
736
- await pc.addInstruction(`Active Flow: ${route.title}\nDescription: ${route.description || "N/A"}`);
737
- // Add current step context
738
- if (currentStep) {
739
- await pc.addInstruction(`Current Step: ${currentStep.id}\nDescription: ${currentStep.description || "N/A"}`);
740
- }
741
- else {
742
- await pc.addInstruction("Current Step: None (entering flow)");
743
- }
744
- // Add collected data context
745
- if (Object.keys(data).length > 0) {
746
- await pc.addInstruction(`Collected Data So Far:\n${JSON.stringify(data, null, 2)}`);
747
- }
748
- else {
749
- await pc.addInstruction("Collected Data: None yet");
750
- }
751
- // Add conversation history
752
- await pc.addInteractionHistory(history);
753
- await pc.addLastMessage(lastMessage);
754
- // Add candidate steps with condition context
755
- const stepDescriptions = [];
756
- for (const candidate of candidates) {
757
- const idx = candidates.indexOf(candidate);
758
- const parts = [
759
- `${idx + 1}. Step ID: ${candidate.step.id}`,
760
- ` Description: ${candidate.step.description || "N/A"}`,
761
- ];
762
- // Add when condition context
763
- if (candidate.step.when) {
764
- const whenResult = await candidate.step.evaluateWhen(templateContext);
765
- if (whenResult.aiContextStrings.length > 0) {
766
- parts.push(` When any condition matches: ${whenResult.aiContextStrings.join(" OR ")}`);
767
- }
768
- if (whenResult.aiExclusionStrings.length > 0) {
769
- parts.push(` Do not choose when any condition matches: ${whenResult.aiExclusionStrings.join(" OR ")}`);
770
- }
771
- }
772
- if (candidate.step.requires && candidate.step.requires.length > 0) {
773
- parts.push(` Required Data: ${candidate.step.requires.join(", ")}`);
774
- }
775
- if (candidate.step.collect && candidate.step.collect.length > 0) {
776
- parts.push(` Collects: ${candidate.step.collect.join(", ")}`);
777
- }
778
- stepDescriptions.push(parts.join("\n"));
779
- }
780
- await pc.addInstruction(`Available Steps to Transition To:\n${stepDescriptions.join("\n\n")}`);
781
- // Add step condition context if available
782
- if (stepConditionContext && stepConditionContext.length > 0) {
783
- await pc.addInstruction([
784
- "",
785
- "Additional step context from conditions:",
786
- ...stepConditionContext.map(ctx => `- ${ctx}`),
787
- "",
788
- "Consider this context when selecting the most appropriate step.",
789
- ].join("\n"));
790
- }
791
- if (stepExclusionContext && stepExclusionContext.length > 0) {
792
- await pc.addInstruction([
793
- "",
794
- "Additional step exclusion context:",
795
- ...stepExclusionContext.map(ctx => `- ${ctx}`),
796
- "",
797
- "Avoid selecting steps when their exclusion context matches.",
798
- ].join("\n"));
799
- }
800
- // Add decision prompt
801
- const decisionRules = [
802
- "Task: Decide which step to transition to based on:",
803
- "1. The user's current message and intent",
804
- "2. The conversation history and context",
805
- "3. The collected data we already have",
806
- "4. The conditions and requirements of each step",
807
- "5. The logical flow of the conversation",
808
- "",
809
- "Rules:",
810
- "- If a step has a condition, evaluate whether it's met based on context",
811
- "- If a step requires data we don't have, consider if we should collect it now",
812
- "- Choose the step that makes the most sense for moving the conversation forward",
813
- "- Steps with skipIf conditions that are met have already been filtered out",
814
- ];
815
- if (includeCompletion) {
816
- decisionRules.push("", `- You can select '__COMPLETE__' to complete this flow if:`, " * All required data has been collected", " * The user's intent suggests they're done with this task", " * No further steps are needed to fulfill the user's request");
817
- }
818
- decisionRules.push("", "Return ONLY JSON matching the provided schema.");
819
- await pc.addInstruction(decisionRules.join("\n"));
820
- return pc.build();
821
- }
822
- /**
823
- * Build schema for step selection
824
- * @private
825
- */
826
- buildStepSelectionSchema(validSteps, includeCompletion = false) {
827
- const stepIds = validSteps.map((s) => s.id);
828
- // Add completion option if requested (when required fields are complete)
829
- if (includeCompletion) {
830
- stepIds.push('__COMPLETE__');
831
- }
832
- return {
833
- description: "Step transition decision based on conversation context and collected data",
834
- type: "object",
835
- properties: {
836
- reasoning: {
837
- type: "string",
838
- nullable: false,
839
- description: "Brief explanation of why this step was selected",
840
- },
841
- selectedStepId: {
842
- type: "string",
843
- nullable: false,
844
- description: includeCompletion
845
- ? "The ID of the selected step to transition to, or '__COMPLETE__' to complete the flow"
846
- : "The ID of the selected step to transition to",
847
- enum: stepIds,
848
- },
849
- responseDirectives: {
850
- type: "array",
851
- items: { type: "string" },
852
- description: "Optional bullet points the response should address (concise)",
853
- },
854
- },
855
- required: ["reasoning", "selectedStepId"],
856
- additionalProperties: false,
857
- };
858
- }
859
- buildDynamicFlowSchema(routes, extrasSchema, activeFlowSteps) {
860
- const routeIds = routes.map((r) => r.id);
861
- const routeProperties = {};
862
- for (const id of routeIds) {
863
- routeProperties[id] = {
864
- type: "number",
865
- nullable: false,
866
- description: `Score for flow ${id} based on direct evidence, context and semantic fit (0-100)`,
867
- minimum: 0,
868
- maximum: 100,
869
- };
870
- }
871
- const base = {
872
- description: "Full intent analysis: score ALL available flows (0-100) using evidence and context",
873
- type: "object",
874
- properties: {
875
- context: {
876
- type: "string",
877
- nullable: false,
878
- description: "Brief summary of the user's intent/context",
879
- },
880
- flows: {
881
- type: "object",
882
- properties: routeProperties,
883
- required: routeIds,
884
- nullable: false,
885
- description: "Mapping of flowId to score (0-100)",
886
- },
887
- responseDirectives: {
888
- type: "array",
889
- items: { type: "string" },
890
- description: "Optional bullet points the response should address (concise)",
891
- },
892
- },
893
- required: ["context", "flows"],
894
- additionalProperties: false,
895
- };
896
- // Add step selection fields if there's an active flow with steps
897
- if (activeFlowSteps && activeFlowSteps.length > 0) {
898
- base.properties = base.properties || {};
899
- base.properties.selectedStepId = {
900
- type: "string",
901
- nullable: false,
902
- description: "The step ID to transition to within the active flow (required if continuing in current flow)",
903
- enum: activeFlowSteps.map((s) => s.id),
904
- };
905
- base.properties.stepReasoning = {
906
- type: "string",
907
- nullable: false,
908
- description: "Brief explanation of why this step was selected",
909
- };
910
- base.required = [
911
- ...(base.required || []),
912
- "selectedStepId",
913
- "stepReasoning",
914
- ];
915
- }
916
- if (extrasSchema) {
917
- base.properties = base.properties || {};
918
- base.properties.extractions = extrasSchema;
919
- }
920
- return base;
921
- }
922
- async buildRoutingPrompt(params) {
923
- const { history, flows: routes, lastMessage, agentOptions, session, activeFlowSteps, context, } = params;
924
- const templateContext = (0, index_js_3.createTemplateContext)({ context, session, history });
925
- const pc = new PromptComposer_js_1.PromptComposer(templateContext, this.options?.promptSectionCache);
926
- if (agentOptions) {
927
- await pc.addAgentMeta(agentOptions);
928
- }
929
- await pc.addInstruction("Task: Intent analysis and route scoring (0-100). Score ALL listed routes.");
930
- // Add session context if available
931
- if (session?.currentFlow) {
932
- const sessionInfo = [
933
- "Current conversation context:",
934
- `- Active route: ${session.currentFlow.title} (${session.currentFlow.id})`,
935
- ];
936
- if (session.currentStep) {
937
- sessionInfo.push(`- Current step: ${session.currentStep.id}`);
938
- if (session.currentStep.description) {
939
- sessionInfo.push(` "${session.currentStep.description}"`);
940
- }
941
- }
942
- if (session.data && Object.keys(session.data).length > 0) {
943
- sessionInfo.push(`- Collected data: ${JSON.stringify(session.data)}`);
944
- }
945
- sessionInfo.push("Note: User is mid-conversation. They may want to continue current route or switch to a new one based on their intent.");
946
- await pc.addInstruction(sessionInfo.join("\n"));
947
- // Add cross-route completion status
948
- const completionStatus = this.getFlowCompletionStatus(routes, session.data || {});
949
- const completedFlows = this.evaluateFlowCompletions(routes, session.data || {});
950
- if (completionStatus.size > 0) {
951
- const statusInfo = [
952
- "",
953
- "Flow completion status based on collected data:",
954
- ];
955
- for (const route of routes) {
956
- const progress = completionStatus.get(route.id) || 0;
957
- const isComplete = completedFlows.includes(route);
958
- const progressPercent = Math.round(progress * 100);
959
- statusInfo.push(`- ${route.title}: ${progressPercent}% complete${isComplete ? ' ✓ COMPLETE' : ''}`);
960
- if (!isComplete && route.requiredFields) {
961
- const missingFields = route.getMissingRequiredFields(session.data || {});
962
- if (missingFields.length > 0) {
963
- statusInfo.push(` Missing: ${missingFields.join(', ')}`);
964
- }
965
- }
966
- }
967
- statusInfo.push("", "Consider route completion status when scoring. Partially complete routes may be good candidates for continuation.");
968
- await pc.addInstruction(statusInfo.join("\n"));
969
- }
970
- // Add available steps for the active route
971
- if (activeFlowSteps && activeFlowSteps.length > 0) {
972
- const stepInfo = [
973
- "",
974
- "Available steps in active route (choose one to transition to):",
975
- ];
976
- const activeStepConditionContext = [];
977
- const activeStepExclusionContext = [];
978
- for (const step of activeFlowSteps) {
979
- const idx = activeFlowSteps.indexOf(step);
980
- stepInfo.push(`${idx + 1}. Step: ${step.id}`);
981
- if (step.description) {
982
- stepInfo.push(` Description: ${step.description}`);
983
- }
984
- // Collect AI context from step conditions
985
- if (step.when) {
986
- const whenResult = await step.evaluateWhen(templateContext);
987
- if (whenResult.aiContextStrings.length > 0) {
988
- stepInfo.push(` When any condition matches: ${whenResult.aiContextStrings.join(" OR ")}`);
989
- activeStepConditionContext.push(...whenResult.aiContextStrings);
990
- }
991
- if (whenResult.aiExclusionStrings.length > 0) {
992
- stepInfo.push(` Do not choose when any condition matches: ${whenResult.aiExclusionStrings.join(" OR ")}`);
993
- activeStepExclusionContext.push(...whenResult.aiExclusionStrings);
994
- }
995
- }
996
- if (step.requires && step.requires.length > 0) {
997
- stepInfo.push(` Required data: ${step.requires.join(", ")}`);
998
- }
999
- if (step.collect && step.collect.length > 0) {
1000
- stepInfo.push(` Will collect: ${step.collect.join(", ")}`);
1001
- }
1002
- }
1003
- stepInfo.push("");
1004
- stepInfo.push("IMPORTANT: You MUST select a step to transition to. Evaluate which step makes the most sense based on:");
1005
- stepInfo.push("- The conversation flow and what's been collected");
1006
- stepInfo.push("- What data is still needed vs already present");
1007
- stepInfo.push("- The logical next step in the conversation");
1008
- stepInfo.push("- Whether conditions for steps are met");
1009
- await pc.addInstruction(stepInfo.join("\n"));
1010
- // Add active step condition context if available
1011
- if (activeStepConditionContext.length > 0) {
1012
- await pc.addInstruction([
1013
- "",
1014
- "Additional context from step conditions:",
1015
- ...activeStepConditionContext.map(ctx => `- ${ctx}`),
1016
- "",
1017
- "Use this context to inform your step selection decision.",
1018
- ].join("\n"));
1019
- }
1020
- if (activeStepExclusionContext.length > 0) {
1021
- await pc.addInstruction([
1022
- "",
1023
- "Additional step exclusion context:",
1024
- ...activeStepExclusionContext.map(ctx => `- ${ctx}`),
1025
- "",
1026
- "Avoid selecting steps when their exclusion context matches.",
1027
- ].join("\n"));
1028
- }
1029
- }
1030
- }
1031
- await pc.addInteractionHistory(history);
1032
- await pc.addLastMessage(lastMessage);
1033
- await pc.addFlowOverview(routes);
1034
- await pc.addInstruction([
1035
- "Scoring rules:",
1036
- "- 90-100: explicit keywords + clear intent",
1037
- "- 70-89: strong contextual evidence + relevant keywords",
1038
- "- 50-69: moderate relevance",
1039
- "- 30-49: weak connection or ambiguous",
1040
- "- 0-29: minimal/none",
1041
- "Return ONLY JSON matching the provided schema. Include scores for ALL routes.",
1042
- ].join("\n"));
1043
- return pc.build();
1044
- }
1045
- }
1046
- exports.FlowRouter = FlowRouter;
1047
- //# sourceMappingURL=FlowRouter.js.map