@falai/agent 1.2.7 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (508) hide show
  1. package/README.md +40 -886
  2. package/dist/adapters/MemoryAdapter.js +2 -2
  3. package/dist/adapters/MemoryAdapter.js.map +1 -1
  4. package/dist/adapters/MongoAdapter.js +2 -2
  5. package/dist/adapters/MongoAdapter.js.map +1 -1
  6. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
  7. package/dist/adapters/OpenSearchAdapter.js +9 -7
  8. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  9. package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
  10. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  11. package/dist/adapters/PostgreSQLAdapter.js +25 -9
  12. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  13. package/dist/adapters/PrismaAdapter.js +5 -5
  14. package/dist/adapters/PrismaAdapter.js.map +1 -1
  15. package/dist/adapters/RedisAdapter.js +2 -2
  16. package/dist/adapters/RedisAdapter.js.map +1 -1
  17. package/dist/adapters/SQLiteAdapter.d.ts +17 -0
  18. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  19. package/dist/adapters/SQLiteAdapter.js +30 -11
  20. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  21. package/dist/cjs/adapters/MemoryAdapter.js +2 -2
  22. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  23. package/dist/cjs/adapters/MongoAdapter.js +2 -2
  24. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  25. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  26. package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
  27. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  28. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
  29. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  30. package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
  31. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  32. package/dist/cjs/adapters/PrismaAdapter.js +5 -5
  33. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  34. package/dist/cjs/adapters/RedisAdapter.js +2 -2
  35. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  36. package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
  37. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  38. package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
  39. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  40. package/dist/cjs/constants/index.d.ts +0 -9
  41. package/dist/cjs/constants/index.d.ts.map +1 -1
  42. package/dist/cjs/constants/index.js +2 -11
  43. package/dist/cjs/constants/index.js.map +1 -1
  44. package/dist/cjs/core/Agent.d.ts +119 -153
  45. package/dist/cjs/core/Agent.d.ts.map +1 -1
  46. package/dist/cjs/core/Agent.js +471 -324
  47. package/dist/cjs/core/Agent.js.map +1 -1
  48. package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
  49. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
  50. package/dist/cjs/core/AutoChainExecutor.js +297 -0
  51. package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
  52. package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
  53. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
  54. package/dist/cjs/core/BranchEvaluator.js +130 -0
  55. package/dist/cjs/core/BranchEvaluator.js.map +1 -0
  56. package/dist/cjs/core/DirectiveBus.d.ts +88 -0
  57. package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
  58. package/dist/cjs/core/DirectiveBus.js +196 -0
  59. package/dist/cjs/core/DirectiveBus.js.map +1 -0
  60. package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
  61. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
  62. package/dist/cjs/core/DirectiveChainTracker.js +121 -0
  63. package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
  64. package/dist/cjs/core/Flow.d.ts +186 -0
  65. package/dist/cjs/core/Flow.d.ts.map +1 -0
  66. package/dist/cjs/core/Flow.js +550 -0
  67. package/dist/cjs/core/Flow.js.map +1 -0
  68. package/dist/cjs/core/FlowRouter.d.ts +182 -0
  69. package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
  70. package/dist/cjs/core/{RoutingEngine.js → FlowRouter.js} +323 -306
  71. package/dist/cjs/core/FlowRouter.js.map +1 -0
  72. package/dist/cjs/core/PersistenceManager.d.ts +2 -2
  73. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  74. package/dist/cjs/core/PersistenceManager.js +7 -7
  75. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  76. package/dist/cjs/core/PromptComposer.d.ts +21 -8
  77. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  78. package/dist/cjs/core/PromptComposer.js +182 -105
  79. package/dist/cjs/core/PromptComposer.js.map +1 -1
  80. package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
  81. package/dist/cjs/core/PromptSectionCache.js +1 -1
  82. package/dist/cjs/core/ResponseEngine.d.ts +18 -8
  83. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  84. package/dist/cjs/core/ResponseEngine.js +38 -36
  85. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  86. package/dist/cjs/core/ResponseModal.d.ts +73 -56
  87. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  88. package/dist/cjs/core/ResponseModal.js +1196 -1015
  89. package/dist/cjs/core/ResponseModal.js.map +1 -1
  90. package/dist/cjs/core/ResponsePipeline.d.ts +124 -26
  91. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  92. package/dist/cjs/core/ResponsePipeline.js +524 -134
  93. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  94. package/dist/cjs/core/SignalEvaluator.d.ts +86 -0
  95. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -0
  96. package/dist/cjs/core/SignalEvaluator.js +333 -0
  97. package/dist/cjs/core/SignalEvaluator.js.map +1 -0
  98. package/dist/cjs/core/SignalProcessor.d.ts +152 -0
  99. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -0
  100. package/dist/cjs/core/SignalProcessor.js +562 -0
  101. package/dist/cjs/core/SignalProcessor.js.map +1 -0
  102. package/dist/cjs/core/Step.d.ts +43 -32
  103. package/dist/cjs/core/Step.d.ts.map +1 -1
  104. package/dist/cjs/core/Step.js +221 -126
  105. package/dist/cjs/core/Step.js.map +1 -1
  106. package/dist/cjs/core/StreamingToolExecutor.d.ts +2 -2
  107. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
  108. package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
  109. package/dist/cjs/core/ToolManager.d.ts +44 -13
  110. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  111. package/dist/cjs/core/ToolManager.js +174 -91
  112. package/dist/cjs/core/ToolManager.js.map +1 -1
  113. package/dist/cjs/core/createAgent.d.ts +35 -0
  114. package/dist/cjs/core/createAgent.d.ts.map +1 -0
  115. package/dist/cjs/core/createAgent.js +39 -0
  116. package/dist/cjs/core/createAgent.js.map +1 -0
  117. package/dist/cjs/core/flow-namespace.d.ts +49 -0
  118. package/dist/cjs/core/flow-namespace.d.ts.map +1 -0
  119. package/dist/cjs/core/flow-namespace.js +171 -0
  120. package/dist/cjs/core/flow-namespace.js.map +1 -0
  121. package/dist/cjs/index.d.ts +11 -14
  122. package/dist/cjs/index.d.ts.map +1 -1
  123. package/dist/cjs/index.js +18 -22
  124. package/dist/cjs/index.js.map +1 -1
  125. package/dist/cjs/providers/GeminiProvider.d.ts +3 -3
  126. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  127. package/dist/cjs/providers/GeminiProvider.js +16 -14
  128. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  129. package/dist/cjs/types/agent.d.ts +183 -54
  130. package/dist/cjs/types/agent.d.ts.map +1 -1
  131. package/dist/cjs/types/agent.js +0 -6
  132. package/dist/cjs/types/agent.js.map +1 -1
  133. package/dist/cjs/types/ai.d.ts +3 -3
  134. package/dist/cjs/types/ai.d.ts.map +1 -1
  135. package/dist/cjs/types/errors.d.ts +15 -0
  136. package/dist/cjs/types/errors.d.ts.map +1 -0
  137. package/dist/cjs/types/errors.js +22 -0
  138. package/dist/cjs/types/errors.js.map +1 -0
  139. package/dist/cjs/types/flow.d.ts +513 -0
  140. package/dist/cjs/types/flow.d.ts.map +1 -0
  141. package/dist/cjs/types/{route.js → flow.js} +2 -2
  142. package/dist/cjs/types/flow.js.map +1 -0
  143. package/dist/cjs/types/index.d.ts +7 -6
  144. package/dist/cjs/types/index.d.ts.map +1 -1
  145. package/dist/cjs/types/index.js +6 -2
  146. package/dist/cjs/types/index.js.map +1 -1
  147. package/dist/cjs/types/persistence.d.ts +11 -7
  148. package/dist/cjs/types/persistence.d.ts.map +1 -1
  149. package/dist/cjs/types/routing.d.ts +1 -1
  150. package/dist/cjs/types/routing.d.ts.map +1 -1
  151. package/dist/cjs/types/session.d.ts +24 -23
  152. package/dist/cjs/types/session.d.ts.map +1 -1
  153. package/dist/cjs/types/signals.d.ts +248 -0
  154. package/dist/cjs/types/signals.d.ts.map +1 -0
  155. package/dist/cjs/types/signals.js +11 -0
  156. package/dist/cjs/types/signals.js.map +1 -0
  157. package/dist/cjs/types/template.d.ts +2 -8
  158. package/dist/cjs/types/template.d.ts.map +1 -1
  159. package/dist/cjs/types/tool.d.ts +36 -29
  160. package/dist/cjs/types/tool.d.ts.map +1 -1
  161. package/dist/cjs/types/tool.js +1 -1
  162. package/dist/cjs/types/tool.js.map +1 -1
  163. package/dist/cjs/utils/condition.d.ts +7 -1
  164. package/dist/cjs/utils/condition.d.ts.map +1 -1
  165. package/dist/cjs/utils/condition.js.map +1 -1
  166. package/dist/cjs/utils/id.d.ts +13 -5
  167. package/dist/cjs/utils/id.d.ts.map +1 -1
  168. package/dist/cjs/utils/id.js +24 -10
  169. package/dist/cjs/utils/id.js.map +1 -1
  170. package/dist/cjs/utils/index.d.ts +2 -2
  171. package/dist/cjs/utils/index.d.ts.map +1 -1
  172. package/dist/cjs/utils/index.js +7 -3
  173. package/dist/cjs/utils/index.js.map +1 -1
  174. package/dist/cjs/utils/session.d.ts +44 -5
  175. package/dist/cjs/utils/session.d.ts.map +1 -1
  176. package/dist/cjs/utils/session.js +197 -38
  177. package/dist/cjs/utils/session.js.map +1 -1
  178. package/dist/constants/index.d.ts +0 -9
  179. package/dist/constants/index.d.ts.map +1 -1
  180. package/dist/constants/index.js +3 -9
  181. package/dist/constants/index.js.map +1 -1
  182. package/dist/core/Agent.d.ts +119 -153
  183. package/dist/core/Agent.d.ts.map +1 -1
  184. package/dist/core/Agent.js +472 -325
  185. package/dist/core/Agent.js.map +1 -1
  186. package/dist/core/AutoChainExecutor.d.ts +107 -0
  187. package/dist/core/AutoChainExecutor.d.ts.map +1 -0
  188. package/dist/core/AutoChainExecutor.js +293 -0
  189. package/dist/core/AutoChainExecutor.js.map +1 -0
  190. package/dist/core/BranchEvaluator.d.ts +54 -0
  191. package/dist/core/BranchEvaluator.d.ts.map +1 -0
  192. package/dist/core/BranchEvaluator.js +126 -0
  193. package/dist/core/BranchEvaluator.js.map +1 -0
  194. package/dist/core/DirectiveBus.d.ts +88 -0
  195. package/dist/core/DirectiveBus.d.ts.map +1 -0
  196. package/dist/core/DirectiveBus.js +192 -0
  197. package/dist/core/DirectiveBus.js.map +1 -0
  198. package/dist/core/DirectiveChainTracker.d.ts +49 -0
  199. package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
  200. package/dist/core/DirectiveChainTracker.js +117 -0
  201. package/dist/core/DirectiveChainTracker.js.map +1 -0
  202. package/dist/core/Flow.d.ts +186 -0
  203. package/dist/core/Flow.d.ts.map +1 -0
  204. package/dist/core/Flow.js +546 -0
  205. package/dist/core/Flow.js.map +1 -0
  206. package/dist/core/FlowRouter.d.ts +182 -0
  207. package/dist/core/FlowRouter.d.ts.map +1 -0
  208. package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
  209. package/dist/core/FlowRouter.js.map +1 -0
  210. package/dist/core/PersistenceManager.d.ts +2 -2
  211. package/dist/core/PersistenceManager.d.ts.map +1 -1
  212. package/dist/core/PersistenceManager.js +7 -7
  213. package/dist/core/PersistenceManager.js.map +1 -1
  214. package/dist/core/PromptComposer.d.ts +21 -8
  215. package/dist/core/PromptComposer.d.ts.map +1 -1
  216. package/dist/core/PromptComposer.js +183 -106
  217. package/dist/core/PromptComposer.js.map +1 -1
  218. package/dist/core/PromptSectionCache.d.ts +1 -1
  219. package/dist/core/PromptSectionCache.js +1 -1
  220. package/dist/core/ResponseEngine.d.ts +18 -8
  221. package/dist/core/ResponseEngine.d.ts.map +1 -1
  222. package/dist/core/ResponseEngine.js +38 -36
  223. package/dist/core/ResponseEngine.js.map +1 -1
  224. package/dist/core/ResponseModal.d.ts +73 -56
  225. package/dist/core/ResponseModal.d.ts.map +1 -1
  226. package/dist/core/ResponseModal.js +1198 -1017
  227. package/dist/core/ResponseModal.js.map +1 -1
  228. package/dist/core/ResponsePipeline.d.ts +124 -26
  229. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  230. package/dist/core/ResponsePipeline.js +524 -135
  231. package/dist/core/ResponsePipeline.js.map +1 -1
  232. package/dist/core/SignalEvaluator.d.ts +86 -0
  233. package/dist/core/SignalEvaluator.d.ts.map +1 -0
  234. package/dist/core/SignalEvaluator.js +326 -0
  235. package/dist/core/SignalEvaluator.js.map +1 -0
  236. package/dist/core/SignalProcessor.d.ts +152 -0
  237. package/dist/core/SignalProcessor.d.ts.map +1 -0
  238. package/dist/core/SignalProcessor.js +555 -0
  239. package/dist/core/SignalProcessor.js.map +1 -0
  240. package/dist/core/Step.d.ts +43 -32
  241. package/dist/core/Step.d.ts.map +1 -1
  242. package/dist/core/Step.js +220 -126
  243. package/dist/core/Step.js.map +1 -1
  244. package/dist/core/StreamingToolExecutor.d.ts +2 -2
  245. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  246. package/dist/core/StreamingToolExecutor.js.map +1 -1
  247. package/dist/core/ToolManager.d.ts +44 -13
  248. package/dist/core/ToolManager.d.ts.map +1 -1
  249. package/dist/core/ToolManager.js +174 -91
  250. package/dist/core/ToolManager.js.map +1 -1
  251. package/dist/core/createAgent.d.ts +35 -0
  252. package/dist/core/createAgent.d.ts.map +1 -0
  253. package/dist/core/createAgent.js +36 -0
  254. package/dist/core/createAgent.js.map +1 -0
  255. package/dist/core/flow-namespace.d.ts +49 -0
  256. package/dist/core/flow-namespace.d.ts.map +1 -0
  257. package/dist/core/flow-namespace.js +168 -0
  258. package/dist/core/flow-namespace.js.map +1 -0
  259. package/dist/index.d.ts +11 -14
  260. package/dist/index.d.ts.map +1 -1
  261. package/dist/index.js +9 -12
  262. package/dist/index.js.map +1 -1
  263. package/dist/providers/GeminiProvider.d.ts +3 -3
  264. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  265. package/dist/providers/GeminiProvider.js +16 -14
  266. package/dist/providers/GeminiProvider.js.map +1 -1
  267. package/dist/types/agent.d.ts +183 -54
  268. package/dist/types/agent.d.ts.map +1 -1
  269. package/dist/types/agent.js +0 -6
  270. package/dist/types/agent.js.map +1 -1
  271. package/dist/types/ai.d.ts +3 -3
  272. package/dist/types/ai.d.ts.map +1 -1
  273. package/dist/types/errors.d.ts +15 -0
  274. package/dist/types/errors.d.ts.map +1 -0
  275. package/dist/types/errors.js +18 -0
  276. package/dist/types/errors.js.map +1 -0
  277. package/dist/types/flow.d.ts +513 -0
  278. package/dist/types/flow.d.ts.map +1 -0
  279. package/dist/types/flow.js +5 -0
  280. package/dist/types/flow.js.map +1 -0
  281. package/dist/types/index.d.ts +7 -6
  282. package/dist/types/index.d.ts.map +1 -1
  283. package/dist/types/index.js +4 -1
  284. package/dist/types/index.js.map +1 -1
  285. package/dist/types/persistence.d.ts +11 -7
  286. package/dist/types/persistence.d.ts.map +1 -1
  287. package/dist/types/routing.d.ts +1 -1
  288. package/dist/types/routing.d.ts.map +1 -1
  289. package/dist/types/session.d.ts +24 -23
  290. package/dist/types/session.d.ts.map +1 -1
  291. package/dist/types/signals.d.ts +248 -0
  292. package/dist/types/signals.d.ts.map +1 -0
  293. package/dist/types/signals.js +10 -0
  294. package/dist/types/signals.js.map +1 -0
  295. package/dist/types/template.d.ts +2 -8
  296. package/dist/types/template.d.ts.map +1 -1
  297. package/dist/types/tool.d.ts +36 -29
  298. package/dist/types/tool.d.ts.map +1 -1
  299. package/dist/types/tool.js +1 -1
  300. package/dist/types/tool.js.map +1 -1
  301. package/dist/utils/condition.d.ts +7 -1
  302. package/dist/utils/condition.d.ts.map +1 -1
  303. package/dist/utils/condition.js.map +1 -1
  304. package/dist/utils/id.d.ts +13 -5
  305. package/dist/utils/id.d.ts.map +1 -1
  306. package/dist/utils/id.js +22 -9
  307. package/dist/utils/id.js.map +1 -1
  308. package/dist/utils/index.d.ts +2 -2
  309. package/dist/utils/index.d.ts.map +1 -1
  310. package/dist/utils/index.js +2 -2
  311. package/dist/utils/index.js.map +1 -1
  312. package/dist/utils/session.d.ts +44 -5
  313. package/dist/utils/session.d.ts.map +1 -1
  314. package/dist/utils/session.js +193 -37
  315. package/dist/utils/session.js.map +1 -1
  316. package/docs/README.md +15 -202
  317. package/docs/concepts/architecture.md +281 -0
  318. package/docs/concepts/directives.md +400 -0
  319. package/docs/concepts/pipeline.md +399 -0
  320. package/docs/guides/branching.md +263 -0
  321. package/docs/guides/compaction.md +163 -0
  322. package/docs/guides/conditions.md +167 -0
  323. package/docs/guides/error-handling.md +176 -0
  324. package/docs/guides/flow-control.md +409 -0
  325. package/docs/guides/instructions.md +210 -0
  326. package/docs/guides/persistence.md +182 -0
  327. package/docs/guides/streaming.md +137 -0
  328. package/docs/migration/README.md +15 -0
  329. package/docs/migration/route-to-flow.md +560 -0
  330. package/docs/migration/v1-to-v2.md +909 -0
  331. package/docs/reference/adapters.md +481 -0
  332. package/docs/reference/branches.md +241 -0
  333. package/docs/reference/create-agent.md +186 -0
  334. package/docs/reference/directive.md +243 -0
  335. package/docs/reference/errors.md +122 -0
  336. package/docs/reference/flow.md +238 -0
  337. package/docs/reference/instruction.md +177 -0
  338. package/docs/reference/pre-directive.md +131 -0
  339. package/docs/reference/providers.md +227 -0
  340. package/docs/reference/signals.md +356 -0
  341. package/docs/reference/step.md +339 -0
  342. package/docs/reference/tool.md +269 -0
  343. package/docs/start/01-install.md +81 -0
  344. package/docs/start/02-first-agent.md +196 -0
  345. package/docs/start/03-collect-data.md +222 -0
  346. package/docs/start/04-add-tools.md +276 -0
  347. package/docs/start/05-go-to-production.md +216 -0
  348. package/examples/01-quickstart.ts +20 -0
  349. package/examples/02-data-extraction.ts +90 -0
  350. package/examples/03-tools.ts +136 -0
  351. package/examples/04-instructions.ts +100 -0
  352. package/examples/05-branching.ts +140 -0
  353. package/examples/06-flow-control.ts +103 -0
  354. package/examples/07-streaming.ts +69 -0
  355. package/examples/08-persistence.ts +98 -0
  356. package/examples/09-signals.ts +144 -0
  357. package/examples/tsconfig.json +30 -0
  358. package/package.json +2 -1
  359. package/src/adapters/MemoryAdapter.ts +3 -3
  360. package/src/adapters/MongoAdapter.ts +3 -3
  361. package/src/adapters/OpenSearchAdapter.ts +10 -8
  362. package/src/adapters/PostgreSQLAdapter.ts +26 -10
  363. package/src/adapters/PrismaAdapter.ts +6 -6
  364. package/src/adapters/RedisAdapter.ts +3 -3
  365. package/src/adapters/SQLiteAdapter.ts +31 -12
  366. package/src/constants/index.ts +2 -10
  367. package/src/core/Agent.ts +585 -374
  368. package/src/core/AutoChainExecutor.ts +440 -0
  369. package/src/core/BranchEvaluator.ts +167 -0
  370. package/src/core/DirectiveBus.ts +248 -0
  371. package/src/core/DirectiveChainTracker.ts +144 -0
  372. package/src/core/Flow.ts +666 -0
  373. package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
  374. package/src/core/PersistenceManager.ts +8 -8
  375. package/src/core/PromptComposer.ts +209 -140
  376. package/src/core/PromptSectionCache.ts +1 -1
  377. package/src/core/ResponseEngine.ts +61 -46
  378. package/src/core/ResponseModal.ts +1458 -1241
  379. package/src/core/ResponsePipeline.ts +675 -173
  380. package/src/core/SignalEvaluator.ts +420 -0
  381. package/src/core/SignalProcessor.ts +723 -0
  382. package/src/core/Step.ts +279 -176
  383. package/src/core/StreamingToolExecutor.ts +4 -4
  384. package/src/core/ToolManager.ts +200 -97
  385. package/src/core/createAgent.ts +40 -0
  386. package/src/core/flow-namespace.ts +219 -0
  387. package/src/index.ts +42 -36
  388. package/src/providers/GeminiProvider.ts +17 -15
  389. package/src/types/agent.ts +182 -53
  390. package/src/types/ai.ts +3 -3
  391. package/src/types/errors.ts +18 -0
  392. package/src/types/flow.ts +590 -0
  393. package/src/types/index.ts +43 -16
  394. package/src/types/persistence.ts +12 -8
  395. package/src/types/routing.ts +1 -1
  396. package/src/types/session.ts +26 -23
  397. package/src/types/signals.ts +321 -0
  398. package/src/types/template.ts +3 -11
  399. package/src/types/tool.ts +50 -42
  400. package/src/utils/condition.ts +13 -4
  401. package/src/utils/id.ts +27 -9
  402. package/src/utils/index.ts +6 -2
  403. package/src/utils/session.ts +238 -42
  404. package/dist/cjs/core/BatchExecutor.d.ts +0 -359
  405. package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
  406. package/dist/cjs/core/BatchExecutor.js +0 -861
  407. package/dist/cjs/core/BatchExecutor.js.map +0 -1
  408. package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
  409. package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
  410. package/dist/cjs/core/BatchPromptBuilder.js +0 -223
  411. package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
  412. package/dist/cjs/core/Route.d.ts +0 -180
  413. package/dist/cjs/core/Route.d.ts.map +0 -1
  414. package/dist/cjs/core/Route.js +0 -542
  415. package/dist/cjs/core/Route.js.map +0 -1
  416. package/dist/cjs/core/RoutingEngine.d.ts +0 -185
  417. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  418. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  419. package/dist/cjs/types/route.d.ts +0 -336
  420. package/dist/cjs/types/route.d.ts.map +0 -1
  421. package/dist/cjs/types/route.js.map +0 -1
  422. package/dist/core/BatchExecutor.d.ts +0 -359
  423. package/dist/core/BatchExecutor.d.ts.map +0 -1
  424. package/dist/core/BatchExecutor.js +0 -856
  425. package/dist/core/BatchExecutor.js.map +0 -1
  426. package/dist/core/BatchPromptBuilder.d.ts +0 -89
  427. package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
  428. package/dist/core/BatchPromptBuilder.js +0 -219
  429. package/dist/core/BatchPromptBuilder.js.map +0 -1
  430. package/dist/core/Route.d.ts +0 -180
  431. package/dist/core/Route.d.ts.map +0 -1
  432. package/dist/core/Route.js +0 -538
  433. package/dist/core/Route.js.map +0 -1
  434. package/dist/core/RoutingEngine.d.ts +0 -185
  435. package/dist/core/RoutingEngine.d.ts.map +0 -1
  436. package/dist/core/RoutingEngine.js.map +0 -1
  437. package/dist/types/route.d.ts +0 -336
  438. package/dist/types/route.d.ts.map +0 -1
  439. package/dist/types/route.js +0 -5
  440. package/dist/types/route.js.map +0 -1
  441. package/docs/CONTRIBUTING.md +0 -521
  442. package/docs/api/README.md +0 -3299
  443. package/docs/api/overview.md +0 -1410
  444. package/docs/architecture/data-extraction-flow.md +0 -360
  445. package/docs/architecture/multi-step-execution.md +0 -277
  446. package/docs/core/agent/README.md +0 -938
  447. package/docs/core/agent/context-management.md +0 -796
  448. package/docs/core/agent/rules-and-prohibitions.md +0 -113
  449. package/docs/core/agent/session-management.md +0 -693
  450. package/docs/core/ai-integration/prompt-composition.md +0 -355
  451. package/docs/core/ai-integration/providers.md +0 -515
  452. package/docs/core/ai-integration/response-processing.md +0 -433
  453. package/docs/core/conversation-flows/data-collection.md +0 -772
  454. package/docs/core/conversation-flows/route-dsl.md +0 -509
  455. package/docs/core/conversation-flows/routes.md +0 -249
  456. package/docs/core/conversation-flows/step-transitions.md +0 -731
  457. package/docs/core/conversation-flows/steps.md +0 -268
  458. package/docs/core/error-handling.md +0 -830
  459. package/docs/core/persistence/adapters.md +0 -255
  460. package/docs/core/persistence/session-storage.md +0 -656
  461. package/docs/core/routing/intelligent-routing.md +0 -470
  462. package/docs/core/tools/enhanced-tool.md +0 -186
  463. package/docs/core/tools/streaming-execution.md +0 -161
  464. package/docs/core/tools/tool-definition.md +0 -970
  465. package/docs/core/tools/tool-scoping.md +0 -819
  466. package/docs/guides/advanced-patterns/publishing.md +0 -186
  467. package/docs/guides/context-compaction.md +0 -96
  468. package/docs/guides/error-handling-patterns.md +0 -578
  469. package/docs/guides/getting-started/README.md +0 -795
  470. package/docs/guides/migration/README.md +0 -101
  471. package/docs/guides/migration/flexible-routing-conditions.md +0 -375
  472. package/docs/guides/migration/multi-step-execution.md +0 -393
  473. package/docs/guides/migration/response-modal-refactor.md +0 -518
  474. package/docs/guides/prompt-optimization.md +0 -164
  475. package/examples/advanced-patterns/context-compaction.ts +0 -223
  476. package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
  477. package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
  478. package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
  479. package/examples/advanced-patterns/streaming-responses.ts +0 -656
  480. package/examples/ai-providers/anthropic-integration.ts +0 -388
  481. package/examples/ai-providers/openai-integration.ts +0 -228
  482. package/examples/condition-patterns/function-only-conditions.ts +0 -365
  483. package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
  484. package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
  485. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  486. package/examples/condition-patterns/string-only-conditions.ts +0 -296
  487. package/examples/conversation-flows/completion-transitions.ts +0 -318
  488. package/examples/core-concepts/basic-agent.ts +0 -503
  489. package/examples/core-concepts/modern-streaming-api.ts +0 -309
  490. package/examples/core-concepts/schema-driven-extraction.ts +0 -332
  491. package/examples/core-concepts/session-management.ts +0 -494
  492. package/examples/integrations/database-integration.ts +0 -631
  493. package/examples/integrations/healthcare-integration.ts +0 -595
  494. package/examples/integrations/search-integration.ts +0 -530
  495. package/examples/integrations/server-session-management.ts +0 -307
  496. package/examples/persistence/custom-adapter.ts +0 -526
  497. package/examples/persistence/database-persistence.ts +0 -583
  498. package/examples/persistence/memory-sessions.ts +0 -495
  499. package/examples/persistence/prisma-schema.example.prisma +0 -74
  500. package/examples/persistence/redis-persistence.ts +0 -488
  501. package/examples/tools/basic-tools.ts +0 -765
  502. package/examples/tools/data-enrichment-tools.ts +0 -593
  503. package/examples/tools/enhanced-tool-metadata.ts +0 -268
  504. package/examples/tools/streaming-tool-execution.ts +0 -283
  505. package/src/core/BatchExecutor.ts +0 -1187
  506. package/src/core/BatchPromptBuilder.ts +0 -299
  507. package/src/core/Route.ts +0 -678
  508. package/src/types/route.ts +0 -392
