@falai/agent 1.2.8 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. package/README.md +40 -886
  2. package/dist/adapters/MemoryAdapter.js +2 -2
  3. package/dist/adapters/MemoryAdapter.js.map +1 -1
  4. package/dist/adapters/MongoAdapter.js +2 -2
  5. package/dist/adapters/MongoAdapter.js.map +1 -1
  6. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
  7. package/dist/adapters/OpenSearchAdapter.js +9 -7
  8. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  9. package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
  10. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  11. package/dist/adapters/PostgreSQLAdapter.js +25 -9
  12. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  13. package/dist/adapters/PrismaAdapter.js +5 -5
  14. package/dist/adapters/PrismaAdapter.js.map +1 -1
  15. package/dist/adapters/RedisAdapter.js +2 -2
  16. package/dist/adapters/RedisAdapter.js.map +1 -1
  17. package/dist/adapters/SQLiteAdapter.d.ts +17 -0
  18. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  19. package/dist/adapters/SQLiteAdapter.js +30 -11
  20. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  21. package/dist/cjs/adapters/MemoryAdapter.js +2 -2
  22. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  23. package/dist/cjs/adapters/MongoAdapter.js +2 -2
  24. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  25. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  26. package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
  27. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  28. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
  29. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  30. package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
  31. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  32. package/dist/cjs/adapters/PrismaAdapter.js +5 -5
  33. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  34. package/dist/cjs/adapters/RedisAdapter.js +2 -2
  35. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  36. package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
  37. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  38. package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
  39. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  40. package/dist/cjs/constants/index.d.ts +0 -9
  41. package/dist/cjs/constants/index.d.ts.map +1 -1
  42. package/dist/cjs/constants/index.js +2 -11
  43. package/dist/cjs/constants/index.js.map +1 -1
  44. package/dist/cjs/core/Agent.d.ts +119 -153
  45. package/dist/cjs/core/Agent.d.ts.map +1 -1
  46. package/dist/cjs/core/Agent.js +471 -324
  47. package/dist/cjs/core/Agent.js.map +1 -1
  48. package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
  49. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
  50. package/dist/cjs/core/AutoChainExecutor.js +297 -0
  51. package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
  52. package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
  53. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
  54. package/dist/cjs/core/BranchEvaluator.js +130 -0
  55. package/dist/cjs/core/BranchEvaluator.js.map +1 -0
  56. package/dist/cjs/core/DirectiveBus.d.ts +88 -0
  57. package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
  58. package/dist/cjs/core/DirectiveBus.js +196 -0
  59. package/dist/cjs/core/DirectiveBus.js.map +1 -0
  60. package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
  61. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
  62. package/dist/cjs/core/DirectiveChainTracker.js +121 -0
  63. package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
  64. package/dist/cjs/core/Flow.d.ts +186 -0
  65. package/dist/cjs/core/Flow.d.ts.map +1 -0
  66. package/dist/cjs/core/Flow.js +550 -0
  67. package/dist/cjs/core/Flow.js.map +1 -0
  68. package/dist/cjs/core/FlowRouter.d.ts +182 -0
  69. package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
  70. package/dist/cjs/core/{RoutingEngine.js → FlowRouter.js} +323 -306
  71. package/dist/cjs/core/FlowRouter.js.map +1 -0
  72. package/dist/cjs/core/PersistenceManager.d.ts +2 -2
  73. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  74. package/dist/cjs/core/PersistenceManager.js +7 -7
  75. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  76. package/dist/cjs/core/PromptComposer.d.ts +21 -8
  77. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  78. package/dist/cjs/core/PromptComposer.js +182 -105
  79. package/dist/cjs/core/PromptComposer.js.map +1 -1
  80. package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
  81. package/dist/cjs/core/PromptSectionCache.js +1 -1
  82. package/dist/cjs/core/ResponseEngine.d.ts +18 -8
  83. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  84. package/dist/cjs/core/ResponseEngine.js +38 -36
  85. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  86. package/dist/cjs/core/ResponseModal.d.ts +73 -56
  87. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  88. package/dist/cjs/core/ResponseModal.js +1191 -1014
  89. package/dist/cjs/core/ResponseModal.js.map +1 -1
  90. package/dist/cjs/core/ResponsePipeline.d.ts +124 -26
  91. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  92. package/dist/cjs/core/ResponsePipeline.js +509 -136
  93. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  94. package/dist/cjs/core/SignalEvaluator.d.ts +86 -0
  95. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -0
  96. package/dist/cjs/core/SignalEvaluator.js +333 -0
  97. package/dist/cjs/core/SignalEvaluator.js.map +1 -0
  98. package/dist/cjs/core/SignalProcessor.d.ts +152 -0
  99. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -0
  100. package/dist/cjs/core/SignalProcessor.js +562 -0
  101. package/dist/cjs/core/SignalProcessor.js.map +1 -0
  102. package/dist/cjs/core/Step.d.ts +43 -32
  103. package/dist/cjs/core/Step.d.ts.map +1 -1
  104. package/dist/cjs/core/Step.js +221 -126
  105. package/dist/cjs/core/Step.js.map +1 -1
  106. package/dist/cjs/core/StreamingToolExecutor.d.ts +2 -2
  107. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
  108. package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
  109. package/dist/cjs/core/ToolManager.d.ts +44 -13
  110. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  111. package/dist/cjs/core/ToolManager.js +174 -91
  112. package/dist/cjs/core/ToolManager.js.map +1 -1
  113. package/dist/cjs/core/createAgent.d.ts +35 -0
  114. package/dist/cjs/core/createAgent.d.ts.map +1 -0
  115. package/dist/cjs/core/createAgent.js +39 -0
  116. package/dist/cjs/core/createAgent.js.map +1 -0
  117. package/dist/cjs/core/flow-namespace.d.ts +49 -0
  118. package/dist/cjs/core/flow-namespace.d.ts.map +1 -0
  119. package/dist/cjs/core/flow-namespace.js +171 -0
  120. package/dist/cjs/core/flow-namespace.js.map +1 -0
  121. package/dist/cjs/index.d.ts +11 -14
  122. package/dist/cjs/index.d.ts.map +1 -1
  123. package/dist/cjs/index.js +18 -22
  124. package/dist/cjs/index.js.map +1 -1
  125. package/dist/cjs/providers/AnthropicProvider.d.ts +1 -1
  126. package/dist/cjs/providers/AnthropicProvider.js +1 -1
  127. package/dist/cjs/providers/GeminiProvider.d.ts +1 -1
  128. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  129. package/dist/cjs/providers/GeminiProvider.js +1 -1
  130. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  131. package/dist/cjs/providers/OpenAIProvider.d.ts +1 -1
  132. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  133. package/dist/cjs/providers/OpenAIProvider.js +1 -1
  134. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  135. package/dist/cjs/types/agent.d.ts +183 -54
  136. package/dist/cjs/types/agent.d.ts.map +1 -1
  137. package/dist/cjs/types/agent.js +0 -6
  138. package/dist/cjs/types/agent.js.map +1 -1
  139. package/dist/cjs/types/ai.d.ts +3 -3
  140. package/dist/cjs/types/ai.d.ts.map +1 -1
  141. package/dist/cjs/types/errors.d.ts +15 -0
  142. package/dist/cjs/types/errors.d.ts.map +1 -0
  143. package/dist/cjs/types/errors.js +22 -0
  144. package/dist/cjs/types/errors.js.map +1 -0
  145. package/dist/cjs/types/flow.d.ts +513 -0
  146. package/dist/cjs/types/flow.d.ts.map +1 -0
  147. package/dist/cjs/types/{route.js → flow.js} +2 -2
  148. package/dist/cjs/types/flow.js.map +1 -0
  149. package/dist/cjs/types/index.d.ts +7 -6
  150. package/dist/cjs/types/index.d.ts.map +1 -1
  151. package/dist/cjs/types/index.js +6 -2
  152. package/dist/cjs/types/index.js.map +1 -1
  153. package/dist/cjs/types/persistence.d.ts +11 -7
  154. package/dist/cjs/types/persistence.d.ts.map +1 -1
  155. package/dist/cjs/types/routing.d.ts +1 -1
  156. package/dist/cjs/types/routing.d.ts.map +1 -1
  157. package/dist/cjs/types/session.d.ts +24 -23
  158. package/dist/cjs/types/session.d.ts.map +1 -1
  159. package/dist/cjs/types/signals.d.ts +248 -0
  160. package/dist/cjs/types/signals.d.ts.map +1 -0
  161. package/dist/cjs/types/signals.js +11 -0
  162. package/dist/cjs/types/signals.js.map +1 -0
  163. package/dist/cjs/types/template.d.ts +2 -8
  164. package/dist/cjs/types/template.d.ts.map +1 -1
  165. package/dist/cjs/types/tool.d.ts +36 -29
  166. package/dist/cjs/types/tool.d.ts.map +1 -1
  167. package/dist/cjs/types/tool.js +1 -1
  168. package/dist/cjs/types/tool.js.map +1 -1
  169. package/dist/cjs/utils/condition.d.ts +7 -1
  170. package/dist/cjs/utils/condition.d.ts.map +1 -1
  171. package/dist/cjs/utils/condition.js.map +1 -1
  172. package/dist/cjs/utils/id.d.ts +13 -5
  173. package/dist/cjs/utils/id.d.ts.map +1 -1
  174. package/dist/cjs/utils/id.js +24 -10
  175. package/dist/cjs/utils/id.js.map +1 -1
  176. package/dist/cjs/utils/index.d.ts +2 -2
  177. package/dist/cjs/utils/index.d.ts.map +1 -1
  178. package/dist/cjs/utils/index.js +7 -3
  179. package/dist/cjs/utils/index.js.map +1 -1
  180. package/dist/cjs/utils/session.d.ts +44 -5
  181. package/dist/cjs/utils/session.d.ts.map +1 -1
  182. package/dist/cjs/utils/session.js +197 -38
  183. package/dist/cjs/utils/session.js.map +1 -1
  184. package/dist/constants/index.d.ts +0 -9
  185. package/dist/constants/index.d.ts.map +1 -1
  186. package/dist/constants/index.js +3 -9
  187. package/dist/constants/index.js.map +1 -1
  188. package/dist/core/Agent.d.ts +119 -153
  189. package/dist/core/Agent.d.ts.map +1 -1
  190. package/dist/core/Agent.js +472 -325
  191. package/dist/core/Agent.js.map +1 -1
  192. package/dist/core/AutoChainExecutor.d.ts +107 -0
  193. package/dist/core/AutoChainExecutor.d.ts.map +1 -0
  194. package/dist/core/AutoChainExecutor.js +293 -0
  195. package/dist/core/AutoChainExecutor.js.map +1 -0
  196. package/dist/core/BranchEvaluator.d.ts +54 -0
  197. package/dist/core/BranchEvaluator.d.ts.map +1 -0
  198. package/dist/core/BranchEvaluator.js +126 -0
  199. package/dist/core/BranchEvaluator.js.map +1 -0
  200. package/dist/core/DirectiveBus.d.ts +88 -0
  201. package/dist/core/DirectiveBus.d.ts.map +1 -0
  202. package/dist/core/DirectiveBus.js +192 -0
  203. package/dist/core/DirectiveBus.js.map +1 -0
  204. package/dist/core/DirectiveChainTracker.d.ts +49 -0
  205. package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
  206. package/dist/core/DirectiveChainTracker.js +117 -0
  207. package/dist/core/DirectiveChainTracker.js.map +1 -0
  208. package/dist/core/Flow.d.ts +186 -0
  209. package/dist/core/Flow.d.ts.map +1 -0
  210. package/dist/core/Flow.js +546 -0
  211. package/dist/core/Flow.js.map +1 -0
  212. package/dist/core/FlowRouter.d.ts +182 -0
  213. package/dist/core/FlowRouter.d.ts.map +1 -0
  214. package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
  215. package/dist/core/FlowRouter.js.map +1 -0
  216. package/dist/core/PersistenceManager.d.ts +2 -2
  217. package/dist/core/PersistenceManager.d.ts.map +1 -1
  218. package/dist/core/PersistenceManager.js +7 -7
  219. package/dist/core/PersistenceManager.js.map +1 -1
  220. package/dist/core/PromptComposer.d.ts +21 -8
  221. package/dist/core/PromptComposer.d.ts.map +1 -1
  222. package/dist/core/PromptComposer.js +183 -106
  223. package/dist/core/PromptComposer.js.map +1 -1
  224. package/dist/core/PromptSectionCache.d.ts +1 -1
  225. package/dist/core/PromptSectionCache.js +1 -1
  226. package/dist/core/ResponseEngine.d.ts +18 -8
  227. package/dist/core/ResponseEngine.d.ts.map +1 -1
  228. package/dist/core/ResponseEngine.js +38 -36
  229. package/dist/core/ResponseEngine.js.map +1 -1
  230. package/dist/core/ResponseModal.d.ts +73 -56
  231. package/dist/core/ResponseModal.d.ts.map +1 -1
  232. package/dist/core/ResponseModal.js +1193 -1016
  233. package/dist/core/ResponseModal.js.map +1 -1
  234. package/dist/core/ResponsePipeline.d.ts +124 -26
  235. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  236. package/dist/core/ResponsePipeline.js +509 -137
  237. package/dist/core/ResponsePipeline.js.map +1 -1
  238. package/dist/core/SignalEvaluator.d.ts +86 -0
  239. package/dist/core/SignalEvaluator.d.ts.map +1 -0
  240. package/dist/core/SignalEvaluator.js +326 -0
  241. package/dist/core/SignalEvaluator.js.map +1 -0
  242. package/dist/core/SignalProcessor.d.ts +152 -0
  243. package/dist/core/SignalProcessor.d.ts.map +1 -0
  244. package/dist/core/SignalProcessor.js +555 -0
  245. package/dist/core/SignalProcessor.js.map +1 -0
  246. package/dist/core/Step.d.ts +43 -32
  247. package/dist/core/Step.d.ts.map +1 -1
  248. package/dist/core/Step.js +220 -126
  249. package/dist/core/Step.js.map +1 -1
  250. package/dist/core/StreamingToolExecutor.d.ts +2 -2
  251. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  252. package/dist/core/StreamingToolExecutor.js.map +1 -1
  253. package/dist/core/ToolManager.d.ts +44 -13
  254. package/dist/core/ToolManager.d.ts.map +1 -1
  255. package/dist/core/ToolManager.js +174 -91
  256. package/dist/core/ToolManager.js.map +1 -1
  257. package/dist/core/createAgent.d.ts +35 -0
  258. package/dist/core/createAgent.d.ts.map +1 -0
  259. package/dist/core/createAgent.js +36 -0
  260. package/dist/core/createAgent.js.map +1 -0
  261. package/dist/core/flow-namespace.d.ts +49 -0
  262. package/dist/core/flow-namespace.d.ts.map +1 -0
  263. package/dist/core/flow-namespace.js +168 -0
  264. package/dist/core/flow-namespace.js.map +1 -0
  265. package/dist/index.d.ts +11 -14
  266. package/dist/index.d.ts.map +1 -1
  267. package/dist/index.js +9 -12
  268. package/dist/index.js.map +1 -1
  269. package/dist/providers/AnthropicProvider.d.ts +1 -1
  270. package/dist/providers/AnthropicProvider.js +1 -1
  271. package/dist/providers/GeminiProvider.d.ts +1 -1
  272. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  273. package/dist/providers/GeminiProvider.js +1 -1
  274. package/dist/providers/GeminiProvider.js.map +1 -1
  275. package/dist/providers/OpenAIProvider.d.ts +1 -1
  276. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  277. package/dist/providers/OpenAIProvider.js +1 -1
  278. package/dist/providers/OpenAIProvider.js.map +1 -1
  279. package/dist/types/agent.d.ts +183 -54
  280. package/dist/types/agent.d.ts.map +1 -1
  281. package/dist/types/agent.js +0 -6
  282. package/dist/types/agent.js.map +1 -1
  283. package/dist/types/ai.d.ts +3 -3
  284. package/dist/types/ai.d.ts.map +1 -1
  285. package/dist/types/errors.d.ts +15 -0
  286. package/dist/types/errors.d.ts.map +1 -0
  287. package/dist/types/errors.js +18 -0
  288. package/dist/types/errors.js.map +1 -0
  289. package/dist/types/flow.d.ts +513 -0
  290. package/dist/types/flow.d.ts.map +1 -0
  291. package/dist/types/flow.js +5 -0
  292. package/dist/types/flow.js.map +1 -0
  293. package/dist/types/index.d.ts +7 -6
  294. package/dist/types/index.d.ts.map +1 -1
  295. package/dist/types/index.js +4 -1
  296. package/dist/types/index.js.map +1 -1
  297. package/dist/types/persistence.d.ts +11 -7
  298. package/dist/types/persistence.d.ts.map +1 -1
  299. package/dist/types/routing.d.ts +1 -1
  300. package/dist/types/routing.d.ts.map +1 -1
  301. package/dist/types/session.d.ts +24 -23
  302. package/dist/types/session.d.ts.map +1 -1
  303. package/dist/types/signals.d.ts +248 -0
  304. package/dist/types/signals.d.ts.map +1 -0
  305. package/dist/types/signals.js +10 -0
  306. package/dist/types/signals.js.map +1 -0
  307. package/dist/types/template.d.ts +2 -8
  308. package/dist/types/template.d.ts.map +1 -1
  309. package/dist/types/tool.d.ts +36 -29
  310. package/dist/types/tool.d.ts.map +1 -1
  311. package/dist/types/tool.js +1 -1
  312. package/dist/types/tool.js.map +1 -1
  313. package/dist/utils/condition.d.ts +7 -1
  314. package/dist/utils/condition.d.ts.map +1 -1
  315. package/dist/utils/condition.js.map +1 -1
  316. package/dist/utils/id.d.ts +13 -5
  317. package/dist/utils/id.d.ts.map +1 -1
  318. package/dist/utils/id.js +22 -9
  319. package/dist/utils/id.js.map +1 -1
  320. package/dist/utils/index.d.ts +2 -2
  321. package/dist/utils/index.d.ts.map +1 -1
  322. package/dist/utils/index.js +2 -2
  323. package/dist/utils/index.js.map +1 -1
  324. package/dist/utils/session.d.ts +44 -5
  325. package/dist/utils/session.d.ts.map +1 -1
  326. package/dist/utils/session.js +193 -37
  327. package/dist/utils/session.js.map +1 -1
  328. package/docs/README.md +22 -200
  329. package/docs/concepts/architecture.md +281 -0
  330. package/docs/concepts/directives.md +400 -0
  331. package/docs/concepts/pipeline.md +399 -0
  332. package/docs/guides/branching.md +263 -0
  333. package/docs/guides/compaction.md +163 -0
  334. package/docs/guides/conditions.md +167 -0
  335. package/docs/guides/error-handling.md +176 -0
  336. package/docs/guides/flow-control.md +409 -0
  337. package/docs/guides/instructions.md +210 -0
  338. package/docs/guides/persistence.md +182 -0
  339. package/docs/guides/streaming.md +137 -0
  340. package/docs/migration/README.md +14 -0
  341. package/docs/migration/route-to-flow.md +561 -0
  342. package/docs/migration/v1-to-v2.md +909 -0
  343. package/docs/reference/adapters.md +481 -0
  344. package/docs/reference/branches.md +241 -0
  345. package/docs/reference/create-agent.md +186 -0
  346. package/docs/reference/directive.md +243 -0
  347. package/docs/reference/errors.md +122 -0
  348. package/docs/reference/flow.md +238 -0
  349. package/docs/reference/instruction.md +177 -0
  350. package/docs/reference/pre-directive.md +131 -0
  351. package/docs/reference/providers.md +227 -0
  352. package/docs/reference/signals.md +356 -0
  353. package/docs/reference/step.md +339 -0
  354. package/docs/reference/tool.md +269 -0
  355. package/docs/start/01-install.md +81 -0
  356. package/docs/start/02-first-agent.md +196 -0
  357. package/docs/start/03-collect-data.md +222 -0
  358. package/docs/start/04-add-tools.md +276 -0
  359. package/docs/start/05-go-to-production.md +216 -0
  360. package/examples/01-quickstart.ts +20 -0
  361. package/examples/02-data-extraction.ts +90 -0
  362. package/examples/03-tools.ts +136 -0
  363. package/examples/04-instructions.ts +100 -0
  364. package/examples/05-branching.ts +140 -0
  365. package/examples/06-flow-control.ts +103 -0
  366. package/examples/07-streaming.ts +69 -0
  367. package/examples/08-persistence.ts +98 -0
  368. package/examples/09-signals.ts +144 -0
  369. package/examples/tsconfig.json +30 -0
  370. package/package.json +2 -1
  371. package/src/adapters/MemoryAdapter.ts +3 -3
  372. package/src/adapters/MongoAdapter.ts +3 -3
  373. package/src/adapters/OpenSearchAdapter.ts +10 -8
  374. package/src/adapters/PostgreSQLAdapter.ts +26 -10
  375. package/src/adapters/PrismaAdapter.ts +6 -6
  376. package/src/adapters/RedisAdapter.ts +3 -3
  377. package/src/adapters/SQLiteAdapter.ts +31 -12
  378. package/src/constants/index.ts +2 -10
  379. package/src/core/Agent.ts +585 -374
  380. package/src/core/AutoChainExecutor.ts +440 -0
  381. package/src/core/BranchEvaluator.ts +167 -0
  382. package/src/core/DirectiveBus.ts +248 -0
  383. package/src/core/DirectiveChainTracker.ts +144 -0
  384. package/src/core/Flow.ts +666 -0
  385. package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
  386. package/src/core/PersistenceManager.ts +8 -8
  387. package/src/core/PromptComposer.ts +209 -140
  388. package/src/core/PromptSectionCache.ts +1 -1
  389. package/src/core/ResponseEngine.ts +61 -46
  390. package/src/core/ResponseModal.ts +1453 -1240
  391. package/src/core/ResponsePipeline.ts +655 -175
  392. package/src/core/SignalEvaluator.ts +420 -0
  393. package/src/core/SignalProcessor.ts +723 -0
  394. package/src/core/Step.ts +279 -176
  395. package/src/core/StreamingToolExecutor.ts +4 -4
  396. package/src/core/ToolManager.ts +200 -97
  397. package/src/core/createAgent.ts +40 -0
  398. package/src/core/flow-namespace.ts +219 -0
  399. package/src/index.ts +42 -36
  400. package/src/providers/AnthropicProvider.ts +2 -2
  401. package/src/providers/GeminiProvider.ts +2 -2
  402. package/src/providers/OpenAIProvider.ts +2 -2
  403. package/src/types/agent.ts +182 -53
  404. package/src/types/ai.ts +3 -3
  405. package/src/types/errors.ts +18 -0
  406. package/src/types/flow.ts +590 -0
  407. package/src/types/index.ts +43 -16
  408. package/src/types/persistence.ts +12 -8
  409. package/src/types/routing.ts +1 -1
  410. package/src/types/session.ts +26 -23
  411. package/src/types/signals.ts +321 -0
  412. package/src/types/template.ts +3 -11
  413. package/src/types/tool.ts +50 -42
  414. package/src/utils/condition.ts +13 -4
  415. package/src/utils/id.ts +27 -9
  416. package/src/utils/index.ts +6 -2
  417. package/src/utils/session.ts +238 -42
  418. package/dist/cjs/core/BatchExecutor.d.ts +0 -359
  419. package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
  420. package/dist/cjs/core/BatchExecutor.js +0 -861
  421. package/dist/cjs/core/BatchExecutor.js.map +0 -1
  422. package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
  423. package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
  424. package/dist/cjs/core/BatchPromptBuilder.js +0 -223
  425. package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
  426. package/dist/cjs/core/Route.d.ts +0 -180
  427. package/dist/cjs/core/Route.d.ts.map +0 -1
  428. package/dist/cjs/core/Route.js +0 -542
  429. package/dist/cjs/core/Route.js.map +0 -1
  430. package/dist/cjs/core/RoutingEngine.d.ts +0 -185
  431. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  432. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  433. package/dist/cjs/types/route.d.ts +0 -336
  434. package/dist/cjs/types/route.d.ts.map +0 -1
  435. package/dist/cjs/types/route.js.map +0 -1
  436. package/dist/core/BatchExecutor.d.ts +0 -359
  437. package/dist/core/BatchExecutor.d.ts.map +0 -1
  438. package/dist/core/BatchExecutor.js +0 -856
  439. package/dist/core/BatchExecutor.js.map +0 -1
  440. package/dist/core/BatchPromptBuilder.d.ts +0 -89
  441. package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
  442. package/dist/core/BatchPromptBuilder.js +0 -219
  443. package/dist/core/BatchPromptBuilder.js.map +0 -1
  444. package/dist/core/Route.d.ts +0 -180
  445. package/dist/core/Route.d.ts.map +0 -1
  446. package/dist/core/Route.js +0 -538
  447. package/dist/core/Route.js.map +0 -1
  448. package/dist/core/RoutingEngine.d.ts +0 -185
  449. package/dist/core/RoutingEngine.d.ts.map +0 -1
  450. package/dist/core/RoutingEngine.js.map +0 -1
  451. package/dist/types/route.d.ts +0 -336
  452. package/dist/types/route.d.ts.map +0 -1
  453. package/dist/types/route.js +0 -5
  454. package/dist/types/route.js.map +0 -1
  455. package/docs/CONTRIBUTING.md +0 -521
  456. package/docs/api/README.md +0 -3299
  457. package/docs/api/overview.md +0 -1410
  458. package/docs/architecture/data-extraction-flow.md +0 -360
  459. package/docs/architecture/multi-step-execution.md +0 -277
  460. package/docs/core/agent/README.md +0 -938
  461. package/docs/core/agent/context-management.md +0 -796
  462. package/docs/core/agent/rules-and-prohibitions.md +0 -113
  463. package/docs/core/agent/session-management.md +0 -693
  464. package/docs/core/ai-integration/prompt-composition.md +0 -355
  465. package/docs/core/ai-integration/providers.md +0 -515
  466. package/docs/core/ai-integration/response-processing.md +0 -433
  467. package/docs/core/conversation-flows/data-collection.md +0 -772
  468. package/docs/core/conversation-flows/route-dsl.md +0 -509
  469. package/docs/core/conversation-flows/routes.md +0 -249
  470. package/docs/core/conversation-flows/step-transitions.md +0 -731
  471. package/docs/core/conversation-flows/steps.md +0 -268
  472. package/docs/core/error-handling.md +0 -830
  473. package/docs/core/persistence/adapters.md +0 -255
  474. package/docs/core/persistence/session-storage.md +0 -656
  475. package/docs/core/routing/intelligent-routing.md +0 -470
  476. package/docs/core/tools/enhanced-tool.md +0 -186
  477. package/docs/core/tools/streaming-execution.md +0 -161
  478. package/docs/core/tools/tool-definition.md +0 -970
  479. package/docs/core/tools/tool-scoping.md +0 -819
  480. package/docs/guides/advanced-patterns/publishing.md +0 -186
  481. package/docs/guides/context-compaction.md +0 -96
  482. package/docs/guides/error-handling-patterns.md +0 -578
  483. package/docs/guides/getting-started/README.md +0 -795
  484. package/docs/guides/migration/README.md +0 -101
  485. package/docs/guides/migration/flexible-routing-conditions.md +0 -375
  486. package/docs/guides/migration/multi-step-execution.md +0 -393
  487. package/docs/guides/migration/response-modal-refactor.md +0 -518
  488. package/docs/guides/prompt-optimization.md +0 -164
  489. package/examples/advanced-patterns/context-compaction.ts +0 -223
  490. package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
  491. package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
  492. package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
  493. package/examples/advanced-patterns/streaming-responses.ts +0 -656
  494. package/examples/ai-providers/anthropic-integration.ts +0 -388
  495. package/examples/ai-providers/openai-integration.ts +0 -228
  496. package/examples/condition-patterns/function-only-conditions.ts +0 -365
  497. package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
  498. package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
  499. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  500. package/examples/condition-patterns/string-only-conditions.ts +0 -296
  501. package/examples/conversation-flows/completion-transitions.ts +0 -318
  502. package/examples/core-concepts/basic-agent.ts +0 -503
  503. package/examples/core-concepts/modern-streaming-api.ts +0 -309
  504. package/examples/core-concepts/schema-driven-extraction.ts +0 -332
  505. package/examples/core-concepts/session-management.ts +0 -494
  506. package/examples/integrations/database-integration.ts +0 -631
  507. package/examples/integrations/healthcare-integration.ts +0 -595
  508. package/examples/integrations/search-integration.ts +0 -530
  509. package/examples/integrations/server-session-management.ts +0 -307
  510. package/examples/persistence/custom-adapter.ts +0 -526
  511. package/examples/persistence/database-persistence.ts +0 -583
  512. package/examples/persistence/memory-sessions.ts +0 -495
  513. package/examples/persistence/prisma-schema.example.prisma +0 -74
  514. package/examples/persistence/redis-persistence.ts +0 -488
  515. package/examples/tools/basic-tools.ts +0 -765
  516. package/examples/tools/data-enrichment-tools.ts +0 -593
  517. package/examples/tools/enhanced-tool-metadata.ts +0 -268
  518. package/examples/tools/streaming-tool-execution.ts +0 -283
  519. package/src/core/BatchExecutor.ts +0 -1187
  520. package/src/core/BatchPromptBuilder.ts +0 -299
  521. package/src/core/Route.ts +0 -678
  522. package/src/types/route.ts +0 -392
