@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,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.