@falai/agent 1.2.8 → 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 (499) 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/types/agent.d.ts +183 -54
  126. package/dist/cjs/types/agent.d.ts.map +1 -1
  127. package/dist/cjs/types/agent.js +0 -6
  128. package/dist/cjs/types/agent.js.map +1 -1
  129. package/dist/cjs/types/ai.d.ts +3 -3
  130. package/dist/cjs/types/ai.d.ts.map +1 -1
  131. package/dist/cjs/types/errors.d.ts +15 -0
  132. package/dist/cjs/types/errors.d.ts.map +1 -0
  133. package/dist/cjs/types/errors.js +22 -0
  134. package/dist/cjs/types/errors.js.map +1 -0
  135. package/dist/cjs/types/flow.d.ts +513 -0
  136. package/dist/cjs/types/flow.d.ts.map +1 -0
  137. package/dist/cjs/types/{route.js → flow.js} +2 -2
  138. package/dist/cjs/types/flow.js.map +1 -0
  139. package/dist/cjs/types/index.d.ts +7 -6
  140. package/dist/cjs/types/index.d.ts.map +1 -1
  141. package/dist/cjs/types/index.js +6 -2
  142. package/dist/cjs/types/index.js.map +1 -1
  143. package/dist/cjs/types/persistence.d.ts +11 -7
  144. package/dist/cjs/types/persistence.d.ts.map +1 -1
  145. package/dist/cjs/types/routing.d.ts +1 -1
  146. package/dist/cjs/types/routing.d.ts.map +1 -1
  147. package/dist/cjs/types/session.d.ts +24 -23
  148. package/dist/cjs/types/session.d.ts.map +1 -1
  149. package/dist/cjs/types/signals.d.ts +248 -0
  150. package/dist/cjs/types/signals.d.ts.map +1 -0
  151. package/dist/cjs/types/signals.js +11 -0
  152. package/dist/cjs/types/signals.js.map +1 -0
  153. package/dist/cjs/types/template.d.ts +2 -8
  154. package/dist/cjs/types/template.d.ts.map +1 -1
  155. package/dist/cjs/types/tool.d.ts +36 -29
  156. package/dist/cjs/types/tool.d.ts.map +1 -1
  157. package/dist/cjs/types/tool.js +1 -1
  158. package/dist/cjs/types/tool.js.map +1 -1
  159. package/dist/cjs/utils/condition.d.ts +7 -1
  160. package/dist/cjs/utils/condition.d.ts.map +1 -1
  161. package/dist/cjs/utils/condition.js.map +1 -1
  162. package/dist/cjs/utils/id.d.ts +13 -5
  163. package/dist/cjs/utils/id.d.ts.map +1 -1
  164. package/dist/cjs/utils/id.js +24 -10
  165. package/dist/cjs/utils/id.js.map +1 -1
  166. package/dist/cjs/utils/index.d.ts +2 -2
  167. package/dist/cjs/utils/index.d.ts.map +1 -1
  168. package/dist/cjs/utils/index.js +7 -3
  169. package/dist/cjs/utils/index.js.map +1 -1
  170. package/dist/cjs/utils/session.d.ts +44 -5
  171. package/dist/cjs/utils/session.d.ts.map +1 -1
  172. package/dist/cjs/utils/session.js +197 -38
  173. package/dist/cjs/utils/session.js.map +1 -1
  174. package/dist/constants/index.d.ts +0 -9
  175. package/dist/constants/index.d.ts.map +1 -1
  176. package/dist/constants/index.js +3 -9
  177. package/dist/constants/index.js.map +1 -1
  178. package/dist/core/Agent.d.ts +119 -153
  179. package/dist/core/Agent.d.ts.map +1 -1
  180. package/dist/core/Agent.js +472 -325
  181. package/dist/core/Agent.js.map +1 -1
  182. package/dist/core/AutoChainExecutor.d.ts +107 -0
  183. package/dist/core/AutoChainExecutor.d.ts.map +1 -0
  184. package/dist/core/AutoChainExecutor.js +293 -0
  185. package/dist/core/AutoChainExecutor.js.map +1 -0
  186. package/dist/core/BranchEvaluator.d.ts +54 -0
  187. package/dist/core/BranchEvaluator.d.ts.map +1 -0
  188. package/dist/core/BranchEvaluator.js +126 -0
  189. package/dist/core/BranchEvaluator.js.map +1 -0
  190. package/dist/core/DirectiveBus.d.ts +88 -0
  191. package/dist/core/DirectiveBus.d.ts.map +1 -0
  192. package/dist/core/DirectiveBus.js +192 -0
  193. package/dist/core/DirectiveBus.js.map +1 -0
  194. package/dist/core/DirectiveChainTracker.d.ts +49 -0
  195. package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
  196. package/dist/core/DirectiveChainTracker.js +117 -0
  197. package/dist/core/DirectiveChainTracker.js.map +1 -0
  198. package/dist/core/Flow.d.ts +186 -0
  199. package/dist/core/Flow.d.ts.map +1 -0
  200. package/dist/core/Flow.js +546 -0
  201. package/dist/core/Flow.js.map +1 -0
  202. package/dist/core/FlowRouter.d.ts +182 -0
  203. package/dist/core/FlowRouter.d.ts.map +1 -0
  204. package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
  205. package/dist/core/FlowRouter.js.map +1 -0
  206. package/dist/core/PersistenceManager.d.ts +2 -2
  207. package/dist/core/PersistenceManager.d.ts.map +1 -1
  208. package/dist/core/PersistenceManager.js +7 -7
  209. package/dist/core/PersistenceManager.js.map +1 -1
  210. package/dist/core/PromptComposer.d.ts +21 -8
  211. package/dist/core/PromptComposer.d.ts.map +1 -1
  212. package/dist/core/PromptComposer.js +183 -106
  213. package/dist/core/PromptComposer.js.map +1 -1
  214. package/dist/core/PromptSectionCache.d.ts +1 -1
  215. package/dist/core/PromptSectionCache.js +1 -1
  216. package/dist/core/ResponseEngine.d.ts +18 -8
  217. package/dist/core/ResponseEngine.d.ts.map +1 -1
  218. package/dist/core/ResponseEngine.js +38 -36
  219. package/dist/core/ResponseEngine.js.map +1 -1
  220. package/dist/core/ResponseModal.d.ts +73 -56
  221. package/dist/core/ResponseModal.d.ts.map +1 -1
  222. package/dist/core/ResponseModal.js +1193 -1016
  223. package/dist/core/ResponseModal.js.map +1 -1
  224. package/dist/core/ResponsePipeline.d.ts +124 -26
  225. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  226. package/dist/core/ResponsePipeline.js +509 -137
  227. package/dist/core/ResponsePipeline.js.map +1 -1
  228. package/dist/core/SignalEvaluator.d.ts +86 -0
  229. package/dist/core/SignalEvaluator.d.ts.map +1 -0
  230. package/dist/core/SignalEvaluator.js +326 -0
  231. package/dist/core/SignalEvaluator.js.map +1 -0
  232. package/dist/core/SignalProcessor.d.ts +152 -0
  233. package/dist/core/SignalProcessor.d.ts.map +1 -0
  234. package/dist/core/SignalProcessor.js +555 -0
  235. package/dist/core/SignalProcessor.js.map +1 -0
  236. package/dist/core/Step.d.ts +43 -32
  237. package/dist/core/Step.d.ts.map +1 -1
  238. package/dist/core/Step.js +220 -126
  239. package/dist/core/Step.js.map +1 -1
  240. package/dist/core/StreamingToolExecutor.d.ts +2 -2
  241. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  242. package/dist/core/StreamingToolExecutor.js.map +1 -1
  243. package/dist/core/ToolManager.d.ts +44 -13
  244. package/dist/core/ToolManager.d.ts.map +1 -1
  245. package/dist/core/ToolManager.js +174 -91
  246. package/dist/core/ToolManager.js.map +1 -1
  247. package/dist/core/createAgent.d.ts +35 -0
  248. package/dist/core/createAgent.d.ts.map +1 -0
  249. package/dist/core/createAgent.js +36 -0
  250. package/dist/core/createAgent.js.map +1 -0
  251. package/dist/core/flow-namespace.d.ts +49 -0
  252. package/dist/core/flow-namespace.d.ts.map +1 -0
  253. package/dist/core/flow-namespace.js +168 -0
  254. package/dist/core/flow-namespace.js.map +1 -0
  255. package/dist/index.d.ts +11 -14
  256. package/dist/index.d.ts.map +1 -1
  257. package/dist/index.js +9 -12
  258. package/dist/index.js.map +1 -1
  259. package/dist/types/agent.d.ts +183 -54
  260. package/dist/types/agent.d.ts.map +1 -1
  261. package/dist/types/agent.js +0 -6
  262. package/dist/types/agent.js.map +1 -1
  263. package/dist/types/ai.d.ts +3 -3
  264. package/dist/types/ai.d.ts.map +1 -1
  265. package/dist/types/errors.d.ts +15 -0
  266. package/dist/types/errors.d.ts.map +1 -0
  267. package/dist/types/errors.js +18 -0
  268. package/dist/types/errors.js.map +1 -0
  269. package/dist/types/flow.d.ts +513 -0
  270. package/dist/types/flow.d.ts.map +1 -0
  271. package/dist/types/flow.js +5 -0
  272. package/dist/types/flow.js.map +1 -0
  273. package/dist/types/index.d.ts +7 -6
  274. package/dist/types/index.d.ts.map +1 -1
  275. package/dist/types/index.js +4 -1
  276. package/dist/types/index.js.map +1 -1
  277. package/dist/types/persistence.d.ts +11 -7
  278. package/dist/types/persistence.d.ts.map +1 -1
  279. package/dist/types/routing.d.ts +1 -1
  280. package/dist/types/routing.d.ts.map +1 -1
  281. package/dist/types/session.d.ts +24 -23
  282. package/dist/types/session.d.ts.map +1 -1
  283. package/dist/types/signals.d.ts +248 -0
  284. package/dist/types/signals.d.ts.map +1 -0
  285. package/dist/types/signals.js +10 -0
  286. package/dist/types/signals.js.map +1 -0
  287. package/dist/types/template.d.ts +2 -8
  288. package/dist/types/template.d.ts.map +1 -1
  289. package/dist/types/tool.d.ts +36 -29
  290. package/dist/types/tool.d.ts.map +1 -1
  291. package/dist/types/tool.js +1 -1
  292. package/dist/types/tool.js.map +1 -1
  293. package/dist/utils/condition.d.ts +7 -1
  294. package/dist/utils/condition.d.ts.map +1 -1
  295. package/dist/utils/condition.js.map +1 -1
  296. package/dist/utils/id.d.ts +13 -5
  297. package/dist/utils/id.d.ts.map +1 -1
  298. package/dist/utils/id.js +22 -9
  299. package/dist/utils/id.js.map +1 -1
  300. package/dist/utils/index.d.ts +2 -2
  301. package/dist/utils/index.d.ts.map +1 -1
  302. package/dist/utils/index.js +2 -2
  303. package/dist/utils/index.js.map +1 -1
  304. package/dist/utils/session.d.ts +44 -5
  305. package/dist/utils/session.d.ts.map +1 -1
  306. package/dist/utils/session.js +193 -37
  307. package/dist/utils/session.js.map +1 -1
  308. package/docs/README.md +15 -202
  309. package/docs/concepts/architecture.md +281 -0
  310. package/docs/concepts/directives.md +400 -0
  311. package/docs/concepts/pipeline.md +399 -0
  312. package/docs/guides/branching.md +263 -0
  313. package/docs/guides/compaction.md +163 -0
  314. package/docs/guides/conditions.md +167 -0
  315. package/docs/guides/error-handling.md +176 -0
  316. package/docs/guides/flow-control.md +409 -0
  317. package/docs/guides/instructions.md +210 -0
  318. package/docs/guides/persistence.md +182 -0
  319. package/docs/guides/streaming.md +137 -0
  320. package/docs/migration/README.md +15 -0
  321. package/docs/migration/route-to-flow.md +560 -0
  322. package/docs/migration/v1-to-v2.md +909 -0
  323. package/docs/reference/adapters.md +481 -0
  324. package/docs/reference/branches.md +241 -0
  325. package/docs/reference/create-agent.md +186 -0
  326. package/docs/reference/directive.md +243 -0
  327. package/docs/reference/errors.md +122 -0
  328. package/docs/reference/flow.md +238 -0
  329. package/docs/reference/instruction.md +177 -0
  330. package/docs/reference/pre-directive.md +131 -0
  331. package/docs/reference/providers.md +227 -0
  332. package/docs/reference/signals.md +356 -0
  333. package/docs/reference/step.md +339 -0
  334. package/docs/reference/tool.md +269 -0
  335. package/docs/start/01-install.md +81 -0
  336. package/docs/start/02-first-agent.md +196 -0
  337. package/docs/start/03-collect-data.md +222 -0
  338. package/docs/start/04-add-tools.md +276 -0
  339. package/docs/start/05-go-to-production.md +216 -0
  340. package/examples/01-quickstart.ts +20 -0
  341. package/examples/02-data-extraction.ts +90 -0
  342. package/examples/03-tools.ts +136 -0
  343. package/examples/04-instructions.ts +100 -0
  344. package/examples/05-branching.ts +140 -0
  345. package/examples/06-flow-control.ts +103 -0
  346. package/examples/07-streaming.ts +69 -0
  347. package/examples/08-persistence.ts +98 -0
  348. package/examples/09-signals.ts +144 -0
  349. package/examples/tsconfig.json +30 -0
  350. package/package.json +2 -1
  351. package/src/adapters/MemoryAdapter.ts +3 -3
  352. package/src/adapters/MongoAdapter.ts +3 -3
  353. package/src/adapters/OpenSearchAdapter.ts +10 -8
  354. package/src/adapters/PostgreSQLAdapter.ts +26 -10
  355. package/src/adapters/PrismaAdapter.ts +6 -6
  356. package/src/adapters/RedisAdapter.ts +3 -3
  357. package/src/adapters/SQLiteAdapter.ts +31 -12
  358. package/src/constants/index.ts +2 -10
  359. package/src/core/Agent.ts +585 -374
  360. package/src/core/AutoChainExecutor.ts +440 -0
  361. package/src/core/BranchEvaluator.ts +167 -0
  362. package/src/core/DirectiveBus.ts +248 -0
  363. package/src/core/DirectiveChainTracker.ts +144 -0
  364. package/src/core/Flow.ts +666 -0
  365. package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
  366. package/src/core/PersistenceManager.ts +8 -8
  367. package/src/core/PromptComposer.ts +209 -140
  368. package/src/core/PromptSectionCache.ts +1 -1
  369. package/src/core/ResponseEngine.ts +61 -46
  370. package/src/core/ResponseModal.ts +1453 -1240
  371. package/src/core/ResponsePipeline.ts +655 -175
  372. package/src/core/SignalEvaluator.ts +420 -0
  373. package/src/core/SignalProcessor.ts +723 -0
  374. package/src/core/Step.ts +279 -176
  375. package/src/core/StreamingToolExecutor.ts +4 -4
  376. package/src/core/ToolManager.ts +200 -97
  377. package/src/core/createAgent.ts +40 -0
  378. package/src/core/flow-namespace.ts +219 -0
  379. package/src/index.ts +42 -36
  380. package/src/types/agent.ts +182 -53
  381. package/src/types/ai.ts +3 -3
  382. package/src/types/errors.ts +18 -0
  383. package/src/types/flow.ts +590 -0
  384. package/src/types/index.ts +43 -16
  385. package/src/types/persistence.ts +12 -8
  386. package/src/types/routing.ts +1 -1
  387. package/src/types/session.ts +26 -23
  388. package/src/types/signals.ts +321 -0
  389. package/src/types/template.ts +3 -11
  390. package/src/types/tool.ts +50 -42
  391. package/src/utils/condition.ts +13 -4
  392. package/src/utils/id.ts +27 -9
  393. package/src/utils/index.ts +6 -2
  394. package/src/utils/session.ts +238 -42
  395. package/dist/cjs/core/BatchExecutor.d.ts +0 -359
  396. package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
  397. package/dist/cjs/core/BatchExecutor.js +0 -861
  398. package/dist/cjs/core/BatchExecutor.js.map +0 -1
  399. package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
  400. package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
  401. package/dist/cjs/core/BatchPromptBuilder.js +0 -223
  402. package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
  403. package/dist/cjs/core/Route.d.ts +0 -180
  404. package/dist/cjs/core/Route.d.ts.map +0 -1
  405. package/dist/cjs/core/Route.js +0 -542
  406. package/dist/cjs/core/Route.js.map +0 -1
  407. package/dist/cjs/core/RoutingEngine.d.ts +0 -185
  408. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  409. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  410. package/dist/cjs/types/route.d.ts +0 -336
  411. package/dist/cjs/types/route.d.ts.map +0 -1
  412. package/dist/cjs/types/route.js.map +0 -1
  413. package/dist/core/BatchExecutor.d.ts +0 -359
  414. package/dist/core/BatchExecutor.d.ts.map +0 -1
  415. package/dist/core/BatchExecutor.js +0 -856
  416. package/dist/core/BatchExecutor.js.map +0 -1
  417. package/dist/core/BatchPromptBuilder.d.ts +0 -89
  418. package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
  419. package/dist/core/BatchPromptBuilder.js +0 -219
  420. package/dist/core/BatchPromptBuilder.js.map +0 -1
  421. package/dist/core/Route.d.ts +0 -180
  422. package/dist/core/Route.d.ts.map +0 -1
  423. package/dist/core/Route.js +0 -538
  424. package/dist/core/Route.js.map +0 -1
  425. package/dist/core/RoutingEngine.d.ts +0 -185
  426. package/dist/core/RoutingEngine.d.ts.map +0 -1
  427. package/dist/core/RoutingEngine.js.map +0 -1
  428. package/dist/types/route.d.ts +0 -336
  429. package/dist/types/route.d.ts.map +0 -1
  430. package/dist/types/route.js +0 -5
  431. package/dist/types/route.js.map +0 -1
  432. package/docs/CONTRIBUTING.md +0 -521
  433. package/docs/api/README.md +0 -3299
  434. package/docs/api/overview.md +0 -1410
  435. package/docs/architecture/data-extraction-flow.md +0 -360
  436. package/docs/architecture/multi-step-execution.md +0 -277
  437. package/docs/core/agent/README.md +0 -938
  438. package/docs/core/agent/context-management.md +0 -796
  439. package/docs/core/agent/rules-and-prohibitions.md +0 -113
  440. package/docs/core/agent/session-management.md +0 -693
  441. package/docs/core/ai-integration/prompt-composition.md +0 -355
  442. package/docs/core/ai-integration/providers.md +0 -515
  443. package/docs/core/ai-integration/response-processing.md +0 -433
  444. package/docs/core/conversation-flows/data-collection.md +0 -772
  445. package/docs/core/conversation-flows/route-dsl.md +0 -509
  446. package/docs/core/conversation-flows/routes.md +0 -249
  447. package/docs/core/conversation-flows/step-transitions.md +0 -731
  448. package/docs/core/conversation-flows/steps.md +0 -268
  449. package/docs/core/error-handling.md +0 -830
  450. package/docs/core/persistence/adapters.md +0 -255
  451. package/docs/core/persistence/session-storage.md +0 -656
  452. package/docs/core/routing/intelligent-routing.md +0 -470
  453. package/docs/core/tools/enhanced-tool.md +0 -186
  454. package/docs/core/tools/streaming-execution.md +0 -161
  455. package/docs/core/tools/tool-definition.md +0 -970
  456. package/docs/core/tools/tool-scoping.md +0 -819
  457. package/docs/guides/advanced-patterns/publishing.md +0 -186
  458. package/docs/guides/context-compaction.md +0 -96
  459. package/docs/guides/error-handling-patterns.md +0 -578
  460. package/docs/guides/getting-started/README.md +0 -795
  461. package/docs/guides/migration/README.md +0 -101
  462. package/docs/guides/migration/flexible-routing-conditions.md +0 -375
  463. package/docs/guides/migration/multi-step-execution.md +0 -393
  464. package/docs/guides/migration/response-modal-refactor.md +0 -518
  465. package/docs/guides/prompt-optimization.md +0 -164
  466. package/examples/advanced-patterns/context-compaction.ts +0 -223
  467. package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
  468. package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
  469. package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
  470. package/examples/advanced-patterns/streaming-responses.ts +0 -656
  471. package/examples/ai-providers/anthropic-integration.ts +0 -388
  472. package/examples/ai-providers/openai-integration.ts +0 -228
  473. package/examples/condition-patterns/function-only-conditions.ts +0 -365
  474. package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
  475. package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
  476. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  477. package/examples/condition-patterns/string-only-conditions.ts +0 -296
  478. package/examples/conversation-flows/completion-transitions.ts +0 -318
  479. package/examples/core-concepts/basic-agent.ts +0 -503
  480. package/examples/core-concepts/modern-streaming-api.ts +0 -309
  481. package/examples/core-concepts/schema-driven-extraction.ts +0 -332
  482. package/examples/core-concepts/session-management.ts +0 -494
  483. package/examples/integrations/database-integration.ts +0 -631
  484. package/examples/integrations/healthcare-integration.ts +0 -595
  485. package/examples/integrations/search-integration.ts +0 -530
  486. package/examples/integrations/server-session-management.ts +0 -307
  487. package/examples/persistence/custom-adapter.ts +0 -526
  488. package/examples/persistence/database-persistence.ts +0 -583
  489. package/examples/persistence/memory-sessions.ts +0 -495
  490. package/examples/persistence/prisma-schema.example.prisma +0 -74
  491. package/examples/persistence/redis-persistence.ts +0 -488
  492. package/examples/tools/basic-tools.ts +0 -765
  493. package/examples/tools/data-enrichment-tools.ts +0 -593
  494. package/examples/tools/enhanced-tool-metadata.ts +0 -268
  495. package/examples/tools/streaming-tool-execution.ts +0 -283
  496. package/src/core/BatchExecutor.ts +0 -1187
  497. package/src/core/BatchPromptBuilder.ts +0 -299
  498. package/src/core/Route.ts +0 -678
  499. 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.