@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,749 +0,0 @@
1
- /**
2
- * ToolLoopExecutor owns dynamic tool execution during response generation:
3
- *
4
- * - `runLoop()` — the run-tools-then-ask-LLM-again follow-up loop used by the
5
- * non-streaming path (and as the streaming fallback): executes the initial
6
- * tool calls sequentially, asks the provider whether more tools are needed,
7
- * reconstructs tool-result history items, and forces a final text response
8
- * when tools ran but no message was produced.
9
- * - `runStreamingBatch()` — the streaming path's initial batch execution via
10
- * ToolManager.executeWithConcurrency (StreamingToolExecutor concurrency
11
- * rules), yielding tool-progress chunks; falls back to `runLoop()` when
12
- * concurrent execution fails.
13
- *
14
- * ToolManager remains the registry/resolver and single-tool executor.
15
- */
16
-
17
- import type {
18
- AgentOptions,
19
- AgentResponseStreamChunk,
20
- AgentStructuredResponse,
21
- Directive,
22
- HistoryItem,
23
- SessionState,
24
- ToolCallRequest,
25
- } from "../types/index.js";
26
- import type { Flow } from "./Flow.js";
27
- import type { Step } from "./Step.js";
28
- import type { ToolManager } from "./ToolManager.js";
29
- import { ResponseGenerationError } from "./ResponseGenerationError.js";
30
- import { flow } from "./flow-namespace.js";
31
- import { historyToEvents, logger, serializeToolResult, assistantMessage, toolMessage } from "../utils/index.js";
32
-
33
- /**
34
- * One attempted tool execution, keyed by CALL (not tool name): parallel or
35
- * repeated calls to the same tool in one turn keep their own results instead
36
- * of overwriting each other.
37
- */
38
- interface ToolExecutionRecord {
39
- requestId: string;
40
- toolName: string;
41
- arguments: Record<string, unknown>;
42
- /** Which loop round produced this call (0 = the initial streamed batch). */
43
- round: number;
44
- /** Serialized result fed back to the model; set EVEN on failure. */
45
- result?: string;
46
- }
47
-
48
- const executionFailure = (toolName: string, error: unknown): string =>
49
- JSON.stringify({
50
- success: false,
51
- error: `${toolName}: ${error instanceof Error ? error.message : String(error)}`,
52
- });
53
-
54
- const toolNotFoundFailure = (toolName: string): string =>
55
- JSON.stringify({ success: false, error: `Tool "${toolName}" is not registered in any scope.` });
56
-
57
- export class ToolLoopExecutor<TContext = unknown, TData = unknown> {
58
- constructor(
59
- private readonly deps: {
60
- toolManager: ToolManager<TContext, TData>;
61
- getAgentOptions: () => AgentOptions<TContext, TData>;
62
- updateContext: (updates: Partial<TContext>) => Promise<void>;
63
- updateCollectedData: (updates: Partial<TData>) => Promise<void>;
64
- updateSessionData: (
65
- session: SessionState<TData>,
66
- dataUpdate: Partial<TData>
67
- ) => Promise<SessionState<TData>>;
68
- /** Maximum number of tool loops (defaults to 5). */
69
- maxToolLoops?: number;
70
- }
71
- ) { }
72
-
73
- /**
74
- * Unified tool execution logic with loop handling.
75
- * Consolidates the complex tool execution logic from both streaming and
76
- * non-streaming responses.
77
- */
78
- async runLoop(params: {
79
- toolCalls?: Array<{ toolName: string; arguments: Record<string, unknown> }>;
80
- context: TContext;
81
- session: SessionState<TData>;
82
- history: HistoryItem[];
83
- selectedFlow?: Flow<TContext, TData>;
84
- responsePrompt: string;
85
- availableTools: Array<{
86
- id: string;
87
- name: string;
88
- description?: string;
89
- parameters?: unknown;
90
- }>;
91
- responseSchema?: Record<string, unknown>;
92
- signal?: AbortSignal;
93
- }): Promise<{
94
- session: SessionState<TData>;
95
- finalToolCalls?: Array<{ toolName: string; arguments: Record<string, unknown> }>;
96
- finalMessage?: string;
97
- structured?: AgentStructuredResponse;
98
- /** Directives emitted by tools this turn (ctx.dispatch / `{directive}` returns), merged. */
99
- directives?: Directive<TContext, TData>;
100
- }> {
101
- try {
102
- const { context, history, selectedFlow, responsePrompt, availableTools, responseSchema, signal } = params;
103
- // The follow-up loop (which reassigned toolCalls) now lives in
104
- // runFollowUpLoop; here toolCalls is only read.
105
- const { toolCalls } = params;
106
- let { session } = params;
107
-
108
- // Directives emitted by tools this turn — consumed by the caller
109
- const collectedDirectives: Directive<TContext, TData>[] = [];
110
-
111
- // Convert HistoryItem[] to Event[] for internal processing
112
- const historyEvents = historyToEvents(history);
113
-
114
- // Execution records keyed by call — shared with the follow-up loop
115
- const records: ToolExecutionRecord[] = [];
116
-
117
- // Execute initial dynamic tool calls
118
- if (toolCalls && toolCalls.length > 0) {
119
- logger.debug(`[ToolLoopExecutor] Executing ${toolCalls.length} dynamic tool calls:`, toolCalls.map(tc => tc.toolName));
120
-
121
- for (const [callIndex, toolCall] of toolCalls.entries()) {
122
- const record: ToolExecutionRecord = {
123
- requestId: `init-${callIndex}-${toolCall.toolName}`,
124
- toolName: toolCall.toolName,
125
- arguments: toolCall.arguments,
126
- round: 0,
127
- };
128
- records.push(record);
129
-
130
- const tool = this.findAvailableTool(toolCall.toolName, selectedFlow);
131
- if (!tool) {
132
- logger.warn(`[ToolExecutionError] Tool not found: "${toolCall.toolName}" is not registered in any scope. Register the tool or check the tool name.`);
133
- record.result = toolNotFoundFailure(toolCall.toolName);
134
- continue;
135
- }
136
-
137
- try {
138
- // Use ToolManager for unified tool execution
139
- const toolResult = await this.deps.toolManager.executeTool({
140
- tool,
141
- context,
142
- updateContext: this.deps.updateContext,
143
- updateData: this.deps.updateCollectedData,
144
- history: historyEvents, // Use Event[] for tool execution
145
- data: session.data,
146
- toolArguments: toolCall.arguments,
147
- });
148
-
149
- // Store the actual tool result data for history
150
- record.result = serializeToolResult(toolResult);
151
-
152
- // Collect tool-emitted directives (ctx.dispatch / {directive})
153
- if (toolResult.directives?.length) {
154
- collectedDirectives.push(...toolResult.directives as Directive<TContext, TData>[]);
155
- }
156
-
157
- // Check if tool execution was successful
158
- if (!toolResult.success) {
159
- logger.error(`[ToolLoopExecutor] Tool execution failed: ${toolCall.toolName} - ${toolResult.error}`);
160
- // Continue with other tools rather than failing completely
161
- continue;
162
- }
163
-
164
- // Update context with tool results
165
- if (toolResult.contextUpdate) {
166
- try {
167
- await this.deps.updateContext(toolResult.contextUpdate as Partial<TContext>);
168
- } catch (error) {
169
- logger.error(`[ToolLoopExecutor] Failed to update context from tool ${toolCall.toolName}:`, error);
170
- // Continue execution but log the error
171
- }
172
- }
173
-
174
- // Update collected data with tool results
175
- if (toolResult.dataUpdate) {
176
- try {
177
- session = await this.deps.updateSessionData(session, toolResult.dataUpdate as Partial<TData>);
178
- logger.debug(`[ToolLoopExecutor] Tool updated collected data:`, toolResult.dataUpdate);
179
- } catch (error) {
180
- logger.error(`[ToolLoopExecutor] Failed to update data from tool ${toolCall.toolName}:`, error);
181
- // Continue execution but log the error
182
- }
183
- }
184
-
185
- logger.debug(`[ToolLoopExecutor] Executed dynamic tool: ${toolCall.toolName} (success: ${toolResult.success})`);
186
- } catch (error) {
187
- logger.error(`[ToolLoopExecutor] Tool execution error for ${toolCall.toolName}:`, error);
188
- // A thrown handler must be visible to the model as a FAILED
189
- // tool call — reporting success makes it confirm actions
190
- // that never happened.
191
- record.result = executionFailure(toolCall.toolName, error);
192
- continue;
193
- }
194
- }
195
- }
196
-
197
- // A tool spoke verbatim this turn: its reply IS the final message —
198
- // skip the follow-up LLM call (documented dispatch semantics).
199
- const preLoopDirectives = flow.mergeAll(collectedDirectives);
200
- if (preLoopDirectives?.reply) {
201
- logger.debug("[ToolLoopExecutor] Tool directive reply short-circuits follow-up LLM call");
202
- return {
203
- session,
204
- finalToolCalls: toolCalls,
205
- finalMessage: preLoopDirectives.reply,
206
- structured: { message: preLoopDirectives.reply },
207
- directives: preLoopDirectives,
208
- };
209
- }
210
-
211
- // Hand off to the multi-round follow-up loop shared with the
212
- // streaming path. The initial batch above already executed
213
- // sequentially and populated the result maps.
214
- return await this.runFollowUpLoop({
215
- toolCalls,
216
- session,
217
- records,
218
- collectedDirectives,
219
- context,
220
- history,
221
- selectedFlow,
222
- responsePrompt,
223
- availableTools,
224
- responseSchema,
225
- signal,
226
- });
227
- } catch (error) {
228
- throw ResponseGenerationError.fromError(error, 'tool_execution', params, {
229
- toolCallsCount: params.toolCalls?.length || 0,
230
- availableToolsCount: params.availableTools.length
231
- });
232
- }
233
- }
234
-
235
- /**
236
- * The multi-round follow-up loop shared by the non-streaming (`runLoop`) and
237
- * streaming (`runStreamingBatch`) tool paths: re-prompt the model with the
238
- * tool results (tools available on the first round so it can chain further
239
- * calls), execute any further tool calls, repeat up to `maxToolLoops`, then
240
- * force a result-aware closing message if the model never produced one.
241
- * Callers run the *initial* batch — sequentially for `runLoop`, concurrently
242
- * (with progress) for `runStreamingBatch` — and pass the populated result
243
- * maps; from here both paths behave identically.
244
- */
245
- private async runFollowUpLoop(params: {
246
- toolCalls?: Array<{ toolName: string; arguments: Record<string, unknown> }>;
247
- session: SessionState<TData>;
248
- /** Execution records from prior rounds (initial batch = round 0). */
249
- records: ToolExecutionRecord[];
250
- /** Shared directive collector — initial-batch emissions land here too. */
251
- collectedDirectives?: Directive<TContext, TData>[];
252
- context: TContext;
253
- history: HistoryItem[];
254
- selectedFlow?: Flow<TContext, TData>;
255
- responsePrompt: string;
256
- availableTools: Array<{
257
- id: string;
258
- name: string;
259
- description?: string;
260
- parameters?: unknown;
261
- }>;
262
- responseSchema?: Record<string, unknown>;
263
- signal?: AbortSignal;
264
- }): Promise<{
265
- session: SessionState<TData>;
266
- finalToolCalls?: Array<{ toolName: string; arguments: Record<string, unknown> }>;
267
- finalMessage?: string;
268
- structured?: AgentStructuredResponse;
269
- directives?: Directive<TContext, TData>;
270
- }> {
271
- const { context, history, selectedFlow, responsePrompt, availableTools, responseSchema, signal, records, collectedDirectives = [] } = params;
272
- let { toolCalls, session } = params;
273
- try {
274
- // TOOL LOOP: Allow AI to make follow-up tool calls after initial tool execution
275
- // `??` so an explicit `maxToolLoops: 0` is honored instead of being
276
- // clobbered to the default by a falsy-zero check.
277
- const MAX_TOOL_LOOPS = this.deps.maxToolLoops ?? 5;
278
- let toolLoopCount = 0;
279
- let hasToolCalls = toolCalls && toolCalls.length > 0;
280
- let finalMessage: string | undefined;
281
- let followUpStructured: AgentStructuredResponse | undefined;
282
-
283
- while (hasToolCalls && toolLoopCount < MAX_TOOL_LOOPS) {
284
- toolLoopCount++;
285
- logger.debug(`[ToolLoopExecutor] Starting tool loop ${toolLoopCount}/${MAX_TOOL_LOOPS} with ${toolCalls?.length || 0} tool calls`);
286
-
287
- // Create tool result history items for the PREVIOUS round's
288
- // calls. Failures are reported as failures — never as success.
289
- const previousRound = toolLoopCount - 1;
290
- const roundRecords = records.filter((r) => r.round === previousRound);
291
- const toolResultHistoryItems: HistoryItem[] = [];
292
- for (const record of roundRecords) {
293
- toolResultHistoryItems.push(
294
- assistantMessage(null, [
295
- { id: record.requestId, name: record.toolName, arguments: record.arguments },
296
- ]),
297
- toolMessage(
298
- record.toolName,
299
- record.requestId,
300
- record.result ?? toolNotFoundFailure(record.toolName),
301
- ),
302
- );
303
- }
304
-
305
- // Create updated history with tool results
306
- const updatedHistory = [...history, ...toolResultHistoryItems];
307
-
308
- // Make follow-up AI call to see if more tools are needed.
309
- // Tools are offered EVERY iteration — the loop is already bounded
310
- // by MAX_TOOL_LOOPS, so withholding them after round only made
311
- // maxToolLoops values above 2 unreachable.
312
- const agentOptions = this.deps.getAgentOptions();
313
-
314
- logger.debug(`[ToolLoopExecutor] Making follow-up AI call (loop ${toolLoopCount}):`, {
315
- providingTools: true,
316
- toolsCount: availableTools.length,
317
- });
318
-
319
- const followUpResult = await agentOptions.provider.generateMessage({
320
- prompt: responsePrompt,
321
- history: updatedHistory, // Use HistoryItem[] for AI provider
322
- context,
323
- tools: availableTools,
324
- parameters: responseSchema ? {
325
- jsonSchema: responseSchema,
326
- schemaName: "tool_followup",
327
- } : undefined,
328
- signal,
329
- });
330
-
331
- // Check if follow-up call has more tool calls
332
- const followUpToolCalls = followUpResult.structured?.toolCalls;
333
- hasToolCalls = followUpToolCalls && followUpToolCalls.length > 0;
334
-
335
- logger.debug(`[ToolLoopExecutor] Follow-up AI response (loop ${toolLoopCount}):`, {
336
- hasMessage: !!followUpResult.message,
337
- messageLength: followUpResult.message?.length || 0,
338
- hasToolCalls,
339
- toolCallsCount: followUpToolCalls?.length || 0,
340
- toolNames: followUpToolCalls?.map(tc => tc.toolName) || [],
341
- });
342
-
343
- if (hasToolCalls) {
344
- logger.debug(`[ToolLoopExecutor] Follow-up call produced ${followUpToolCalls!.length} additional tool calls`);
345
-
346
- // Execute the follow-up tool calls
347
- for (const [callIndex, toolCall] of followUpToolCalls!.entries()) {
348
- const record: ToolExecutionRecord = {
349
- requestId: `fup-${toolLoopCount}-${callIndex}-${toolCall.toolName}`,
350
- toolName: toolCall.toolName,
351
- arguments: toolCall.arguments,
352
- round: toolLoopCount,
353
- };
354
- records.push(record);
355
-
356
- const tool = this.findAvailableTool(toolCall.toolName, selectedFlow);
357
- if (!tool) {
358
- logger.warn(`[ToolExecutionError] Tool not found in follow-up: "${toolCall.toolName}" is not registered in any scope. Register the tool or check the tool name.`);
359
- record.result = toolNotFoundFailure(toolCall.toolName);
360
- continue;
361
- }
362
-
363
- try {
364
- // Use ToolManager for unified tool execution
365
- const toolResult = await this.deps.toolManager.executeTool({
366
- tool,
367
- context,
368
- updateContext: this.deps.updateContext,
369
- updateData: this.deps.updateCollectedData,
370
- history: historyToEvents(updatedHistory), // Convert to Event[] for tool execution
371
- data: session.data,
372
- toolArguments: toolCall.arguments,
373
- });
374
-
375
- // Check if tool execution was successful
376
- if (!toolResult.success) {
377
- logger.error(`[ToolLoopExecutor] Follow-up tool execution failed: ${toolCall.toolName} - ${toolResult.error}`);
378
- continue;
379
- }
380
-
381
- // Update context with follow-up tool results
382
- if (toolResult.contextUpdate) {
383
- try {
384
- await this.deps.updateContext(toolResult.contextUpdate as Partial<TContext>);
385
- } catch (error) {
386
- logger.error(`[ToolLoopExecutor] Failed to update context from follow-up tool ${toolCall.toolName}:`, error);
387
- }
388
- }
389
-
390
- if (toolResult.dataUpdate) {
391
- try {
392
- session = await this.deps.updateSessionData(session, toolResult.dataUpdate as Partial<TData>);
393
- logger.debug(`[ToolLoopExecutor] Follow-up tool updated collected data:`, toolResult.dataUpdate);
394
- } catch (error) {
395
- logger.error(`[ToolLoopExecutor] Failed to update data from follow-up tool ${toolCall.toolName}:`, error);
396
- }
397
- }
398
-
399
- // Store the follow-up tool result for potential next loop iteration
400
- record.result = serializeToolResult(toolResult);
401
-
402
- // Collect tool-emitted directives (ctx.dispatch / {directive})
403
- if (toolResult.directives?.length) {
404
- collectedDirectives.push(...toolResult.directives as Directive<TContext, TData>[]);
405
- }
406
-
407
- logger.debug(`[ToolLoopExecutor] Executed follow-up tool: ${toolCall.toolName} (success: ${toolResult.success})`);
408
- } catch (error) {
409
- logger.error(`[ToolLoopExecutor] Follow-up tool execution error for ${toolCall.toolName}:`, error);
410
- // Visible failure beats a fabricated success.
411
- record.result = executionFailure(toolCall.toolName, error);
412
- continue;
413
- }
414
- }
415
-
416
- // A tool emitted a verbatim reply this round: it IS the final
417
- // message — stop looping and skip any further LLM call.
418
- const roundDirectives = flow.mergeAll(collectedDirectives);
419
- if (roundDirectives?.reply) {
420
- logger.debug("[ToolLoopExecutor] Tool directive reply short-circuits remaining tool loop");
421
- finalMessage = roundDirectives.reply;
422
- followUpStructured = { message: roundDirectives.reply };
423
- hasToolCalls = false;
424
- toolCalls = undefined;
425
- break;
426
- }
427
-
428
- // Update toolCalls for next iteration or final response
429
- toolCalls = followUpToolCalls;
430
- } else {
431
- logger.debug(`[ToolLoopExecutor] Tool loop completed after ${toolLoopCount} iterations`);
432
- // Update final message and toolCalls from follow-up result if no more tools
433
- finalMessage = followUpResult.structured?.message || followUpResult.message;
434
- followUpStructured = followUpResult.structured;
435
- toolCalls = followUpToolCalls || [];
436
- break;
437
- }
438
- }
439
-
440
- if (toolLoopCount >= MAX_TOOL_LOOPS) {
441
- logger.warn(`[ResponseGenerationError] Tool loop limit reached: ${toolLoopCount} iterations hit the cap (${MAX_TOOL_LOOPS}). Stopping tool execution. Increase the agent's maxToolLoops option or reduce recursive tool calls.`);
442
- }
443
-
444
- // If tools were executed but no final text message was produced,
445
- // make one more LLM call to generate a proper text response from tool
446
- // results. This prevents the original tool-invocation message (e.g.
447
- // "Let me check...") from being returned as the final user-facing
448
- // response. Shared with the streaming path via forceFinalTextFromTools.
449
- if (!finalMessage && toolLoopCount > 0) {
450
- logger.debug(`[ToolLoopExecutor] No final message after tool loop, making additional LLM call for text response`);
451
- const forced = await this.forceFinalTextFromTools({
452
- history,
453
- records,
454
- responsePrompt,
455
- responseSchema,
456
- context,
457
- signal,
458
- });
459
- if (forced.finalMessage) {
460
- finalMessage = forced.finalMessage;
461
- }
462
- if (forced.structured) {
463
- followUpStructured = forced.structured;
464
- }
465
- }
466
-
467
- logger.debug(`[ToolLoopExecutor] Tool loop completed:`, {
468
- totalIterations: toolLoopCount,
469
- hasFinalMessage: !!finalMessage,
470
- finalMessageLength: finalMessage?.length || 0,
471
- finalToolCallsCount: toolCalls?.length || 0,
472
- });
473
-
474
- return {
475
- session,
476
- finalToolCalls: toolCalls,
477
- finalMessage,
478
- structured: followUpStructured,
479
- directives: flow.mergeAll(collectedDirectives),
480
- };
481
- } catch (error) {
482
- throw ResponseGenerationError.fromError(error, 'tool_execution', params, {
483
- toolCallsCount: params.toolCalls?.length || 0,
484
- availableToolsCount: params.availableTools.length
485
- });
486
- }
487
- }
488
-
489
- /**
490
- * After tools have executed but the model produced no closing text, make one
491
- * more LLM call (no tools) that turns the tool results into a user-facing
492
- * message. Shared by the non-streaming tool loop and the streaming batch so
493
- * both paths behave identically. Returns an empty object if the call fails
494
- * or yields nothing, leaving the caller to fall back to its prior message.
495
- */
496
- private async forceFinalTextFromTools(params: {
497
- history: HistoryItem[];
498
- records: ToolExecutionRecord[];
499
- responsePrompt: string;
500
- responseSchema?: Record<string, unknown>;
501
- context: TContext;
502
- signal?: AbortSignal;
503
- }): Promise<{ finalMessage?: string; structured?: AgentStructuredResponse }> {
504
- const { history, records, responsePrompt, responseSchema, context, signal } = params;
505
-
506
- // Reconstruct assistant tool_call + tool result pairs so the follow-up
507
- // call can see what the tools returned — every executed call, keyed by
508
- // its own request id.
509
- const finalToolResultHistoryItems: HistoryItem[] = [];
510
- for (const record of records) {
511
- if (!record.result) continue;
512
- finalToolResultHistoryItems.push(
513
- assistantMessage(null, [
514
- { id: record.requestId, name: record.toolName, arguments: record.arguments },
515
- ]),
516
- toolMessage(record.toolName, record.requestId, record.result),
517
- );
518
- }
519
-
520
- const finalHistory = [...history, ...finalToolResultHistoryItems];
521
- const agentOptions = this.deps.getAgentOptions();
522
-
523
- try {
524
- const textResult = await agentOptions.provider.generateMessage({
525
- prompt: responsePrompt + "\n\nProvide a text response to the user based on the tool results. Do not call any tools.",
526
- history: finalHistory,
527
- context,
528
- tools: [], // No tools - force text response
529
- parameters: responseSchema ? {
530
- jsonSchema: responseSchema,
531
- schemaName: "tool_final_text",
532
- } : undefined,
533
- signal,
534
- });
535
-
536
- const finalMessage = textResult.structured?.message || textResult.message;
537
- logger.debug(`[ToolLoopExecutor] Generated final text response from tool results:`, {
538
- hasMessage: !!finalMessage,
539
- messageLength: finalMessage?.length || 0,
540
- });
541
- return { finalMessage, structured: textResult.structured };
542
- } catch (error) {
543
- logger.error(`[ToolLoopExecutor] Failed to generate final text response from tool results:`, error);
544
- // Leave the caller to fall back to its prior message.
545
- return {};
546
- }
547
- }
548
-
549
- /**
550
- * Execute the streaming path's initial batch of tool calls concurrently
551
- * via ToolManager.executeWithConcurrency, yielding tool-progress chunks.
552
- * When tools ran but the model produced no closing text, forces a final
553
- * text response from the tool results (mirroring `runLoop()`). Falls back
554
- * to `runLoop()` when concurrent execution fails.
555
- *
556
- * Returns the updated session, final tool calls, and any forced closing
557
- * message/structured response.
558
- */
559
- async *runStreamingBatch(params: {
560
- toolCalls: Array<{ toolName: string; arguments: Record<string, unknown> }>;
561
- context: TContext;
562
- session: SessionState<TData>;
563
- history: HistoryItem[];
564
- selectedFlow: Flow<TContext, TData>;
565
- step: Step<TContext, TData>;
566
- /** Accumulated text of the LLM's final chunk, echoed on progress chunks. */
567
- accumulated: string;
568
- responsePrompt: string;
569
- availableTools: Array<{
570
- id: string;
571
- name: string;
572
- description?: string;
573
- parameters?: unknown;
574
- }>;
575
- responseSchema?: Record<string, unknown>;
576
- signal?: AbortSignal;
577
- }): AsyncGenerator<
578
- AgentResponseStreamChunk<TData>,
579
- {
580
- session: SessionState<TData>;
581
- toolCalls: Array<{ toolName: string; arguments: Record<string, unknown> }> | undefined;
582
- /** Closing message forced from the tool results, if one was generated. */
583
- finalMessage?: string;
584
- structured?: AgentStructuredResponse;
585
- /** Directives emitted by tools this turn (ctx.dispatch / `{directive}` returns), merged. */
586
- directives?: Directive<TContext, TData>;
587
- }
588
- > {
589
- const { context, history, selectedFlow, step, accumulated, responsePrompt, availableTools, responseSchema, signal } = params;
590
- let { session } = params;
591
- let toolCalls: Array<{ toolName: string; arguments: Record<string, unknown> }> | undefined = params.toolCalls;
592
-
593
- // Directives emitted by tools this turn — surfaced to the caller
594
- const collectedDirectives: Directive<TContext, TData>[] = [];
595
-
596
- // Use concurrent execution for the initial batch of tool calls
597
- const toolCallRequests: ToolCallRequest[] = params.toolCalls.map((tc, i) => ({
598
- id: `${tc.toolName}-${i}-${Date.now()}`,
599
- toolName: tc.toolName,
600
- arguments: tc.arguments,
601
- }));
602
- // Map request id -> request so completed results can be attributed back
603
- // to their tool name/arguments for the forced final-text call.
604
- // Execution records keyed by call id — seeded at queue time so results
605
- // (and failures) attach to the right call even for same-name calls.
606
- const records: ToolExecutionRecord[] = toolCallRequests.map((req) => ({
607
- requestId: req.id,
608
- toolName: req.toolName,
609
- arguments: req.arguments,
610
- round: 0,
611
- }));
612
- const recordById = new Map(records.map((r) => [r.requestId, r]));
613
-
614
- const historyEvents = historyToEvents(history);
615
-
616
- let finalMessage: string | undefined;
617
- let structured: AgentStructuredResponse | undefined;
618
-
619
- try {
620
- for await (const update of this.deps.toolManager.executeWithConcurrency({
621
- toolCalls: toolCallRequests,
622
- context,
623
- data: session.data,
624
- history: historyEvents,
625
- signal,
626
- flow: selectedFlow,
627
- step,
628
- })) {
629
- // Apply context updates
630
- if (update.contextUpdate) {
631
- try {
632
- await this.deps.updateContext(update.contextUpdate as Partial<TContext>);
633
- } catch (error) {
634
- logger.error(`[ToolLoopExecutor] Failed to update context from concurrent tool:`, error);
635
- }
636
- }
637
-
638
- // Apply data updates
639
- if (update.dataUpdate) {
640
- try {
641
- session = await this.deps.updateSessionData(session, update.dataUpdate);
642
- } catch (error) {
643
- logger.error(`[ToolLoopExecutor] Failed to update data from concurrent tool:`, error);
644
- }
645
- }
646
-
647
- // Capture tool results for the forced final-text call
648
- if (update.result) {
649
- const record = recordById.get(update.toolCallId);
650
- if (record) {
651
- record.result = serializeToolResult(update.result);
652
- }
653
- // Collect tool-emitted directives (ctx.dispatch / {directive})
654
- if (update.result.directives?.length) {
655
- collectedDirectives.push(...update.result.directives as Directive<TContext, TData>[]);
656
- }
657
- }
658
-
659
- // Yield progress updates immediately
660
- if (update.progress) {
661
- yield {
662
- delta: '',
663
- accumulated,
664
- done: false,
665
- session,
666
- toolCalls: undefined,
667
- isFlowComplete: false,
668
- metadata: { toolProgress: update.progress, toolCallId: update.toolCallId },
669
- };
670
- }
671
- }
672
-
673
- logger.debug(`[ToolLoopExecutor] Concurrent tool execution completed for ${toolCallRequests.length} tools`);
674
-
675
- // Multi-round follow-up shared with the non-streaming path: re-prompt
676
- // with the tool results so the model can chain further tool calls,
677
- // then produce result-aware closing text (forced if it never does).
678
- // Previously a single forced-text call — streaming now loops to parity
679
- // with runLoop, so a streamed turn can chain tools across rounds.
680
- const followUp = await this.runFollowUpLoop({
681
- toolCalls,
682
- session,
683
- records,
684
- collectedDirectives,
685
- context,
686
- history,
687
- selectedFlow,
688
- responsePrompt,
689
- availableTools,
690
- responseSchema,
691
- signal,
692
- });
693
- session = followUp.session;
694
- toolCalls = followUp.finalToolCalls;
695
- finalMessage = followUp.finalMessage;
696
- structured = followUp.structured;
697
- } catch (error) {
698
- logger.error(`[ToolLoopExecutor] Concurrent batch failed:`, error);
699
- const executedRecords = records.filter((r) => r.result !== undefined);
700
- if (executedRecords.length > 0) {
701
- // Some tools already executed — re-running them would duplicate
702
- // real-world side effects (sends, writes, charges). Close the
703
- // turn from the results we have instead.
704
- logger.warn(
705
- `[ToolLoopExecutor] ${executedRecords.length} tool(s) already executed; closing the turn from their results rather than re-executing.`
706
- );
707
- const forced = await this.forceFinalTextFromTools({
708
- history,
709
- records,
710
- responsePrompt,
711
- responseSchema,
712
- context,
713
- signal,
714
- });
715
- if (forced.finalMessage) {
716
- finalMessage = forced.finalMessage;
717
- }
718
- structured = structured ?? forced.structured;
719
- } else {
720
- // Nothing executed — safe to fall back to the unified loop.
721
- const toolResult = await this.runLoop({
722
- toolCalls, context, session, history, selectedFlow,
723
- responsePrompt, availableTools, responseSchema, signal,
724
- });
725
- session = toolResult.session;
726
- toolCalls = toolResult.finalToolCalls;
727
- finalMessage = toolResult.finalMessage;
728
- structured = toolResult.structured;
729
- if (toolResult.directives) {
730
- collectedDirectives.length = 0;
731
- collectedDirectives.push(toolResult.directives);
732
- }
733
- }
734
- }
735
-
736
- return { session, toolCalls, finalMessage, structured, directives: flow.mergeAll(collectedDirectives) };
737
- }
738
-
739
- /**
740
- * Find an available tool by name for the given flow.
741
- * Delegates to ToolManager for unified tool resolution.
742
- */
743
- private findAvailableTool(
744
- toolName: string,
745
- flow?: Flow<TContext, TData>
746
- ) {
747
- return this.deps.toolManager.find(toolName, undefined, undefined, flow);
748
- }
749
- }