@falai/agent 0.8.1 → 0.9.0-alpha-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 +306 -133
- package/dist/{adapters → cjs/src/adapters}/MemoryAdapter.d.ts +4 -4
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/MemoryAdapter.js +41 -21
- package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/{adapters → cjs/src/adapters}/MongoAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/MongoAdapter.js +2 -1
- package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
- package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.js +35 -5
- package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/RedisAdapter.js +3 -2
- package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/{adapters → cjs/src/adapters}/SQLiteAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
- package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/index.d.ts.map +1 -0
- package/dist/cjs/src/adapters/index.js.map +1 -0
- package/dist/cjs/src/constants/index.d.ts.map +1 -0
- package/dist/cjs/src/constants/index.js.map +1 -0
- package/dist/{core → cjs/src/core}/Agent.d.ts +65 -67
- package/dist/cjs/src/core/Agent.d.ts.map +1 -0
- package/dist/cjs/src/core/Agent.js +1433 -0
- package/dist/cjs/src/core/Agent.js.map +1 -0
- package/dist/cjs/src/core/Events.d.ts +26 -0
- package/dist/cjs/src/core/Events.d.ts.map +1 -0
- package/dist/cjs/src/core/Events.js +144 -0
- package/dist/cjs/src/core/Events.js.map +1 -0
- package/dist/{core → cjs/src/core}/PersistenceManager.d.ts +21 -19
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/PersistenceManager.js +50 -20
- package/dist/cjs/src/core/PersistenceManager.js.map +1 -0
- package/dist/cjs/src/core/PromptComposer.d.ts +27 -0
- package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -0
- package/dist/cjs/src/core/PromptComposer.js +157 -0
- package/dist/cjs/src/core/PromptComposer.js.map +1 -0
- package/dist/cjs/src/core/ResponseEngine.d.ts +31 -0
- package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponseEngine.js +84 -0
- package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts +143 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.js +446 -0
- package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
- package/dist/cjs/src/core/Route.d.ts +126 -0
- package/dist/cjs/src/core/Route.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/Route.js +116 -20
- package/dist/cjs/src/core/Route.js.map +1 -0
- package/dist/{core → cjs/src/core}/RoutingEngine.d.ts +33 -38
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/RoutingEngine.js +102 -108
- package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/src/core/SessionManager.d.ts +76 -0
- package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
- package/dist/cjs/src/core/SessionManager.js +197 -0
- package/dist/cjs/src/core/SessionManager.js.map +1 -0
- package/dist/cjs/src/core/Step.d.ts +96 -0
- package/dist/cjs/src/core/Step.d.ts.map +1 -0
- package/dist/cjs/src/core/Step.js +206 -0
- package/dist/cjs/src/core/Step.js.map +1 -0
- package/dist/cjs/src/core/ToolExecutor.d.ts +43 -0
- package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/ToolExecutor.js +19 -18
- package/dist/cjs/src/core/ToolExecutor.js.map +1 -0
- package/dist/{index.d.ts → cjs/src/index.d.ts} +7 -15
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/{index.js → src/index.js} +21 -19
- package/dist/cjs/src/index.js.map +1 -0
- package/dist/cjs/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
- package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/AnthropicProvider.js +54 -2
- package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/{providers → cjs/src/providers}/GeminiProvider.d.ts +1 -1
- package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/GeminiProvider.js +65 -0
- package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
- package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenAIProvider.js +70 -1
- package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/{providers → cjs/src/providers}/OpenRouterProvider.d.ts +1 -1
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenRouterProvider.js +76 -0
- package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/cjs/src/providers/index.d.ts.map +1 -0
- package/dist/cjs/src/providers/index.js.map +1 -0
- package/dist/cjs/{types → src/types}/agent.d.ts +52 -33
- package/dist/cjs/src/types/agent.d.ts.map +1 -0
- package/dist/cjs/src/types/agent.js.map +1 -0
- package/dist/cjs/{types → src/types}/ai.d.ts +7 -0
- package/dist/cjs/src/types/ai.d.ts.map +1 -0
- package/dist/cjs/src/types/ai.js.map +1 -0
- package/dist/{types → cjs/src/types}/history.d.ts +76 -18
- package/dist/cjs/src/types/history.d.ts.map +1 -0
- package/dist/cjs/src/types/history.js +33 -0
- package/dist/cjs/src/types/history.js.map +1 -0
- package/dist/cjs/src/types/index.d.ts +20 -0
- package/dist/cjs/src/types/index.d.ts.map +1 -0
- package/dist/cjs/src/types/index.js +30 -0
- package/dist/cjs/src/types/index.js.map +1 -0
- package/dist/{types → cjs/src/types}/persistence.d.ts +39 -23
- package/dist/cjs/src/types/persistence.d.ts.map +1 -0
- package/dist/cjs/src/types/persistence.js.map +1 -0
- package/dist/cjs/{types → src/types}/route.d.ts +85 -31
- package/dist/cjs/src/types/route.d.ts.map +1 -0
- package/dist/cjs/{types → src/types}/route.js.map +1 -1
- package/dist/cjs/src/types/routing.d.ts.map +1 -0
- package/dist/{types → cjs/src/types}/routing.js.map +1 -1
- package/dist/cjs/src/types/schema.d.ts.map +1 -0
- package/dist/{types → cjs/src/types}/schema.js.map +1 -1
- package/dist/cjs/src/types/session.d.ts +70 -0
- package/dist/cjs/src/types/session.d.ts.map +1 -0
- package/dist/cjs/src/types/session.js +6 -0
- package/dist/cjs/src/types/session.js.map +1 -0
- package/dist/cjs/src/types/template.d.ts +30 -0
- package/dist/cjs/src/types/template.d.ts.map +1 -0
- package/dist/cjs/src/types/template.js +3 -0
- package/dist/cjs/src/types/template.js.map +1 -0
- package/dist/cjs/{types → src/types}/tool.d.ts +6 -8
- package/dist/cjs/src/types/tool.d.ts.map +1 -0
- package/dist/cjs/{types → src/types}/tool.js.map +1 -1
- package/dist/cjs/src/utils/clone.d.ts +8 -0
- package/dist/cjs/src/utils/clone.d.ts.map +1 -0
- package/dist/cjs/src/utils/clone.js +36 -0
- package/dist/cjs/src/utils/clone.js.map +1 -0
- package/dist/{utils → cjs/src/utils}/event.d.ts +1 -1
- package/dist/cjs/src/utils/event.d.ts.map +1 -0
- package/dist/cjs/{utils → src/utils}/event.js +2 -2
- package/dist/cjs/src/utils/event.js.map +1 -0
- package/dist/cjs/src/utils/history.d.ts +31 -0
- package/dist/cjs/src/utils/history.d.ts.map +1 -0
- package/dist/cjs/src/utils/history.js +128 -0
- package/dist/cjs/src/utils/history.js.map +1 -0
- package/dist/cjs/src/utils/id.d.ts.map +1 -0
- package/dist/cjs/src/utils/id.js.map +1 -0
- package/dist/cjs/src/utils/index.d.ts +13 -0
- package/dist/cjs/src/utils/index.d.ts.map +1 -0
- package/dist/cjs/src/utils/index.js +49 -0
- package/dist/cjs/src/utils/index.js.map +1 -0
- package/dist/cjs/src/utils/logger.d.ts.map +1 -0
- package/dist/cjs/src/utils/logger.js.map +1 -0
- package/dist/cjs/src/utils/retry.d.ts.map +1 -0
- package/dist/cjs/src/utils/retry.js.map +1 -0
- package/dist/cjs/src/utils/session.d.ts +51 -0
- package/dist/cjs/src/utils/session.d.ts.map +1 -0
- package/dist/cjs/{types → src/utils}/session.js +34 -11
- package/dist/cjs/src/utils/session.js.map +1 -0
- package/dist/cjs/src/utils/template.d.ts +107 -0
- package/dist/cjs/src/utils/template.d.ts.map +1 -0
- package/dist/cjs/src/utils/template.js +283 -0
- package/dist/cjs/src/utils/template.js.map +1 -0
- package/dist/{cjs → src}/adapters/MemoryAdapter.d.ts +4 -4
- package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/MemoryAdapter.js +41 -21
- package/dist/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/{cjs → src}/adapters/MongoAdapter.d.ts +3 -3
- package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/MongoAdapter.js +2 -1
- package/dist/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
- package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
- package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
- package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
- package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
- package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/PrismaAdapter.js +35 -5
- package/dist/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
- package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/RedisAdapter.js +3 -2
- package/dist/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/{cjs → src}/adapters/SQLiteAdapter.d.ts +3 -3
- package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
- package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/constants/index.js.map +1 -0
- package/dist/{cjs → src}/core/Agent.d.ts +65 -67
- package/dist/src/core/Agent.d.ts.map +1 -0
- package/dist/src/core/Agent.js +1429 -0
- package/dist/src/core/Agent.js.map +1 -0
- package/dist/src/core/Events.d.ts +26 -0
- package/dist/src/core/Events.d.ts.map +1 -0
- package/dist/src/core/Events.js +137 -0
- package/dist/src/core/Events.js.map +1 -0
- package/dist/{cjs → src}/core/PersistenceManager.d.ts +21 -19
- package/dist/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/{core → src/core}/PersistenceManager.js +47 -17
- package/dist/src/core/PersistenceManager.js.map +1 -0
- package/dist/src/core/PromptComposer.d.ts +27 -0
- package/dist/src/core/PromptComposer.d.ts.map +1 -0
- package/dist/src/core/PromptComposer.js +153 -0
- package/dist/src/core/PromptComposer.js.map +1 -0
- package/dist/src/core/ResponseEngine.d.ts +31 -0
- package/dist/src/core/ResponseEngine.d.ts.map +1 -0
- package/dist/src/core/ResponseEngine.js +80 -0
- package/dist/src/core/ResponseEngine.js.map +1 -0
- package/dist/src/core/ResponsePipeline.d.ts +143 -0
- package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/src/core/ResponsePipeline.js +442 -0
- package/dist/src/core/ResponsePipeline.js.map +1 -0
- package/dist/src/core/Route.d.ts +126 -0
- package/dist/src/core/Route.d.ts.map +1 -0
- package/dist/{core → src/core}/Route.js +116 -20
- package/dist/src/core/Route.js.map +1 -0
- package/dist/{cjs → src}/core/RoutingEngine.d.ts +33 -38
- package/dist/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/{core → src/core}/RoutingEngine.js +98 -104
- package/dist/src/core/RoutingEngine.js.map +1 -0
- package/dist/src/core/SessionManager.d.ts +76 -0
- package/dist/src/core/SessionManager.d.ts.map +1 -0
- package/dist/src/core/SessionManager.js +193 -0
- package/dist/src/core/SessionManager.js.map +1 -0
- package/dist/src/core/Step.d.ts +96 -0
- package/dist/src/core/Step.d.ts.map +1 -0
- package/dist/src/core/Step.js +202 -0
- package/dist/src/core/Step.js.map +1 -0
- package/dist/src/core/ToolExecutor.d.ts +43 -0
- package/dist/src/core/ToolExecutor.d.ts.map +1 -0
- package/dist/src/core/ToolExecutor.js +70 -0
- package/dist/src/core/ToolExecutor.js.map +1 -0
- package/dist/{cjs → src}/index.d.ts +7 -15
- package/dist/src/index.d.ts.map +1 -0
- package/dist/{index.js → src/index.js} +6 -7
- package/dist/src/index.js.map +1 -0
- package/dist/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
- package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/{providers → src/providers}/AnthropicProvider.js +54 -2
- package/dist/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/{cjs → src}/providers/GeminiProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/GeminiProvider.js +65 -0
- package/dist/src/providers/GeminiProvider.js.map +1 -0
- package/dist/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/OpenAIProvider.js +70 -1
- package/dist/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/OpenRouterProvider.js +76 -0
- package/dist/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/{types → src/types}/agent.d.ts +52 -33
- package/dist/src/types/agent.d.ts.map +1 -0
- package/dist/src/types/agent.js.map +1 -0
- package/dist/{types → src/types}/ai.d.ts +7 -0
- package/dist/src/types/ai.d.ts.map +1 -0
- package/dist/{cjs → src}/types/ai.js.map +1 -1
- package/dist/{cjs → src}/types/history.d.ts +76 -18
- package/dist/src/types/history.d.ts.map +1 -0
- package/dist/src/types/history.js +30 -0
- package/dist/src/types/history.js.map +1 -0
- package/dist/src/types/index.d.ts +20 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +10 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/{cjs → src}/types/persistence.d.ts +39 -23
- package/dist/src/types/persistence.d.ts.map +1 -0
- package/dist/src/types/persistence.js.map +1 -0
- package/dist/{types → src/types}/route.d.ts +85 -31
- package/dist/src/types/route.d.ts.map +1 -0
- package/dist/{types → src/types}/route.js.map +1 -1
- package/dist/src/types/session.d.ts +70 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +5 -0
- package/dist/src/types/session.js.map +1 -0
- package/dist/src/types/template.d.ts +30 -0
- package/dist/src/types/template.d.ts.map +1 -0
- package/dist/src/types/template.js +2 -0
- package/dist/src/types/template.js.map +1 -0
- package/dist/{types → src/types}/tool.d.ts +6 -8
- package/dist/{cjs → src}/types/tool.d.ts.map +1 -1
- package/dist/{types → src/types}/tool.js.map +1 -1
- package/dist/src/utils/clone.d.ts +8 -0
- package/dist/src/utils/clone.d.ts.map +1 -0
- package/dist/src/utils/clone.js +33 -0
- package/dist/src/utils/clone.js.map +1 -0
- package/dist/{cjs → src}/utils/event.d.ts +1 -1
- package/dist/{cjs → src}/utils/event.d.ts.map +1 -1
- package/dist/{utils → src/utils}/event.js +1 -1
- package/dist/src/utils/event.js.map +1 -0
- package/dist/src/utils/history.d.ts +31 -0
- package/dist/src/utils/history.d.ts.map +1 -0
- package/dist/src/utils/history.js +121 -0
- package/dist/src/utils/history.js.map +1 -0
- package/dist/src/utils/id.js.map +1 -0
- package/dist/src/utils/index.d.ts +13 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +19 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/session.d.ts +51 -0
- package/dist/src/utils/session.d.ts.map +1 -0
- package/dist/{types → src/utils}/session.js +32 -11
- package/dist/src/utils/session.js.map +1 -0
- package/dist/src/utils/template.d.ts +107 -0
- package/dist/src/utils/template.d.ts.map +1 -0
- package/dist/src/utils/template.js +276 -0
- package/dist/src/utils/template.js.map +1 -0
- package/docs/README.md +174 -68
- package/docs/{API_REFERENCE.md → api/README.md} +890 -251
- package/docs/api/overview.md +798 -0
- package/docs/core/agent/README.md +642 -0
- package/docs/{CONTEXT_MANAGEMENT.md → core/agent/context-management.md} +143 -94
- package/docs/{ARCHITECTURE.md → core/agent/session-management.md} +74 -59
- package/docs/core/ai-integration/prompt-composition.md +196 -0
- package/docs/core/ai-integration/providers.md +515 -0
- package/docs/core/ai-integration/response-processing.md +165 -0
- package/docs/core/conversation-flows/data-collection.md +545 -0
- package/docs/core/conversation-flows/route-dsl.md +479 -0
- package/docs/core/conversation-flows/routes.md +61 -0
- package/docs/core/conversation-flows/step-transitions.md +595 -0
- package/docs/core/conversation-flows/steps.md +130 -0
- package/docs/{ADAPTERS.md → core/persistence/adapters.md} +1 -1
- package/docs/core/persistence/session-storage.md +644 -0
- package/docs/core/routing/intelligent-routing.md +339 -0
- package/docs/core/tools/tool-definition.md +346 -0
- package/docs/core/tools/tool-execution.md +815 -0
- package/docs/core/tools/tool-scoping.md +628 -0
- package/docs/guides/getting-started/README.md +384 -0
- package/examples/{company-qna-agent.ts → advanced-patterns/knowledge-based-agent.ts} +104 -69
- package/examples/{persistent-onboarding.ts → advanced-patterns/persistent-onboarding.ts} +181 -103
- package/examples/{rules-prohibitions.ts → advanced-patterns/route-lifecycle-hooks.ts} +102 -82
- package/examples/{streaming-agent.ts → advanced-patterns/streaming-responses.ts} +90 -69
- package/examples/ai-providers/anthropic-integration.ts +377 -0
- package/examples/{openai-agent.ts → ai-providers/openai-integration.ts} +37 -43
- package/examples/{route-transitions.ts → conversation-flows/completion-transitions.ts} +112 -105
- package/examples/{declarative-agent.ts → core-concepts/basic-agent.ts} +175 -131
- package/examples/core-concepts/schema-driven-extraction.ts +301 -0
- package/examples/core-concepts/session-management.ts +394 -0
- package/examples/integrations/database-integration.ts +615 -0
- package/examples/{healthcare-agent.ts → integrations/healthcare-integration.ts} +204 -111
- package/examples/{opensearch-persistence.ts → integrations/search-integration.ts} +159 -128
- package/examples/integrations/server-session-management.ts +299 -0
- package/examples/persistence/custom-adapter.ts +529 -0
- package/examples/{prisma-persistence.ts → persistence/database-persistence.ts} +168 -241
- package/examples/persistence/memory-sessions.ts +506 -0
- package/examples/{prisma-schema.example.prisma → persistence/prisma-schema.example.prisma} +1 -1
- package/examples/{redis-persistence.ts → persistence/redis-persistence.ts} +152 -173
- package/examples/tools/basic-tools.ts +550 -0
- package/examples/{extracted-data-modification.ts → tools/data-enrichment-tools.ts} +82 -79
- package/package.json +14 -10
- package/src/adapters/MemoryAdapter.ts +74 -46
- package/src/adapters/MongoAdapter.ts +33 -24
- package/src/adapters/OpenSearchAdapter.ts +41 -37
- package/src/adapters/PostgreSQLAdapter.ts +35 -24
- package/src/adapters/PrismaAdapter.ts +69 -27
- package/src/adapters/RedisAdapter.ts +38 -26
- package/src/adapters/SQLiteAdapter.ts +32 -22
- package/src/core/Agent.ts +1093 -478
- package/src/core/Events.ts +100 -112
- package/src/core/PersistenceManager.ts +77 -47
- package/src/core/PromptComposer.ts +158 -85
- package/src/core/ResponseEngine.ts +118 -38
- package/src/core/ResponsePipeline.ts +715 -0
- package/src/core/Route.ts +168 -51
- package/src/core/RoutingEngine.ts +178 -209
- package/src/core/SessionManager.ts +241 -0
- package/src/core/Step.ts +149 -67
- package/src/core/ToolExecutor.ts +37 -42
- package/src/index.ts +31 -37
- package/src/providers/AnthropicProvider.ts +71 -5
- package/src/providers/GeminiProvider.ts +83 -2
- package/src/providers/OpenAIProvider.ts +95 -3
- package/src/providers/OpenRouterProvider.ts +102 -2
- package/src/types/agent.ts +48 -36
- package/src/types/ai.ts +7 -0
- package/src/types/history.ts +91 -18
- package/src/types/index.ts +43 -7
- package/src/types/persistence.ts +46 -28
- package/src/types/route.ts +104 -45
- package/src/types/session.ts +19 -213
- package/src/types/template.ts +36 -0
- package/src/types/tool.ts +9 -11
- package/src/utils/clone.ts +36 -0
- package/src/utils/event.ts +1 -1
- package/src/utils/history.ts +143 -0
- package/src/utils/index.ts +53 -0
- package/src/utils/session.ts +229 -0
- package/src/utils/template.ts +335 -0
- package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/adapters/MemoryAdapter.js.map +0 -1
- package/dist/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/adapters/MongoAdapter.js.map +0 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/adapters/PrismaAdapter.js.map +0 -1
- package/dist/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/adapters/RedisAdapter.js.map +0 -1
- package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js.map +0 -1
- package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
- package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/cjs/adapters/index.js.map +0 -1
- package/dist/cjs/constants/index.js.map +0 -1
- package/dist/cjs/core/Agent.d.ts.map +0 -1
- package/dist/cjs/core/Agent.js +0 -966
- package/dist/cjs/core/Agent.js.map +0 -1
- package/dist/cjs/core/DomainRegistry.d.ts +0 -36
- package/dist/cjs/core/DomainRegistry.d.ts.map +0 -1
- package/dist/cjs/core/DomainRegistry.js +0 -72
- package/dist/cjs/core/DomainRegistry.js.map +0 -1
- package/dist/cjs/core/Events.d.ts +0 -41
- package/dist/cjs/core/Events.d.ts.map +0 -1
- package/dist/cjs/core/Events.js +0 -99
- package/dist/cjs/core/Events.js.map +0 -1
- package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
- package/dist/cjs/core/PersistenceManager.js.map +0 -1
- package/dist/cjs/core/PromptComposer.d.ts +0 -24
- package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
- package/dist/cjs/core/PromptComposer.js +0 -127
- package/dist/cjs/core/PromptComposer.js.map +0 -1
- package/dist/cjs/core/ResponseEngine.d.ts +0 -14
- package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
- package/dist/cjs/core/ResponseEngine.js +0 -56
- package/dist/cjs/core/ResponseEngine.js.map +0 -1
- package/dist/cjs/core/Route.d.ts +0 -90
- package/dist/cjs/core/Route.d.ts.map +0 -1
- package/dist/cjs/core/Route.js.map +0 -1
- package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/core/Step.d.ts +0 -72
- package/dist/cjs/core/Step.d.ts.map +0 -1
- package/dist/cjs/core/Step.js +0 -150
- package/dist/cjs/core/Step.js.map +0 -1
- package/dist/cjs/core/Tool.d.ts +0 -39
- package/dist/cjs/core/Tool.d.ts.map +0 -1
- package/dist/cjs/core/Tool.js +0 -34
- package/dist/cjs/core/Tool.js.map +0 -1
- package/dist/cjs/core/ToolExecutor.d.ts +0 -29
- package/dist/cjs/core/ToolExecutor.d.ts.map +0 -1
- package/dist/cjs/core/ToolExecutor.js.map +0 -1
- package/dist/cjs/core/Transition.d.ts +0 -32
- package/dist/cjs/core/Transition.d.ts.map +0 -1
- package/dist/cjs/core/Transition.js +0 -89
- package/dist/cjs/core/Transition.js.map +0 -1
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +0 -1
- package/dist/cjs/providers/AnthropicProvider.js.map +0 -1
- package/dist/cjs/providers/GeminiProvider.js.map +0 -1
- package/dist/cjs/providers/OpenAIProvider.js.map +0 -1
- package/dist/cjs/providers/OpenRouterProvider.js.map +0 -1
- package/dist/cjs/providers/index.js.map +0 -1
- package/dist/cjs/types/agent.d.ts.map +0 -1
- package/dist/cjs/types/agent.js.map +0 -1
- package/dist/cjs/types/ai.d.ts.map +0 -1
- package/dist/cjs/types/history.d.ts.map +0 -1
- package/dist/cjs/types/history.js +0 -37
- package/dist/cjs/types/history.js.map +0 -1
- package/dist/cjs/types/index.d.ts +0 -12
- package/dist/cjs/types/index.d.ts.map +0 -1
- package/dist/cjs/types/index.js +0 -12
- package/dist/cjs/types/index.js.map +0 -1
- package/dist/cjs/types/persistence.d.ts.map +0 -1
- package/dist/cjs/types/persistence.js.map +0 -1
- package/dist/cjs/types/route.d.ts.map +0 -1
- package/dist/cjs/types/session.d.ts +0 -104
- package/dist/cjs/types/session.d.ts.map +0 -1
- package/dist/cjs/types/session.js.map +0 -1
- package/dist/cjs/utils/event.js.map +0 -1
- package/dist/cjs/utils/id.js.map +0 -1
- package/dist/cjs/utils/logger.js.map +0 -1
- package/dist/cjs/utils/retry.js.map +0 -1
- package/dist/constants/index.d.ts.map +0 -1
- package/dist/constants/index.js.map +0 -1
- package/dist/core/Agent.d.ts.map +0 -1
- package/dist/core/Agent.js +0 -962
- package/dist/core/Agent.js.map +0 -1
- package/dist/core/DomainRegistry.d.ts +0 -36
- package/dist/core/DomainRegistry.d.ts.map +0 -1
- package/dist/core/DomainRegistry.js +0 -68
- package/dist/core/DomainRegistry.js.map +0 -1
- package/dist/core/Events.d.ts +0 -41
- package/dist/core/Events.d.ts.map +0 -1
- package/dist/core/Events.js +0 -94
- package/dist/core/Events.js.map +0 -1
- package/dist/core/PersistenceManager.d.ts.map +0 -1
- package/dist/core/PersistenceManager.js.map +0 -1
- package/dist/core/PromptComposer.d.ts +0 -24
- package/dist/core/PromptComposer.d.ts.map +0 -1
- package/dist/core/PromptComposer.js +0 -123
- package/dist/core/PromptComposer.js.map +0 -1
- package/dist/core/ResponseEngine.d.ts +0 -14
- package/dist/core/ResponseEngine.d.ts.map +0 -1
- package/dist/core/ResponseEngine.js +0 -52
- package/dist/core/ResponseEngine.js.map +0 -1
- package/dist/core/Route.d.ts +0 -90
- package/dist/core/Route.d.ts.map +0 -1
- package/dist/core/Route.js.map +0 -1
- package/dist/core/RoutingEngine.d.ts.map +0 -1
- package/dist/core/RoutingEngine.js.map +0 -1
- package/dist/core/Step.d.ts +0 -72
- package/dist/core/Step.d.ts.map +0 -1
- package/dist/core/Step.js +0 -146
- package/dist/core/Step.js.map +0 -1
- package/dist/core/Tool.d.ts +0 -39
- package/dist/core/Tool.d.ts.map +0 -1
- package/dist/core/Tool.js +0 -31
- package/dist/core/Tool.js.map +0 -1
- package/dist/core/ToolExecutor.d.ts +0 -29
- package/dist/core/ToolExecutor.d.ts.map +0 -1
- package/dist/core/ToolExecutor.js +0 -69
- package/dist/core/ToolExecutor.js.map +0 -1
- package/dist/core/Transition.d.ts +0 -32
- package/dist/core/Transition.d.ts.map +0 -1
- package/dist/core/Transition.js +0 -85
- package/dist/core/Transition.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers/AnthropicProvider.d.ts.map +0 -1
- package/dist/providers/AnthropicProvider.js.map +0 -1
- package/dist/providers/GeminiProvider.d.ts.map +0 -1
- package/dist/providers/GeminiProvider.js.map +0 -1
- package/dist/providers/OpenAIProvider.d.ts.map +0 -1
- package/dist/providers/OpenAIProvider.js.map +0 -1
- package/dist/providers/OpenRouterProvider.d.ts.map +0 -1
- package/dist/providers/OpenRouterProvider.js.map +0 -1
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js.map +0 -1
- package/dist/types/agent.d.ts.map +0 -1
- package/dist/types/agent.js.map +0 -1
- package/dist/types/ai.d.ts.map +0 -1
- package/dist/types/ai.js.map +0 -1
- package/dist/types/history.d.ts.map +0 -1
- package/dist/types/history.js +0 -34
- package/dist/types/history.js.map +0 -1
- package/dist/types/index.d.ts +0 -12
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -6
- package/dist/types/index.js.map +0 -1
- package/dist/types/persistence.d.ts.map +0 -1
- package/dist/types/persistence.js.map +0 -1
- package/dist/types/route.d.ts.map +0 -1
- package/dist/types/routing.d.ts.map +0 -1
- package/dist/types/schema.d.ts.map +0 -1
- package/dist/types/session.d.ts +0 -104
- package/dist/types/session.d.ts.map +0 -1
- package/dist/types/session.js.map +0 -1
- package/dist/types/tool.d.ts.map +0 -1
- package/dist/utils/event.d.ts.map +0 -1
- package/dist/utils/event.js.map +0 -1
- package/dist/utils/id.d.ts.map +0 -1
- package/dist/utils/id.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js.map +0 -1
- package/docs/AGENT.md +0 -535
- package/docs/DOCS.md +0 -263
- package/docs/DOMAINS.md +0 -735
- package/docs/EXAMPLES.md +0 -467
- package/docs/GETTING_STARTED.md +0 -424
- package/docs/PERSISTENCE.md +0 -815
- package/docs/PROVIDERS.md +0 -612
- package/docs/ROUTES.md +0 -1085
- package/docs/STEPS.md +0 -883
- package/examples/business-onboarding.ts +0 -791
- package/examples/custom-database-persistence.ts +0 -574
- package/examples/domain-scoping.ts +0 -366
- package/examples/travel-agent.ts +0 -584
- package/src/core/DomainRegistry.ts +0 -80
- package/src/core/Tool.ts +0 -112
- package/src/core/Transition.ts +0 -115
- /package/dist/{adapters → cjs/src/adapters}/index.d.ts +0 -0
- /package/dist/cjs/{adapters → src/adapters}/index.js +0 -0
- /package/dist/cjs/{constants → src/constants}/index.d.ts +0 -0
- /package/dist/cjs/{constants → src/constants}/index.js +0 -0
- /package/dist/cjs/{providers → src/providers}/index.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/index.js +0 -0
- /package/dist/cjs/{types → src/types}/agent.js +0 -0
- /package/dist/cjs/{types → src/types}/ai.js +0 -0
- /package/dist/cjs/{types → src/types}/persistence.js +0 -0
- /package/dist/cjs/{types → src/types}/route.js +0 -0
- /package/dist/cjs/{types → src/types}/routing.d.ts +0 -0
- /package/dist/cjs/{types → src/types}/routing.js +0 -0
- /package/dist/cjs/{types → src/types}/schema.d.ts +0 -0
- /package/dist/cjs/{types → src/types}/schema.js +0 -0
- /package/dist/cjs/{types → src/types}/tool.js +0 -0
- /package/dist/cjs/{utils → src/utils}/id.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/id.js +0 -0
- /package/dist/cjs/{utils → src/utils}/logger.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/logger.js +0 -0
- /package/dist/cjs/{utils → src/utils}/retry.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/retry.js +0 -0
- /package/dist/{cjs → src}/adapters/index.d.ts +0 -0
- /package/dist/{cjs → src}/adapters/index.d.ts.map +0 -0
- /package/dist/{adapters → src/adapters}/index.js +0 -0
- /package/dist/{constants → src/constants}/index.d.ts +0 -0
- /package/dist/{cjs → src}/constants/index.d.ts.map +0 -0
- /package/dist/{constants → src/constants}/index.js +0 -0
- /package/dist/{providers → src/providers}/index.d.ts +0 -0
- /package/dist/{cjs → src}/providers/index.d.ts.map +0 -0
- /package/dist/{providers → src/providers}/index.js +0 -0
- /package/dist/{types → src/types}/agent.js +0 -0
- /package/dist/{types → src/types}/ai.js +0 -0
- /package/dist/{types → src/types}/persistence.js +0 -0
- /package/dist/{types → src/types}/route.js +0 -0
- /package/dist/{types → src/types}/routing.d.ts +0 -0
- /package/dist/{cjs → src}/types/routing.d.ts.map +0 -0
- /package/dist/{types → src/types}/routing.js +0 -0
- /package/dist/{cjs → src}/types/routing.js.map +0 -0
- /package/dist/{types → src/types}/schema.d.ts +0 -0
- /package/dist/{cjs → src}/types/schema.d.ts.map +0 -0
- /package/dist/{types → src/types}/schema.js +0 -0
- /package/dist/{cjs → src}/types/schema.js.map +0 -0
- /package/dist/{types → src/types}/tool.js +0 -0
- /package/dist/{utils → src/utils}/id.d.ts +0 -0
- /package/dist/{cjs → src}/utils/id.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/id.js +0 -0
- /package/dist/{utils → src/utils}/logger.d.ts +0 -0
- /package/dist/{cjs → src}/utils/logger.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/logger.js +0 -0
- /package/dist/{utils → src/utils}/retry.d.ts +0 -0
- /package/dist/{cjs → src}/utils/retry.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/retry.js +0 -0
- /package/docs/{PUBLISHING.md → guides/advanced-patterns/publishing.md} +0 -0
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
# Tool Scoping & Access Control
|
|
2
|
+
|
|
3
|
+
@falai/agent provides a hierarchical tool scoping system that enables fine-grained control over tool availability and access. Tools can be defined at agent, route, or step levels, with intelligent resolution and security controls.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The scoping system provides:
|
|
8
|
+
|
|
9
|
+
- **Hierarchical Access**: Agent → Route → Step level tool definitions
|
|
10
|
+
- **Security Boundaries**: Control tool access based on context and permissions
|
|
11
|
+
- **Performance Optimization**: Limit tool evaluation to relevant contexts
|
|
12
|
+
- **Conflict Resolution**: Predictable tool selection when IDs conflict
|
|
13
|
+
- **Dynamic Availability**: Tools can be conditionally available
|
|
14
|
+
|
|
15
|
+
## Scoping Hierarchy
|
|
16
|
+
|
|
17
|
+
### Agent-Level Tools
|
|
18
|
+
|
|
19
|
+
Available to all routes and steps within the agent:
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
const agent = new Agent({
|
|
23
|
+
name: "Multi-Purpose Agent",
|
|
24
|
+
provider: openaiProvider,
|
|
25
|
+
|
|
26
|
+
// Available to ALL routes and steps
|
|
27
|
+
tools: [
|
|
28
|
+
searchTool, // General search functionality
|
|
29
|
+
userProfileTool, // User management
|
|
30
|
+
systemStatusTool, // System health checks
|
|
31
|
+
],
|
|
32
|
+
|
|
33
|
+
routes: [route1, route2, route3], // All can use agent tools
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Use Cases:**
|
|
38
|
+
|
|
39
|
+
- Cross-cutting functionality (search, user management)
|
|
40
|
+
- System utilities (health checks, logging)
|
|
41
|
+
- Common operations (data formatting, validation)
|
|
42
|
+
|
|
43
|
+
### Route-Level Tools
|
|
44
|
+
|
|
45
|
+
Specific to a single route and its steps:
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
const supportRoute = agent.createRoute({
|
|
49
|
+
title: "Customer Support",
|
|
50
|
+
|
|
51
|
+
// Available only within this route
|
|
52
|
+
tools: [ticketCreationTool, knowledgeBaseTool, escalationTool],
|
|
53
|
+
|
|
54
|
+
initialStep: {
|
|
55
|
+
prompt: "How can I help you?",
|
|
56
|
+
tools: ["ticketCreationTool"], // Can access route tools
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Use Cases:**
|
|
62
|
+
|
|
63
|
+
- Domain-specific operations (support tickets, knowledge search)
|
|
64
|
+
- Route-specific workflows (order processing, account management)
|
|
65
|
+
- Contextual utilities (customer lookup, history access)
|
|
66
|
+
|
|
67
|
+
### Step-Level Tools
|
|
68
|
+
|
|
69
|
+
Limited to a specific conversation step:
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
const dataCollectionStep = {
|
|
73
|
+
prompt: "Please provide your payment information",
|
|
74
|
+
collect: ["paymentDetails"],
|
|
75
|
+
|
|
76
|
+
// Available ONLY in this step
|
|
77
|
+
tools: [paymentValidationTool, fraudCheckTool, secureStorageTool],
|
|
78
|
+
|
|
79
|
+
requires: ["userConsent", "securityVerified"],
|
|
80
|
+
};
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Use Cases:**
|
|
84
|
+
|
|
85
|
+
- Sensitive operations (payment processing, data encryption)
|
|
86
|
+
- Step-specific validation (form validation, business rules)
|
|
87
|
+
- Conditional actions (approval workflows, security checks)
|
|
88
|
+
|
|
89
|
+
## Tool Resolution Logic
|
|
90
|
+
|
|
91
|
+
### Priority Order
|
|
92
|
+
|
|
93
|
+
When tools have conflicting IDs, resolution follows this hierarchy:
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
// 1. Step-level tools (highest priority)
|
|
97
|
+
step.tools.find((tool) => tool.id === toolId || tool.name === toolId) ||
|
|
98
|
+
// 2. Route-level tools
|
|
99
|
+
route.tools.find((tool) => tool.id === toolId || tool.name === toolId) ||
|
|
100
|
+
// 3. Agent-level tools (lowest priority)
|
|
101
|
+
agent.tools.find((tool) => tool.id === toolId || tool.name === toolId);
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Example Resolution
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
const agent = new Agent({
|
|
108
|
+
tools: [{ id: "search", description: "General search" }],
|
|
109
|
+
routes: [
|
|
110
|
+
{
|
|
111
|
+
title: "Support",
|
|
112
|
+
tools: [{ id: "search", description: "Knowledge base search" }],
|
|
113
|
+
initialStep: {
|
|
114
|
+
prompt: "Search question?",
|
|
115
|
+
tools: [{ id: "search", description: "Web search" }],
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// In the support route's initial step:
|
|
122
|
+
// - "search" resolves to: Web search (step-level)
|
|
123
|
+
// In other support route steps:
|
|
124
|
+
// - "search" resolves to: Knowledge base search (route-level)
|
|
125
|
+
// In other routes:
|
|
126
|
+
// - "search" resolves to: General search (agent-level)
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Dynamic Tool Availability
|
|
130
|
+
|
|
131
|
+
### Conditional Tool Access
|
|
132
|
+
|
|
133
|
+
Tools can be conditionally available based on context:
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
const conditionalRoute = agent.createRoute({
|
|
137
|
+
title: "Premium Features",
|
|
138
|
+
|
|
139
|
+
initialStep: {
|
|
140
|
+
prompt: "What would you like to do?",
|
|
141
|
+
tools: ({ context, data }) => {
|
|
142
|
+
const tools = [basicTool];
|
|
143
|
+
|
|
144
|
+
// Add premium tools based on user status
|
|
145
|
+
if (context.userTier === "premium") {
|
|
146
|
+
tools.push(premiumTool);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Add admin tools based on permissions
|
|
150
|
+
if (context.userRole === "admin") {
|
|
151
|
+
tools.push(adminTool);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return tools;
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Runtime Tool Filtering
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
const filteredStep = {
|
|
164
|
+
prompt: "Available actions:",
|
|
165
|
+
tools: ({ context, data }) => {
|
|
166
|
+
return allTools.filter((tool) => {
|
|
167
|
+
// Filter based on user permissions
|
|
168
|
+
if (
|
|
169
|
+
tool.requiresPermission &&
|
|
170
|
+
!context.permissions?.includes(tool.requiresPermission)
|
|
171
|
+
) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Filter based on collected data
|
|
176
|
+
if (tool.requiresData && !data[tool.requiresData]) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Filter based on step progress
|
|
181
|
+
if (tool.minStep && data.currentStep < tool.minStep) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return true;
|
|
186
|
+
});
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Security & Access Control
|
|
192
|
+
|
|
193
|
+
### Permission-Based Access
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
const secureTool = {
|
|
197
|
+
id: "admin_action",
|
|
198
|
+
description: "Administrative action",
|
|
199
|
+
requiresPermission: "admin", // Tool-level permission requirement
|
|
200
|
+
|
|
201
|
+
execute: async ({ action }, { context }) => {
|
|
202
|
+
// Runtime permission check
|
|
203
|
+
if (!context.permissions?.includes("admin")) {
|
|
204
|
+
throw new Error("Insufficient permissions");
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return await performAdminAction(action);
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Context-Based Security
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
import { Tool } from "@falai/agent";
|
|
216
|
+
|
|
217
|
+
const contextSecureTool: Tool<SecureContext, [], UserData> = {
|
|
218
|
+
id: "user_data_access",
|
|
219
|
+
description: "Access user data with security checks",
|
|
220
|
+
parameters: {
|
|
221
|
+
type: "object",
|
|
222
|
+
properties: {
|
|
223
|
+
userId: { type: "string", description: "User ID to access" },
|
|
224
|
+
},
|
|
225
|
+
required: ["userId"],
|
|
226
|
+
},
|
|
227
|
+
handler: async (toolContext, args) => {
|
|
228
|
+
// Ensure users can only access their own data
|
|
229
|
+
if (
|
|
230
|
+
toolContext.context.userId !== args.userId &&
|
|
231
|
+
!toolContext.context.isAdmin
|
|
232
|
+
) {
|
|
233
|
+
throw new Error("Access denied: Can only access own data");
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return await getUserData(args.userId);
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Route Isolation
|
|
242
|
+
|
|
243
|
+
```typescript
|
|
244
|
+
// Sensitive route with isolated tools
|
|
245
|
+
const financeRoute = agent.createRoute({
|
|
246
|
+
title: "Financial Operations",
|
|
247
|
+
|
|
248
|
+
// Route-specific tools only
|
|
249
|
+
tools: [secureTransactionTool, auditTool],
|
|
250
|
+
|
|
251
|
+
// No agent-level tools available
|
|
252
|
+
toolFilter: ({ context }) => {
|
|
253
|
+
// Additional security checks
|
|
254
|
+
if (!context.mfaVerified) {
|
|
255
|
+
throw new Error("MFA required for financial operations");
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return true; // Allow only route tools
|
|
259
|
+
},
|
|
260
|
+
});
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Performance Optimization
|
|
264
|
+
|
|
265
|
+
### Tool Limiting
|
|
266
|
+
|
|
267
|
+
Control the number of tools available to reduce AI evaluation time:
|
|
268
|
+
|
|
269
|
+
```typescript
|
|
270
|
+
const optimizedRoute = agent
|
|
271
|
+
.createRoute({
|
|
272
|
+
title: "Focused Interaction",
|
|
273
|
+
|
|
274
|
+
initialStep: {
|
|
275
|
+
prompt: "Basic question?",
|
|
276
|
+
tools: ["basic_search"], // Only essential tools
|
|
277
|
+
},
|
|
278
|
+
})
|
|
279
|
+
.nextStep({
|
|
280
|
+
prompt: "Detailed analysis needed?",
|
|
281
|
+
tools: ["basic_search", "deep_analysis", "expert_consultation"],
|
|
282
|
+
// More tools as conversation progresses
|
|
283
|
+
});
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Lazy Loading
|
|
287
|
+
|
|
288
|
+
Load tools only when needed:
|
|
289
|
+
|
|
290
|
+
```typescript
|
|
291
|
+
const lazyRoute = agent
|
|
292
|
+
.createRoute({
|
|
293
|
+
title: "On-Demand Tools",
|
|
294
|
+
|
|
295
|
+
initialStep: {
|
|
296
|
+
prompt: "What type of help?",
|
|
297
|
+
tools: ["categorize_request"],
|
|
298
|
+
},
|
|
299
|
+
})
|
|
300
|
+
.nextStep({
|
|
301
|
+
prompt: "Processing your {{category}} request",
|
|
302
|
+
tools: ({ data }) => {
|
|
303
|
+
// Load category-specific tools
|
|
304
|
+
switch (data.category) {
|
|
305
|
+
case "technical":
|
|
306
|
+
return [technicalSupportTool, codeReviewTool];
|
|
307
|
+
case "billing":
|
|
308
|
+
return [billingTool, paymentProcessingTool];
|
|
309
|
+
default:
|
|
310
|
+
return [generalHelpTool];
|
|
311
|
+
}
|
|
312
|
+
},
|
|
313
|
+
requires: ["category"],
|
|
314
|
+
});
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
## Tool Registration Patterns
|
|
318
|
+
|
|
319
|
+
### Factory Pattern
|
|
320
|
+
|
|
321
|
+
Create tool instances dynamically:
|
|
322
|
+
|
|
323
|
+
```typescript
|
|
324
|
+
function createScopedTools(userContext: UserContext) {
|
|
325
|
+
return [
|
|
326
|
+
{
|
|
327
|
+
id: "user_search",
|
|
328
|
+
description: "Search within user's personal data",
|
|
329
|
+
parameters: {
|
|
330
|
+
type: "object",
|
|
331
|
+
properties: {
|
|
332
|
+
query: { type: "string", description: "Search query" },
|
|
333
|
+
},
|
|
334
|
+
required: ["query"],
|
|
335
|
+
},
|
|
336
|
+
handler: async ({ context }, { query }) => {
|
|
337
|
+
// Search scoped to user's data
|
|
338
|
+
const results = await searchUserData(query, userContext.userId);
|
|
339
|
+
return {
|
|
340
|
+
data: `Found ${results.length} results for "${query}"`,
|
|
341
|
+
dataUpdate: { searchResults: results },
|
|
342
|
+
};
|
|
343
|
+
},
|
|
344
|
+
},
|
|
345
|
+
|
|
346
|
+
{
|
|
347
|
+
id: "user_preferences",
|
|
348
|
+
description: "Manage user-specific preferences",
|
|
349
|
+
parameters: {
|
|
350
|
+
type: "object",
|
|
351
|
+
properties: {
|
|
352
|
+
action: { type: "string", enum: ["get", "set", "delete"] },
|
|
353
|
+
value: { type: "string", description: "Value for set action" },
|
|
354
|
+
},
|
|
355
|
+
required: ["action"],
|
|
356
|
+
},
|
|
357
|
+
handler: async ({ context }, { action, value }) => {
|
|
358
|
+
// Manage user-specific preferences
|
|
359
|
+
const result = await updateUserPreferences(
|
|
360
|
+
userContext.userId,
|
|
361
|
+
action,
|
|
362
|
+
value
|
|
363
|
+
);
|
|
364
|
+
return {
|
|
365
|
+
data: `Preferences ${action} operation completed`,
|
|
366
|
+
contextUpdate: { lastPreferenceUpdate: new Date().toISOString() },
|
|
367
|
+
};
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
];
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const personalizedAgent = new Agent({
|
|
374
|
+
name: "Personal Assistant",
|
|
375
|
+
tools: ({ context }) => createScopedTools(context),
|
|
376
|
+
routes: [
|
|
377
|
+
/* routes */
|
|
378
|
+
],
|
|
379
|
+
});
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### Plugin System
|
|
383
|
+
|
|
384
|
+
Extensible tool registration:
|
|
385
|
+
|
|
386
|
+
```typescript
|
|
387
|
+
class ToolRegistry {
|
|
388
|
+
private tools = new Map<string, Tool>();
|
|
389
|
+
|
|
390
|
+
register(scope: "agent" | "route" | "step", tool: Tool) {
|
|
391
|
+
const key = `${scope}:${tool.id}`;
|
|
392
|
+
this.tools.set(key, tool);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
getAvailable(scope: string, context: any): Tool[] {
|
|
396
|
+
const scopedTools = Array.from(this.tools.entries())
|
|
397
|
+
.filter(([key]) => key.startsWith(scope))
|
|
398
|
+
.map(([, tool]) => tool);
|
|
399
|
+
|
|
400
|
+
// Apply context-based filtering
|
|
401
|
+
return scopedTools.filter((tool) => this.checkPermissions(tool, context));
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
private checkPermissions(tool: Tool, context: any): boolean {
|
|
405
|
+
// Implement permission logic
|
|
406
|
+
return true; // Placeholder
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
## Advanced Scoping Patterns
|
|
412
|
+
|
|
413
|
+
### Multi-Tenant Tools
|
|
414
|
+
|
|
415
|
+
```typescript
|
|
416
|
+
const multiTenantTool: Tool<
|
|
417
|
+
{ tenantId: string },
|
|
418
|
+
[],
|
|
419
|
+
string,
|
|
420
|
+
{ query: string }
|
|
421
|
+
> = {
|
|
422
|
+
id: "tenant_search",
|
|
423
|
+
description: "Search within tenant's data scope",
|
|
424
|
+
parameters: {
|
|
425
|
+
type: "object",
|
|
426
|
+
properties: {
|
|
427
|
+
query: { type: "string", description: "Search query" },
|
|
428
|
+
},
|
|
429
|
+
required: ["query"],
|
|
430
|
+
},
|
|
431
|
+
handler: async ({ context }, { query }) => {
|
|
432
|
+
// Scope search to tenant's data
|
|
433
|
+
const tenantId = context.tenantId;
|
|
434
|
+
const results = await searchTenantData(query, tenantId);
|
|
435
|
+
return {
|
|
436
|
+
data: `Found ${results.length} results in tenant data`,
|
|
437
|
+
dataUpdate: { searchResults: results },
|
|
438
|
+
};
|
|
439
|
+
},
|
|
440
|
+
};
|
|
441
|
+
|
|
442
|
+
const tenantAgent = new Agent({
|
|
443
|
+
name: "Multi-Tenant Agent",
|
|
444
|
+
tools: [multiTenantTool],
|
|
445
|
+
routes: ({ context }) => {
|
|
446
|
+
// Routes scoped to tenant
|
|
447
|
+
return createTenantRoutes(context.tenantId);
|
|
448
|
+
},
|
|
449
|
+
});
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### Time-Based Availability
|
|
453
|
+
|
|
454
|
+
```typescript
|
|
455
|
+
const timeSensitiveTool = {
|
|
456
|
+
id: "business_hours_support",
|
|
457
|
+
execute: async (args) => {
|
|
458
|
+
const now = new Date();
|
|
459
|
+
const hour = now.getHours();
|
|
460
|
+
|
|
461
|
+
if (hour < 9 || hour > 17) {
|
|
462
|
+
throw new Error(
|
|
463
|
+
"Support only available during business hours (9 AM - 5 PM)"
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
return await provideSupport(args);
|
|
468
|
+
},
|
|
469
|
+
};
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
### Usage-Based Limiting
|
|
473
|
+
|
|
474
|
+
```typescript
|
|
475
|
+
const limitedTool: Tool<{ userId: string }, [args: any], string, any> = {
|
|
476
|
+
id: "premium_feature",
|
|
477
|
+
description: "Execute premium feature with usage limits",
|
|
478
|
+
parameters: {
|
|
479
|
+
type: "object",
|
|
480
|
+
properties: {
|
|
481
|
+
action: { type: "string", description: "Premium action to perform" },
|
|
482
|
+
},
|
|
483
|
+
required: ["action"],
|
|
484
|
+
},
|
|
485
|
+
handler: async ({ context }, { action }) => {
|
|
486
|
+
// Check usage limits
|
|
487
|
+
const usage = await getUserUsage(context.userId, "premium_feature");
|
|
488
|
+
|
|
489
|
+
if (usage.count >= usage.limit) {
|
|
490
|
+
throw new Error("Premium feature usage limit exceeded");
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
// Execute feature
|
|
494
|
+
const result = await executePremiumFeature(action);
|
|
495
|
+
|
|
496
|
+
// Update usage
|
|
497
|
+
await incrementUsage(context.userId, "premium_feature");
|
|
498
|
+
|
|
499
|
+
return {
|
|
500
|
+
data: `Premium feature executed: ${result}`,
|
|
501
|
+
contextUpdate: {
|
|
502
|
+
lastPremiumUsage: new Date().toISOString(),
|
|
503
|
+
premiumUsageCount: usage.count + 1,
|
|
504
|
+
},
|
|
505
|
+
};
|
|
506
|
+
},
|
|
507
|
+
};
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
## Debugging & Monitoring
|
|
511
|
+
|
|
512
|
+
### Tool Resolution Tracing
|
|
513
|
+
|
|
514
|
+
```typescript
|
|
515
|
+
// Enable debug logging
|
|
516
|
+
const agent = new Agent({
|
|
517
|
+
name: "Debug Agent",
|
|
518
|
+
debug: true,
|
|
519
|
+
provider: provider,
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
// Logs show tool resolution:
|
|
523
|
+
// [Agent] Resolving tool 'search' in step 'query'
|
|
524
|
+
// [Agent] Found step-level tool: web_search
|
|
525
|
+
// [Agent] Tool resolution: web_search (step > route > agent)
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
### Access Audit Logging
|
|
529
|
+
|
|
530
|
+
```typescript
|
|
531
|
+
const auditedTool: Tool<{ userId: string }, [args: any], string, any> = {
|
|
532
|
+
id: "sensitive_operation",
|
|
533
|
+
description: "Perform sensitive operation with audit logging",
|
|
534
|
+
parameters: {
|
|
535
|
+
type: "object",
|
|
536
|
+
properties: {
|
|
537
|
+
operation: { type: "string", description: "Operation to perform" },
|
|
538
|
+
},
|
|
539
|
+
required: ["operation"],
|
|
540
|
+
},
|
|
541
|
+
handler: async ({ context }, { operation }) => {
|
|
542
|
+
// Log access attempt
|
|
543
|
+
await auditLog.log({
|
|
544
|
+
userId: context.userId,
|
|
545
|
+
toolId: "sensitive_operation",
|
|
546
|
+
timestamp: new Date(),
|
|
547
|
+
operation: operation, // Log the operation type
|
|
548
|
+
});
|
|
549
|
+
|
|
550
|
+
const result = await performSensitiveOperation(operation);
|
|
551
|
+
|
|
552
|
+
return {
|
|
553
|
+
data: `Sensitive operation completed: ${result}`,
|
|
554
|
+
contextUpdate: {
|
|
555
|
+
lastSensitiveOperation: new Date().toISOString(),
|
|
556
|
+
},
|
|
557
|
+
};
|
|
558
|
+
},
|
|
559
|
+
};
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
### Performance Monitoring
|
|
563
|
+
|
|
564
|
+
```typescript
|
|
565
|
+
const monitoredAgent = new Agent({
|
|
566
|
+
name: "Monitored Agent",
|
|
567
|
+
tools: [
|
|
568
|
+
{
|
|
569
|
+
...tool,
|
|
570
|
+
execute: async (args, context) => {
|
|
571
|
+
const startTime = Date.now();
|
|
572
|
+
try {
|
|
573
|
+
const result = await originalExecute(args, context);
|
|
574
|
+
|
|
575
|
+
// Log performance metrics
|
|
576
|
+
metrics.record("tool_execution", {
|
|
577
|
+
toolId: tool.id,
|
|
578
|
+
duration: Date.now() - startTime,
|
|
579
|
+
success: true,
|
|
580
|
+
});
|
|
581
|
+
|
|
582
|
+
return result;
|
|
583
|
+
} catch (error) {
|
|
584
|
+
metrics.record("tool_execution", {
|
|
585
|
+
toolId: tool.id,
|
|
586
|
+
duration: Date.now() - startTime,
|
|
587
|
+
success: false,
|
|
588
|
+
error: error.message,
|
|
589
|
+
});
|
|
590
|
+
|
|
591
|
+
throw error;
|
|
592
|
+
}
|
|
593
|
+
},
|
|
594
|
+
},
|
|
595
|
+
],
|
|
596
|
+
});
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
## Best Practices
|
|
600
|
+
|
|
601
|
+
### Scoping Strategy
|
|
602
|
+
|
|
603
|
+
1. **Agent Level**: Cross-cutting, general-purpose tools
|
|
604
|
+
2. **Route Level**: Domain-specific, route-centric tools
|
|
605
|
+
3. **Step Level**: Sensitive, step-specific operations
|
|
606
|
+
|
|
607
|
+
### Security First
|
|
608
|
+
|
|
609
|
+
1. **Defense in Depth**: Multiple layers of access control
|
|
610
|
+
2. **Principle of Least Privilege**: Minimal required permissions
|
|
611
|
+
3. **Audit Everything**: Log all tool access and usage
|
|
612
|
+
4. **Fail Secure**: Deny access when in doubt
|
|
613
|
+
|
|
614
|
+
### Performance
|
|
615
|
+
|
|
616
|
+
1. **Limit Scope**: Don't expose unnecessary tools
|
|
617
|
+
2. **Lazy Loading**: Load tools only when needed
|
|
618
|
+
3. **Caching**: Cache permission checks and tool metadata
|
|
619
|
+
4. **Monitoring**: Track usage patterns and optimize
|
|
620
|
+
|
|
621
|
+
### Maintainability
|
|
622
|
+
|
|
623
|
+
1. **Clear Naming**: Descriptive tool IDs and scopes
|
|
624
|
+
2. **Documentation**: Document tool purposes and requirements
|
|
625
|
+
3. **Testing**: Test tool resolution and access control
|
|
626
|
+
4. **Versioning**: Plan for tool evolution and compatibility
|
|
627
|
+
|
|
628
|
+
The hierarchical scoping system enables sophisticated tool management while maintaining security, performance, and developer experience.
|