@falai/agent 3.4.5 → 4.0.0-alpha.10

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 (865) hide show
  1. package/README.md +41 -34
  2. package/dist/cjs/core/Agent.d.ts +29 -378
  3. package/dist/cjs/core/Agent.d.ts.map +1 -1
  4. package/dist/cjs/core/Agent.js +113 -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 +573 -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 +149 -0
  20. package/dist/cjs/core/Prompt.js.map +1 -0
  21. package/dist/cjs/core/Runner.d.ts +171 -0
  22. package/dist/cjs/core/Runner.d.ts.map +1 -0
  23. package/dist/cjs/core/Runner.js +1158 -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 +373 -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 +357 -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 +11 -6
  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/providers/ZaiProvider.d.ts +6 -4
  100. package/dist/cjs/providers/ZaiProvider.d.ts.map +1 -1
  101. package/dist/cjs/providers/ZaiProvider.js +6 -4
  102. package/dist/cjs/providers/ZaiProvider.js.map +1 -1
  103. package/dist/cjs/types/agent.d.ts +163 -383
  104. package/dist/cjs/types/agent.d.ts.map +1 -1
  105. package/dist/cjs/types/agent.js +1 -1
  106. package/dist/cjs/types/ai.d.ts +32 -1
  107. package/dist/cjs/types/ai.d.ts.map +1 -1
  108. package/dist/cjs/types/compaction.d.ts +3 -1
  109. package/dist/cjs/types/compaction.d.ts.map +1 -1
  110. package/dist/cjs/types/errors.d.ts +9 -12
  111. package/dist/cjs/types/errors.d.ts.map +1 -1
  112. package/dist/cjs/types/errors.js +14 -17
  113. package/dist/cjs/types/errors.js.map +1 -1
  114. package/dist/cjs/types/flow.d.ts +265 -513
  115. package/dist/cjs/types/flow.d.ts.map +1 -1
  116. package/dist/cjs/types/flow.js +7 -1
  117. package/dist/cjs/types/flow.js.map +1 -1
  118. package/dist/cjs/types/history.d.ts +7 -18
  119. package/dist/cjs/types/history.d.ts.map +1 -1
  120. package/dist/cjs/types/history.js.map +1 -1
  121. package/dist/cjs/types/index.d.ts +9 -15
  122. package/dist/cjs/types/index.d.ts.map +1 -1
  123. package/dist/cjs/types/index.js +4 -14
  124. package/dist/cjs/types/index.js.map +1 -1
  125. package/dist/cjs/types/session.d.ts +94 -64
  126. package/dist/cjs/types/session.d.ts.map +1 -1
  127. package/dist/cjs/types/session.js +5 -1
  128. package/dist/cjs/types/session.js.map +1 -1
  129. package/dist/cjs/types/tool.d.ts +37 -207
  130. package/dist/cjs/types/tool.d.ts.map +1 -1
  131. package/dist/cjs/types/tool.js +5 -14
  132. package/dist/cjs/types/tool.js.map +1 -1
  133. package/dist/cjs/utils/clock.d.ts +28 -0
  134. package/dist/cjs/utils/clock.d.ts.map +1 -0
  135. package/dist/cjs/utils/clock.js +64 -0
  136. package/dist/cjs/utils/clock.js.map +1 -0
  137. package/dist/cjs/utils/duration.d.ts +11 -0
  138. package/dist/cjs/utils/duration.d.ts.map +1 -0
  139. package/dist/cjs/utils/duration.js +31 -0
  140. package/dist/cjs/utils/duration.js.map +1 -0
  141. package/dist/cjs/utils/history.d.ts +4 -1
  142. package/dist/cjs/utils/history.d.ts.map +1 -1
  143. package/dist/cjs/utils/history.js +2 -2
  144. package/dist/cjs/utils/history.js.map +1 -1
  145. package/dist/cjs/utils/index.d.ts +4 -10
  146. package/dist/cjs/utils/index.d.ts.map +1 -1
  147. package/dist/cjs/utils/index.js +14 -61
  148. package/dist/cjs/utils/index.js.map +1 -1
  149. package/dist/cjs/utils/json.d.ts +2 -0
  150. package/dist/cjs/utils/json.d.ts.map +1 -1
  151. package/dist/cjs/utils/json.js +5 -0
  152. package/dist/cjs/utils/json.js.map +1 -1
  153. package/dist/cjs/utils/outcomes.d.ts +48 -0
  154. package/dist/cjs/utils/outcomes.d.ts.map +1 -0
  155. package/dist/cjs/utils/outcomes.js +51 -0
  156. package/dist/cjs/utils/outcomes.js.map +1 -0
  157. package/dist/cjs/utils/phrases.d.ts +25 -0
  158. package/dist/cjs/utils/phrases.d.ts.map +1 -0
  159. package/dist/cjs/utils/phrases.js +38 -0
  160. package/dist/cjs/utils/phrases.js.map +1 -0
  161. package/dist/cjs/utils/schema.d.ts +50 -0
  162. package/dist/cjs/utils/schema.d.ts.map +1 -0
  163. package/dist/cjs/utils/schema.js +138 -0
  164. package/dist/cjs/utils/schema.js.map +1 -0
  165. package/dist/cjs/utils/streamingMessage.d.ts +3 -2
  166. package/dist/cjs/utils/streamingMessage.d.ts.map +1 -1
  167. package/dist/cjs/utils/streamingMessage.js +38 -4
  168. package/dist/cjs/utils/streamingMessage.js.map +1 -1
  169. package/dist/cjs/utils/template.d.ts +22 -150
  170. package/dist/cjs/utils/template.d.ts.map +1 -1
  171. package/dist/cjs/utils/template.js +64 -359
  172. package/dist/cjs/utils/template.js.map +1 -1
  173. package/dist/cjs/utils/usage.d.ts +19 -0
  174. package/dist/cjs/utils/usage.d.ts.map +1 -0
  175. package/dist/cjs/utils/usage.js +35 -0
  176. package/dist/cjs/utils/usage.js.map +1 -0
  177. package/dist/core/Agent.d.ts +29 -378
  178. package/dist/core/Agent.d.ts.map +1 -1
  179. package/dist/core/Agent.js +116 -1181
  180. package/dist/core/Agent.js.map +1 -1
  181. package/dist/core/CompactionEngine.d.ts.map +1 -1
  182. package/dist/core/CompactionEngine.js +5 -3
  183. package/dist/core/CompactionEngine.js.map +1 -1
  184. package/dist/core/FlowSpec.d.ts +136 -0
  185. package/dist/core/FlowSpec.d.ts.map +1 -0
  186. package/dist/core/FlowSpec.js +567 -0
  187. package/dist/core/FlowSpec.js.map +1 -0
  188. package/dist/core/Migrate.d.ts +38 -0
  189. package/dist/core/Migrate.d.ts.map +1 -0
  190. package/dist/core/Migrate.js +264 -0
  191. package/dist/core/Migrate.js.map +1 -0
  192. package/dist/core/Prompt.d.ts +54 -0
  193. package/dist/core/Prompt.d.ts.map +1 -0
  194. package/dist/core/Prompt.js +139 -0
  195. package/dist/core/Prompt.js.map +1 -0
  196. package/dist/core/Runner.d.ts +171 -0
  197. package/dist/core/Runner.d.ts.map +1 -0
  198. package/dist/core/Runner.js +1154 -0
  199. package/dist/core/Runner.js.map +1 -0
  200. package/dist/core/Speak.d.ts +37 -0
  201. package/dist/core/Speak.d.ts.map +1 -0
  202. package/dist/core/Speak.js +369 -0
  203. package/dist/core/Speak.js.map +1 -0
  204. package/dist/core/Understand.d.ts +28 -0
  205. package/dist/core/Understand.d.ts.map +1 -0
  206. package/dist/core/Understand.js +353 -0
  207. package/dist/core/Understand.js.map +1 -0
  208. package/dist/core/contracts.d.ts +122 -0
  209. package/dist/core/contracts.d.ts.map +1 -0
  210. package/dist/core/contracts.js +10 -0
  211. package/dist/core/contracts.js.map +1 -0
  212. package/dist/core/falai.d.ts +57 -0
  213. package/dist/core/falai.d.ts.map +1 -0
  214. package/dist/core/falai.js +40 -0
  215. package/dist/core/falai.js.map +1 -0
  216. package/dist/core/predicate.d.ts +9 -0
  217. package/dist/core/predicate.d.ts.map +1 -0
  218. package/dist/core/predicate.js +54 -0
  219. package/dist/core/predicate.js.map +1 -0
  220. package/dist/index.d.ts +26 -31
  221. package/dist/index.d.ts.map +1 -1
  222. package/dist/index.js +19 -24
  223. package/dist/index.js.map +1 -1
  224. package/dist/persistence/MemoryStore.d.ts +15 -0
  225. package/dist/persistence/MemoryStore.d.ts.map +1 -0
  226. package/dist/persistence/MemoryStore.js +35 -0
  227. package/dist/persistence/MemoryStore.js.map +1 -0
  228. package/dist/persistence/MongoStore.d.ts +42 -0
  229. package/dist/persistence/MongoStore.d.ts.map +1 -0
  230. package/dist/persistence/MongoStore.js +56 -0
  231. package/dist/persistence/MongoStore.js.map +1 -0
  232. package/dist/persistence/OpenSearchStore.d.ts +86 -0
  233. package/dist/persistence/OpenSearchStore.d.ts.map +1 -0
  234. package/dist/persistence/OpenSearchStore.js +116 -0
  235. package/dist/persistence/OpenSearchStore.js.map +1 -0
  236. package/dist/persistence/PostgresStore.d.ts +41 -0
  237. package/dist/persistence/PostgresStore.d.ts.map +1 -0
  238. package/dist/persistence/PostgresStore.js +54 -0
  239. package/dist/persistence/PostgresStore.js.map +1 -0
  240. package/dist/persistence/PrismaStore.d.ts +65 -0
  241. package/dist/persistence/PrismaStore.d.ts.map +1 -0
  242. package/dist/persistence/PrismaStore.js +91 -0
  243. package/dist/persistence/PrismaStore.js.map +1 -0
  244. package/dist/persistence/RedisStore.d.ts +34 -0
  245. package/dist/persistence/RedisStore.d.ts.map +1 -0
  246. package/dist/persistence/RedisStore.js +57 -0
  247. package/dist/persistence/RedisStore.js.map +1 -0
  248. package/dist/persistence/SQLiteStore.d.ts +45 -0
  249. package/dist/persistence/SQLiteStore.d.ts.map +1 -0
  250. package/dist/persistence/SQLiteStore.js +70 -0
  251. package/dist/persistence/SQLiteStore.js.map +1 -0
  252. package/dist/persistence/sessionRow.d.ts +14 -0
  253. package/dist/persistence/sessionRow.d.ts.map +1 -0
  254. package/dist/persistence/sessionRow.js +45 -0
  255. package/dist/persistence/sessionRow.js.map +1 -0
  256. package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
  257. package/dist/providers/DeepSeekProvider.js +8 -3
  258. package/dist/providers/DeepSeekProvider.js.map +1 -1
  259. package/dist/providers/GeminiProvider.d.ts +4 -3
  260. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  261. package/dist/providers/GeminiProvider.js +4 -3
  262. package/dist/providers/GeminiProvider.js.map +1 -1
  263. package/dist/providers/OpenAICompatibleProvider.d.ts +4 -0
  264. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  265. package/dist/providers/OpenAICompatibleProvider.js +2 -0
  266. package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
  267. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  268. package/dist/providers/OpenRouterProvider.js +2 -4
  269. package/dist/providers/OpenRouterProvider.js.map +1 -1
  270. package/dist/providers/ProviderAdapter.d.ts +11 -6
  271. package/dist/providers/ProviderAdapter.d.ts.map +1 -1
  272. package/dist/providers/ProviderAdapter.js +34 -11
  273. package/dist/providers/ProviderAdapter.js.map +1 -1
  274. package/dist/providers/ZaiProvider.d.ts +6 -4
  275. package/dist/providers/ZaiProvider.d.ts.map +1 -1
  276. package/dist/providers/ZaiProvider.js +6 -4
  277. package/dist/providers/ZaiProvider.js.map +1 -1
  278. package/dist/types/agent.d.ts +163 -383
  279. package/dist/types/agent.d.ts.map +1 -1
  280. package/dist/types/agent.js +1 -1
  281. package/dist/types/ai.d.ts +32 -1
  282. package/dist/types/ai.d.ts.map +1 -1
  283. package/dist/types/compaction.d.ts +3 -1
  284. package/dist/types/compaction.d.ts.map +1 -1
  285. package/dist/types/errors.d.ts +9 -12
  286. package/dist/types/errors.d.ts.map +1 -1
  287. package/dist/types/errors.js +12 -15
  288. package/dist/types/errors.js.map +1 -1
  289. package/dist/types/flow.d.ts +265 -513
  290. package/dist/types/flow.d.ts.map +1 -1
  291. package/dist/types/flow.js +7 -1
  292. package/dist/types/flow.js.map +1 -1
  293. package/dist/types/history.d.ts +7 -18
  294. package/dist/types/history.d.ts.map +1 -1
  295. package/dist/types/history.js.map +1 -1
  296. package/dist/types/index.d.ts +9 -15
  297. package/dist/types/index.d.ts.map +1 -1
  298. package/dist/types/index.js +2 -7
  299. package/dist/types/index.js.map +1 -1
  300. package/dist/types/session.d.ts +94 -64
  301. package/dist/types/session.d.ts.map +1 -1
  302. package/dist/types/session.js +5 -1
  303. package/dist/types/session.js.map +1 -1
  304. package/dist/types/tool.d.ts +37 -207
  305. package/dist/types/tool.d.ts.map +1 -1
  306. package/dist/types/tool.js +6 -13
  307. package/dist/types/tool.js.map +1 -1
  308. package/dist/utils/clock.d.ts +28 -0
  309. package/dist/utils/clock.d.ts.map +1 -0
  310. package/dist/utils/clock.js +59 -0
  311. package/dist/utils/clock.js.map +1 -0
  312. package/dist/utils/duration.d.ts +11 -0
  313. package/dist/utils/duration.d.ts.map +1 -0
  314. package/dist/utils/duration.js +26 -0
  315. package/dist/utils/duration.js.map +1 -0
  316. package/dist/utils/history.d.ts +4 -1
  317. package/dist/utils/history.d.ts.map +1 -1
  318. package/dist/utils/history.js +2 -2
  319. package/dist/utils/history.js.map +1 -1
  320. package/dist/utils/index.d.ts +4 -10
  321. package/dist/utils/index.d.ts.map +1 -1
  322. package/dist/utils/index.js +4 -21
  323. package/dist/utils/index.js.map +1 -1
  324. package/dist/utils/json.d.ts +2 -0
  325. package/dist/utils/json.d.ts.map +1 -1
  326. package/dist/utils/json.js +4 -0
  327. package/dist/utils/json.js.map +1 -1
  328. package/dist/utils/outcomes.d.ts +48 -0
  329. package/dist/utils/outcomes.d.ts.map +1 -0
  330. package/dist/utils/outcomes.js +48 -0
  331. package/dist/utils/outcomes.js.map +1 -0
  332. package/dist/utils/phrases.d.ts +25 -0
  333. package/dist/utils/phrases.d.ts.map +1 -0
  334. package/dist/utils/phrases.js +35 -0
  335. package/dist/utils/phrases.js.map +1 -0
  336. package/dist/utils/schema.d.ts +50 -0
  337. package/dist/utils/schema.d.ts.map +1 -0
  338. package/dist/utils/schema.js +129 -0
  339. package/dist/utils/schema.js.map +1 -0
  340. package/dist/utils/streamingMessage.d.ts +3 -2
  341. package/dist/utils/streamingMessage.d.ts.map +1 -1
  342. package/dist/utils/streamingMessage.js +38 -4
  343. package/dist/utils/streamingMessage.js.map +1 -1
  344. package/dist/utils/template.d.ts +22 -150
  345. package/dist/utils/template.d.ts.map +1 -1
  346. package/dist/utils/template.js +61 -351
  347. package/dist/utils/template.js.map +1 -1
  348. package/dist/utils/usage.d.ts +19 -0
  349. package/dist/utils/usage.d.ts.map +1 -0
  350. package/dist/utils/usage.js +31 -0
  351. package/dist/utils/usage.js.map +1 -0
  352. package/docs/README.md +37 -19
  353. package/docs/concepts/architecture.md +117 -239
  354. package/docs/concepts/collection.md +170 -0
  355. package/docs/concepts/pipeline.md +132 -378
  356. package/docs/concepts/runs-and-waits.md +192 -0
  357. package/docs/guides/actions-and-events.md +276 -0
  358. package/docs/guides/branching.md +119 -208
  359. package/docs/guides/compaction.md +63 -158
  360. package/docs/guides/conditions.md +164 -128
  361. package/docs/guides/error-handling.md +170 -164
  362. package/docs/guides/flow-control.md +210 -349
  363. package/docs/guides/flows-from-json.md +224 -0
  364. package/docs/guides/instructions.md +125 -161
  365. package/docs/guides/persistence.md +182 -206
  366. package/docs/guides/streaming.md +50 -114
  367. package/docs/guides/testing.md +284 -0
  368. package/docs/guides/triggers.md +401 -0
  369. package/docs/migration/README.md +8 -15
  370. package/docs/migration/v1-to-v2.md +1 -1
  371. package/docs/migration/v2-3-to-v2-4.md +2 -2
  372. package/docs/migration/v2-6-to-v2-7.md +4 -4
  373. package/docs/migration/v3-to-v4.md +457 -0
  374. package/docs/reference/actions-events-conditions.md +396 -0
  375. package/docs/reference/agent.md +248 -0
  376. package/docs/reference/branches.md +75 -203
  377. package/docs/reference/errors.md +188 -144
  378. package/docs/reference/fields.md +125 -0
  379. package/docs/reference/flow-spec.md +248 -0
  380. package/docs/reference/flow.md +104 -192
  381. package/docs/reference/instruction.md +83 -137
  382. package/docs/reference/outcomes.md +273 -0
  383. package/docs/reference/providers.md +525 -302
  384. package/docs/reference/session.md +210 -0
  385. package/docs/reference/step.md +194 -312
  386. package/docs/reference/stores.md +496 -0
  387. package/docs/reference/tool.md +162 -231
  388. package/docs/reference/trigger.md +200 -0
  389. package/docs/rfc/v4-one-flow.md +477 -0
  390. package/docs/start/01-install.md +59 -44
  391. package/docs/start/02-first-agent.md +97 -147
  392. package/docs/start/03-collect-data.md +78 -183
  393. package/docs/start/04-add-tools.md +159 -227
  394. package/docs/start/05-go-to-production.md +181 -163
  395. package/examples/01-quickstart.ts +26 -16
  396. package/examples/02-fields.ts +75 -0
  397. package/examples/03-tools.ts +79 -119
  398. package/examples/04-instructions.ts +60 -87
  399. package/examples/05-branches.ts +78 -0
  400. package/examples/06-triggers-and-waits.ts +149 -0
  401. package/examples/07-streaming.ts +34 -60
  402. package/examples/08-store-and-migration.ts +97 -0
  403. package/examples/09-flows-from-json.ts +107 -0
  404. package/package.json +11 -6
  405. package/src/core/Agent.ts +126 -1512
  406. package/src/core/CompactionEngine.ts +7 -4
  407. package/src/core/FlowSpec.ts +778 -0
  408. package/src/core/Migrate.ts +256 -0
  409. package/src/core/Prompt.ts +162 -0
  410. package/src/core/Runner.ts +1214 -0
  411. package/src/core/Speak.ts +460 -0
  412. package/src/core/Understand.ts +423 -0
  413. package/src/core/contracts.ts +111 -0
  414. package/src/core/falai.ts +86 -0
  415. package/src/core/predicate.ts +56 -0
  416. package/src/index.ts +120 -147
  417. package/src/persistence/MemoryStore.ts +37 -0
  418. package/src/persistence/MongoStore.ts +89 -0
  419. package/src/persistence/OpenSearchStore.ts +153 -0
  420. package/src/persistence/PostgresStore.ts +89 -0
  421. package/src/persistence/PrismaStore.ts +127 -0
  422. package/src/persistence/RedisStore.ts +90 -0
  423. package/src/persistence/SQLiteStore.ts +103 -0
  424. package/src/persistence/sessionRow.ts +45 -0
  425. package/src/providers/DeepSeekProvider.ts +8 -3
  426. package/src/providers/GeminiProvider.ts +4 -3
  427. package/src/providers/OpenAICompatibleProvider.ts +6 -0
  428. package/src/providers/OpenRouterProvider.ts +2 -4
  429. package/src/providers/ProviderAdapter.ts +46 -13
  430. package/src/providers/ZaiProvider.ts +6 -4
  431. package/src/types/agent.ts +135 -397
  432. package/src/types/ai.ts +33 -1
  433. package/src/types/compaction.ts +3 -1
  434. package/src/types/errors.ts +13 -16
  435. package/src/types/flow.ts +249 -550
  436. package/src/types/history.ts +7 -20
  437. package/src/types/index.ts +88 -139
  438. package/src/types/session.ts +135 -70
  439. package/src/types/tool.ts +42 -267
  440. package/src/utils/clock.ts +70 -0
  441. package/src/utils/duration.ts +33 -0
  442. package/src/utils/history.ts +3 -2
  443. package/src/utils/index.ts +8 -66
  444. package/src/utils/json.ts +5 -0
  445. package/src/utils/outcomes.ts +56 -0
  446. package/src/utils/phrases.ts +40 -0
  447. package/src/utils/schema.ts +145 -0
  448. package/src/utils/streamingMessage.ts +34 -4
  449. package/src/utils/template.ts +63 -418
  450. package/src/utils/usage.ts +37 -0
  451. package/dist/adapters/MemoryAdapter.d.ts +0 -47
  452. package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
  453. package/dist/adapters/MemoryAdapter.js +0 -204
  454. package/dist/adapters/MemoryAdapter.js.map +0 -1
  455. package/dist/adapters/MongoAdapter.d.ts +0 -97
  456. package/dist/adapters/MongoAdapter.d.ts.map +0 -1
  457. package/dist/adapters/MongoAdapter.js +0 -196
  458. package/dist/adapters/MongoAdapter.js.map +0 -1
  459. package/dist/adapters/OpenSearchAdapter.d.ts +0 -169
  460. package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
  461. package/dist/adapters/OpenSearchAdapter.js +0 -471
  462. package/dist/adapters/OpenSearchAdapter.js.map +0 -1
  463. package/dist/adapters/PostgreSQLAdapter.d.ts +0 -85
  464. package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  465. package/dist/adapters/PostgreSQLAdapter.js +0 -308
  466. package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
  467. package/dist/adapters/PrismaAdapter.d.ts +0 -115
  468. package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
  469. package/dist/adapters/PrismaAdapter.js +0 -406
  470. package/dist/adapters/PrismaAdapter.js.map +0 -1
  471. package/dist/adapters/RedisAdapter.d.ts +0 -72
  472. package/dist/adapters/RedisAdapter.d.ts.map +0 -1
  473. package/dist/adapters/RedisAdapter.js +0 -286
  474. package/dist/adapters/RedisAdapter.js.map +0 -1
  475. package/dist/adapters/SQLiteAdapter.d.ts +0 -86
  476. package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
  477. package/dist/adapters/SQLiteAdapter.js +0 -337
  478. package/dist/adapters/SQLiteAdapter.js.map +0 -1
  479. package/dist/adapters/index.d.ts +0 -17
  480. package/dist/adapters/index.d.ts.map +0 -1
  481. package/dist/adapters/index.js +0 -11
  482. package/dist/adapters/index.js.map +0 -1
  483. package/dist/adapters/sessionRow.d.ts +0 -22
  484. package/dist/adapters/sessionRow.d.ts.map +0 -1
  485. package/dist/adapters/sessionRow.js +0 -48
  486. package/dist/adapters/sessionRow.js.map +0 -1
  487. package/dist/cjs/adapters/MemoryAdapter.d.ts +0 -47
  488. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
  489. package/dist/cjs/adapters/MemoryAdapter.js +0 -208
  490. package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
  491. package/dist/cjs/adapters/MongoAdapter.d.ts +0 -97
  492. package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
  493. package/dist/cjs/adapters/MongoAdapter.js +0 -200
  494. package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
  495. package/dist/cjs/adapters/OpenSearchAdapter.d.ts +0 -169
  496. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
  497. package/dist/cjs/adapters/OpenSearchAdapter.js +0 -475
  498. package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
  499. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +0 -85
  500. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  501. package/dist/cjs/adapters/PostgreSQLAdapter.js +0 -312
  502. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
  503. package/dist/cjs/adapters/PrismaAdapter.d.ts +0 -115
  504. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
  505. package/dist/cjs/adapters/PrismaAdapter.js +0 -410
  506. package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
  507. package/dist/cjs/adapters/RedisAdapter.d.ts +0 -72
  508. package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
  509. package/dist/cjs/adapters/RedisAdapter.js +0 -290
  510. package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
  511. package/dist/cjs/adapters/SQLiteAdapter.d.ts +0 -86
  512. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
  513. package/dist/cjs/adapters/SQLiteAdapter.js +0 -341
  514. package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
  515. package/dist/cjs/adapters/index.d.ts +0 -17
  516. package/dist/cjs/adapters/index.d.ts.map +0 -1
  517. package/dist/cjs/adapters/index.js +0 -21
  518. package/dist/cjs/adapters/index.js.map +0 -1
  519. package/dist/cjs/adapters/sessionRow.d.ts +0 -22
  520. package/dist/cjs/adapters/sessionRow.d.ts.map +0 -1
  521. package/dist/cjs/adapters/sessionRow.js +0 -52
  522. package/dist/cjs/adapters/sessionRow.js.map +0 -1
  523. package/dist/cjs/constants/index.d.ts +0 -1
  524. package/dist/cjs/constants/index.d.ts.map +0 -1
  525. package/dist/cjs/constants/index.js +0 -4
  526. package/dist/cjs/constants/index.js.map +0 -1
  527. package/dist/cjs/core/AutoChainExecutor.d.ts +0 -97
  528. package/dist/cjs/core/AutoChainExecutor.d.ts.map +0 -1
  529. package/dist/cjs/core/AutoChainExecutor.js +0 -288
  530. package/dist/cjs/core/AutoChainExecutor.js.map +0 -1
  531. package/dist/cjs/core/BranchEvaluator.d.ts +0 -55
  532. package/dist/cjs/core/BranchEvaluator.d.ts.map +0 -1
  533. package/dist/cjs/core/BranchEvaluator.js +0 -125
  534. package/dist/cjs/core/BranchEvaluator.js.map +0 -1
  535. package/dist/cjs/core/DirectiveChainTracker.d.ts +0 -49
  536. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +0 -1
  537. package/dist/cjs/core/DirectiveChainTracker.js +0 -121
  538. package/dist/cjs/core/DirectiveChainTracker.js.map +0 -1
  539. package/dist/cjs/core/Events.d.ts +0 -26
  540. package/dist/cjs/core/Events.d.ts.map +0 -1
  541. package/dist/cjs/core/Events.js +0 -144
  542. package/dist/cjs/core/Events.js.map +0 -1
  543. package/dist/cjs/core/Flow.d.ts +0 -183
  544. package/dist/cjs/core/Flow.d.ts.map +0 -1
  545. package/dist/cjs/core/Flow.js +0 -551
  546. package/dist/cjs/core/Flow.js.map +0 -1
  547. package/dist/cjs/core/FlowRouter.d.ts +0 -183
  548. package/dist/cjs/core/FlowRouter.d.ts.map +0 -1
  549. package/dist/cjs/core/FlowRouter.js +0 -1047
  550. package/dist/cjs/core/FlowRouter.js.map +0 -1
  551. package/dist/cjs/core/PersistenceManager.d.ts +0 -114
  552. package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
  553. package/dist/cjs/core/PersistenceManager.js +0 -336
  554. package/dist/cjs/core/PersistenceManager.js.map +0 -1
  555. package/dist/cjs/core/PromptComposer.d.ts +0 -47
  556. package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
  557. package/dist/cjs/core/PromptComposer.js +0 -397
  558. package/dist/cjs/core/PromptComposer.js.map +0 -1
  559. package/dist/cjs/core/PromptSectionCache.d.ts +0 -48
  560. package/dist/cjs/core/PromptSectionCache.d.ts.map +0 -1
  561. package/dist/cjs/core/PromptSectionCache.js +0 -108
  562. package/dist/cjs/core/PromptSectionCache.js.map +0 -1
  563. package/dist/cjs/core/ResponseEngine.d.ts +0 -43
  564. package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
  565. package/dist/cjs/core/ResponseEngine.js +0 -235
  566. package/dist/cjs/core/ResponseEngine.js.map +0 -1
  567. package/dist/cjs/core/ResponseGenerationError.d.ts +0 -30
  568. package/dist/cjs/core/ResponseGenerationError.d.ts.map +0 -1
  569. package/dist/cjs/core/ResponseGenerationError.js +0 -35
  570. package/dist/cjs/core/ResponseGenerationError.js.map +0 -1
  571. package/dist/cjs/core/ResponseModal.d.ts +0 -305
  572. package/dist/cjs/core/ResponseModal.d.ts.map +0 -1
  573. package/dist/cjs/core/ResponseModal.js +0 -1414
  574. package/dist/cjs/core/ResponseModal.js.map +0 -1
  575. package/dist/cjs/core/ResponsePipeline.d.ts +0 -220
  576. package/dist/cjs/core/ResponsePipeline.d.ts.map +0 -1
  577. package/dist/cjs/core/ResponsePipeline.js +0 -1040
  578. package/dist/cjs/core/ResponsePipeline.js.map +0 -1
  579. package/dist/cjs/core/SessionFinalizer.d.ts +0 -34
  580. package/dist/cjs/core/SessionFinalizer.d.ts.map +0 -1
  581. package/dist/cjs/core/SessionFinalizer.js +0 -88
  582. package/dist/cjs/core/SessionFinalizer.js.map +0 -1
  583. package/dist/cjs/core/SessionManager.d.ts +0 -112
  584. package/dist/cjs/core/SessionManager.d.ts.map +0 -1
  585. package/dist/cjs/core/SessionManager.js +0 -308
  586. package/dist/cjs/core/SessionManager.js.map +0 -1
  587. package/dist/cjs/core/SignalCoordinator.d.ts +0 -103
  588. package/dist/cjs/core/SignalCoordinator.d.ts.map +0 -1
  589. package/dist/cjs/core/SignalCoordinator.js +0 -207
  590. package/dist/cjs/core/SignalCoordinator.js.map +0 -1
  591. package/dist/cjs/core/SignalEvaluator.d.ts +0 -86
  592. package/dist/cjs/core/SignalEvaluator.d.ts.map +0 -1
  593. package/dist/cjs/core/SignalEvaluator.js +0 -319
  594. package/dist/cjs/core/SignalEvaluator.js.map +0 -1
  595. package/dist/cjs/core/SignalProcessor.d.ts +0 -152
  596. package/dist/cjs/core/SignalProcessor.d.ts.map +0 -1
  597. package/dist/cjs/core/SignalProcessor.js +0 -505
  598. package/dist/cjs/core/SignalProcessor.js.map +0 -1
  599. package/dist/cjs/core/Step.d.ts +0 -184
  600. package/dist/cjs/core/Step.d.ts.map +0 -1
  601. package/dist/cjs/core/Step.js +0 -599
  602. package/dist/cjs/core/Step.js.map +0 -1
  603. package/dist/cjs/core/StepLifecycle.d.ts +0 -43
  604. package/dist/cjs/core/StepLifecycle.d.ts.map +0 -1
  605. package/dist/cjs/core/StepLifecycle.js +0 -180
  606. package/dist/cjs/core/StepLifecycle.js.map +0 -1
  607. package/dist/cjs/core/StreamingToolExecutor.d.ts +0 -142
  608. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +0 -1
  609. package/dist/cjs/core/StreamingToolExecutor.js +0 -490
  610. package/dist/cjs/core/StreamingToolExecutor.js.map +0 -1
  611. package/dist/cjs/core/ToolLoopExecutor.d.ts +0 -133
  612. package/dist/cjs/core/ToolLoopExecutor.d.ts.map +0 -1
  613. package/dist/cjs/core/ToolLoopExecutor.js +0 -568
  614. package/dist/cjs/core/ToolLoopExecutor.js.map +0 -1
  615. package/dist/cjs/core/ToolManager.d.ts +0 -250
  616. package/dist/cjs/core/ToolManager.d.ts.map +0 -1
  617. package/dist/cjs/core/ToolManager.js +0 -1104
  618. package/dist/cjs/core/ToolManager.js.map +0 -1
  619. package/dist/cjs/core/createAgent.d.ts +0 -35
  620. package/dist/cjs/core/createAgent.d.ts.map +0 -1
  621. package/dist/cjs/core/createAgent.js +0 -39
  622. package/dist/cjs/core/createAgent.js.map +0 -1
  623. package/dist/cjs/core/flow-namespace.d.ts +0 -64
  624. package/dist/cjs/core/flow-namespace.d.ts.map +0 -1
  625. package/dist/cjs/core/flow-namespace.js +0 -182
  626. package/dist/cjs/core/flow-namespace.js.map +0 -1
  627. package/dist/cjs/core/toolGates.d.ts +0 -24
  628. package/dist/cjs/core/toolGates.d.ts.map +0 -1
  629. package/dist/cjs/core/toolGates.js +0 -52
  630. package/dist/cjs/core/toolGates.js.map +0 -1
  631. package/dist/cjs/types/persistence.d.ts +0 -254
  632. package/dist/cjs/types/persistence.d.ts.map +0 -1
  633. package/dist/cjs/types/persistence.js +0 -7
  634. package/dist/cjs/types/persistence.js.map +0 -1
  635. package/dist/cjs/types/prompt-cache.d.ts +0 -15
  636. package/dist/cjs/types/prompt-cache.d.ts.map +0 -1
  637. package/dist/cjs/types/prompt-cache.js +0 -6
  638. package/dist/cjs/types/prompt-cache.js.map +0 -1
  639. package/dist/cjs/types/signals.d.ts +0 -263
  640. package/dist/cjs/types/signals.d.ts.map +0 -1
  641. package/dist/cjs/types/signals.js +0 -11
  642. package/dist/cjs/types/signals.js.map +0 -1
  643. package/dist/cjs/types/template.d.ts +0 -84
  644. package/dist/cjs/types/template.d.ts.map +0 -1
  645. package/dist/cjs/types/template.js +0 -3
  646. package/dist/cjs/types/template.js.map +0 -1
  647. package/dist/cjs/utils/condition.d.ts +0 -63
  648. package/dist/cjs/utils/condition.d.ts.map +0 -1
  649. package/dist/cjs/utils/condition.js +0 -239
  650. package/dist/cjs/utils/condition.js.map +0 -1
  651. package/dist/cjs/utils/event.d.ts +0 -6
  652. package/dist/cjs/utils/event.d.ts.map +0 -1
  653. package/dist/cjs/utils/event.js +0 -20
  654. package/dist/cjs/utils/event.js.map +0 -1
  655. package/dist/cjs/utils/id.d.ts +0 -33
  656. package/dist/cjs/utils/id.d.ts.map +0 -1
  657. package/dist/cjs/utils/id.js +0 -84
  658. package/dist/cjs/utils/id.js.map +0 -1
  659. package/dist/cjs/utils/serialize.d.ts +0 -36
  660. package/dist/cjs/utils/serialize.d.ts.map +0 -1
  661. package/dist/cjs/utils/serialize.js +0 -77
  662. package/dist/cjs/utils/serialize.js.map +0 -1
  663. package/dist/cjs/utils/session.d.ts +0 -124
  664. package/dist/cjs/utils/session.d.ts.map +0 -1
  665. package/dist/cjs/utils/session.js +0 -396
  666. package/dist/cjs/utils/session.js.map +0 -1
  667. package/dist/constants/index.d.ts +0 -2
  668. package/dist/constants/index.d.ts.map +0 -1
  669. package/dist/constants/index.js +0 -4
  670. package/dist/constants/index.js.map +0 -1
  671. package/dist/core/AutoChainExecutor.d.ts +0 -97
  672. package/dist/core/AutoChainExecutor.d.ts.map +0 -1
  673. package/dist/core/AutoChainExecutor.js +0 -284
  674. package/dist/core/AutoChainExecutor.js.map +0 -1
  675. package/dist/core/BranchEvaluator.d.ts +0 -55
  676. package/dist/core/BranchEvaluator.d.ts.map +0 -1
  677. package/dist/core/BranchEvaluator.js +0 -121
  678. package/dist/core/BranchEvaluator.js.map +0 -1
  679. package/dist/core/DirectiveChainTracker.d.ts +0 -49
  680. package/dist/core/DirectiveChainTracker.d.ts.map +0 -1
  681. package/dist/core/DirectiveChainTracker.js +0 -117
  682. package/dist/core/DirectiveChainTracker.js.map +0 -1
  683. package/dist/core/Events.d.ts +0 -26
  684. package/dist/core/Events.d.ts.map +0 -1
  685. package/dist/core/Events.js +0 -137
  686. package/dist/core/Events.js.map +0 -1
  687. package/dist/core/Flow.d.ts +0 -183
  688. package/dist/core/Flow.d.ts.map +0 -1
  689. package/dist/core/Flow.js +0 -547
  690. package/dist/core/Flow.js.map +0 -1
  691. package/dist/core/FlowRouter.d.ts +0 -183
  692. package/dist/core/FlowRouter.d.ts.map +0 -1
  693. package/dist/core/FlowRouter.js +0 -1043
  694. package/dist/core/FlowRouter.js.map +0 -1
  695. package/dist/core/PersistenceManager.d.ts +0 -114
  696. package/dist/core/PersistenceManager.d.ts.map +0 -1
  697. package/dist/core/PersistenceManager.js +0 -332
  698. package/dist/core/PersistenceManager.js.map +0 -1
  699. package/dist/core/PromptComposer.d.ts +0 -47
  700. package/dist/core/PromptComposer.d.ts.map +0 -1
  701. package/dist/core/PromptComposer.js +0 -393
  702. package/dist/core/PromptComposer.js.map +0 -1
  703. package/dist/core/PromptSectionCache.d.ts +0 -48
  704. package/dist/core/PromptSectionCache.d.ts.map +0 -1
  705. package/dist/core/PromptSectionCache.js +0 -104
  706. package/dist/core/PromptSectionCache.js.map +0 -1
  707. package/dist/core/ResponseEngine.d.ts +0 -43
  708. package/dist/core/ResponseEngine.d.ts.map +0 -1
  709. package/dist/core/ResponseEngine.js +0 -231
  710. package/dist/core/ResponseEngine.js.map +0 -1
  711. package/dist/core/ResponseGenerationError.d.ts +0 -30
  712. package/dist/core/ResponseGenerationError.d.ts.map +0 -1
  713. package/dist/core/ResponseGenerationError.js +0 -31
  714. package/dist/core/ResponseGenerationError.js.map +0 -1
  715. package/dist/core/ResponseModal.d.ts +0 -305
  716. package/dist/core/ResponseModal.d.ts.map +0 -1
  717. package/dist/core/ResponseModal.js +0 -1410
  718. package/dist/core/ResponseModal.js.map +0 -1
  719. package/dist/core/ResponsePipeline.d.ts +0 -220
  720. package/dist/core/ResponsePipeline.d.ts.map +0 -1
  721. package/dist/core/ResponsePipeline.js +0 -1035
  722. package/dist/core/ResponsePipeline.js.map +0 -1
  723. package/dist/core/SessionFinalizer.d.ts +0 -34
  724. package/dist/core/SessionFinalizer.d.ts.map +0 -1
  725. package/dist/core/SessionFinalizer.js +0 -84
  726. package/dist/core/SessionFinalizer.js.map +0 -1
  727. package/dist/core/SessionManager.d.ts +0 -112
  728. package/dist/core/SessionManager.d.ts.map +0 -1
  729. package/dist/core/SessionManager.js +0 -301
  730. package/dist/core/SessionManager.js.map +0 -1
  731. package/dist/core/SignalCoordinator.d.ts +0 -103
  732. package/dist/core/SignalCoordinator.d.ts.map +0 -1
  733. package/dist/core/SignalCoordinator.js +0 -203
  734. package/dist/core/SignalCoordinator.js.map +0 -1
  735. package/dist/core/SignalEvaluator.d.ts +0 -86
  736. package/dist/core/SignalEvaluator.d.ts.map +0 -1
  737. package/dist/core/SignalEvaluator.js +0 -312
  738. package/dist/core/SignalEvaluator.js.map +0 -1
  739. package/dist/core/SignalProcessor.d.ts +0 -152
  740. package/dist/core/SignalProcessor.d.ts.map +0 -1
  741. package/dist/core/SignalProcessor.js +0 -498
  742. package/dist/core/SignalProcessor.js.map +0 -1
  743. package/dist/core/Step.d.ts +0 -184
  744. package/dist/core/Step.d.ts.map +0 -1
  745. package/dist/core/Step.js +0 -594
  746. package/dist/core/Step.js.map +0 -1
  747. package/dist/core/StepLifecycle.d.ts +0 -43
  748. package/dist/core/StepLifecycle.d.ts.map +0 -1
  749. package/dist/core/StepLifecycle.js +0 -176
  750. package/dist/core/StepLifecycle.js.map +0 -1
  751. package/dist/core/StreamingToolExecutor.d.ts +0 -142
  752. package/dist/core/StreamingToolExecutor.d.ts.map +0 -1
  753. package/dist/core/StreamingToolExecutor.js +0 -483
  754. package/dist/core/StreamingToolExecutor.js.map +0 -1
  755. package/dist/core/ToolLoopExecutor.d.ts +0 -133
  756. package/dist/core/ToolLoopExecutor.d.ts.map +0 -1
  757. package/dist/core/ToolLoopExecutor.js +0 -564
  758. package/dist/core/ToolLoopExecutor.js.map +0 -1
  759. package/dist/core/ToolManager.d.ts +0 -250
  760. package/dist/core/ToolManager.d.ts.map +0 -1
  761. package/dist/core/ToolManager.js +0 -1098
  762. package/dist/core/ToolManager.js.map +0 -1
  763. package/dist/core/createAgent.d.ts +0 -35
  764. package/dist/core/createAgent.d.ts.map +0 -1
  765. package/dist/core/createAgent.js +0 -36
  766. package/dist/core/createAgent.js.map +0 -1
  767. package/dist/core/flow-namespace.d.ts +0 -64
  768. package/dist/core/flow-namespace.d.ts.map +0 -1
  769. package/dist/core/flow-namespace.js +0 -179
  770. package/dist/core/flow-namespace.js.map +0 -1
  771. package/dist/core/toolGates.d.ts +0 -24
  772. package/dist/core/toolGates.d.ts.map +0 -1
  773. package/dist/core/toolGates.js +0 -49
  774. package/dist/core/toolGates.js.map +0 -1
  775. package/dist/types/persistence.d.ts +0 -254
  776. package/dist/types/persistence.d.ts.map +0 -1
  777. package/dist/types/persistence.js +0 -6
  778. package/dist/types/persistence.js.map +0 -1
  779. package/dist/types/prompt-cache.d.ts +0 -15
  780. package/dist/types/prompt-cache.d.ts.map +0 -1
  781. package/dist/types/prompt-cache.js +0 -5
  782. package/dist/types/prompt-cache.js.map +0 -1
  783. package/dist/types/signals.d.ts +0 -263
  784. package/dist/types/signals.d.ts.map +0 -1
  785. package/dist/types/signals.js +0 -10
  786. package/dist/types/signals.js.map +0 -1
  787. package/dist/types/template.d.ts +0 -84
  788. package/dist/types/template.d.ts.map +0 -1
  789. package/dist/types/template.js +0 -2
  790. package/dist/types/template.js.map +0 -1
  791. package/dist/utils/condition.d.ts +0 -63
  792. package/dist/utils/condition.d.ts.map +0 -1
  793. package/dist/utils/condition.js +0 -230
  794. package/dist/utils/condition.js.map +0 -1
  795. package/dist/utils/event.d.ts +0 -6
  796. package/dist/utils/event.d.ts.map +0 -1
  797. package/dist/utils/event.js +0 -17
  798. package/dist/utils/event.js.map +0 -1
  799. package/dist/utils/id.d.ts +0 -33
  800. package/dist/utils/id.d.ts.map +0 -1
  801. package/dist/utils/id.js +0 -77
  802. package/dist/utils/id.js.map +0 -1
  803. package/dist/utils/serialize.d.ts +0 -36
  804. package/dist/utils/serialize.d.ts.map +0 -1
  805. package/dist/utils/serialize.js +0 -72
  806. package/dist/utils/serialize.js.map +0 -1
  807. package/dist/utils/session.d.ts +0 -124
  808. package/dist/utils/session.d.ts.map +0 -1
  809. package/dist/utils/session.js +0 -379
  810. package/dist/utils/session.js.map +0 -1
  811. package/docs/concepts/directives.md +0 -369
  812. package/docs/reference/adapters.md +0 -543
  813. package/docs/reference/create-agent.md +0 -216
  814. package/docs/reference/directive.md +0 -242
  815. package/docs/reference/signals.md +0 -368
  816. package/examples/02-data-extraction.ts +0 -90
  817. package/examples/05-branching.ts +0 -140
  818. package/examples/06-flow-control.ts +0 -103
  819. package/examples/08-persistence.ts +0 -98
  820. package/examples/09-signals.ts +0 -144
  821. package/src/adapters/MemoryAdapter.ts +0 -281
  822. package/src/adapters/MongoAdapter.ts +0 -341
  823. package/src/adapters/OpenSearchAdapter.ts +0 -693
  824. package/src/adapters/PostgreSQLAdapter.ts +0 -487
  825. package/src/adapters/PrismaAdapter.ts +0 -617
  826. package/src/adapters/RedisAdapter.ts +0 -439
  827. package/src/adapters/SQLiteAdapter.ts +0 -496
  828. package/src/adapters/index.ts +0 -43
  829. package/src/adapters/sessionRow.ts +0 -57
  830. package/src/constants/index.ts +0 -2
  831. package/src/core/AutoChainExecutor.ts +0 -397
  832. package/src/core/BranchEvaluator.ts +0 -161
  833. package/src/core/DirectiveChainTracker.ts +0 -144
  834. package/src/core/Events.ts +0 -164
  835. package/src/core/Flow.ts +0 -665
  836. package/src/core/FlowRouter.ts +0 -1540
  837. package/src/core/PersistenceManager.ts +0 -446
  838. package/src/core/PromptComposer.ts +0 -448
  839. package/src/core/PromptSectionCache.ts +0 -125
  840. package/src/core/ResponseEngine.ts +0 -338
  841. package/src/core/ResponseGenerationError.ts +0 -53
  842. package/src/core/ResponseModal.ts +0 -1902
  843. package/src/core/ResponsePipeline.ts +0 -1404
  844. package/src/core/SessionFinalizer.ts +0 -108
  845. package/src/core/SessionManager.ts +0 -372
  846. package/src/core/SignalCoordinator.ts +0 -263
  847. package/src/core/SignalEvaluator.ts +0 -404
  848. package/src/core/SignalProcessor.ts +0 -663
  849. package/src/core/Step.ts +0 -782
  850. package/src/core/StepLifecycle.ts +0 -242
  851. package/src/core/StreamingToolExecutor.ts +0 -609
  852. package/src/core/ToolLoopExecutor.ts +0 -749
  853. package/src/core/ToolManager.ts +0 -1379
  854. package/src/core/createAgent.ts +0 -40
  855. package/src/core/flow-namespace.ts +0 -227
  856. package/src/core/toolGates.ts +0 -72
  857. package/src/types/persistence.ts +0 -303
  858. package/src/types/prompt-cache.ts +0 -17
  859. package/src/types/signals.ts +0 -338
  860. package/src/types/template.ts +0 -98
  861. package/src/utils/condition.ts +0 -296
  862. package/src/utils/event.ts +0 -16
  863. package/src/utils/id.ts +0 -91
  864. package/src/utils/serialize.ts +0 -86
  865. package/src/utils/session.ts +0 -501