@@ -1,819 +0,0 @@
1
- # Tool Scoping & Registry System
2
-
3
- The unified Tool interface supports sophisticated hierarchical scoping with a central registry that enables fine-grained control over tool availability and access. Tools can be registered globally for reuse or added to specific scopes (agent, route, step) with intelligent resolution and security controls.
4
-
5
- ## Overview
6
-
7
- The unified Tool scoping and registry system provides:
8
-
9
- - **Central Tool Registry**: Global registry for reusable tools referenced by ID across contexts
10
- - **Hierarchical Scoping**: Agent → Route → Step level tool definitions with clear priority
11
- - **Intelligent Resolution**: Automatic tool lookup across scopes with fallback to registry
12
- - **Flexible Returns**: Support for both simple return values and complex ToolResult objects
13
- - **Security Boundaries**: Fine-grained access control based on context and permissions
14
- - **Performance Optimization**: Efficient tool evaluation limited to relevant contexts
15
- - **Conflict Resolution**: Predictable tool selection when IDs conflict across scopes
16
- - **Dynamic Availability**: Conditional tool access based on runtime context
17
-
18
- ## Tool Scoping Hierarchy
19
-
20
- ### Central Tool Registry
21
-
22
- The system maintains a central registry for tools that can be referenced by ID across different contexts:
23
-
24
- ```typescript
25
- import { Agent, GeminiProvider } from "@falai/agent";
26
-
27
- const agent = new Agent({
28
- name: "Multi-Purpose Agent",
29
- provider: new GeminiProvider({
30
- apiKey: process.env.GEMINI_API_KEY!,
31
- }),
32
- });
33
-
34
- // Register tools in the central registry for reuse
35
- agent.tool.register({
36
- id: "global_search",
37
- name: "Universal Search",
38
- description: "Search across all available data sources",
39
- parameters: {
40
- type: "object",
41
- properties: {
42
- query: { type: "string", description: "Search query" },
43
- scope: { type: "string", enum: ["all", "documents", "users"], default: "all" },
44
- },
45
- required: ["query"],
46
- },
47
- handler: async ({ context, data }, args) => {
48
- const results = await searchService.search(args.query, args.scope);
49
- return `Found ${results.length} results for "${args.query}"`; // Simple return value
50
- },
51
- });
52
-
53
- agent.tool.register({
54
- id: "user_profile_manager",
55
- name: "User Profile Manager",
56
- description: "Manage user profile operations",
57
- parameters: {
58
- type: "object",
59
- properties: {
60
- action: { type: "string", enum: ["get", "update", "delete"] },
61
- userId: { type: "string", description: "User ID" },
62
- updates: { type: "object", description: "Profile updates for update action" },
63
- },
64
- required: ["action"],
65
- },
66
- handler: async ({ context, data }, args) => {
67
- const result = await userService.manageProfile(args.action, args.userId, args.updates);
68
- return {
69
- data: `Profile ${args.action} completed`,
70
- success: true,
71
- contextUpdate: { lastProfileAction: args.action }
72
- }; // Complex ToolResult pattern
73
- },
74
- });
75
-
76
- // Register multiple tools at once for efficiency
77
- agent.tool.registerMany([
78
- {
79
- id: "system_health_check",
80
- description: "Check system health and status",
81
- handler: async () => {
82
- const health = await systemService.checkHealth();
83
- return `System status: ${health.status}`; // Simple return
84
- },
85
- },
86
- {
87
- id: "audit_logger",
88
- description: "Create audit log entries",
89
- handler: async ({ context }, args) => {
90
- await auditService.log(context.userId, args.action, args.details);
91
- return {
92
- data: "Audit entry created",
93
- contextUpdate: { lastAuditAction: args.action }
94
- }; // ToolResult with context update
95
- },
96
- },
97
- ]);
98
-
99
- // Check registry status
100
- console.log("Registered tools:", Array.from(agent.tool.getRegistered().keys()));
101
- console.log("Is search registered?", agent.tool.isRegistered("global_search"));
102
- ```
103
-
104
- ### Agent-Level Tools
105
-
106
- Available to all routes and steps within the agent:
107
-
108
- ```typescript
109
- // Add tools directly to agent scope - simple return value
110
- agent.addTool({
111
- id: "agent_search",
112
- description: "Agent-wide search functionality",
113
- handler: async ({ context, data }) => {
114
- return "Agent search results"; // Simple return
115
- },
116
- });
117
-
118
- // All routes can access agent-level tools
119
- const route1 = agent.createRoute({ title: "Route 1" });
120
- const route2 = agent.createRoute({ title: "Route 2" });
121
- ```
122
-
123
- **Use Cases:**
124
-
125
- - Cross-cutting functionality (search, user management)
126
- - System utilities (health checks, logging)
127
- - Common operations (data formatting, validation)
128
-
129
- ### Route-Level Tools
130
-
131
- Specific to a single route and its steps:
132
-
133
- ```typescript
134
- const supportRoute = agent.createRoute({
135
- title: "Customer Support",
136
- });
137
-
138
- // Add tools to route scope - mixed return patterns
139
- supportRoute.addTool({
140
- id: "create_ticket",
141
- description: "Create support ticket",
142
- handler: async ({ context, data }) => {
143
- const ticketId = await ticketService.create(data);
144
- return {
145
- data: "Ticket created successfully",
146
- success: true,
147
- dataUpdate: { ticketId: ticketId }
148
- }; // Complex ToolResult
149
- },
150
- });
151
-
152
- supportRoute.addTool({
153
- id: "search_knowledge",
154
- description: "Search knowledge base",
155
- handler: async ({ context, data }) => {
156
- const results = await knowledgeBase.search(data.query);
157
- return `Found ${results.length} knowledge articles`; // Simple return
158
- },
159
- });
160
-
161
- const initialStep = supportRoute.initialStep.nextStep({
162
- prompt: "How can I help you?",
163
- tools: ["create_ticket", "search_knowledge"], // Reference by ID
164
- });
165
- ```
166
-
167
- **Use Cases:**
168
-
169
- - Domain-specific operations (support tickets, knowledge search)
170
- - Route-specific workflows (order processing, account management)
171
- - Contextual utilities (customer lookup, history access)
172
-
173
- ### Step-Level Tools
174
-
175
- Limited to a specific conversation step:
176
-
177
- ```typescript
178
- const dataCollectionStep = supportRoute.initialStep.nextStep({
179
- prompt: "Please provide your payment information",
180
- collect: ["paymentDetails"],
181
- requires: ["userConsent", "securityVerified"],
182
- }).addTool({
183
- id: "validate_payment",
184
- description: "Validate payment information",
185
- handler: async ({ context, data }) => {
186
- const isValid = await paymentValidator.validate(data.paymentDetails);
187
- return isValid ? "Payment validated successfully" : "Payment validation failed"; // Simple return
188
- },
189
- }).addTool({
190
- id: "fraud_check",
191
- description: "Perform fraud detection",
192
- handler: async ({ context, data }) => {
193
- const fraudResult = await fraudDetector.check(data.paymentDetails);
194
- return {
195
- data: fraudResult.passed ? "Fraud check passed" : "Fraud detected",
196
- success: fraudResult.passed,
197
- contextUpdate: { fraudScore: fraudResult.score }
198
- }; // Complex ToolResult with security data
199
- },
200
- });
201
-
202
- // Or reference registered tools by ID
203
- const secureStep = route.initialStep.nextStep({
204
- prompt: "Processing secure operation...",
205
- tools: ['registered_security_tool'], // Reference by ID
206
- });
207
- ```
208
-
209
- **Use Cases:**
210
-
211
- - Sensitive operations (payment processing, data encryption)
212
- - Step-specific validation (form validation, business rules)
213
- - Conditional actions (approval workflows, security checks)
214
-
215
- ## Tool Resolution Logic
216
-
217
- ### Priority Order
218
-
219
- ToolManager resolves tools with the following priority:
220
-
221
- ```typescript
222
- // 1. Step-level inline tools (highest priority)
223
- // 2. Step-level tool references (by ID) → Registry lookup
224
- // 3. Route-level tools
225
- // 4. Agent-level tools
226
- // 5. Registered tools (fallback for unresolved IDs)
227
- ```
228
-
229
- ### Tool Resolution Example
230
-
231
- The system resolves tools with clear priority rules and intelligent fallback to the registry:
232
-
233
- ```typescript
234
- import { Agent, GeminiProvider } from "@falai/agent";
235
-
236
- const agent = new Agent({
237
- name: "Resolution Demo",
238
- provider: new GeminiProvider({ apiKey: process.env.GEMINI_API_KEY! })
239
- });
240
-
241
- // 1. Register tool in central registry
242
- agent.tool.register({
243
- id: "search",
244
- description: "Registry-based search with fallback capability",
245
- handler: async ({ context, data }, args) => "Registry search executed", // Simple return
246
- });
247
-
248
- // 2. Add agent-level tool (overrides registry for this agent)
249
- agent.addTool({
250
- id: "search",
251
- description: "Agent-wide search functionality",
252
- handler: async ({ context, data }, args) => ({
253
- data: "Agent search executed",
254
- contextUpdate: { lastSearchLevel: "agent" }
255
- }), // ToolResult pattern
256
- });
257
-
258
- const route = agent.createRoute({ title: "Support Route" });
259
-
260
- // 3. Add route-level tool (overrides agent-level for this route)
261
- route.addTool({
262
- id: "search",
263
- description: "Route-specific search",
264
- handler: async ({ context, data }, args) => "Route search executed", // Simple return
265
- });
266
-
267
- // 4. Step with inline tool (highest priority)
268
- const step = route.initialStep.nextStep({
269
- prompt: "What would you like to search for?",
270
- tools: [
271
- {
272
- id: "search",
273
- description: "Step-specific search with custom logic",
274
- handler: async ({ context, data }, args) => ({
275
- data: "Step search executed",
276
- success: true,
277
- dataUpdate: { lastStepSearch: new Date() }
278
- }), // Advanced ToolResult
279
- },
280
- ],
281
- });
282
-
283
- // 5. Step referencing registered tool by ID
284
- const registryStep = route.initialStep.nextStep({
285
- prompt: "Using registry search...",
286
- tools: ['global_search'] // References registered tool by ID
287
- });
288
-
289
- // Resolution Priority (highest to lowest):
290
- // 1. Step-level inline tools → "Step search executed"
291
- // 2. Step-level tool references (by ID) → Registry lookup
292
- // 3. Route-level tools → "Route search executed"
293
- // 4. Agent-level tools → "Agent search executed"
294
- // 5. Registry fallback → "Registry search executed"
295
-
296
- // Test resolution
297
- const foundTool = agent.tool.find('search');
298
- console.log("Resolved tool:", foundTool?.description);
299
-
300
- // Get all available tools for current context
301
- const availableTools = agent.tool.getAvailable();
302
- console.log("Available tools:", availableTools.map(t => t.id));
303
- ```
304
-
305
- ### Using Tool Resolution
306
-
307
- ```typescript
308
- // Find tool across all scopes
309
- const tool = agent.tool.find('search');
310
-
311
- // Get available tools for current context
312
- const availableTools = agent.tool.getAvailable();
313
-
314
- // Check if tool is registered
315
- if (agent.tool.isRegistered('search')) {
316
- console.log('Tool available in registry');
317
- }
318
- ```
319
-
320
- ## Dynamic Tool Availability
321
-
322
- ### Conditional Tool Access
323
-
324
- Tools can be conditionally available based on context:
325
-
326
- ```typescript
327
- const conditionalRoute = agent.createRoute({
328
- title: "Premium Features",
329
-
330
- initialStep: {
331
- prompt: "What would you like to do?",
332
- tools: ({ context, data }) => {
333
- const tools = [basicTool];
334
-
335
- // Add premium tools based on user status
336
- if (context.userTier === "premium") {
337
- tools.push(premiumTool);
338
- }
339
-
340
- // Add admin tools based on permissions
341
- if (context.userRole === "admin") {
342
- tools.push(adminTool);
343
- }
344
-
345
- return tools;
346
- },
347
- },
348
- });
349
- ```
350
-
351
- ### Runtime Tool Filtering
352
-
353
- ```typescript
354
- const filteredStep = {
355
- prompt: "Available actions:",
356
- tools: ({ context, data }) => {
357
- return allTools.filter((tool) => {
358
- // Filter based on user permissions
359
- if (
360
- tool.requiresPermission &&
361
- !context.permissions?.includes(tool.requiresPermission)
362
- ) {
363
- return false;
364
- }
365
-
366
- // Filter based on collected data
367
- if (tool.requiresData && !data[tool.requiresData]) {
368
- return false;
369
- }
370
-
371
- // Filter based on step progress
372
- if (tool.minStep && data.currentStep < tool.minStep) {
373
- return false;
374
- }
375
-
376
- return true;
377
- });
378
- },
379
- };
380
- ```
381
-
382
- ## Security & Access Control
383
-
384
- ### Permission-Based Access
385
-
386
- ```typescript
387
- const secureTool = {
388
- id: "admin_action",
389
- description: "Administrative action",
390
- requiresPermission: "admin", // Tool-level permission requirement
391
-
392
- execute: async ({ action }, { context }) => {
393
- // Runtime permission check
394
- if (!context.permissions?.includes("admin")) {
395
- throw new Error("Insufficient permissions");
396
- }
397
-
398
- return await performAdminAction(action);
399
- },
400
- };
401
- ```
402
-
403
- ### Context-Based Security
404
-
405
- ```typescript
406
- import { Tool } from "@falai/agent";
407
-
408
- const contextSecureTool: Tool<SecureContext, UserData, [], any> = {
409
- id: "user_data_access",
410
- description: "Access user data with security checks",
411
- parameters: {
412
- type: "object",
413
- properties: {
414
- userId: { type: "string", description: "User ID to access" },
415
- },
416
- required: ["userId"],
417
- },
418
- handler: async (toolContext, args) => {
419
- // Ensure users can only access their own data
420
- if (
421
- toolContext.context.userId !== args.userId &&
422
- !toolContext.context.isAdmin
423
- ) {
424
- throw new Error("Access denied: Can only access own data");
425
- }
426
-
427
- return await getUserData(args.userId);
428
- },
429
- };
430
- ```
431
-
432
- ### Route Isolation
433
-
434
- ```typescript
435
- // Sensitive route with isolated tools
436
- const financeRoute = agent.createRoute({
437
- title: "Financial Operations",
438
-
439
- // Route-specific tools only
440
- tools: [secureTransactionTool, auditTool],
441
-
442
- // No agent-level tools available
443
- toolFilter: ({ context }) => {
444
- // Additional security checks
445
- if (!context.mfaVerified) {
446
- throw new Error("MFA required for financial operations");
447
- }
448
-
449
- return true; // Allow only route tools
450
- },
451
- });
452
- ```
453
-
454
- ## Performance Optimization
455
-
456
- ### Tool Limiting
457
-
458
- Control the number of tools available to reduce AI evaluation time:
459
-
460
- ```typescript
461
- const optimizedRoute = agent
462
- .createRoute({
463
- title: "Focused Interaction",
464
-
465
- initialStep: {
466
- prompt: "Basic question?",
467
- tools: ["basic_search"], // Only essential tools
468
- },
469
- })
470
- .nextStep({
471
- prompt: "Detailed analysis needed?",
472
- tools: ["basic_search", "deep_analysis", "expert_consultation"],
473
- // More tools as conversation progresses
474
- });
475
- ```
476
-
477
- ### Lazy Loading
478
-
479
- Load tools only when needed:
480
-
481
- ```typescript
482
- const lazyRoute = agent
483
- .createRoute({
484
- title: "On-Demand Tools",
485
-
486
- initialStep: {
487
- prompt: "What type of help?",
488
- tools: ["categorize_request"],
489
- },
490
- })
491
- .nextStep({
492
- prompt: "Processing your {{category}} request",
493
- tools: ({ data }) => {
494
- // Load category-specific tools
495
- switch (data.category) {
496
- case "technical":
497
- return [technicalSupportTool, codeReviewTool];
498
- case "billing":
499
- return [billingTool, paymentProcessingTool];
500
- default:
501
- return [generalHelpTool];
502
- }
503
- },
504
- requires: ["category"],
505
- });
506
- ```
507
-
508
- ## Tool Registration Patterns
509
-
510
- ### Factory Pattern
511
-
512
- Create tool instances dynamically:
513
-
514
- ```typescript
515
- function createScopedTools(userContext: UserContext) {
516
- return [
517
- {
518
- id: "user_search",
519
- description: "Search within user's personal data",
520
- parameters: {
521
- type: "object",
522
- properties: {
523
- query: { type: "string", description: "Search query" },
524
- },
525
- required: ["query"],
526
- },
527
- handler: async ({ context }, { query }) => {
528
- // Search scoped to user's data
529
- const results = await searchUserData(query, userContext.userId);
530
- return {
531
- data: `Found ${results.length} results for "${query}"`,
532
- dataUpdate: { searchResults: results },
533
- };
534
- },
535
- },
536
-
537
- {
538
- id: "user_preferences",
539
- description: "Manage user-specific preferences",
540
- parameters: {
541
- type: "object",
542
- properties: {
543
- action: { type: "string", enum: ["get", "set", "delete"] },
544
- value: { type: "string", description: "Value for set action" },
545
- },
546
- required: ["action"],
547
- },
548
- handler: async ({ context }, { action, value }) => {
549
- // Manage user-specific preferences
550
- const result = await updateUserPreferences(
551
- userContext.userId,
552
- action,
553
- value
554
- );
555
- return {
556
- data: `Preferences ${action} operation completed`,
557
- contextUpdate: { lastPreferenceUpdate: new Date().toISOString() },
558
- };
559
- },
560
- },
561
- ];
562
- }
563
-
564
- const personalizedAgent = new Agent({
565
- name: "Personal Assistant",
566
- tools: ({ context }) => createScopedTools(context),
567
- routes: [
568
- /* routes */
569
- ],
570
- });
571
- ```
572
-
573
- ### Plugin System
574
-
575
- Extensible tool registration:
576
-
577
- ```typescript
578
- class ToolRegistry {
579
- private tools = new Map<string, Tool>();
580
-
581
- register(scope: "agent" | "route" | "step", tool: Tool) {
582
- const key = `${scope}:${tool.id}`;
583
- this.tools.set(key, tool);
584
- }
585
-
586
- getAvailable(scope: string, context: any): Tool[] {
587
- const scopedTools = Array.from(this.tools.entries())
588
- .filter(([key]) => key.startsWith(scope))
589
- .map(([, tool]) => tool);
590
-
591
- // Apply context-based filtering
592
- return scopedTools.filter((tool) => this.checkPermissions(tool, context));
593
- }
594
-
595
- private checkPermissions(tool: Tool, context: any): boolean {
596
- // Implement permission logic
597
- return true; // Placeholder
598
- }
599
- }
600
- ```
601
-
602
- ## Advanced Scoping Patterns
603
-
604
- ### Multi-Tenant Tools
605
-
606
- ```typescript
607
- const multiTenantTool: Tool<
608
- { tenantId: string },
609
- { query: string },
610
- [],
611
- string
612
- > = {
613
- id: "tenant_search",
614
- description: "Search within tenant's data scope",
615
- parameters: {
616
- type: "object",
617
- properties: {
618
- query: { type: "string", description: "Search query" },
619
- },
620
- required: ["query"],
621
- },
622
- handler: async ({ context }, { query }) => {
623
- // Scope search to tenant's data
624
- const tenantId = context.tenantId;
625
- const results = await searchTenantData(query, tenantId);
626
- return {
627
- data: `Found ${results.length} results in tenant data`,
628
- dataUpdate: { searchResults: results },
629
- };
630
- },
631
- };
632
-
633
- const tenantAgent = new Agent({
634
- name: "Multi-Tenant Agent",
635
- tools: [multiTenantTool],
636
- routes: ({ context }) => {
637
- // Routes scoped to tenant
638
- return createTenantRoutes(context.tenantId);
639
- },
640
- });
641
- ```
642
-
643
- ### Time-Based Availability
644
-
645
- ```typescript
646
- const timeSensitiveTool = {
647
- id: "business_hours_support",
648
- execute: async (args) => {
649
- const now = new Date();
650
- const hour = now.getHours();
651
-
652
- if (hour < 9 || hour > 17) {
653
- throw new Error(
654
- "Support only available during business hours (9 AM - 5 PM)"
655
- );
656
- }
657
-
658
- return await provideSupport(args);
659
- },
660
- };
661
- ```
662
-
663
- ### Usage-Based Limiting
664
-
665
- ```typescript
666
- const limitedTool: Tool<{ userId: string }, any, [args: any], string> = {
667
- id: "premium_feature",
668
- description: "Execute premium feature with usage limits",
669
- parameters: {
670
- type: "object",
671
- properties: {
672
- action: { type: "string", description: "Premium action to perform" },
673
- },
674
- required: ["action"],
675
- },
676
- handler: async ({ context }, { action }) => {
677
- // Check usage limits
678
- const usage = await getUserUsage(context.userId, "premium_feature");
679
-
680
- if (usage.count >= usage.limit) {
681
- throw new Error("Premium feature usage limit exceeded");
682
- }
683
-
684
- // Execute feature
685
- const result = await executePremiumFeature(action);
686
-
687
- // Update usage
688
- await incrementUsage(context.userId, "premium_feature");
689
-
690
- return {
691
- data: `Premium feature executed: ${result}`,
692
- contextUpdate: {
693
- lastPremiumUsage: new Date().toISOString(),
694
- premiumUsageCount: usage.count + 1,
695
- },
696
- };
697
- },
698
- };
699
- ```
700
-
701
- ## Debugging & Monitoring
702
-
703
- ### Tool Resolution Tracing
704
-
705
- ```typescript
706
- // Enable debug logging
707
- const agent = new Agent({
708
- name: "Debug Agent",
709
- debug: true,
710
- provider: provider,
711
- });
712
-
713
- // Logs show tool resolution:
714
- // [Agent] Resolving tool 'search' in step 'query'
715
- // [Agent] Found step-level tool: web_search
716
- // [Agent] Tool resolution: web_search (step > route > agent)
717
- ```
718
-
719
- ### Access Audit Logging
720
-
721
- ```typescript
722
- const auditedTool: Tool<{ userId: string }, any, [args: any], string> = {
723
- id: "sensitive_operation",
724
- description: "Perform sensitive operation with audit logging",
725
- parameters: {
726
- type: "object",
727
- properties: {
728
- operation: { type: "string", description: "Operation to perform" },
729
- },
730
- required: ["operation"],
731
- },
732
- handler: async ({ context }, { operation }) => {
733
- // Log access attempt
734
- await auditLog.log({
735
- userId: context.userId,
736
- toolId: "sensitive_operation",
737
- timestamp: new Date(),
738
- operation: operation, // Log the operation type
739
- });
740
-
741
- const result = await performSensitiveOperation(operation);
742
-
743
- return {
744
- data: `Sensitive operation completed: ${result}`,
745
- contextUpdate: {
746
- lastSensitiveOperation: new Date().toISOString(),
747
- },
748
- };
749
- },
750
- };
751
- ```
752
-
753
- ### Performance Monitoring
754
-
755
- ```typescript
756
- const monitoredAgent = new Agent({
757
- name: "Monitored Agent",
758
- tools: [
759
- {
760
- ...tool,
761
- execute: async (args, context) => {
762
- const startTime = Date.now();
763
- try {
764
- const result = await originalExecute(args, context);
765
-
766
- // Log performance metrics
767
- metrics.record("tool_execution", {
768
- toolId: tool.id,
769
- duration: Date.now() - startTime,
770
- success: true,
771
- });
772
-
773
- return result;
774
- } catch (error) {
775
- metrics.record("tool_execution", {
776
- toolId: tool.id,
777
- duration: Date.now() - startTime,
778
- success: false,
779
- error: error.message,
780
- });
781
-
782
- throw error;
783
- }
784
- },
785
- },
786
- ],
787
- });
788
- ```
789
-
790
- ## Best Practices
791
-
792
- ### Scoping Strategy
793
-
794
- 1. **Agent Level**: Cross-cutting, general-purpose tools
795
- 2. **Route Level**: Domain-specific, route-centric tools
796
- 3. **Step Level**: Sensitive, step-specific operations
797
-
798
- ### Security First
799
-
800
- 1. **Defense in Depth**: Multiple layers of access control
801
- 2. **Principle of Least Privilege**: Minimal required permissions
802
- 3. **Audit Everything**: Log all tool access and usage
803
- 4. **Fail Secure**: Deny access when in doubt
804
-
805
- ### Performance
806
-
807
- 1. **Limit Scope**: Don't expose unnecessary tools
808
- 2. **Lazy Loading**: Load tools only when needed
809
- 3. **Caching**: Cache permission checks and tool metadata
810
- 4. **Monitoring**: Track usage patterns and optimize
811
-
812
- ### Maintainability
813
-
814
- 1. **Clear Naming**: Descriptive tool IDs and scopes
815
- 2. **Documentation**: Document tool purposes and requirements
816
- 3. **Testing**: Test tool resolution and access control
817
- 4. **Versioning**: Plan for tool evolution and compatibility
818
-
819
- The hierarchical scoping system enables sophisticated tool management while maintaining security, performance, and developer experience.