@falai/agent 1.2.8 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -886
- package/dist/adapters/MemoryAdapter.js +2 -2
- package/dist/adapters/MemoryAdapter.js.map +1 -1
- package/dist/adapters/MongoAdapter.js +2 -2
- package/dist/adapters/MongoAdapter.js.map +1 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenSearchAdapter.js +9 -7
- package/dist/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.js +25 -9
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/adapters/PrismaAdapter.js +5 -5
- package/dist/adapters/PrismaAdapter.js.map +1 -1
- package/dist/adapters/RedisAdapter.js +2 -2
- package/dist/adapters/RedisAdapter.js.map +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts +17 -0
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/adapters/SQLiteAdapter.js +30 -11
- package/dist/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.js +2 -2
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.js +2 -2
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.js +5 -5
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.js +2 -2
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/constants/index.d.ts +0 -9
- package/dist/cjs/constants/index.d.ts.map +1 -1
- package/dist/cjs/constants/index.js +2 -11
- package/dist/cjs/constants/index.js.map +1 -1
- package/dist/cjs/core/Agent.d.ts +119 -153
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +471 -324
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
- package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
- package/dist/cjs/core/AutoChainExecutor.js +297 -0
- package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
- package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
- package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
- package/dist/cjs/core/BranchEvaluator.js +130 -0
- package/dist/cjs/core/BranchEvaluator.js.map +1 -0
- package/dist/cjs/core/DirectiveBus.d.ts +88 -0
- package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
- package/dist/cjs/core/DirectiveBus.js +196 -0
- package/dist/cjs/core/DirectiveBus.js.map +1 -0
- package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
- package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
- package/dist/cjs/core/DirectiveChainTracker.js +121 -0
- package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
- package/dist/cjs/core/Flow.d.ts +186 -0
- package/dist/cjs/core/Flow.d.ts.map +1 -0
- package/dist/cjs/core/Flow.js +550 -0
- package/dist/cjs/core/Flow.js.map +1 -0
- package/dist/cjs/core/FlowRouter.d.ts +182 -0
- package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
- package/dist/cjs/core/{RoutingEngine.js → FlowRouter.js} +323 -306
- package/dist/cjs/core/FlowRouter.js.map +1 -0
- package/dist/cjs/core/PersistenceManager.d.ts +2 -2
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
- package/dist/cjs/core/PersistenceManager.js +7 -7
- package/dist/cjs/core/PersistenceManager.js.map +1 -1
- package/dist/cjs/core/PromptComposer.d.ts +21 -8
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
- package/dist/cjs/core/PromptComposer.js +182 -105
- package/dist/cjs/core/PromptComposer.js.map +1 -1
- package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
- package/dist/cjs/core/PromptSectionCache.js +1 -1
- package/dist/cjs/core/ResponseEngine.d.ts +18 -8
- package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +38 -36
- package/dist/cjs/core/ResponseEngine.js.map +1 -1
- package/dist/cjs/core/ResponseModal.d.ts +73 -56
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
- package/dist/cjs/core/ResponseModal.js +1191 -1014
- package/dist/cjs/core/ResponseModal.js.map +1 -1
- package/dist/cjs/core/ResponsePipeline.d.ts +124 -26
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/cjs/core/ResponsePipeline.js +509 -136
- package/dist/cjs/core/ResponsePipeline.js.map +1 -1
- package/dist/cjs/core/SignalEvaluator.d.ts +86 -0
- package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -0
- package/dist/cjs/core/SignalEvaluator.js +333 -0
- package/dist/cjs/core/SignalEvaluator.js.map +1 -0
- package/dist/cjs/core/SignalProcessor.d.ts +152 -0
- package/dist/cjs/core/SignalProcessor.d.ts.map +1 -0
- package/dist/cjs/core/SignalProcessor.js +562 -0
- package/dist/cjs/core/SignalProcessor.js.map +1 -0
- package/dist/cjs/core/Step.d.ts +43 -32
- package/dist/cjs/core/Step.d.ts.map +1 -1
- package/dist/cjs/core/Step.js +221 -126
- package/dist/cjs/core/Step.js.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.d.ts +2 -2
- package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
- package/dist/cjs/core/ToolManager.d.ts +44 -13
- package/dist/cjs/core/ToolManager.d.ts.map +1 -1
- package/dist/cjs/core/ToolManager.js +174 -91
- package/dist/cjs/core/ToolManager.js.map +1 -1
- package/dist/cjs/core/createAgent.d.ts +35 -0
- package/dist/cjs/core/createAgent.d.ts.map +1 -0
- package/dist/cjs/core/createAgent.js +39 -0
- package/dist/cjs/core/createAgent.js.map +1 -0
- package/dist/cjs/core/flow-namespace.d.ts +49 -0
- package/dist/cjs/core/flow-namespace.d.ts.map +1 -0
- package/dist/cjs/core/flow-namespace.js +171 -0
- package/dist/cjs/core/flow-namespace.js.map +1 -0
- package/dist/cjs/index.d.ts +11 -14
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +18 -22
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts +1 -1
- package/dist/cjs/providers/AnthropicProvider.js +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +1 -1
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.js +1 -1
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +183 -54
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/agent.js +0 -6
- package/dist/cjs/types/agent.js.map +1 -1
- package/dist/cjs/types/ai.d.ts +3 -3
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/errors.d.ts +15 -0
- package/dist/cjs/types/errors.d.ts.map +1 -0
- package/dist/cjs/types/errors.js +22 -0
- package/dist/cjs/types/errors.js.map +1 -0
- package/dist/cjs/types/flow.d.ts +513 -0
- package/dist/cjs/types/flow.d.ts.map +1 -0
- package/dist/cjs/types/{route.js → flow.js} +2 -2
- package/dist/cjs/types/flow.js.map +1 -0
- package/dist/cjs/types/index.d.ts +7 -6
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js +6 -2
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/persistence.d.ts +11 -7
- package/dist/cjs/types/persistence.d.ts.map +1 -1
- package/dist/cjs/types/routing.d.ts +1 -1
- package/dist/cjs/types/routing.d.ts.map +1 -1
- package/dist/cjs/types/session.d.ts +24 -23
- package/dist/cjs/types/session.d.ts.map +1 -1
- package/dist/cjs/types/signals.d.ts +248 -0
- package/dist/cjs/types/signals.d.ts.map +1 -0
- package/dist/cjs/types/signals.js +11 -0
- package/dist/cjs/types/signals.js.map +1 -0
- package/dist/cjs/types/template.d.ts +2 -8
- package/dist/cjs/types/template.d.ts.map +1 -1
- package/dist/cjs/types/tool.d.ts +36 -29
- package/dist/cjs/types/tool.d.ts.map +1 -1
- package/dist/cjs/types/tool.js +1 -1
- package/dist/cjs/types/tool.js.map +1 -1
- package/dist/cjs/utils/condition.d.ts +7 -1
- package/dist/cjs/utils/condition.d.ts.map +1 -1
- package/dist/cjs/utils/condition.js.map +1 -1
- package/dist/cjs/utils/id.d.ts +13 -5
- package/dist/cjs/utils/id.d.ts.map +1 -1
- package/dist/cjs/utils/id.js +24 -10
- package/dist/cjs/utils/id.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +2 -2
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +7 -3
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/session.d.ts +44 -5
- package/dist/cjs/utils/session.d.ts.map +1 -1
- package/dist/cjs/utils/session.js +197 -38
- package/dist/cjs/utils/session.js.map +1 -1
- package/dist/constants/index.d.ts +0 -9
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +3 -9
- package/dist/constants/index.js.map +1 -1
- package/dist/core/Agent.d.ts +119 -153
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +472 -325
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/AutoChainExecutor.d.ts +107 -0
- package/dist/core/AutoChainExecutor.d.ts.map +1 -0
- package/dist/core/AutoChainExecutor.js +293 -0
- package/dist/core/AutoChainExecutor.js.map +1 -0
- package/dist/core/BranchEvaluator.d.ts +54 -0
- package/dist/core/BranchEvaluator.d.ts.map +1 -0
- package/dist/core/BranchEvaluator.js +126 -0
- package/dist/core/BranchEvaluator.js.map +1 -0
- package/dist/core/DirectiveBus.d.ts +88 -0
- package/dist/core/DirectiveBus.d.ts.map +1 -0
- package/dist/core/DirectiveBus.js +192 -0
- package/dist/core/DirectiveBus.js.map +1 -0
- package/dist/core/DirectiveChainTracker.d.ts +49 -0
- package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
- package/dist/core/DirectiveChainTracker.js +117 -0
- package/dist/core/DirectiveChainTracker.js.map +1 -0
- package/dist/core/Flow.d.ts +186 -0
- package/dist/core/Flow.d.ts.map +1 -0
- package/dist/core/Flow.js +546 -0
- package/dist/core/Flow.js.map +1 -0
- package/dist/core/FlowRouter.d.ts +182 -0
- package/dist/core/FlowRouter.d.ts.map +1 -0
- package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
- package/dist/core/FlowRouter.js.map +1 -0
- package/dist/core/PersistenceManager.d.ts +2 -2
- package/dist/core/PersistenceManager.d.ts.map +1 -1
- package/dist/core/PersistenceManager.js +7 -7
- package/dist/core/PersistenceManager.js.map +1 -1
- package/dist/core/PromptComposer.d.ts +21 -8
- package/dist/core/PromptComposer.d.ts.map +1 -1
- package/dist/core/PromptComposer.js +183 -106
- package/dist/core/PromptComposer.js.map +1 -1
- package/dist/core/PromptSectionCache.d.ts +1 -1
- package/dist/core/PromptSectionCache.js +1 -1
- package/dist/core/ResponseEngine.d.ts +18 -8
- package/dist/core/ResponseEngine.d.ts.map +1 -1
- package/dist/core/ResponseEngine.js +38 -36
- package/dist/core/ResponseEngine.js.map +1 -1
- package/dist/core/ResponseModal.d.ts +73 -56
- package/dist/core/ResponseModal.d.ts.map +1 -1
- package/dist/core/ResponseModal.js +1193 -1016
- package/dist/core/ResponseModal.js.map +1 -1
- package/dist/core/ResponsePipeline.d.ts +124 -26
- package/dist/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/core/ResponsePipeline.js +509 -137
- package/dist/core/ResponsePipeline.js.map +1 -1
- package/dist/core/SignalEvaluator.d.ts +86 -0
- package/dist/core/SignalEvaluator.d.ts.map +1 -0
- package/dist/core/SignalEvaluator.js +326 -0
- package/dist/core/SignalEvaluator.js.map +1 -0
- package/dist/core/SignalProcessor.d.ts +152 -0
- package/dist/core/SignalProcessor.d.ts.map +1 -0
- package/dist/core/SignalProcessor.js +555 -0
- package/dist/core/SignalProcessor.js.map +1 -0
- package/dist/core/Step.d.ts +43 -32
- package/dist/core/Step.d.ts.map +1 -1
- package/dist/core/Step.js +220 -126
- package/dist/core/Step.js.map +1 -1
- package/dist/core/StreamingToolExecutor.d.ts +2 -2
- package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/core/StreamingToolExecutor.js.map +1 -1
- package/dist/core/ToolManager.d.ts +44 -13
- package/dist/core/ToolManager.d.ts.map +1 -1
- package/dist/core/ToolManager.js +174 -91
- package/dist/core/ToolManager.js.map +1 -1
- package/dist/core/createAgent.d.ts +35 -0
- package/dist/core/createAgent.d.ts.map +1 -0
- package/dist/core/createAgent.js +36 -0
- package/dist/core/createAgent.js.map +1 -0
- package/dist/core/flow-namespace.d.ts +49 -0
- package/dist/core/flow-namespace.d.ts.map +1 -0
- package/dist/core/flow-namespace.js +168 -0
- package/dist/core/flow-namespace.js.map +1 -0
- package/dist/index.d.ts +11 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -12
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts +1 -1
- package/dist/providers/AnthropicProvider.js +1 -1
- package/dist/providers/GeminiProvider.d.ts +1 -1
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +1 -1
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/OpenAIProvider.d.ts +1 -1
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +1 -1
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/types/agent.d.ts +183 -54
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js +0 -6
- package/dist/types/agent.js.map +1 -1
- package/dist/types/ai.d.ts +3 -3
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/errors.d.ts +15 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +18 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/flow.d.ts +513 -0
- package/dist/types/flow.d.ts.map +1 -0
- package/dist/types/flow.js +5 -0
- package/dist/types/flow.js.map +1 -0
- package/dist/types/index.d.ts +7 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/persistence.d.ts +11 -7
- package/dist/types/persistence.d.ts.map +1 -1
- package/dist/types/routing.d.ts +1 -1
- package/dist/types/routing.d.ts.map +1 -1
- package/dist/types/session.d.ts +24 -23
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/signals.d.ts +248 -0
- package/dist/types/signals.d.ts.map +1 -0
- package/dist/types/signals.js +10 -0
- package/dist/types/signals.js.map +1 -0
- package/dist/types/template.d.ts +2 -8
- package/dist/types/template.d.ts.map +1 -1
- package/dist/types/tool.d.ts +36 -29
- package/dist/types/tool.d.ts.map +1 -1
- package/dist/types/tool.js +1 -1
- package/dist/types/tool.js.map +1 -1
- package/dist/utils/condition.d.ts +7 -1
- package/dist/utils/condition.d.ts.map +1 -1
- package/dist/utils/condition.js.map +1 -1
- package/dist/utils/id.d.ts +13 -5
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +22 -9
- package/dist/utils/id.js.map +1 -1
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/session.d.ts +44 -5
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +193 -37
- package/dist/utils/session.js.map +1 -1
- package/docs/README.md +22 -200
- package/docs/concepts/architecture.md +281 -0
- package/docs/concepts/directives.md +400 -0
- package/docs/concepts/pipeline.md +399 -0
- package/docs/guides/branching.md +263 -0
- package/docs/guides/compaction.md +163 -0
- package/docs/guides/conditions.md +167 -0
- package/docs/guides/error-handling.md +176 -0
- package/docs/guides/flow-control.md +409 -0
- package/docs/guides/instructions.md +210 -0
- package/docs/guides/persistence.md +182 -0
- package/docs/guides/streaming.md +137 -0
- package/docs/migration/README.md +14 -0
- package/docs/migration/route-to-flow.md +561 -0
- package/docs/migration/v1-to-v2.md +909 -0
- package/docs/reference/adapters.md +481 -0
- package/docs/reference/branches.md +241 -0
- package/docs/reference/create-agent.md +186 -0
- package/docs/reference/directive.md +243 -0
- package/docs/reference/errors.md +122 -0
- package/docs/reference/flow.md +238 -0
- package/docs/reference/instruction.md +177 -0
- package/docs/reference/pre-directive.md +131 -0
- package/docs/reference/providers.md +227 -0
- package/docs/reference/signals.md +356 -0
- package/docs/reference/step.md +339 -0
- package/docs/reference/tool.md +269 -0
- package/docs/start/01-install.md +81 -0
- package/docs/start/02-first-agent.md +196 -0
- package/docs/start/03-collect-data.md +222 -0
- package/docs/start/04-add-tools.md +276 -0
- package/docs/start/05-go-to-production.md +216 -0
- package/examples/01-quickstart.ts +20 -0
- package/examples/02-data-extraction.ts +90 -0
- package/examples/03-tools.ts +136 -0
- package/examples/04-instructions.ts +100 -0
- package/examples/05-branching.ts +140 -0
- package/examples/06-flow-control.ts +103 -0
- package/examples/07-streaming.ts +69 -0
- package/examples/08-persistence.ts +98 -0
- package/examples/09-signals.ts +144 -0
- package/examples/tsconfig.json +30 -0
- package/package.json +2 -1
- package/src/adapters/MemoryAdapter.ts +3 -3
- package/src/adapters/MongoAdapter.ts +3 -3
- package/src/adapters/OpenSearchAdapter.ts +10 -8
- package/src/adapters/PostgreSQLAdapter.ts +26 -10
- package/src/adapters/PrismaAdapter.ts +6 -6
- package/src/adapters/RedisAdapter.ts +3 -3
- package/src/adapters/SQLiteAdapter.ts +31 -12
- package/src/constants/index.ts +2 -10
- package/src/core/Agent.ts +585 -374
- package/src/core/AutoChainExecutor.ts +440 -0
- package/src/core/BranchEvaluator.ts +167 -0
- package/src/core/DirectiveBus.ts +248 -0
- package/src/core/DirectiveChainTracker.ts +144 -0
- package/src/core/Flow.ts +666 -0
- package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
- package/src/core/PersistenceManager.ts +8 -8
- package/src/core/PromptComposer.ts +209 -140
- package/src/core/PromptSectionCache.ts +1 -1
- package/src/core/ResponseEngine.ts +61 -46
- package/src/core/ResponseModal.ts +1453 -1240
- package/src/core/ResponsePipeline.ts +655 -175
- package/src/core/SignalEvaluator.ts +420 -0
- package/src/core/SignalProcessor.ts +723 -0
- package/src/core/Step.ts +279 -176
- package/src/core/StreamingToolExecutor.ts +4 -4
- package/src/core/ToolManager.ts +200 -97
- package/src/core/createAgent.ts +40 -0
- package/src/core/flow-namespace.ts +219 -0
- package/src/index.ts +42 -36
- package/src/providers/AnthropicProvider.ts +2 -2
- package/src/providers/GeminiProvider.ts +2 -2
- package/src/providers/OpenAIProvider.ts +2 -2
- package/src/types/agent.ts +182 -53
- package/src/types/ai.ts +3 -3
- package/src/types/errors.ts +18 -0
- package/src/types/flow.ts +590 -0
- package/src/types/index.ts +43 -16
- package/src/types/persistence.ts +12 -8
- package/src/types/routing.ts +1 -1
- package/src/types/session.ts +26 -23
- package/src/types/signals.ts +321 -0
- package/src/types/template.ts +3 -11
- package/src/types/tool.ts +50 -42
- package/src/utils/condition.ts +13 -4
- package/src/utils/id.ts +27 -9
- package/src/utils/index.ts +6 -2
- package/src/utils/session.ts +238 -42
- package/dist/cjs/core/BatchExecutor.d.ts +0 -359
- package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
- package/dist/cjs/core/BatchExecutor.js +0 -861
- package/dist/cjs/core/BatchExecutor.js.map +0 -1
- package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
- package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
- package/dist/cjs/core/BatchPromptBuilder.js +0 -223
- package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
- package/dist/cjs/core/Route.d.ts +0 -180
- package/dist/cjs/core/Route.d.ts.map +0 -1
- package/dist/cjs/core/Route.js +0 -542
- package/dist/cjs/core/Route.js.map +0 -1
- package/dist/cjs/core/RoutingEngine.d.ts +0 -185
- package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/types/route.d.ts +0 -336
- package/dist/cjs/types/route.d.ts.map +0 -1
- package/dist/cjs/types/route.js.map +0 -1
- package/dist/core/BatchExecutor.d.ts +0 -359
- package/dist/core/BatchExecutor.d.ts.map +0 -1
- package/dist/core/BatchExecutor.js +0 -856
- package/dist/core/BatchExecutor.js.map +0 -1
- package/dist/core/BatchPromptBuilder.d.ts +0 -89
- package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
- package/dist/core/BatchPromptBuilder.js +0 -219
- package/dist/core/BatchPromptBuilder.js.map +0 -1
- package/dist/core/Route.d.ts +0 -180
- package/dist/core/Route.d.ts.map +0 -1
- package/dist/core/Route.js +0 -538
- package/dist/core/Route.js.map +0 -1
- package/dist/core/RoutingEngine.d.ts +0 -185
- package/dist/core/RoutingEngine.d.ts.map +0 -1
- package/dist/core/RoutingEngine.js.map +0 -1
- package/dist/types/route.d.ts +0 -336
- package/dist/types/route.d.ts.map +0 -1
- package/dist/types/route.js +0 -5
- package/dist/types/route.js.map +0 -1
- package/docs/CONTRIBUTING.md +0 -521
- package/docs/api/README.md +0 -3299
- package/docs/api/overview.md +0 -1410
- package/docs/architecture/data-extraction-flow.md +0 -360
- package/docs/architecture/multi-step-execution.md +0 -277
- package/docs/core/agent/README.md +0 -938
- package/docs/core/agent/context-management.md +0 -796
- package/docs/core/agent/rules-and-prohibitions.md +0 -113
- package/docs/core/agent/session-management.md +0 -693
- package/docs/core/ai-integration/prompt-composition.md +0 -355
- package/docs/core/ai-integration/providers.md +0 -515
- package/docs/core/ai-integration/response-processing.md +0 -433
- package/docs/core/conversation-flows/data-collection.md +0 -772
- package/docs/core/conversation-flows/route-dsl.md +0 -509
- package/docs/core/conversation-flows/routes.md +0 -249
- package/docs/core/conversation-flows/step-transitions.md +0 -731
- package/docs/core/conversation-flows/steps.md +0 -268
- package/docs/core/error-handling.md +0 -830
- package/docs/core/persistence/adapters.md +0 -255
- package/docs/core/persistence/session-storage.md +0 -656
- package/docs/core/routing/intelligent-routing.md +0 -470
- package/docs/core/tools/enhanced-tool.md +0 -186
- package/docs/core/tools/streaming-execution.md +0 -161
- package/docs/core/tools/tool-definition.md +0 -970
- package/docs/core/tools/tool-scoping.md +0 -819
- package/docs/guides/advanced-patterns/publishing.md +0 -186
- package/docs/guides/context-compaction.md +0 -96
- package/docs/guides/error-handling-patterns.md +0 -578
- package/docs/guides/getting-started/README.md +0 -795
- package/docs/guides/migration/README.md +0 -101
- package/docs/guides/migration/flexible-routing-conditions.md +0 -375
- package/docs/guides/migration/multi-step-execution.md +0 -393
- package/docs/guides/migration/response-modal-refactor.md +0 -518
- package/docs/guides/prompt-optimization.md +0 -164
- package/examples/advanced-patterns/context-compaction.ts +0 -223
- package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
- package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
- package/examples/advanced-patterns/streaming-responses.ts +0 -656
- package/examples/ai-providers/anthropic-integration.ts +0 -388
- package/examples/ai-providers/openai-integration.ts +0 -228
- package/examples/condition-patterns/function-only-conditions.ts +0 -365
- package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
- package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
- package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
- package/examples/condition-patterns/string-only-conditions.ts +0 -296
- package/examples/conversation-flows/completion-transitions.ts +0 -318
- package/examples/core-concepts/basic-agent.ts +0 -503
- package/examples/core-concepts/modern-streaming-api.ts +0 -309
- package/examples/core-concepts/schema-driven-extraction.ts +0 -332
- package/examples/core-concepts/session-management.ts +0 -494
- package/examples/integrations/database-integration.ts +0 -631
- package/examples/integrations/healthcare-integration.ts +0 -595
- package/examples/integrations/search-integration.ts +0 -530
- package/examples/integrations/server-session-management.ts +0 -307
- package/examples/persistence/custom-adapter.ts +0 -526
- package/examples/persistence/database-persistence.ts +0 -583
- package/examples/persistence/memory-sessions.ts +0 -495
- package/examples/persistence/prisma-schema.example.prisma +0 -74
- package/examples/persistence/redis-persistence.ts +0 -488
- package/examples/tools/basic-tools.ts +0 -765
- package/examples/tools/data-enrichment-tools.ts +0 -593
- package/examples/tools/enhanced-tool-metadata.ts +0 -268
- package/examples/tools/streaming-tool-execution.ts +0 -283
- package/src/core/BatchExecutor.ts +0 -1187
- package/src/core/BatchPromptBuilder.ts +0 -299
- package/src/core/Route.ts +0 -678
- 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.
|