@@ -1,268 +0,0 @@
1
- /**
2
- * Enhanced Tool Metadata Example
3
- *
4
- * Demonstrates the EnhancedTool interface with rich metadata for concurrency
5
- * control, input validation, permission gating, and result size budgeting.
6
- *
7
- * Key concepts:
8
- * - `isConcurrencySafe` — classify tools for parallel vs serial execution
9
- * - `validateInput` — reject bad inputs before the handler runs
10
- * - `checkPermissions` — gate execution behind authorization checks
11
- * - `maxResultSizeChars` — cap result size to prevent context overflow
12
- * - `interruptBehavior` — control abort signal handling ('cancel' vs 'block')
13
- * - Backward compatibility: plain `Tool` objects work without any metadata
14
- */
15
-
16
- import {
17
- Agent,
18
- GeminiProvider,
19
- type EnhancedTool,
20
- type Tool,
21
- type ToolContext,
22
- } from "../../src/index";
23
-
24
- // --- Context type for permission checks ---
25
-
26
- interface AppContext {
27
- userRole: "admin" | "editor" | "viewer";
28
- userId: string;
29
- }
30
-
31
- // --- 1. Read-only tool with concurrency metadata ---
32
-
33
- const fetchUserTool: EnhancedTool<AppContext> = {
34
- id: "fetch_user",
35
- name: "Fetch User",
36
- description: "Fetch user profile by ID",
37
- parameters: {
38
- type: "object",
39
- properties: { userId: { type: "string" } },
40
- required: ["userId"],
41
- },
42
- handler: async (_ctx, args) => {
43
- const userId = args?.userId as string;
44
- return { data: `User ${userId}: Alice (admin)`, success: true };
45
- },
46
-
47
- // Concurrency metadata — safe to run alongside other reads
48
- isConcurrencySafe: () => true,
49
- isReadOnly: () => true,
50
- isDestructive: () => false,
51
- interruptBehavior: () => "cancel",
52
-
53
- // Cap result size to 10k chars
54
- maxResultSizeChars: 10_000,
55
- };
56
-
57
- // --- 2. Write tool with validation and permissions ---
58
-
59
- const deleteResourceTool: EnhancedTool<AppContext> = {
60
- id: "delete_resource",
61
- name: "Delete Resource",
62
- description: "Permanently delete a resource",
63
- parameters: {
64
- type: "object",
65
- properties: { resourceId: { type: "string" } },
66
- required: ["resourceId"],
67
- },
68
- handler: async (_ctx, args) => {
69
- const id = args?.resourceId as string;
70
- return { data: `Resource ${id} deleted`, success: true };
71
- },
72
-
73
- // Not concurrency-safe — must run exclusively
74
- isConcurrencySafe: () => false,
75
- isReadOnly: () => false,
76
- isDestructive: () => true,
77
- interruptBehavior: () => "block", // don't abort mid-delete
78
-
79
- maxResultSizeChars: 500,
80
-
81
- // Input validation — runs before handler
82
- validateInput: (input) => {
83
- const id = input.resourceId;
84
- if (!id || typeof id !== "string" || id.trim().length === 0) {
85
- return { valid: false, error: "resourceId must be a non-empty string" };
86
- }
87
- // Suggest correction for common prefix mistake
88
- if (typeof id === "string" && !id.startsWith("res_")) {
89
- return {
90
- valid: false,
91
- error: "resourceId must start with 'res_'",
92
- correctedInput: { resourceId: `res_${id}` },
93
- };
94
- }
95
- return { valid: true };
96
- },
97
-
98
- // Permission check — runs before handler
99
- checkPermissions: (_input, ctx) => {
100
- if (ctx.context.userRole !== "admin") {
101
- return {
102
- allowed: false,
103
- reason: "Only admins can delete resources",
104
- canOverride: false,
105
- };
106
- }
107
- return { allowed: true };
108
- },
109
- };
110
-
111
- // --- 3. Tool with input-dependent concurrency ---
112
-
113
- const queryDatabaseTool: EnhancedTool<AppContext> = {
114
- id: "query_database",
115
- name: "Query Database",
116
- description: "Run a database query (SELECT is concurrent-safe, mutations are not)",
117
- parameters: {
118
- type: "object",
119
- properties: {
120
- sql: { type: "string" },
121
- readonly: { type: "boolean" },
122
- },
123
- required: ["sql"],
124
- },
125
- handler: async (_ctx, args) => {
126
- const sql = args?.sql as string;
127
- return { data: `Query result for: ${sql}`, success: true };
128
- },
129
-
130
- // Concurrency depends on the query type
131
- isConcurrencySafe: (input) => input?.readonly === true,
132
- isReadOnly: (input) => input?.readonly === true,
133
- isDestructive: (input) => {
134
- const sql = (input?.sql as string)?.toUpperCase() ?? "";
135
- return sql.includes("DROP") || sql.includes("DELETE") || sql.includes("TRUNCATE");
136
- },
137
- interruptBehavior: () => "block",
138
-
139
- // Validate SQL isn't empty
140
- validateInput: (input) => {
141
- if (!input.sql || typeof input.sql !== "string") {
142
- return { valid: false, error: "sql must be a non-empty string" };
143
- }
144
- return { valid: true };
145
- },
146
-
147
- // Large query results get truncated
148
- maxResultSizeChars: 50_000,
149
- };
150
-
151
- // --- 4. Plain Tool (backward compatible, no metadata) ---
152
-
153
- const echoTool: Tool<AppContext> = {
154
- id: "echo",
155
- name: "Echo",
156
- description: "Echo back the input (plain Tool, no EnhancedTool metadata)",
157
- parameters: {
158
- type: "object",
159
- properties: { message: { type: "string" } },
160
- required: ["message"],
161
- },
162
- handler: async (_ctx, args) => {
163
- return { data: args?.message as string, success: true };
164
- },
165
- // No isConcurrencySafe, validateInput, checkPermissions, etc.
166
- // Defaults: isConcurrencySafe → false, interruptBehavior → 'block'
167
- };
168
-
169
- // --- Demo functions ---
170
-
171
- function demonstrateMetadata() {
172
- console.log("=== EnhancedTool Metadata ===\n");
173
-
174
- const tools = [fetchUserTool, deleteResourceTool, queryDatabaseTool, echoTool];
175
-
176
- for (const tool of tools) {
177
- const enhanced = tool as EnhancedTool;
178
- console.log(`${tool.id}:`);
179
- console.log(` concurrencySafe: ${enhanced.isConcurrencySafe?.() ?? "default (false)"}`);
180
- console.log(` readOnly: ${enhanced.isReadOnly?.() ?? "default (false)"}`);
181
- console.log(` destructive: ${enhanced.isDestructive?.() ?? "default (false)"}`);
182
- console.log(` interruptBehavior: ${enhanced.interruptBehavior?.() ?? "default (block)"}`);
183
- console.log(` maxResultSizeChars: ${enhanced.maxResultSizeChars ?? "none"}`);
184
- console.log(` hasValidateInput: ${!!enhanced.validateInput}`);
185
- console.log(` hasCheckPermissions: ${!!enhanced.checkPermissions}`);
186
- console.log();
187
- }
188
- }
189
-
190
- function demonstrateInputDependentConcurrency() {
191
- console.log("=== Input-Dependent Concurrency ===\n");
192
-
193
- const selectInput = { sql: "SELECT * FROM users", readonly: true };
194
- const insertInput = { sql: "INSERT INTO users VALUES (...)", readonly: false };
195
- const dropInput = { sql: "DROP TABLE users", readonly: false };
196
-
197
- console.log(`SELECT query: concurrencySafe=${queryDatabaseTool.isConcurrencySafe!(selectInput)}`);
198
- console.log(`INSERT query: concurrencySafe=${queryDatabaseTool.isConcurrencySafe!(insertInput)}`);
199
- console.log(`DROP query: destructive=${queryDatabaseTool.isDestructive!(dropInput)}`);
200
- console.log();
201
- }
202
-
203
- async function demonstrateValidation() {
204
- console.log("=== Input Validation ===\n");
205
-
206
- const cases = [
207
- { label: "valid ID", input: { resourceId: "res_123" } },
208
- { label: "missing prefix", input: { resourceId: "123" } },
209
- { label: "empty string", input: { resourceId: "" } },
210
- ];
211
-
212
- for (const { label, input } of cases) {
213
- const result = deleteResourceTool.validateInput!(input, {} as any);
214
- const resolved = result instanceof Promise ? await result : result;
215
- console.log(` ${label}: valid=${resolved.valid}${resolved.error ? `, error="${resolved.error}"` : ""}${resolved.correctedInput ? `, corrected=${JSON.stringify(resolved.correctedInput)}` : ""}`);
216
- }
217
- console.log();
218
- }
219
-
220
- async function demonstratePermissions() {
221
- console.log("=== Permission Gating ===\n");
222
-
223
- const roles: Array<"admin" | "editor" | "viewer"> = ["admin", "editor", "viewer"];
224
-
225
- for (const role of roles) {
226
- const mockCtx = { context: { userRole: role, userId: "u1" } } as ToolContext<AppContext>;
227
- const result = deleteResourceTool.checkPermissions!({ resourceId: "res_1" }, mockCtx);
228
- const resolved = result instanceof Promise ? await result : result;
229
- console.log(` role=${role}: allowed=${resolved.allowed}${resolved.reason ? `, reason="${resolved.reason}"` : ""}`);
230
- }
231
- console.log();
232
- }
233
-
234
- function demonstrateAgentRegistration() {
235
- console.log("=== Agent Registration ===\n");
236
-
237
- const agent = new Agent<AppContext>({
238
- name: "MetadataDemo",
239
- description: "Demonstrates EnhancedTool metadata",
240
- provider: new GeminiProvider({
241
- apiKey: process.env.GEMINI_API_KEY || "demo-key",
242
- model: "models/gemini-2.5-flash",
243
- }),
244
- context: { userRole: "admin", userId: "u1" },
245
- // Mix of EnhancedTool and plain Tool — both accepted seamlessly
246
- tools: [fetchUserTool, deleteResourceTool, queryDatabaseTool, echoTool],
247
- });
248
-
249
- console.log("Registered tools:");
250
- for (const t of agent.getTools()) {
251
- console.log(` - ${t.id}`);
252
- }
253
- console.log("\nPlain Tool objects work alongside EnhancedTool without changes.");
254
- }
255
-
256
- async function main() {
257
- demonstrateMetadata();
258
- demonstrateInputDependentConcurrency();
259
- await demonstrateValidation();
260
- await demonstratePermissions();
261
- demonstrateAgentRegistration();
262
- }
263
-
264
- if (import.meta.url === `file://${process.argv[1]}`) {
265
- main().catch(console.error);
266
- }
267
-
268
- export { main };
@@ -1,283 +0,0 @@
1
- /**
2
- * Streaming Tool Execution Example
3
- *
4
- * Demonstrates the StreamingToolExecutor with mixed read-only and write tools,
5
- * showing how read-only tools execute in parallel while write tools run serially.
6
- *
7
- * Key concepts:
8
- * - EnhancedTool with `isConcurrencySafe` metadata
9
- * - Parallel execution of concurrent-safe (read-only) tools
10
- * - Serial execution of non-concurrent-safe (write) tools
11
- * - Result ordering preserved regardless of completion order
12
- * - Progress reporting from long-running tools
13
- * - Abort signal support
14
- */
15
-
16
- import {
17
- Agent,
18
- GeminiProvider,
19
- StreamingToolExecutor,
20
- type EnhancedTool,
21
- type ToolCallRequest,
22
- } from "../../src/index";
23
-
24
- // --- Read-only tools (concurrency-safe, run in parallel) ---
25
-
26
- const readFileTool: EnhancedTool = {
27
- id: "read_file",
28
- name: "Read File",
29
- description: "Read a file from disk",
30
- parameters: {
31
- type: "object",
32
- properties: { path: { type: "string" } },
33
- required: ["path"],
34
- },
35
- handler: async (_ctx, args) => {
36
- const path = args?.path as string;
37
- // Simulate file read latency
38
- await new Promise((r) => setTimeout(r, 200));
39
- return { data: `Contents of ${path}: [mock file data]`, success: true };
40
- },
41
- isConcurrencySafe: () => true,
42
- isReadOnly: () => true,
43
- isDestructive: () => false,
44
- interruptBehavior: () => "cancel",
45
- maxResultSizeChars: 50_000,
46
- };
47
-
48
- const listDirectoryTool: EnhancedTool = {
49
- id: "list_directory",
50
- name: "List Directory",
51
- description: "List files in a directory",
52
- parameters: {
53
- type: "object",
54
- properties: { path: { type: "string" } },
55
- required: ["path"],
56
- },
57
- handler: async (_ctx, args) => {
58
- const path = args?.path as string;
59
- await new Promise((r) => setTimeout(r, 150));
60
- return {
61
- data: `Files in ${path}: index.ts, utils.ts, types.ts`,
62
- success: true,
63
- };
64
- },
65
- isConcurrencySafe: () => true,
66
- isReadOnly: () => true,
67
- isDestructive: () => false,
68
- interruptBehavior: () => "cancel",
69
- };
70
-
71
- const searchCodeTool: EnhancedTool = {
72
- id: "search_code",
73
- name: "Search Code",
74
- description: "Search for patterns in the codebase",
75
- parameters: {
76
- type: "object",
77
- properties: { query: { type: "string" } },
78
- required: ["query"],
79
- },
80
- handler: async (_ctx, args) => {
81
- const query = args?.query as string;
82
- await new Promise((r) => setTimeout(r, 300));
83
- return {
84
- data: `Found 3 matches for "${query}" in src/`,
85
- success: true,
86
- };
87
- },
88
- isConcurrencySafe: () => true,
89
- isReadOnly: () => true,
90
- isDestructive: () => false,
91
- interruptBehavior: () => "cancel",
92
- };
93
-
94
- // --- Write tools (NOT concurrency-safe, run serially) ---
95
-
96
- const writeFileTool: EnhancedTool = {
97
- id: "write_file",
98
- name: "Write File",
99
- description: "Write content to a file",
100
- parameters: {
101
- type: "object",
102
- properties: {
103
- path: { type: "string" },
104
- content: { type: "string" },
105
- },
106
- required: ["path", "content"],
107
- },
108
- handler: async (_ctx, args) => {
109
- const path = args?.path as string;
110
- await new Promise((r) => setTimeout(r, 250));
111
- return { data: `Wrote to ${path}`, success: true };
112
- },
113
- isConcurrencySafe: () => false,
114
- isReadOnly: () => false,
115
- isDestructive: (input) => true,
116
- interruptBehavior: () => "block",
117
- maxResultSizeChars: 1_000,
118
- };
119
-
120
- const deleteFileTool: EnhancedTool = {
121
- id: "delete_file",
122
- name: "Delete File",
123
- description: "Delete a file from disk",
124
- parameters: {
125
- type: "object",
126
- properties: { path: { type: "string" } },
127
- required: ["path"],
128
- },
129
- handler: async (_ctx, args) => {
130
- const path = args?.path as string;
131
- await new Promise((r) => setTimeout(r, 100));
132
- return { data: `Deleted ${path}`, success: true };
133
- },
134
- isConcurrencySafe: () => false,
135
- isReadOnly: () => false,
136
- isDestructive: () => true,
137
- interruptBehavior: () => "block",
138
- };
139
-
140
- // Helper: create a minimal ToolContext for standalone executor usage
141
- function createMockToolContext() {
142
- return {
143
- context: {},
144
- data: {},
145
- history: [],
146
- updateContext: async () => { },
147
- updateData: async () => { },
148
- getField: () => undefined,
149
- setField: async () => { },
150
- hasField: () => false,
151
- } as any;
152
- }
153
-
154
- // --- Direct StreamingToolExecutor usage ---
155
-
156
- async function demonstrateDirectExecutor() {
157
- console.log("=== Direct StreamingToolExecutor Demo ===\n");
158
-
159
- const toolMap = new Map<string, EnhancedTool>([
160
- ["read_file", readFileTool],
161
- ["list_directory", listDirectoryTool],
162
- ["search_code", searchCodeTool],
163
- ["write_file", writeFileTool],
164
- ]);
165
-
166
- // Simulate a sequence of tool calls from an LLM response:
167
- // 3 reads (parallel) followed by 1 write (serial)
168
- const toolCalls: ToolCallRequest[] = [
169
- { id: "call_1", toolName: "read_file", arguments: { path: "src/index.ts" } },
170
- { id: "call_2", toolName: "list_directory", arguments: { path: "src/" } },
171
- { id: "call_3", toolName: "search_code", arguments: { query: "import" } },
172
- { id: "call_4", toolName: "write_file", arguments: { path: "out.ts", content: "// generated" } },
173
- ];
174
-
175
- const executor = new StreamingToolExecutor<unknown, unknown>(
176
- createMockToolContext(),
177
- { maxParallel: 5 },
178
- );
179
-
180
- console.log("Queueing tools as they arrive from the LLM stream...\n");
181
-
182
- for (const call of toolCalls) {
183
- const tool = toolMap.get(call.toolName)!;
184
- const safe = tool.isConcurrencySafe?.() ? "parallel" : "serial";
185
- console.log(` + Queued: ${call.toolName} (${safe})`);
186
- executor.addTool(call, tool);
187
- }
188
-
189
- console.log("\nResults (yielded in original request order):\n");
190
-
191
- for await (const update of executor.getRemainingResults()) {
192
- if (update.progress) {
193
- console.log(` [progress] ${update.toolCallId}: ${update.progress}`);
194
- }
195
- if (update.result) {
196
- console.log(` [result] ${update.toolCallId}: ${update.result.data}`);
197
- }
198
- }
199
-
200
- console.log("\nAll tools complete.");
201
- }
202
-
203
- // --- Agent-level integration ---
204
-
205
- async function demonstrateAgentIntegration() {
206
- console.log("\n=== Agent Integration Demo ===\n");
207
-
208
- const agent = new Agent({
209
- name: "CodeAssistant",
210
- description: "An assistant with streaming tool execution",
211
- provider: new GeminiProvider({
212
- apiKey: process.env.GEMINI_API_KEY || "demo-key",
213
- model: "models/gemini-2.5-flash",
214
- }),
215
- tools: [readFileTool, listDirectoryTool, searchCodeTool, writeFileTool, deleteFileTool],
216
- });
217
-
218
- console.log("Tools registered:");
219
- for (const t of agent.getTools()) {
220
- const enhanced = t as EnhancedTool;
221
- const safe = enhanced.isConcurrencySafe?.() ?? false;
222
- console.log(` - ${t.id} (concurrencySafe: ${safe})`);
223
- }
224
-
225
- console.log("\nStreaming tool execution happens automatically during respondStream().");
226
- console.log("Read-only tools run in parallel; write tools wait for exclusive access.\n");
227
-
228
- // In a real scenario you'd call agent.stream() or agent.respondStream()
229
- // and the StreamingToolExecutor handles concurrency internally.
230
- console.log("Example streaming usage:");
231
- console.log(' for await (const chunk of agent.stream("Read index.ts and list src/")) {');
232
- console.log(" process.stdout.write(chunk.delta);");
233
- console.log(" }");
234
- }
235
-
236
- // --- Abort signal demo ---
237
-
238
- async function demonstrateAbortSignal() {
239
- console.log("\n=== Abort Signal Demo ===\n");
240
-
241
- const controller = new AbortController();
242
- const executor = new StreamingToolExecutor<unknown, unknown>(
243
- createMockToolContext(),
244
- { maxParallel: 5, signal: controller.signal },
245
- );
246
-
247
- // Queue a slow read and a write
248
- executor.addTool(
249
- { id: "slow_read", toolName: "search_code", arguments: { query: "TODO" } },
250
- searchCodeTool
251
- );
252
- executor.addTool(
253
- { id: "slow_write", toolName: "write_file", arguments: { path: "tmp.ts", content: "x" } },
254
- writeFileTool
255
- );
256
-
257
- // Abort after 100ms — 'cancel' tools abort immediately, 'block' tools finish
258
- setTimeout(() => {
259
- console.log(" Aborting...");
260
- controller.abort();
261
- }, 100);
262
-
263
- for await (const update of executor.getRemainingResults()) {
264
- if (update.result) {
265
- const status = update.result.success ? "ok" : "aborted";
266
- console.log(` ${update.toolCallId}: ${status} — ${update.result.data ?? update.result.error}`);
267
- }
268
- }
269
-
270
- console.log(" Done (abort handled gracefully).");
271
- }
272
-
273
- async function main() {
274
- await demonstrateDirectExecutor();
275
- await demonstrateAgentIntegration();
276
- await demonstrateAbortSignal();
277
- }
278
-
279
- if (import.meta.url === `file://${process.argv[1]}`) {
280
- main().catch(console.error);
281
- }
282
-
283
- export { main };