@falai/agent 0.8.1 → 0.9.0-alpha-2
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 +332 -147
- 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/cjs/src/core/Agent.d.ts +223 -0
- package/dist/cjs/src/core/Agent.d.ts.map +1 -0
- package/dist/cjs/src/core/Agent.js +1660 -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 +73 -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 +32 -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 +171 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.js +514 -0
- package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
- package/dist/cjs/src/core/Route.d.ts +145 -0
- package/dist/cjs/src/core/Route.d.ts.map +1 -0
- package/dist/cjs/src/core/Route.js +343 -0
- package/dist/cjs/src/core/Route.js.map +1 -0
- package/dist/cjs/src/core/RoutingEngine.d.ts +129 -0
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/RoutingEngine.js +215 -117
- package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/src/core/SessionManager.d.ts +86 -0
- package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
- package/dist/cjs/src/core/SessionManager.js +217 -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 +45 -0
- package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/ToolExecutor.js +30 -19
- 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 +80 -41
- 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 +38 -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/src/types/route.d.ts +235 -0
- 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 +65 -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/{types → cjs/src/types}/tool.d.ts +17 -13
- 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 +35 -32
- 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/src/core/Agent.d.ts +223 -0
- package/dist/src/core/Agent.d.ts.map +1 -0
- package/dist/src/core/Agent.js +1656 -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 +71 -18
- 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 +32 -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 +171 -0
- package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/src/core/ResponsePipeline.js +510 -0
- package/dist/src/core/ResponsePipeline.js.map +1 -0
- package/dist/src/core/Route.d.ts +145 -0
- package/dist/src/core/Route.d.ts.map +1 -0
- package/dist/src/core/Route.js +339 -0
- package/dist/src/core/Route.js.map +1 -0
- package/dist/src/core/RoutingEngine.d.ts +129 -0
- package/dist/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/{core → src/core}/RoutingEngine.js +211 -113
- package/dist/src/core/RoutingEngine.js.map +1 -0
- package/dist/src/core/SessionManager.d.ts +86 -0
- package/dist/src/core/SessionManager.d.ts.map +1 -0
- package/dist/src/core/SessionManager.js +213 -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 +45 -0
- package/dist/src/core/ToolExecutor.d.ts.map +1 -0
- package/dist/src/core/ToolExecutor.js +80 -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 +80 -41
- 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 +38 -23
- package/dist/src/types/persistence.d.ts.map +1 -0
- package/dist/src/types/persistence.js.map +1 -0
- package/dist/src/types/route.d.ts +235 -0
- 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 +65 -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/{cjs → src}/types/tool.d.ts +17 -13
- package/dist/src/types/tool.d.ts.map +1 -0
- 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 +33 -32
- 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} +925 -255
- package/docs/api/overview.md +952 -0
- package/docs/core/agent/README.md +787 -0
- package/docs/{CONTEXT_MANAGEMENT.md → core/agent/context-management.md} +175 -102
- package/docs/{ARCHITECTURE.md → core/agent/session-management.md} +117 -69
- package/docs/core/ai-integration/prompt-composition.md +220 -0
- package/docs/core/ai-integration/providers.md +515 -0
- package/docs/core/ai-integration/response-processing.md +176 -0
- package/docs/core/conversation-flows/data-collection.md +623 -0
- package/docs/core/conversation-flows/route-dsl.md +502 -0
- package/docs/core/conversation-flows/routes.md +117 -0
- package/docs/core/conversation-flows/step-transitions.md +595 -0
- package/docs/core/conversation-flows/steps.md +154 -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 +348 -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 +406 -0
- package/examples/{company-qna-agent.ts → advanced-patterns/knowledge-based-agent.ts} +139 -95
- package/examples/{persistent-onboarding.ts → advanced-patterns/persistent-onboarding.ts} +244 -137
- package/examples/{rules-prohibitions.ts → advanced-patterns/route-lifecycle-hooks.ts} +130 -84
- package/examples/{streaming-agent.ts → advanced-patterns/streaming-responses.ts} +116 -90
- package/examples/ai-providers/anthropic-integration.ts +384 -0
- package/examples/{openai-agent.ts → ai-providers/openai-integration.ts} +57 -63
- package/examples/conversation-flows/completion-transitions.ts +277 -0
- package/examples/core-concepts/basic-agent.ts +443 -0
- package/examples/core-concepts/schema-driven-extraction.ts +305 -0
- package/examples/core-concepts/session-management.ts +406 -0
- package/examples/integrations/database-integration.ts +630 -0
- package/examples/integrations/healthcare-integration.ts +609 -0
- package/examples/{opensearch-persistence.ts → integrations/search-integration.ts} +199 -171
- package/examples/integrations/server-session-management.ts +307 -0
- package/examples/persistence/custom-adapter.ts +529 -0
- package/examples/{prisma-persistence.ts → persistence/database-persistence.ts} +215 -272
- package/examples/persistence/memory-sessions.ts +495 -0
- package/examples/{prisma-schema.example.prisma → persistence/prisma-schema.example.prisma} +1 -1
- package/examples/persistence/redis-persistence.ts +490 -0
- package/examples/tools/basic-tools.ts +561 -0
- package/examples/{extracted-data-modification.ts → tools/data-enrichment-tools.ts} +128 -117
- 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 +1431 -526
- package/src/core/Events.ts +100 -112
- package/src/core/PersistenceManager.ts +103 -49
- package/src/core/PromptComposer.ts +158 -85
- package/src/core/ResponseEngine.ts +128 -46
- package/src/core/ResponsePipeline.ts +830 -0
- package/src/core/Route.ts +222 -53
- package/src/core/RoutingEngine.ts +345 -229
- package/src/core/SessionManager.ts +265 -0
- package/src/core/Step.ts +157 -67
- package/src/core/ToolExecutor.ts +52 -43
- 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 +81 -46
- package/src/types/ai.ts +7 -0
- package/src/types/history.ts +91 -18
- package/src/types/index.ts +45 -7
- package/src/types/persistence.ts +45 -28
- package/src/types/route.ts +122 -57
- package/src/types/session.ts +20 -220
- package/src/types/template.ts +36 -0
- package/src/types/tool.ts +23 -19
- 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 +204 -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 +0 -197
- 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 +0 -203
- package/dist/cjs/core/Route.js.map +0 -1
- package/dist/cjs/core/RoutingEngine.d.ts +0 -109
- 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 +0 -175
- 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/types/tool.d.ts.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 +0 -197
- 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 +0 -199
- package/dist/core/Route.js.map +0 -1
- package/dist/core/RoutingEngine.d.ts +0 -109
- 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 +0 -175
- 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/declarative-agent.ts +0 -401
- package/examples/domain-scoping.ts +0 -366
- package/examples/healthcare-agent.ts +0 -511
- package/examples/redis-persistence.ts +0 -525
- package/examples/route-transitions.ts +0 -266
- 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,830 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response processing utilities shared between respond() and respondStream() methods
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type {
|
|
6
|
+
AgentOptions,
|
|
7
|
+
Event,
|
|
8
|
+
SessionState,
|
|
9
|
+
AgentStructuredResponse,
|
|
10
|
+
Tool,
|
|
11
|
+
RouteTransitionConfig,
|
|
12
|
+
} from "../types";
|
|
13
|
+
import { EventKind, MessageRole } from "../types/history";
|
|
14
|
+
import {
|
|
15
|
+
createSession,
|
|
16
|
+
enterRoute,
|
|
17
|
+
enterStep,
|
|
18
|
+
mergeCollected,
|
|
19
|
+
logger,
|
|
20
|
+
render,
|
|
21
|
+
} from "../utils";
|
|
22
|
+
import { Route } from "../core/Route";
|
|
23
|
+
import { Step } from "../core/Step";
|
|
24
|
+
import { RoutingEngine } from "../core/RoutingEngine";
|
|
25
|
+
import { ToolExecutor } from "../core/ToolExecutor";
|
|
26
|
+
import { END_ROUTE_ID } from "../constants";
|
|
27
|
+
|
|
28
|
+
export interface ResponsePreparationResult<TContext, TData = unknown> {
|
|
29
|
+
effectiveContext: TContext;
|
|
30
|
+
session: SessionState<TData>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface RoutingResult<TContext, TData = unknown> {
|
|
34
|
+
selectedRoute: Route<TContext, TData> | undefined;
|
|
35
|
+
selectedStep: Step<TContext, TData> | undefined;
|
|
36
|
+
responseDirectives: string[] | undefined;
|
|
37
|
+
session: SessionState<TData>;
|
|
38
|
+
isRouteComplete: boolean;
|
|
39
|
+
completedRoutes?: Route<TContext, TData>[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface ToolExecutionResult<TData = unknown> {
|
|
43
|
+
session: SessionState<TData>;
|
|
44
|
+
toolCalls:
|
|
45
|
+
| Array<{ toolName: string; arguments: Record<string, unknown> }>
|
|
46
|
+
| undefined;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface DataCollectionResult<TData = unknown> {
|
|
50
|
+
session: SessionState<TData>;
|
|
51
|
+
collectedData?: Partial<TData>;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Shared response processing logic between respond() and respondStream() methods
|
|
56
|
+
*/
|
|
57
|
+
export class ResponsePipeline<TContext = unknown, TData = unknown> {
|
|
58
|
+
constructor(
|
|
59
|
+
private readonly options: AgentOptions<TContext, TData>,
|
|
60
|
+
private readonly routes: Route<TContext, TData>[],
|
|
61
|
+
private readonly tools: Tool<TContext, TData, unknown[], unknown>[],
|
|
62
|
+
private readonly routingEngine: RoutingEngine<TContext, TData>,
|
|
63
|
+
private readonly updateContext: (
|
|
64
|
+
updates: Partial<TContext>
|
|
65
|
+
) => Promise<void>,
|
|
66
|
+
private readonly updateData: (
|
|
67
|
+
session: SessionState<TData>,
|
|
68
|
+
dataUpdate: Partial<TData>
|
|
69
|
+
) => Promise<SessionState<TData>>,
|
|
70
|
+
private readonly updateCollectedData?: (
|
|
71
|
+
updates: Partial<TData>
|
|
72
|
+
) => Promise<void>
|
|
73
|
+
) {}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Prepare context and session for response generation
|
|
77
|
+
*/
|
|
78
|
+
async prepareResponseContext(params: {
|
|
79
|
+
contextOverride?: Partial<TContext>;
|
|
80
|
+
session?: SessionState<TData>;
|
|
81
|
+
}): Promise<ResponsePreparationResult<TContext, TData>> {
|
|
82
|
+
const { contextOverride, session } = params;
|
|
83
|
+
|
|
84
|
+
// Get current context (may fetch from provider)
|
|
85
|
+
let currentContext = await this.getContext();
|
|
86
|
+
|
|
87
|
+
// Call beforeRespond hook if configured
|
|
88
|
+
if (this.options.hooks?.beforeRespond && currentContext !== undefined) {
|
|
89
|
+
currentContext = await this.options.hooks.beforeRespond(currentContext);
|
|
90
|
+
// Update stored context with the result from beforeRespond
|
|
91
|
+
this.context = currentContext;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Merge context with override
|
|
95
|
+
const effectiveContext = {
|
|
96
|
+
...(currentContext as Record<string, unknown>),
|
|
97
|
+
...(contextOverride as Record<string, unknown>),
|
|
98
|
+
} as TContext;
|
|
99
|
+
|
|
100
|
+
// Initialize or get session (use current session if available)
|
|
101
|
+
const targetSession = session || this.currentSession || createSession<TData>();
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
effectiveContext,
|
|
105
|
+
session: targetSession,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Handle routing and step selection logic
|
|
111
|
+
*/
|
|
112
|
+
async handleRoutingAndStepSelection(params: {
|
|
113
|
+
session: SessionState<TData>;
|
|
114
|
+
history: Event[];
|
|
115
|
+
context: TContext;
|
|
116
|
+
signal?: AbortSignal;
|
|
117
|
+
}): Promise<RoutingResult<TContext, TData>> {
|
|
118
|
+
const { session, history, context, signal } = params;
|
|
119
|
+
|
|
120
|
+
// PHASE 2: ROUTING + STEP SELECTION - Determine which route and step to use (combined)
|
|
121
|
+
let selectedRoute: Route<TContext, TData> | undefined;
|
|
122
|
+
let responseDirectives: string[] | undefined;
|
|
123
|
+
let selectedStep: Step<TContext, TData> | undefined;
|
|
124
|
+
let isRouteComplete = false;
|
|
125
|
+
let completedRoutes: Route<TContext, TData>[] = [];
|
|
126
|
+
let targetSession = session;
|
|
127
|
+
|
|
128
|
+
// Check for pending transition from previous route completion
|
|
129
|
+
if (targetSession.pendingTransition) {
|
|
130
|
+
const targetRoute = this.routes.find(
|
|
131
|
+
(r) => r.id === targetSession.pendingTransition?.targetRouteId
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
if (targetRoute) {
|
|
135
|
+
logger.debug(
|
|
136
|
+
`[ResponseHandler] Auto-transitioning from pending transition to route: ${targetRoute.title}`
|
|
137
|
+
);
|
|
138
|
+
// Clear pending transition and enter new route
|
|
139
|
+
targetSession = {
|
|
140
|
+
...targetSession,
|
|
141
|
+
pendingTransition: undefined,
|
|
142
|
+
};
|
|
143
|
+
targetSession = enterRoute(
|
|
144
|
+
targetSession,
|
|
145
|
+
targetRoute.id,
|
|
146
|
+
targetRoute.title
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
// Merge initial data if available
|
|
150
|
+
if (targetRoute.initialData) {
|
|
151
|
+
targetSession = mergeCollected(
|
|
152
|
+
targetSession,
|
|
153
|
+
targetRoute.initialData
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
selectedRoute = targetRoute;
|
|
158
|
+
} else {
|
|
159
|
+
logger.warn(
|
|
160
|
+
`[ResponseHandler] Pending transition target route not found: ${targetSession.pendingTransition.targetRouteId}`
|
|
161
|
+
);
|
|
162
|
+
// Clear invalid transition
|
|
163
|
+
targetSession = {
|
|
164
|
+
...targetSession,
|
|
165
|
+
pendingTransition: undefined,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// If no pending transition or transition handled, do normal routing
|
|
171
|
+
if (this.routes.length > 0 && !selectedRoute) {
|
|
172
|
+
const orchestration = await this.routingEngine.decideRouteAndStep({
|
|
173
|
+
routes: this.routes,
|
|
174
|
+
session: targetSession,
|
|
175
|
+
history,
|
|
176
|
+
agentOptions: this.options,
|
|
177
|
+
provider: this.options.provider,
|
|
178
|
+
context,
|
|
179
|
+
signal,
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
selectedRoute = orchestration.selectedRoute;
|
|
183
|
+
selectedStep = orchestration.selectedStep;
|
|
184
|
+
responseDirectives = orchestration.responseDirectives;
|
|
185
|
+
targetSession = orchestration.session;
|
|
186
|
+
isRouteComplete = orchestration.isRouteComplete || false;
|
|
187
|
+
completedRoutes = orchestration.completedRoutes || [];
|
|
188
|
+
|
|
189
|
+
// Log if route is complete
|
|
190
|
+
if (isRouteComplete) {
|
|
191
|
+
logger.debug(
|
|
192
|
+
`[ResponseHandler] Route complete: all required data collected, END_ROUTE reached`
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
selectedRoute,
|
|
199
|
+
selectedStep,
|
|
200
|
+
responseDirectives,
|
|
201
|
+
session: targetSession,
|
|
202
|
+
isRouteComplete,
|
|
203
|
+
completedRoutes,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Determine next step and update session
|
|
209
|
+
*/
|
|
210
|
+
determineNextStep(params: {
|
|
211
|
+
selectedRoute: Route<TContext, TData> | undefined;
|
|
212
|
+
selectedStep: Step<TContext, TData> | undefined;
|
|
213
|
+
session: SessionState<TData>;
|
|
214
|
+
isRouteComplete: boolean;
|
|
215
|
+
}): { nextStep: Step<TContext, TData> | undefined; session: SessionState<TData> } {
|
|
216
|
+
const { selectedRoute, selectedStep, session, isRouteComplete } = params;
|
|
217
|
+
|
|
218
|
+
if (!selectedRoute || isRouteComplete) {
|
|
219
|
+
return { nextStep: undefined, session };
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
let nextStep: Step<TContext, TData>;
|
|
223
|
+
|
|
224
|
+
// If we have a selected step from the combined routing decision, use it
|
|
225
|
+
if (selectedStep) {
|
|
226
|
+
nextStep = selectedStep;
|
|
227
|
+
} else {
|
|
228
|
+
// New route or no step selected - get initial step or first valid step
|
|
229
|
+
const candidates = this.routingEngine.getCandidateSteps(
|
|
230
|
+
selectedRoute,
|
|
231
|
+
undefined,
|
|
232
|
+
session.data || {}
|
|
233
|
+
);
|
|
234
|
+
if (candidates.length > 0) {
|
|
235
|
+
nextStep = candidates[0].step;
|
|
236
|
+
logger.debug(
|
|
237
|
+
`[ResponseHandler] Using first valid step: ${nextStep.id} for new route`
|
|
238
|
+
);
|
|
239
|
+
} else {
|
|
240
|
+
// Fallback to initial step even if it should be skipped
|
|
241
|
+
nextStep = selectedRoute.initialStep;
|
|
242
|
+
logger.warn(
|
|
243
|
+
`[ResponseHandler] No valid steps found, using initial step: ${nextStep.id}`
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Update session with next step
|
|
249
|
+
const updatedSession = enterStep(
|
|
250
|
+
session,
|
|
251
|
+
nextStep.id,
|
|
252
|
+
nextStep.description
|
|
253
|
+
);
|
|
254
|
+
logger.debug(`[ResponseHandler] Entered step: ${nextStep.id}`);
|
|
255
|
+
|
|
256
|
+
return { nextStep, session: updatedSession };
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Execute tool calls and handle results
|
|
261
|
+
*/
|
|
262
|
+
async executeToolCalls(params: {
|
|
263
|
+
toolCalls: Array<{ toolName: string; arguments: Record<string, unknown> }>;
|
|
264
|
+
selectedRoute?: Route<TContext, TData>;
|
|
265
|
+
context: TContext;
|
|
266
|
+
session: SessionState<TData>;
|
|
267
|
+
history: Event[];
|
|
268
|
+
isStreaming?: boolean;
|
|
269
|
+
}): Promise<ToolExecutionResult<TData>> {
|
|
270
|
+
const {
|
|
271
|
+
toolCalls,
|
|
272
|
+
selectedRoute,
|
|
273
|
+
context,
|
|
274
|
+
session,
|
|
275
|
+
history,
|
|
276
|
+
isStreaming = false,
|
|
277
|
+
} = params;
|
|
278
|
+
|
|
279
|
+
if (toolCalls.length === 0) {
|
|
280
|
+
return { session, toolCalls: undefined };
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
logger.debug(
|
|
284
|
+
`[ResponseHandler] Executing ${toolCalls.length} ${
|
|
285
|
+
isStreaming ? "streaming " : ""
|
|
286
|
+
}tool calls`
|
|
287
|
+
);
|
|
288
|
+
|
|
289
|
+
let updatedSession = session;
|
|
290
|
+
const executedToolCalls: Array<{
|
|
291
|
+
toolName: string;
|
|
292
|
+
arguments: Record<string, unknown>;
|
|
293
|
+
}> = [];
|
|
294
|
+
|
|
295
|
+
for (const toolCall of toolCalls) {
|
|
296
|
+
const tool = this.findAvailableTool(toolCall.toolName, selectedRoute);
|
|
297
|
+
if (!tool) {
|
|
298
|
+
logger.warn(`[ResponseHandler] Tool not found: ${toolCall.toolName}`);
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const toolExecutor = new ToolExecutor<TContext, TData>();
|
|
303
|
+
const result = await toolExecutor.executeTool({
|
|
304
|
+
tool,
|
|
305
|
+
context,
|
|
306
|
+
updateContext: this.updateContext,
|
|
307
|
+
updateData: this.updateCollectedData || (async () => {}),
|
|
308
|
+
history,
|
|
309
|
+
data: updatedSession.data,
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
executedToolCalls.push(toolCall);
|
|
313
|
+
|
|
314
|
+
// Update context with tool results
|
|
315
|
+
if (result.contextUpdate) {
|
|
316
|
+
await this.updateContext(result.contextUpdate as Partial<TContext>);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Update collected data with tool results
|
|
320
|
+
if (result.dataUpdate) {
|
|
321
|
+
updatedSession = await this.updateData(
|
|
322
|
+
updatedSession,
|
|
323
|
+
result.dataUpdate as Partial<TData>
|
|
324
|
+
);
|
|
325
|
+
logger.debug(
|
|
326
|
+
`[ResponseHandler] ${
|
|
327
|
+
isStreaming ? "Streaming " : ""
|
|
328
|
+
}Tool updated collected data:`,
|
|
329
|
+
result.dataUpdate
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
logger.debug(
|
|
334
|
+
`[ResponseHandler] Executed ${isStreaming ? "streaming " : ""}tool: ${
|
|
335
|
+
result.toolName
|
|
336
|
+
} (success: ${result.success})`
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return {
|
|
341
|
+
session: updatedSession,
|
|
342
|
+
toolCalls: executedToolCalls.length > 0 ? executedToolCalls : undefined,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Execute tool loop for follow-up tool calls
|
|
348
|
+
*/
|
|
349
|
+
async executeToolLoop(params: {
|
|
350
|
+
initialToolCalls:
|
|
351
|
+
| Array<{ toolName: string; arguments: Record<string, unknown> }>
|
|
352
|
+
| undefined;
|
|
353
|
+
selectedRoute?: Route<TContext, TData>;
|
|
354
|
+
nextStep: Step<TContext, TData>;
|
|
355
|
+
responsePrompt: string;
|
|
356
|
+
history: Event[];
|
|
357
|
+
context: TContext;
|
|
358
|
+
session: SessionState<TData>;
|
|
359
|
+
responseSchema: Record<string, unknown>;
|
|
360
|
+
isStreaming?: boolean;
|
|
361
|
+
}): Promise<ToolExecutionResult<TData>> {
|
|
362
|
+
const {
|
|
363
|
+
initialToolCalls,
|
|
364
|
+
selectedRoute,
|
|
365
|
+
nextStep,
|
|
366
|
+
responsePrompt,
|
|
367
|
+
history,
|
|
368
|
+
context,
|
|
369
|
+
session,
|
|
370
|
+
responseSchema,
|
|
371
|
+
isStreaming = false,
|
|
372
|
+
} = params;
|
|
373
|
+
|
|
374
|
+
const MAX_TOOL_LOOPS = 5;
|
|
375
|
+
let toolLoopCount = 0;
|
|
376
|
+
let currentToolCalls = initialToolCalls;
|
|
377
|
+
let hasToolCalls = currentToolCalls && currentToolCalls.length > 0;
|
|
378
|
+
let currentSession = session;
|
|
379
|
+
|
|
380
|
+
while (hasToolCalls && toolLoopCount < MAX_TOOL_LOOPS) {
|
|
381
|
+
toolLoopCount++;
|
|
382
|
+
logger.debug(
|
|
383
|
+
`[ResponseHandler] Starting ${
|
|
384
|
+
isStreaming ? "streaming " : ""
|
|
385
|
+
}tool loop ${toolLoopCount}/${MAX_TOOL_LOOPS}`
|
|
386
|
+
);
|
|
387
|
+
|
|
388
|
+
// Add tool execution results to history so AI knows what happened
|
|
389
|
+
const toolResultsEvents: Event[] = [];
|
|
390
|
+
for (const toolCall of currentToolCalls || []) {
|
|
391
|
+
const tool = this.findAvailableTool(toolCall.toolName, selectedRoute);
|
|
392
|
+
if (tool) {
|
|
393
|
+
toolResultsEvents.push({
|
|
394
|
+
kind: EventKind.TOOL,
|
|
395
|
+
source: MessageRole.AGENT,
|
|
396
|
+
timestamp: new Date().toISOString(),
|
|
397
|
+
data: {
|
|
398
|
+
tool_calls: [
|
|
399
|
+
{
|
|
400
|
+
tool_id: toolCall.toolName,
|
|
401
|
+
arguments: toolCall.arguments,
|
|
402
|
+
result: {
|
|
403
|
+
data: "Tool executed successfully",
|
|
404
|
+
},
|
|
405
|
+
},
|
|
406
|
+
],
|
|
407
|
+
},
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// Create updated history with tool results
|
|
413
|
+
const updatedHistory = [...history, ...toolResultsEvents];
|
|
414
|
+
|
|
415
|
+
// Make follow-up AI call to see if more tools are needed
|
|
416
|
+
const followUpResult = await this.options.provider.generateMessage({
|
|
417
|
+
prompt: responsePrompt,
|
|
418
|
+
history: updatedHistory,
|
|
419
|
+
context,
|
|
420
|
+
tools: this.collectAvailableTools(selectedRoute, nextStep),
|
|
421
|
+
parameters: {
|
|
422
|
+
jsonSchema: responseSchema,
|
|
423
|
+
schemaName: isStreaming ? "tool_followup_streaming" : "tool_followup",
|
|
424
|
+
},
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
// Check if follow-up call has more tool calls
|
|
428
|
+
const followUpToolCalls = followUpResult.structured?.toolCalls;
|
|
429
|
+
hasToolCalls = followUpToolCalls && followUpToolCalls.length > 0;
|
|
430
|
+
|
|
431
|
+
if (hasToolCalls) {
|
|
432
|
+
logger.debug(
|
|
433
|
+
`[ResponseHandler] Follow-up call produced ${
|
|
434
|
+
followUpToolCalls!.length
|
|
435
|
+
} additional tool calls`
|
|
436
|
+
);
|
|
437
|
+
|
|
438
|
+
// Execute the follow-up tool calls
|
|
439
|
+
const toolResult = await this.executeToolCalls({
|
|
440
|
+
toolCalls: followUpToolCalls!,
|
|
441
|
+
selectedRoute,
|
|
442
|
+
context,
|
|
443
|
+
session: currentSession,
|
|
444
|
+
history: updatedHistory,
|
|
445
|
+
isStreaming,
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
currentSession = toolResult.session;
|
|
449
|
+
currentToolCalls = followUpToolCalls;
|
|
450
|
+
} else {
|
|
451
|
+
logger.debug(
|
|
452
|
+
`[ResponseHandler] ${
|
|
453
|
+
isStreaming ? "Streaming " : ""
|
|
454
|
+
}Tool loop completed after ${toolLoopCount} iterations`
|
|
455
|
+
);
|
|
456
|
+
// Update final toolCalls from follow-up result if no more tools
|
|
457
|
+
currentToolCalls = followUpToolCalls || [];
|
|
458
|
+
break;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
if (toolLoopCount >= MAX_TOOL_LOOPS) {
|
|
463
|
+
logger.warn(
|
|
464
|
+
`[ResponseHandler] ${
|
|
465
|
+
isStreaming ? "Streaming " : ""
|
|
466
|
+
}Tool loop limit reached (${MAX_TOOL_LOOPS}), stopping`
|
|
467
|
+
);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
return {
|
|
471
|
+
session: currentSession,
|
|
472
|
+
toolCalls: currentToolCalls,
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Handle data collection from structured response
|
|
478
|
+
*/
|
|
479
|
+
async handleDataCollection(params: {
|
|
480
|
+
structured: AgentStructuredResponse | undefined;
|
|
481
|
+
nextStep: Step<TContext, TData>;
|
|
482
|
+
session: SessionState<TData>;
|
|
483
|
+
}): Promise<DataCollectionResult<TData>> {
|
|
484
|
+
const { structured, nextStep, session } = params;
|
|
485
|
+
|
|
486
|
+
if (!structured || !nextStep.collect) {
|
|
487
|
+
return { session };
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
const collectedData: Partial<TData> = {};
|
|
491
|
+
// The structured response includes both base fields and collected extraction fields
|
|
492
|
+
const structuredData = structured as AgentStructuredResponse &
|
|
493
|
+
Record<string, unknown>;
|
|
494
|
+
|
|
495
|
+
for (const field of nextStep.collect) {
|
|
496
|
+
const fieldKey = field as string;
|
|
497
|
+
if (fieldKey in structuredData) {
|
|
498
|
+
(collectedData as Record<string, unknown>)[fieldKey] = structuredData[fieldKey];
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
let updatedSession = session;
|
|
503
|
+
if (Object.keys(collectedData).length > 0) {
|
|
504
|
+
// Update agent-level collected data with validation if available
|
|
505
|
+
if (this.updateCollectedData) {
|
|
506
|
+
await this.updateCollectedData(collectedData);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// Update session with validated data
|
|
510
|
+
updatedSession = await this.updateData(session, collectedData);
|
|
511
|
+
logger.debug(`[ResponseHandler] Collected data:`, collectedData);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
return {
|
|
515
|
+
session: updatedSession,
|
|
516
|
+
collectedData,
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/**
|
|
521
|
+
* Handle context updates from structured response
|
|
522
|
+
*/
|
|
523
|
+
async handleContextUpdate(
|
|
524
|
+
structured: AgentStructuredResponse | undefined
|
|
525
|
+
): Promise<void> {
|
|
526
|
+
if (
|
|
527
|
+
structured &&
|
|
528
|
+
typeof structured === "object" &&
|
|
529
|
+
"contextUpdate" in structured
|
|
530
|
+
) {
|
|
531
|
+
await this.updateContext(
|
|
532
|
+
(structured as { contextUpdate?: Partial<TContext> })
|
|
533
|
+
.contextUpdate as Partial<TContext>
|
|
534
|
+
);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Handle route completion logic
|
|
540
|
+
*/
|
|
541
|
+
async handleRouteCompletion(params: {
|
|
542
|
+
selectedRoute: Route<TContext, TData>;
|
|
543
|
+
session: SessionState<TData>;
|
|
544
|
+
context: TContext;
|
|
545
|
+
history: Event[];
|
|
546
|
+
}): Promise<{ session: SessionState<TData>; hasTransition: boolean }> {
|
|
547
|
+
const { selectedRoute, session, context, history } = params;
|
|
548
|
+
|
|
549
|
+
// Check for onComplete transition
|
|
550
|
+
const transitionConfig = await selectedRoute.evaluateOnComplete(
|
|
551
|
+
{ data: session.data },
|
|
552
|
+
context
|
|
553
|
+
);
|
|
554
|
+
|
|
555
|
+
if (transitionConfig) {
|
|
556
|
+
// Find target route by ID or title
|
|
557
|
+
const targetRoute = this.routes.find(
|
|
558
|
+
(r) =>
|
|
559
|
+
r.id === transitionConfig.nextStep ||
|
|
560
|
+
r.title === transitionConfig.nextStep
|
|
561
|
+
);
|
|
562
|
+
|
|
563
|
+
if (targetRoute) {
|
|
564
|
+
const templateContext = {
|
|
565
|
+
context,
|
|
566
|
+
session,
|
|
567
|
+
history,
|
|
568
|
+
};
|
|
569
|
+
const renderedCondition: string =
|
|
570
|
+
(await render(transitionConfig.condition, templateContext)) ||
|
|
571
|
+
(typeof transitionConfig.condition === "string"
|
|
572
|
+
? transitionConfig.condition
|
|
573
|
+
: "");
|
|
574
|
+
|
|
575
|
+
// Set pending transition in session
|
|
576
|
+
const updatedSession = {
|
|
577
|
+
...session,
|
|
578
|
+
pendingTransition: {
|
|
579
|
+
targetRouteId: targetRoute.id,
|
|
580
|
+
condition: renderedCondition,
|
|
581
|
+
reason: "route_complete" as const,
|
|
582
|
+
},
|
|
583
|
+
};
|
|
584
|
+
logger.debug(
|
|
585
|
+
`[ResponseHandler] Route ${selectedRoute.title} completed with pending transition to: ${targetRoute.title}`
|
|
586
|
+
);
|
|
587
|
+
return { session: updatedSession, hasTransition: true };
|
|
588
|
+
} else {
|
|
589
|
+
logger.warn(
|
|
590
|
+
`[ResponseHandler] Route ${selectedRoute.title} completed but target route not found: ${transitionConfig.nextStep}`
|
|
591
|
+
);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
// Set step to END_ROUTE marker
|
|
596
|
+
const updatedSession = enterStep(session, END_ROUTE_ID, "Route completed");
|
|
597
|
+
logger.debug(
|
|
598
|
+
`[ResponseHandler] Route ${selectedRoute.title} completed. Entered END_ROUTE step.`
|
|
599
|
+
);
|
|
600
|
+
|
|
601
|
+
return { session: updatedSession, hasTransition: false };
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
/**
|
|
605
|
+
* Find an available tool by name for the given route
|
|
606
|
+
*/
|
|
607
|
+
private findAvailableTool(
|
|
608
|
+
toolName: string,
|
|
609
|
+
route?: Route<TContext, TData>
|
|
610
|
+
): Tool<TContext, TData, unknown[], unknown> | undefined {
|
|
611
|
+
// Check route-level tools first (if route provided)
|
|
612
|
+
if (route) {
|
|
613
|
+
const routeTool = route
|
|
614
|
+
.getTools()
|
|
615
|
+
.find((tool) => tool.id === toolName || tool.name === toolName);
|
|
616
|
+
if (routeTool) return routeTool;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
// Fall back to agent-level tools
|
|
620
|
+
return this.tools.find(
|
|
621
|
+
(tool) => tool.id === toolName || tool.name === toolName
|
|
622
|
+
);
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/**
|
|
626
|
+
* Collect all available tools for the given route and step context
|
|
627
|
+
*/
|
|
628
|
+
private collectAvailableTools(
|
|
629
|
+
route?: Route<TContext, TData>,
|
|
630
|
+
step?: Step<TContext, TData>
|
|
631
|
+
): Array<{ id: string; description?: string; parameters?: unknown }> {
|
|
632
|
+
const availableTools = new Map<
|
|
633
|
+
string,
|
|
634
|
+
Tool<TContext, TData, unknown[], unknown>
|
|
635
|
+
>();
|
|
636
|
+
|
|
637
|
+
// Add agent-level tools
|
|
638
|
+
this.tools.forEach((tool) => {
|
|
639
|
+
availableTools.set(tool.id, tool);
|
|
640
|
+
});
|
|
641
|
+
|
|
642
|
+
// Add route-level tools (these take precedence)
|
|
643
|
+
if (route) {
|
|
644
|
+
route.getTools().forEach((tool) => {
|
|
645
|
+
availableTools.set(tool.id, tool);
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
// Filter by step-level allowed tools if specified
|
|
650
|
+
if (step?.tools) {
|
|
651
|
+
const allowedToolIds = new Set<string>();
|
|
652
|
+
const stepTools: Tool<TContext, TData, unknown[], unknown>[] = [];
|
|
653
|
+
|
|
654
|
+
for (const toolRef of step.tools) {
|
|
655
|
+
if (typeof toolRef === "string") {
|
|
656
|
+
// Reference to registered tool
|
|
657
|
+
allowedToolIds.add(toolRef);
|
|
658
|
+
} else {
|
|
659
|
+
// Inline tool definition
|
|
660
|
+
if (toolRef.id) {
|
|
661
|
+
allowedToolIds.add(toolRef.id);
|
|
662
|
+
stepTools.push(toolRef);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
// If step specifies tools, only include those
|
|
668
|
+
if (allowedToolIds.size > 0) {
|
|
669
|
+
const filteredTools = new Map<
|
|
670
|
+
string,
|
|
671
|
+
Tool<TContext, TData, unknown[], unknown>
|
|
672
|
+
>();
|
|
673
|
+
for (const toolId of allowedToolIds) {
|
|
674
|
+
const tool = availableTools.get(toolId);
|
|
675
|
+
if (tool) {
|
|
676
|
+
filteredTools.set(toolId, tool);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
// Add inline tools
|
|
680
|
+
stepTools.forEach((tool) => {
|
|
681
|
+
if (tool.id) {
|
|
682
|
+
filteredTools.set(tool.id, tool);
|
|
683
|
+
}
|
|
684
|
+
});
|
|
685
|
+
availableTools.clear();
|
|
686
|
+
filteredTools.forEach((tool, id) => availableTools.set(id, tool));
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
// Convert to the format expected by AI providers
|
|
691
|
+
return Array.from(availableTools.values()).map((tool) => ({
|
|
692
|
+
id: tool.id,
|
|
693
|
+
description: tool.description,
|
|
694
|
+
parameters: tool.parameters,
|
|
695
|
+
}));
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
/**
|
|
699
|
+
* Get current context (fetches from provider if configured)
|
|
700
|
+
*/
|
|
701
|
+
private async getContext(): Promise<TContext | undefined> {
|
|
702
|
+
// If context provider is configured, use it to fetch fresh context
|
|
703
|
+
if (this.options.contextProvider) {
|
|
704
|
+
return await this.options.contextProvider();
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
// Otherwise return the stored context
|
|
708
|
+
return this.context;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
// These need to be passed in or accessed differently since ResponseHandler is not part of Agent
|
|
712
|
+
private context?: TContext;
|
|
713
|
+
private currentSession?: SessionState<TData>;
|
|
714
|
+
|
|
715
|
+
// Setters for context and current session (needed for beforeRespond hook)
|
|
716
|
+
setContext(context: TContext | undefined): void {
|
|
717
|
+
this.context = context;
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
setCurrentSession(session: SessionState<TData> | undefined): void {
|
|
721
|
+
this.currentSession = session;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
public getStoredContext(): TContext | undefined {
|
|
725
|
+
return this.context;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
public getCurrentSession(): SessionState<TData> | undefined {
|
|
729
|
+
return this.currentSession;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
/**
|
|
733
|
+
* Handle cross-route completion evaluation and notifications
|
|
734
|
+
* This method evaluates all routes for completion and can trigger completion handlers
|
|
735
|
+
*/
|
|
736
|
+
async handleCrossRouteCompletion(params: {
|
|
737
|
+
routes: Route<TContext, TData>[];
|
|
738
|
+
session: SessionState<TData>;
|
|
739
|
+
context: TContext;
|
|
740
|
+
history: Event[];
|
|
741
|
+
}): Promise<{
|
|
742
|
+
session: SessionState<TData>;
|
|
743
|
+
completedRoutes: Route<TContext, TData>[];
|
|
744
|
+
pendingTransitions: Array<{
|
|
745
|
+
route: Route<TContext, TData>;
|
|
746
|
+
transitionConfig: RouteTransitionConfig<TContext, TData>;
|
|
747
|
+
}>;
|
|
748
|
+
}> {
|
|
749
|
+
const { routes, session, context } = params;
|
|
750
|
+
|
|
751
|
+
// Evaluate all routes for completion
|
|
752
|
+
const completedRoutes: Route<TContext, TData>[] = [];
|
|
753
|
+
const pendingTransitions: Array<{
|
|
754
|
+
route: Route<TContext, TData>;
|
|
755
|
+
transitionConfig: RouteTransitionConfig<TContext, TData>;
|
|
756
|
+
}> = [];
|
|
757
|
+
|
|
758
|
+
for (const route of routes) {
|
|
759
|
+
if (route.isComplete(session.data || {})) {
|
|
760
|
+
completedRoutes.push(route);
|
|
761
|
+
|
|
762
|
+
// Check for onComplete transitions
|
|
763
|
+
const transitionConfig = await route.evaluateOnComplete(
|
|
764
|
+
{ data: session.data },
|
|
765
|
+
context
|
|
766
|
+
);
|
|
767
|
+
|
|
768
|
+
if (transitionConfig) {
|
|
769
|
+
pendingTransitions.push({ route, transitionConfig });
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
logger.debug(
|
|
773
|
+
`[ResponsePipeline] Route completed: ${route.title} ` +
|
|
774
|
+
`(${Math.round(route.getCompletionProgress(session.data || {}) * 100)}%)`
|
|
775
|
+
);
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
// Log completion status for all routes
|
|
780
|
+
if (completedRoutes.length > 0) {
|
|
781
|
+
logger.debug(
|
|
782
|
+
`[ResponsePipeline] Cross-route completion evaluation: ` +
|
|
783
|
+
`${completedRoutes.length}/${routes.length} routes complete`
|
|
784
|
+
);
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
return {
|
|
788
|
+
session,
|
|
789
|
+
completedRoutes,
|
|
790
|
+
pendingTransitions,
|
|
791
|
+
};
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
/**
|
|
795
|
+
* Update data flow to ensure agent-level data consistency
|
|
796
|
+
* This method ensures that data updates are properly validated and propagated
|
|
797
|
+
*/
|
|
798
|
+
async updateDataFlow(params: {
|
|
799
|
+
session: SessionState<TData>;
|
|
800
|
+
dataUpdate: Partial<TData>;
|
|
801
|
+
routes: Route<TContext, TData>[];
|
|
802
|
+
}): Promise<SessionState<TData>> {
|
|
803
|
+
const { session, dataUpdate, routes } = params;
|
|
804
|
+
|
|
805
|
+
// Update session data
|
|
806
|
+
const updatedSession = await this.updateData(session, dataUpdate);
|
|
807
|
+
|
|
808
|
+
// Update agent-level data if handler is available
|
|
809
|
+
if (this.updateCollectedData) {
|
|
810
|
+
await this.updateCollectedData(dataUpdate);
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
// Evaluate route completions after data update
|
|
814
|
+
const completionResults = await this.handleCrossRouteCompletion({
|
|
815
|
+
routes,
|
|
816
|
+
session: updatedSession,
|
|
817
|
+
context: this.context!,
|
|
818
|
+
history: [],
|
|
819
|
+
});
|
|
820
|
+
|
|
821
|
+
// Log any newly completed routes
|
|
822
|
+
if (completionResults.completedRoutes.length > 0) {
|
|
823
|
+
logger.debug(
|
|
824
|
+
`[ResponsePipeline] Data update resulted in ${completionResults.completedRoutes.length} completed routes`
|
|
825
|
+
);
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
return completionResults.session;
|
|
829
|
+
}
|
|
830
|
+
}
|