@@ -1,1040 +0,0 @@
1
- "use strict";
2
- /**
3
- * Response processing utilities shared between respond() and respondStream() methods
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.ResponsePipeline = void 0;
7
- exports.hasDirectivePositionField = hasDirectivePositionField;
8
- const index_js_1 = require("../utils/index.js");
9
- const session_js_1 = require("../utils/session.js");
10
- const template_js_1 = require("../utils/template.js");
11
- const Step_js_1 = require("../core/Step.js");
12
- const BranchEvaluator_js_1 = require("./BranchEvaluator.js");
13
- const DirectiveChainTracker_js_1 = require("./DirectiveChainTracker.js");
14
- const ResponseGenerationError_js_1 = require("./ResponseGenerationError.js");
15
- /**
16
- * Position fields on a Directive that represent a navigation decision.
17
- * When any of these is set, the directive "wins" the turn's position decision
18
- * and downstream resolution (branches, linear, AI) must not run.
19
- */
20
- const DIRECTIVE_POSITION_FIELDS = ['goTo', 'goToStep', 'complete', 'abort', 'reset'];
21
- /**
22
- * Returns `true` if the given directive has at least one position field set.
23
- * Used as the guard at the directive-bus / branch-evaluation seam:
24
- * if the bus produced a winner with a position field, `evaluateStepBranches`
25
- * (and linear/AI selection) must not run.
26
- */
27
- function hasDirectivePositionField(directive) {
28
- if (!directive)
29
- return false;
30
- return DIRECTIVE_POSITION_FIELDS.some((field) => directive[field] !== undefined);
31
- }
32
- /**
33
- * Compute the per-key data writes the signal phase applied to a session.
34
- * The signal phase and routing start from the same input session, so any
35
- * key whose value differs between the input and the signal output was
36
- * written by the signal phase alone (handler `updateData` calls).
37
- */
38
- function diffSignalDataWrites(before, after) {
39
- const beforeData = (before ?? {});
40
- const afterData = (after ?? {});
41
- const writes = {};
42
- for (const key of Object.keys(afterData)) {
43
- if (afterData[key] !== beforeData[key]) {
44
- writes[key] = afterData[key];
45
- }
46
- }
47
- return writes;
48
- }
49
- /**
50
- * Shared response processing logic between respond() and respondStream() methods
51
- */
52
- class ResponsePipeline {
53
- constructor(options, getFlows, flowRouter, signalCoordinator, updateCollectedData, getSchema) {
54
- this.options = options;
55
- this.getFlows = getFlows;
56
- this.flowRouter = flowRouter;
57
- this.signalCoordinator = signalCoordinator;
58
- this.updateCollectedData = updateCollectedData;
59
- this.getSchema = getSchema;
60
- }
61
- /**
62
- * Create a fresh chain tracker for the current turn.
63
- * Call at the start of each turn; the tracker is discarded at turn end.
64
- */
65
- createChainTracker() {
66
- const maxChain = this.options.maxDirectiveChain ?? 10;
67
- this._chainTracker = new DirectiveChainTracker_js_1.DirectiveChainTracker(maxChain);
68
- return this._chainTracker;
69
- }
70
- /**
71
- * Get the current turn's chain tracker (creates one if none exists).
72
- */
73
- get chainTracker() {
74
- if (!this._chainTracker) {
75
- return this.createChainTracker();
76
- }
77
- return this._chainTracker;
78
- }
79
- /**
80
- * Prepare context and session for response generation
81
- */
82
- async prepareResponseContext(params) {
83
- const { contextOverride, session } = params;
84
- let currentContext = params.currentContext;
85
- let contextAfterHook;
86
- // Call beforeRespond hook if configured
87
- if (this.options.hooks?.beforeRespond && currentContext !== undefined) {
88
- currentContext = await this.options.hooks.beforeRespond(currentContext);
89
- // Surface the hook result so the caller can sync it back to the agent
90
- contextAfterHook = currentContext;
91
- }
92
- // Merge context with override
93
- const effectiveContext = {
94
- ...currentContext,
95
- ...contextOverride,
96
- };
97
- // Initialize or get session (use the live session if available)
98
- const targetSession = session || params.currentSession || (0, index_js_1.createSession)();
99
- return {
100
- effectiveContext,
101
- session: targetSession,
102
- contextAfterHook,
103
- };
104
- }
105
- /**
106
- * Handle routing and step selection logic
107
- */
108
- async handleRoutingAndStepSelection(params) {
109
- const { session, history, context, signal, allowedFlows } = params;
110
- // PHASE 2: ROUTING + STEP SELECTION - Determine which flow and step to use (combined)
111
- let selectedFlow;
112
- let responseDirectives;
113
- let selectedStep;
114
- let isFlowComplete = false;
115
- let completedFlows = [];
116
- let targetSession = session;
117
- // Flows exited this turn via pendingDirective redirect/reset
118
- const endedFlows = [];
119
- let exitPrevFlowId;
120
- let exitPrevFlowTitle;
121
- let exitReason;
122
- // Get flows early since we need them for pending directives
123
- const flows = this.getFlows();
124
- // Routing candidates may be narrowed for this turn (entry pins); the
125
- // pendingDirective applier below still resolves targets against the FULL
126
- // registry so declared redirects always resolve.
127
- const routingFlows = allowedFlows && allowedFlows.length > 0
128
- ? flows.filter((f) => allowedFlows.includes(f.id) || allowedFlows.includes(f.title))
129
- : flows;
130
- // Check for pending directive from previous flow completion or external dispatch
131
- if (targetSession.pendingDirective) {
132
- const directive = targetSession.pendingDirective;
133
- index_js_1.logger.debug(`[ResponsePipeline] Applying pending directive at start of turn`);
134
- // Track directive chain depth (Requirement 22.1)
135
- const tracker = this.chainTracker;
136
- tracker.record(directive, "pending");
137
- // If abort (chain breaker), the tracker stops counting; apply normally below
138
- // Clear pendingDirective before application (unless complete.next chains another)
139
- let nextDirective = undefined;
140
- if (directive.complete &&
141
- typeof directive.complete === 'object' &&
142
- directive.complete.next) {
143
- nextDirective = directive.complete.next;
144
- }
145
- targetSession = {
146
- ...targetSession,
147
- pendingDirective: nextDirective,
148
- };
149
- // Capture the flow we're leaving so directive-driven exits surface on
150
- // the response (endedFlows).
151
- exitPrevFlowId = targetSession.currentFlow?.id;
152
- exitPrevFlowTitle = exitPrevFlowId
153
- ? flows.find((f) => f.id === exitPrevFlowId)?.title
154
- : undefined;
155
- // Apply the directive: resolve position field to a flow/step
156
- if (directive.goTo) {
157
- exitReason = 'goto';
158
- const flowTarget = typeof directive.goTo === 'string'
159
- ? directive.goTo
160
- : directive.goTo.flow;
161
- if (flowTarget) {
162
- const targetFlow = flows.find((r) => r.id === flowTarget || r.title === flowTarget);
163
- if (targetFlow) {
164
- index_js_1.logger.debug(`[ResponsePipeline] Pending directive goTo → flow: ${targetFlow.title}`);
165
- targetSession = (0, session_js_1.enterFlow)(targetSession, targetFlow.id, targetFlow.title);
166
- // Merge initial data if available
167
- if (targetFlow.initialData) {
168
- targetSession = (0, index_js_1.mergeCollected)(targetSession, targetFlow.initialData);
169
- }
170
- // Merge directive-carried data if present
171
- if (typeof directive.goTo === 'object' && directive.goTo.data) {
172
- targetSession = (0, index_js_1.mergeCollected)(targetSession, directive.goTo.data);
173
- }
174
- selectedFlow = targetFlow;
175
- // If goTo specifies a step, enter it
176
- if (typeof directive.goTo === 'object' && directive.goTo.step) {
177
- const stepTarget = directive.goTo.step;
178
- const targetStep = targetFlow.getStep(stepTarget);
179
- if (targetStep) {
180
- targetSession = (0, index_js_1.enterStep)(targetSession, targetStep.id, targetStep.description);
181
- selectedStep = targetStep;
182
- }
183
- }
184
- }
185
- else {
186
- index_js_1.logger.warn(`[FlowConfigurationError] Pending directive goTo target not found: flow "${flowTarget}" does not exist. Falling back to normal routing. Fix the goTo reference or remove the pending directive.`);
187
- }
188
- }
189
- }
190
- else if (directive.goToStep) {
191
- const stepTarget = typeof directive.goToStep === 'string'
192
- ? directive.goToStep
193
- : directive.goToStep.step;
194
- const flowTarget = typeof directive.goToStep === 'object'
195
- ? directive.goToStep.flow
196
- : undefined;
197
- if (flowTarget) {
198
- const targetFlow = flows.find((r) => r.id === flowTarget || r.title === flowTarget);
199
- if (targetFlow) {
200
- targetSession = (0, session_js_1.enterFlow)(targetSession, targetFlow.id, targetFlow.title);
201
- selectedFlow = targetFlow;
202
- const targetStep = targetFlow.getStep(stepTarget);
203
- if (targetStep) {
204
- targetSession = (0, index_js_1.enterStep)(targetSession, targetStep.id, targetStep.description);
205
- selectedStep = targetStep;
206
- }
207
- }
208
- }
209
- else if (targetSession.currentFlow) {
210
- // Step within current flow
211
- const currentFlow = flows.find(r => r.id === targetSession.currentFlow?.id);
212
- if (currentFlow) {
213
- selectedFlow = currentFlow;
214
- const targetStep = currentFlow.getStep(stepTarget);
215
- if (targetStep) {
216
- targetSession = (0, index_js_1.enterStep)(targetSession, targetStep.id, targetStep.description);
217
- selectedStep = targetStep;
218
- }
219
- }
220
- }
221
- }
222
- else if (directive.reset) {
223
- exitReason = 'reset';
224
- // Reset current flow
225
- if (targetSession.currentFlow) {
226
- const currentFlow = flows.find(r => r.id === targetSession.currentFlow?.id);
227
- if (currentFlow) {
228
- const resetStep = typeof directive.reset === 'object' && directive.reset.step
229
- ? directive.reset.step
230
- : undefined;
231
- selectedFlow = currentFlow;
232
- if (resetStep) {
233
- const targetStep = currentFlow.getStep(resetStep);
234
- if (targetStep) {
235
- targetSession = (0, index_js_1.enterStep)(targetSession, targetStep.id, targetStep.description);
236
- selectedStep = targetStep;
237
- }
238
- }
239
- else {
240
- // Reset to initial step
241
- const initialStep = currentFlow.initialStep;
242
- targetSession = (0, index_js_1.enterStep)(targetSession, initialStep.id, initialStep.description);
243
- selectedStep = initialStep;
244
- }
245
- }
246
- }
247
- }
248
- // For complete/abort, selectedFlow stays undefined → handled downstream
249
- // Apply state writes from the directive
250
- if (directive.dataUpdate) {
251
- targetSession = (0, index_js_1.mergeCollected)(targetSession, directive.dataUpdate);
252
- }
253
- // Skip FlowRouter.decideFlowAndStep — the directive resolved the position
254
- }
255
- if (exitReason &&
256
- exitPrevFlowId &&
257
- (!selectedFlow || selectedFlow.id !== exitPrevFlowId)) {
258
- endedFlows.push({ flowId: exitPrevFlowId, title: exitPrevFlowTitle, reason: exitReason });
259
- }
260
- // If no pending transition or transition handled, do normal routing.
261
- // Candidates honor allowedFlows; completion scoring runs over the same set.
262
- if (routingFlows.length > 0 && !selectedFlow) {
263
- const orchestration = await this.flowRouter.decideFlowAndStep({
264
- flows: routingFlows,
265
- session: targetSession,
266
- history,
267
- agentOptions: this.options,
268
- provider: this.options.provider,
269
- context,
270
- signal,
271
- });
272
- selectedFlow = orchestration.selectedFlow;
273
- selectedStep = orchestration.selectedStep;
274
- responseDirectives = orchestration.responseDirectives;
275
- targetSession = orchestration.session;
276
- isFlowComplete = orchestration.isFlowComplete || false;
277
- completedFlows = orchestration.completedFlows || [];
278
- // Log if flow is complete
279
- if (isFlowComplete) {
280
- index_js_1.logger.debug(`[ResponsePipeline] Flow complete: all required data collected or last step reached`);
281
- }
282
- }
283
- return {
284
- selectedFlow,
285
- selectedStep,
286
- responseDirectives,
287
- session: targetSession,
288
- isFlowComplete,
289
- completedFlows,
290
- ...(endedFlows.length > 0 ? { endedFlows } : {}),
291
- };
292
- }
293
- /**
294
- * Combine a routing-derived session with the signal phase's non-position
295
- * mutations. The routing session is the base — it owns position state AND
296
- * data merges such as flow initialData and directive-carried writes; the
297
- * signal phase's mutations (trigger recording under `signals`, handler
298
- * data writes) are re-applied on top. Both phases start from the same
299
- * input session, so their mutations cannot silently collide.
300
- */
301
- combineRoutingAndSignalSessions(params) {
302
- const { inputSession, signalSession, routingSession } = params;
303
- let combined = routingSession;
304
- if (signalSession.signals !== inputSession.signals) {
305
- combined = { ...combined, signals: signalSession.signals };
306
- }
307
- const signalWrites = diffSignalDataWrites(inputSession.data, signalSession.data);
308
- if (Object.keys(signalWrites).length > 0) {
309
- combined = (0, index_js_1.mergeCollected)(combined, signalWrites);
310
- }
311
- return combined;
312
- }
313
- /**
314
- * Determine next step and update session
315
- */
316
- async determineNextStep(params) {
317
- const { selectedFlow, selectedStep, session, isFlowComplete, context, busDirective } = params;
318
- if (!selectedFlow) {
319
- return { nextStep: undefined, session, isFlowComplete };
320
- }
321
- // ─── GUARD: directive bus winner with a position field preempts branches ───
322
- // Resolution precedence (design.md): bus > branches > linear > AI.
323
- // If the bus produced a directive with a position field (goTo, goToStep,
324
- // complete, abort, reset), that decision wins the turn. Do NOT evaluate
325
- // branches or linear/AI selection — the caller applies the bus directive.
326
- if (hasDirectivePositionField(busDirective)) {
327
- index_js_1.logger.debug(`[ResponsePipeline] Directive bus winner has position field — skipping branch evaluation and linear/AI selection`);
328
- return { nextStep: undefined, session, isFlowComplete };
329
- }
330
- // STEP 1 (Algorithm 1): branches win over linear chain AND flow completion.
331
- // Evaluate branches before checking isFlowComplete — a branch can redirect
332
- // even from the "last" step (which getCandidateStepsWithConditions marks as complete).
333
- if (!selectedStep) {
334
- const currentStep = session.currentFlow?.id === selectedFlow.id && session.currentStep
335
- ? selectedFlow.getStep(session.currentStep.id)
336
- : undefined;
337
- if (currentStep?.branches && currentStep.branches.length > 0) {
338
- const branchResult = await this.evaluateStepBranches(currentStep, selectedFlow, session, context);
339
- if (branchResult) {
340
- // A branch that resolved a position overrides the router's completion
341
- // proposal. Without this, a branch that parks on a step of its own
342
- // flow (`then: '<stepId>'`, `then: { reset: true }`) keeps
343
- // isFlowComplete=true, the caller drops the step it just resolved,
344
- // and the turn ends as a silent completion — no LLM call, empty
345
- // reply, flow marked completed for the rest of the session.
346
- const resolvedPosition = Boolean(branchResult.nextStep || branchResult.flowChanged);
347
- return { ...branchResult, isFlowComplete: resolvedPosition ? false : isFlowComplete };
348
- }
349
- // undefined → fall through to linear/AI selection or flow completion
350
- }
351
- }
352
- if (isFlowComplete) {
353
- return { nextStep: undefined, session, isFlowComplete: true };
354
- }
355
- let nextStep;
356
- // If we have a selected step from the combined routing decision, use it
357
- if (selectedStep) {
358
- nextStep = selectedStep;
359
- }
360
- else {
361
- // Determine current step from session if we're already in this flow
362
- const currentStep = session.currentFlow?.id === selectedFlow.id && session.currentStep
363
- ? selectedFlow.getStep(session.currentStep.id)
364
- : undefined;
365
- // Get candidate steps based on current position in the flow
366
- const candidates = await this.flowRouter.getCandidateStepsWithConditions(selectedFlow, currentStep, // Pass current step instead of undefined to maintain progression
367
- (0, template_js_1.createTemplateContext)({ data: session.data, session, context }));
368
- if (candidates.length > 0) {
369
- nextStep = candidates[0].step;
370
- index_js_1.logger.debug(`[ResponsePipeline] Using first valid step: ${nextStep.id}${currentStep ? ' (progressing from ' + currentStep.id + ')' : ' for new flow'}`);
371
- }
372
- else {
373
- // Fallback to initial step even if it should be skipped
374
- nextStep = selectedFlow.initialStep;
375
- index_js_1.logger.warn(`[FlowConfigurationError] No valid steps found in flow "${selectedFlow.title}": all candidates were skipped. Falling back to initial step "${nextStep.id}". Review step skip conditions.`);
376
- }
377
- }
378
- // Before entering the step, check if requires fields are satisfied
379
- if (nextStep.requires && nextStep.requires.length > 0) {
380
- const sessionData = session.data || {};
381
- const missingRequires = nextStep.requires.filter(field => sessionData[String(field)] === undefined);
382
- if (missingRequires.length > 0) {
383
- index_js_1.logger.debug(`[ResponsePipeline] Cannot enter step "${nextStep.id}": missing required fields [${missingRequires.join(', ')}]. Staying at current step.`);
384
- // Stay at current step - don't enter the next one
385
- const currentStepId = session.currentStep?.id;
386
- if (currentStepId && selectedFlow) {
387
- const currentStepInstance = selectedFlow.getStep(currentStepId);
388
- if (currentStepInstance) {
389
- nextStep = currentStepInstance;
390
- }
391
- }
392
- return { nextStep, session, isFlowComplete: false };
393
- }
394
- }
395
- // Update session with next step
396
- const updatedSession = (0, index_js_1.enterStep)(session, nextStep.id, nextStep.description);
397
- index_js_1.logger.debug(`[ResponsePipeline] Entered step: ${nextStep.id}`);
398
- return { nextStep, session: updatedSession, isFlowComplete: false };
399
- }
400
- /**
401
- * Evaluate branches on a step and resolve the `then` value.
402
- *
403
- * Resolution rules (Algorithm 1, STEP 1 + then resolution):
404
- * - String `then` → look up in current flow's step registry first (local step wins).
405
- * - Not a local step → look up in agent's flow registry; if found, treat as goTo directive.
406
- * - Neither → throw FlowConfigurationError.
407
- * - Directive `then` → apply directly (bypass directive bus merge).
408
- *
409
- * Returns the resolved { nextStep, session, flowChanged? } or undefined if no branch matched.
410
- */
411
- async evaluateStepBranches(currentStep, selectedFlow, session, context) {
412
- const history = session.history ? (0, index_js_1.historyToEvents)(session.history) : [];
413
- // Build the BranchPredicateContext
414
- const branchCtx = {
415
- data: session.data,
416
- context,
417
- session,
418
- history,
419
- };
420
- // Create the AI condition evaluator
421
- const aiEvaluator = (0, BranchEvaluator_js_1.createAiConditionEvaluator)(this.options.provider, history, context);
422
- const result = await (0, BranchEvaluator_js_1.evaluateBranches)(currentStep.branches, branchCtx, aiEvaluator);
423
- if (result === undefined) {
424
- return undefined; // No branch matched → fall through to linear/AI selection
425
- }
426
- // Task 4.3: Directive `then` value — apply directly
427
- if (typeof result === 'object' && result !== null) {
428
- const directive = result;
429
- return this.applyBranchDirective(directive, selectedFlow, session);
430
- }
431
- // Task 4.2: String `then` resolution
432
- // 1. Look up in current flow's step registry first (local step wins)
433
- const localStep = selectedFlow.getStep(result);
434
- if (localStep) {
435
- const updatedSession = (0, index_js_1.enterStep)(session, localStep.id, localStep.description);
436
- index_js_1.logger.debug(`[ResponsePipeline] Branch resolved to local step: ${localStep.id}`);
437
- return { nextStep: localStep, session: updatedSession };
438
- }
439
- // 2. Look up in agent's flow registry
440
- const flows = this.getFlows();
441
- const targetFlow = flows.find(f => f.id === result || f.title === result);
442
- if (targetFlow) {
443
- // Treat as applyDirective({ goTo: result }) — enter the target flow
444
- index_js_1.logger.debug(`[ResponsePipeline] Branch resolved to flow: ${targetFlow.title}`);
445
- const updatedSession = (0, session_js_1.enterFlow)(session, targetFlow.id, targetFlow.title);
446
- return { nextStep: undefined, session: updatedSession, flowChanged: targetFlow };
447
- }
448
- // 3. Neither → throw FlowConfigurationError
449
- throw new Step_js_1.FlowConfigurationError(`[FlowConfigurationError] Unresolved branch target: "${result}" does not match any step in flow "${selectedFlow.id}" or any flow in the agent. ` +
450
- `Source: ${selectedFlow.id}.${currentStep.id}. Fix the branch "then" value to reference a valid step id or flow id/title.`);
451
- }
452
- /**
453
- * Apply a Directive returned by a branch entry's `then` value.
454
- * Branches bypass the directive bus — the Directive is the position decision.
455
- */
456
- applyBranchDirective(directive, selectedFlow, session) {
457
- // Track directive chain depth (Requirement 22.1)
458
- const tracker = this.chainTracker;
459
- tracker.record(directive, `branch:${selectedFlow.id}`);
460
- let updatedSession = session;
461
- // Apply state writes first
462
- if (directive.dataUpdate) {
463
- updatedSession = (0, index_js_1.mergeCollected)(updatedSession, directive.dataUpdate);
464
- }
465
- // Handle position fields
466
- if (directive.goToStep) {
467
- const stepTarget = typeof directive.goToStep === 'string'
468
- ? directive.goToStep
469
- : directive.goToStep.step;
470
- const flowTarget = typeof directive.goToStep === 'object'
471
- ? directive.goToStep.flow
472
- : undefined;
473
- if (flowTarget) {
474
- // Cross-flow step reference — enter the target flow first
475
- const flows = this.getFlows();
476
- const targetFlow = flows.find(f => f.id === flowTarget || f.title === flowTarget);
477
- if (targetFlow) {
478
- updatedSession = (0, session_js_1.enterFlow)(updatedSession, targetFlow.id, targetFlow.title);
479
- updatedSession = (0, index_js_1.enterStep)(updatedSession, stepTarget);
480
- // Try to resolve the target step instance for the caller
481
- const targetStepInstance = targetFlow.getStep(stepTarget);
482
- index_js_1.logger.debug(`[ResponsePipeline] Branch directive goToStep → ${flowTarget}.${stepTarget}`);
483
- return { nextStep: targetStepInstance || undefined, session: updatedSession, flowChanged: targetFlow };
484
- }
485
- throw new Step_js_1.FlowConfigurationError(`[FlowConfigurationError] Branch directive goToStep targets unknown flow: "${flowTarget}" does not match any flow id or title. ` +
486
- `Fix the goToStep.flow value or use goTo to target a known flow.`);
487
- }
488
- // Local step reference
489
- const targetStep = selectedFlow.getStep(stepTarget);
490
- if (targetStep) {
491
- updatedSession = (0, index_js_1.enterStep)(updatedSession, targetStep.id, targetStep.description);
492
- index_js_1.logger.debug(`[ResponsePipeline] Branch directive goToStep → ${targetStep.id}`);
493
- return { nextStep: targetStep, session: updatedSession };
494
- }
495
- throw new Step_js_1.FlowConfigurationError(`[FlowConfigurationError] Branch directive goToStep targets unknown step: "${stepTarget}" does not exist in flow "${selectedFlow.id}". ` +
496
- `Fix the goToStep value to reference a valid step id in the current flow.`);
497
- }
498
- if (directive.goTo) {
499
- const flowTarget = typeof directive.goTo === 'string'
500
- ? directive.goTo
501
- : directive.goTo.flow ?? directive.goTo.step;
502
- if (flowTarget) {
503
- const flows = this.getFlows();
504
- const targetFlow = flows.find(f => f.id === flowTarget || f.title === flowTarget);
505
- if (targetFlow) {
506
- updatedSession = (0, session_js_1.enterFlow)(updatedSession, targetFlow.id, targetFlow.title);
507
- // If goTo is an object with a step field, enter that step too
508
- if (typeof directive.goTo === 'object' && directive.goTo.step) {
509
- updatedSession = (0, index_js_1.enterStep)(updatedSession, directive.goTo.step);
510
- }
511
- index_js_1.logger.debug(`[ResponsePipeline] Branch directive goTo → ${targetFlow.title}`);
512
- return { nextStep: undefined, session: updatedSession, flowChanged: targetFlow };
513
- }
514
- throw new Step_js_1.FlowConfigurationError(`[FlowConfigurationError] Branch directive goTo targets unknown flow: "${flowTarget}" does not match any flow id or title. ` +
515
- `Fix the goTo value to reference a valid flow.`);
516
- }
517
- }
518
- if (directive.complete) {
519
- index_js_1.logger.debug(`[ResponsePipeline] Branch directive complete`);
520
- return { nextStep: undefined, session: updatedSession };
521
- }
522
- if (directive.abort) {
523
- index_js_1.logger.debug(`[ResponsePipeline] Branch directive abort`);
524
- return { nextStep: undefined, session: updatedSession };
525
- }
526
- if (directive.reset) {
527
- const resetStep = typeof directive.reset === 'object' && directive.reset.step
528
- ? directive.reset.step
529
- : undefined;
530
- if (resetStep) {
531
- const targetStep = selectedFlow.getStep(resetStep);
532
- if (targetStep) {
533
- updatedSession = (0, index_js_1.enterStep)(updatedSession, targetStep.id, targetStep.description);
534
- return { nextStep: targetStep, session: updatedSession };
535
- }
536
- }
537
- // Reset to initial step
538
- const initialStep = selectedFlow.initialStep;
539
- updatedSession = (0, index_js_1.enterStep)(updatedSession, initialStep.id, initialStep.description);
540
- index_js_1.logger.debug(`[ResponsePipeline] Branch directive reset → ${initialStep.id}`);
541
- return { nextStep: initialStep, session: updatedSession };
542
- }
543
- // Directive with only non-position fields (e.g., just dataUpdate/contextUpdate/reply)
544
- // No position change — fall through to linear selection
545
- return { nextStep: undefined, session: updatedSession };
546
- }
547
- /**
548
- * TURN ROUTING + STEP SELECTION — the single entry point for deciding which
549
- * flow and step a turn renders. Runs the routing-skip optimization, the
550
- * pre-signal phase (parallel with routing when a processor is configured),
551
- * pre-extraction, and next-step determination.
552
- */
553
- async routeAndSelectStep(params) {
554
- try {
555
- // Create a fresh chain tracker for this turn (Requirement 22.1)
556
- this.createChainTracker();
557
- // ROUTING SKIP OPTIMIZATION (Requirements 20.1, 20.2, 20.3):
558
- // When the current step has collect fields AND step-scoped pre-extraction
559
- // populates at least one of those fields, skip FlowRouter.decideFlowAndStep
560
- // for this turn. The check's extraction result is reused by the fallthrough
561
- // paths below so a turn costs at most ONE extraction LLM call.
562
- const routingSkipCheck = await this.attemptRoutingSkipForCollect(params);
563
- if (routingSkipCheck.skipResult) {
564
- const skipResult = routingSkipCheck.skipResult;
565
- // Even when routing is skipped, run pre-signal phase if processor is present
566
- if (this.signalCoordinator.enabled) {
567
- const signalResult = await this.signalCoordinator.runPrePhase(params.session, params.context, params.history);
568
- // If signal halts, override the routing skip result
569
- if (signalResult.mergedDirective?.halt) {
570
- return {
571
- ...skipResult,
572
- session: signalResult.updatedSession,
573
- signalFirings: signalResult.firings,
574
- signalHalted: true,
575
- signalHaltReply: signalResult.mergedDirective.reply,
576
- };
577
- }
578
- // If signal has position fields, override routing skip result
579
- if (hasDirectivePositionField(signalResult.mergedDirective)) {
580
- return this.signalCoordinator.applyPositionDirective(signalResult);
581
- }
582
- // Non-position directive: keep the skip result (extraction merges,
583
- // step entry) and re-apply the signal phase's non-position mutations
584
- return {
585
- ...skipResult,
586
- session: this.combineRoutingAndSignalSessions({
587
- inputSession: params.session,
588
- signalSession: signalResult.updatedSession,
589
- routingSession: skipResult.session,
590
- }),
591
- signalFirings: signalResult.firings,
592
- signalPreDirective: signalResult.mergedDirective || undefined,
593
- };
594
- }
595
- return skipResult;
596
- }
597
- // ── PARALLEL PRE-SIGNAL PHASE + ROUTING (Algorithm 5) ────────────────
598
- // When signalProcessor is present, run pre-signals in parallel with routing.
599
- // When absent, call the router directly (zero overhead, preserve current behavior).
600
- if (this.signalCoordinator.enabled) {
601
- // Run pre-signal phase in parallel with routing (Requirement 8.1)
602
- const [signalResult, routingResult] = await Promise.all([
603
- this.signalCoordinator.runPrePhase(params.session, params.context, params.history),
604
- this.handleRoutingAndStepSelection({
605
- session: params.session,
606
- history: params.history,
607
- context: params.context,
608
- signal: params.signal,
609
- allowedFlows: params.allowedFlows,
610
- }),
611
- ]);
612
- // ── Requirement 8.2: halt → discard routing, skip LLM ────────────
613
- if (signalResult.mergedDirective?.halt) {
614
- return {
615
- selectedFlow: undefined,
616
- selectedStep: undefined,
617
- session: signalResult.updatedSession,
618
- isFlowComplete: false,
619
- signalFirings: signalResult.firings,
620
- signalHalted: true,
621
- signalHaltReply: signalResult.mergedDirective.reply,
622
- };
623
- }
624
- // ── Requirement 8.3: position directive → discard routing, apply signal position ──
625
- if (hasDirectivePositionField(signalResult.mergedDirective)) {
626
- return this.signalCoordinator.applyPositionDirective(signalResult);
627
- }
628
- // ── Requirement 8.4: non-position directive → use routing, propagate augmentation ──
629
- // ── Requirement 8.5: no directive → use routing as-is ─────────────
630
- // Base = routed session (position state AND router data merges such as
631
- // flow initialData survive); the signal phase's non-position mutations
632
- // (trigger state, handler data writes) are re-applied on top.
633
- let updatedSession = this.combineRoutingAndSignalSessions({
634
- inputSession: params.session,
635
- signalSession: signalResult.updatedSession,
636
- routingSession: routingResult.session,
637
- });
638
- // Explicit dataUpdate from the signal's merged directive lands last
639
- if (signalResult.mergedDirective?.dataUpdate) {
640
- updatedSession = (0, index_js_1.mergeCollected)(updatedSession, signalResult.mergedDirective.dataUpdate);
641
- }
642
- const isFlowComplete = routingResult.isFlowComplete;
643
- // PRE-EXTRACTION: same logic as below — extract data from user message.
644
- // Reuses the routing-skip check's step-scoped extraction when it already
645
- // ran this turn (at most ONE extraction LLM call per turn).
646
- if (routingResult.selectedFlow && !isFlowComplete) {
647
- let extractedData;
648
- if (routingSkipCheck.extractionRan) {
649
- extractedData = routingSkipCheck.extractedData;
650
- }
651
- else if (this.shouldPreExtractData(routingResult.selectedFlow)) {
652
- index_js_1.logger.debug(`[ResponsePipeline] Pre-extracting data for flow: ${routingResult.selectedFlow.title}`);
653
- extractedData = await this.preExtractFlowData({
654
- route: routingResult.selectedFlow,
655
- history: params.history,
656
- context: params.context,
657
- session: updatedSession,
658
- signal: params.signal,
659
- });
660
- }
661
- if (extractedData && Object.keys(extractedData).length > 0) {
662
- index_js_1.logger.debug(`[ResponsePipeline] Pre-extracted data:`, extractedData);
663
- updatedSession = (0, index_js_1.mergeCollected)(updatedSession, extractedData);
664
- await this.updateCollectedData(extractedData);
665
- }
666
- }
667
- // Determine next step
668
- const stepResult = await this.determineNextStep({
669
- selectedFlow: routingResult.selectedFlow,
670
- selectedStep: routingResult.selectedStep,
671
- session: updatedSession,
672
- isFlowComplete,
673
- context: params.context,
674
- });
675
- return {
676
- selectedFlow: stepResult.flowChanged || routingResult.selectedFlow,
677
- selectedStep: stepResult.nextStep,
678
- responseDirectives: routingResult.responseDirectives,
679
- session: stepResult.session,
680
- isFlowComplete: stepResult.isFlowComplete,
681
- signalFirings: signalResult.firings,
682
- signalPreDirective: signalResult.mergedDirective || undefined,
683
- endedFlows: routingResult.endedFlows,
684
- };
685
- }
686
- // ── No signal processor: existing behavior (zero overhead) ────────────
687
- const routingResult = await this.handleRoutingAndStepSelection({
688
- session: params.session,
689
- history: params.history,
690
- context: params.context,
691
- signal: params.signal,
692
- allowedFlows: params.allowedFlows,
693
- });
694
- let updatedSession = routingResult.session;
695
- const isFlowComplete = routingResult.isFlowComplete;
696
- // PRE-EXTRACTION: If entering a flow that collects data, extract data from user message first
697
- // This allows us to skip steps whose data is already provided.
698
- // Reuses the routing-skip check's step-scoped extraction when it already
699
- // ran this turn — at most ONE extraction LLM call per turn.
700
- if (routingResult.selectedFlow && !isFlowComplete) {
701
- // Always pre-extract when flow collects data (not just on new flow entry)
702
- // This ensures step selection has the most up-to-date data
703
- let extractedData;
704
- if (routingSkipCheck.extractionRan) {
705
- extractedData = routingSkipCheck.extractedData;
706
- }
707
- else if (this.shouldPreExtractData(routingResult.selectedFlow)) {
708
- index_js_1.logger.debug(`[ResponsePipeline] Pre-extracting data for flow: ${routingResult.selectedFlow.title}`);
709
- extractedData = await this.preExtractFlowData({
710
- route: routingResult.selectedFlow,
711
- history: params.history,
712
- context: params.context,
713
- session: updatedSession,
714
- signal: params.signal,
715
- });
716
- }
717
- if (extractedData && Object.keys(extractedData).length > 0) {
718
- index_js_1.logger.debug(`[ResponsePipeline] Pre-extracted data:`, extractedData);
719
- // Merge pre-extracted data into session before step selection
720
- updatedSession = (0, index_js_1.mergeCollected)(updatedSession, extractedData);
721
- // Also update agent's collected data
722
- await this.updateCollectedData(extractedData);
723
- }
724
- }
725
- // Determine next step using pipeline method for consistency
726
- const stepResult = await this.determineNextStep({
727
- selectedFlow: routingResult.selectedFlow,
728
- selectedStep: routingResult.selectedStep,
729
- session: updatedSession, // Use updated session with pre-extracted data
730
- isFlowComplete, // Use updated completion status
731
- context: params.context,
732
- });
733
- return {
734
- selectedFlow: stepResult.flowChanged || routingResult.selectedFlow,
735
- selectedStep: stepResult.nextStep, // Use the determined next step
736
- responseDirectives: routingResult.responseDirectives,
737
- session: stepResult.session,
738
- // determineNextStep owns the verdict: a branch that resolved a position
739
- // (new flow, or a step of this one) overrides the router's proposal.
740
- isFlowComplete: stepResult.isFlowComplete,
741
- endedFlows: routingResult.endedFlows,
742
- };
743
- }
744
- catch (error) {
745
- throw ResponseGenerationError_js_1.ResponseGenerationError.fromError(error, 'routing_optimization', params);
746
- }
747
- }
748
- /**
749
- * RENDER-STEP RESOLUTION — resolve the step a flow response will render,
750
- * shared by the streaming and non-streaming paths. When no step was
751
- * pre-selected: branches win over the linear chain, then candidate steps,
752
- * then the initial-step fallback. Enforces `requires` (stays at the current
753
- * step when required fields are missing) and enters the resolved step.
754
- *
755
- * Returns `flowTransition: true` when a branch resolved to a flow
756
- * transition or completion — there is no local step to render and the
757
- * caller handles the transition.
758
- */
759
- async resolveRenderStep(params) {
760
- const { selectedFlow, selectedStep, context } = params;
761
- let session = params.session;
762
- // Determine next step
763
- let nextStep;
764
- if (selectedStep) {
765
- nextStep = selectedStep;
766
- }
767
- else {
768
- // Determine current step from session if we're already in this flow
769
- const isInSameFlow = session.currentFlow?.id === selectedFlow.id;
770
- const currentStep = isInSameFlow && session.currentStep
771
- ? selectedFlow.getStep(session.currentStep.id)
772
- : undefined;
773
- index_js_1.logger.debug(`[ResponsePipeline] Step determination: flow match=${isInSameFlow}, currentFlow=${session.currentFlow?.id}, selectedFlow=${selectedFlow.id}, currentStep=${currentStep?.id || 'none'}`);
774
- // STEP 1 (Algorithm 1): branches win over linear chain
775
- if (currentStep?.branches && currentStep.branches.length > 0) {
776
- const branchResult = await this.evaluateStepBranches(currentStep, selectedFlow, session, context);
777
- if (branchResult) {
778
- if (branchResult.nextStep) {
779
- nextStep = branchResult.nextStep;
780
- session = branchResult.session;
781
- }
782
- else {
783
- // Flow transition or completion — no local step to render
784
- return { nextStep: undefined, session: branchResult.session, flowTransition: true };
785
- }
786
- }
787
- }
788
- if (!nextStep) {
789
- // Get candidate steps based on current position in the flow
790
- const candidates = await this.flowRouter.getCandidateStepsWithConditions(selectedFlow, currentStep, // Pass current step instead of undefined to maintain progression
791
- (0, template_js_1.createTemplateContext)({ data: session.data, session, context }));
792
- index_js_1.logger.debug(`[ResponsePipeline] Found ${candidates.length} candidate steps${currentStep ? ' from current step ' + currentStep.id : ' (new flow entry)'}`);
793
- if (candidates.length > 0) {
794
- nextStep = candidates[0].step;
795
- index_js_1.logger.debug(`[ResponsePipeline] Using first valid step: ${nextStep.id}${currentStep ? ' (progressing from ' + currentStep.id + ')' : ' for new flow'}`);
796
- }
797
- else {
798
- // Fallback to initial step even if it should be skipped
799
- nextStep = selectedFlow.initialStep;
800
- index_js_1.logger.warn(`[FlowConfigurationError] No valid steps found: all candidates were skipped in flow. Falling back to initial step "${nextStep.id}". Review step skip conditions.`);
801
- }
802
- }
803
- }
804
- // Update session with next step
805
- // If the next step has requires fields that are missing, stay at the previous step
806
- if (nextStep.requires && nextStep.requires.length > 0) {
807
- const sessionData = session.data || {};
808
- const missingRequires = nextStep.requires.filter(field => sessionData[String(field)] === undefined);
809
- if (missingRequires.length > 0) {
810
- const warning = `[FlowConfigurationError] Cannot advance to step "${nextStep.description || nextStep.id}": ` +
811
- `missing required fields [${missingRequires.join(', ')}]. Staying at current step. Ensure preceding steps collect these fields.`;
812
- index_js_1.logger.warn(warning);
813
- console.warn(warning);
814
- // Stay at the current step - don't enter the next one
815
- const currentStepId = session.currentStep?.id;
816
- if (currentStepId) {
817
- const currentStepInstance = selectedFlow.getStep(currentStepId);
818
- if (currentStepInstance) {
819
- nextStep = currentStepInstance;
820
- index_js_1.logger.debug(`[ResponsePipeline] Staying at current step: ${nextStep.id} due to missing requires`);
821
- }
822
- }
823
- }
824
- else {
825
- session = (0, index_js_1.enterStep)(session, nextStep.id, nextStep.description);
826
- index_js_1.logger.debug(`[ResponsePipeline] Entered step: ${nextStep.id}`);
827
- }
828
- }
829
- else {
830
- session = (0, index_js_1.enterStep)(session, nextStep.id, nextStep.description);
831
- index_js_1.logger.debug(`[ResponsePipeline] Entered step: ${nextStep.id}`);
832
- }
833
- return { nextStep, session, flowTransition: false };
834
- }
835
- /**
836
- * Routing skip check (Requirements 20.1, 20.2, 20.3):
837
- * When the current step declares `collect` fields AND step-scoped extraction
838
- * populates at least one of those fields from the user's message, the caller
839
- * skips routing for this turn (`skipResult`).
840
- *
841
- * The extraction is scoped to EXACTLY this step's collect fields — incidental
842
- * mentions of other (e.g. other-flow) fields cannot pin the routing decision.
843
- * It is skipped entirely when every collect field is already populated.
844
- *
845
- * Always returns what the check did so the caller can reuse the single
846
- * extraction result in its normal path instead of extracting twice:
847
- * - `extractionRan` — whether an extraction LLM call was made this turn.
848
- * - `extractedData` — that call's result (empty when nothing found / not run).
849
- */
850
- async attemptRoutingSkipForCollect(params) {
851
- const { session } = params;
852
- const notApplicable = { extractionRan: false, extractedData: {} };
853
- // Only applies when we already have a current flow and step
854
- if (!session.currentFlow || !session.currentStep) {
855
- return notApplicable;
856
- }
857
- // Also skip this optimization if there's a pending directive (it takes priority)
858
- if (session.pendingDirective) {
859
- return notApplicable;
860
- }
861
- // Look up the actual Flow and Step objects to access `collect`
862
- const currentFlow = this.getFlows().find((f) => f.id === session.currentFlow?.id);
863
- if (!currentFlow) {
864
- return notApplicable;
865
- }
866
- const currentStep = currentFlow.getStep(session.currentStep.id);
867
- if (!currentStep || !currentStep.collect || currentStep.collect.length === 0) {
868
- return notApplicable;
869
- }
870
- const collectFields = currentStep.collect;
871
- // Every relevant field already set — the skip cannot fire; don't spend
872
- // an extraction LLM call probing for it.
873
- const sessionRecord = (session.data ?? {});
874
- const allPopulated = collectFields.every((field) => {
875
- const value = sessionRecord[String(field)];
876
- return value !== undefined && value !== null;
877
- });
878
- if (allPopulated) {
879
- return notApplicable;
880
- }
881
- // Snapshot current data for comparison
882
- const dataBefore = { ...sessionRecord };
883
- // Step-scoped pre-extraction: see if the user's message populates any of
884
- // THIS step's collect fields.
885
- const extractedData = await this.preExtractFlowData({
886
- route: currentFlow,
887
- history: params.history,
888
- context: params.context,
889
- session,
890
- signal: params.signal,
891
- restrictToFields: collectFields.map(String),
892
- });
893
- if (!extractedData || Object.keys(extractedData).length === 0) {
894
- return { extractionRan: true, extractedData: {} };
895
- }
896
- // Determine which collect fields were newly populated by pre-extraction
897
- const extractedRecord = extractedData;
898
- const populatedCollectFields = [];
899
- for (const field of collectFields) {
900
- const key = String(field);
901
- const hadValue = dataBefore[key] !== undefined && dataBefore[key] !== null;
902
- const hasNewValue = extractedRecord[key] !== undefined && extractedRecord[key] !== null;
903
- if (hasNewValue && !hadValue) {
904
- populatedCollectFields.push(key);
905
- }
906
- }
907
- if (populatedCollectFields.length === 0) {
908
- // Pre-extraction didn't populate any declared collect field — no skip
909
- return { extractionRan: true, extractedData };
910
- }
911
- // ROUTING SKIP: pre-extraction populated collect fields → retain current flow/step
912
- index_js_1.logger.debug(`[ResponsePipeline] Routing skip: pre-extraction populated collect fields [${populatedCollectFields.join(', ')}] for step "${currentStep.id}" — skipping FlowRouter`);
913
- // Merge extracted data into session
914
- const updatedSession = (0, index_js_1.mergeCollected)(session, extractedData);
915
- await this.updateCollectedData(extractedData);
916
- // Determine next step using pipeline method for consistency
917
- // Pass the current flow/step as the routing result (retained)
918
- const stepResult = await this.determineNextStep({
919
- selectedFlow: currentFlow,
920
- selectedStep: currentStep,
921
- session: updatedSession,
922
- isFlowComplete: false,
923
- context: params.context,
924
- });
925
- return {
926
- extractionRan: true,
927
- extractedData,
928
- skipResult: {
929
- selectedFlow: stepResult.flowChanged || currentFlow,
930
- selectedStep: stepResult.nextStep,
931
- responseDirectives: undefined,
932
- session: stepResult.session,
933
- isFlowComplete: stepResult.isFlowComplete,
934
- },
935
- };
936
- }
937
- /**
938
- * Check if a flow should pre-extract data before determining the initial step
939
- */
940
- shouldPreExtractData(flow) {
941
- // Pre-extract if flow has declared required or optional fields
942
- if (flow.requiredFields && flow.requiredFields.length > 0) {
943
- return true;
944
- }
945
- if (flow.optionalFields && flow.optionalFields.length > 0) {
946
- return true;
947
- }
948
- // Pre-extract if any step in the flow collects data
949
- const steps = flow.getAllSteps();
950
- const hasDataCollectionSteps = steps.some(step => step.collect && step.collect.length > 0);
951
- return hasDataCollectionSteps;
952
- }
953
- /**
954
- * Build an extraction schema limited to the given subset of agent schema
955
- * fields. Used by the routing-skip probe so only the current step's collect
956
- * fields are visible to the extractor.
957
- */
958
- buildFieldRestrictedSchema(agentSchema, fields) {
959
- const properties = {};
960
- for (const field of fields) {
961
- const prop = agentSchema.properties?.[field];
962
- if (prop) {
963
- properties[field] = prop;
964
- }
965
- }
966
- return {
967
- type: "object",
968
- description: `Extraction restricted to these fields: ${fields.join(', ')}`,
969
- properties,
970
- additionalProperties: false,
971
- };
972
- }
973
- /**
974
- * Pre-extract data from user message when entering a flow
975
- * This allows skipping steps whose data is already provided
976
- */
977
- async preExtractFlowData(params) {
978
- const { route: flow, history, signal, restrictToFields } = params;
979
- // Build a schema for data extraction based on flow's fields
980
- const agentSchema = this.getSchema();
981
- if (!agentSchema) {
982
- index_js_1.logger.warn(`[ResponsePipeline] No schema available for pre-extraction`);
983
- return {};
984
- }
985
- const extractionSchema = restrictToFields
986
- ? this.buildFieldRestrictedSchema(agentSchema, restrictToFields)
987
- : agentSchema;
988
- // Get last user message
989
- const lastMessage = (0, index_js_1.getLastMessageFromHistory)(history);
990
- // Build extraction prompt
991
- const extractionPrompt = [
992
- `Extract any relevant information from the user's message that matches the following data fields.`,
993
- `Only extract information that is explicitly stated or clearly implied.`,
994
- ``,
995
- `User's message: "${lastMessage}"`,
996
- ``,
997
- `Extract data for these fields if present:`,
998
- ];
999
- // Add field descriptions
1000
- if (restrictToFields) {
1001
- extractionPrompt.push(`Only these fields: ${restrictToFields.join(', ')}`);
1002
- }
1003
- else {
1004
- if (flow.requiredFields) {
1005
- extractionPrompt.push(`Required fields: ${flow.requiredFields.join(', ')}`);
1006
- }
1007
- if (flow.optionalFields) {
1008
- extractionPrompt.push(`Optional fields: ${flow.optionalFields.join(', ')}`);
1009
- }
1010
- }
1011
- extractionPrompt.push(``, `Return ONLY the extracted data as JSON. If no data can be extracted, return an empty object {}.`);
1012
- // Convert Event[] to HistoryItem[] for provider call
1013
- const historyItems = (0, index_js_1.eventsToHistory)(history);
1014
- // Call AI to extract data
1015
- try {
1016
- const result = await this.options.provider.generateMessage({
1017
- prompt: extractionPrompt.join('\n'),
1018
- history: historyItems,
1019
- context: {}, // Passed as empty object so AI doesn't "extract" from context
1020
- // NOTE: context is intentionally NOT passed here.
1021
- // Passing context caused the AI to "extract" data from the lead's context
1022
- // (e.g., name, sector, city) instead of from what the user actually said.
1023
- signal,
1024
- parameters: {
1025
- jsonSchema: extractionSchema,
1026
- schemaName: 'data_extraction',
1027
- },
1028
- });
1029
- // Every caller merges this into the turn session BEFORE updateCollectedData
1030
- // runs, so an undeclared key is dropped here, at the source
1031
- return (0, index_js_1.dropUndeclaredFields)(result.structured || {}, agentSchema);
1032
- }
1033
- catch (error) {
1034
- index_js_1.logger.error(`[ResponsePipeline] Pre-extraction failed:`, error);
1035
- return {};
1036
- }
1037
- }
1038
- }
1039
- exports.ResponsePipeline = ResponsePipeline;
1040
- //# sourceMappingURL=ResponsePipeline.js.map