@falai/agent 0.1.0-alpha2
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 +797 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts +47 -0
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/MemoryAdapter.js +202 -0
- package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/MongoAdapter.d.ts +97 -0
- package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/MongoAdapter.js +168 -0
- package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts +169 -0
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/OpenSearchAdapter.js +458 -0
- package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts +71 -0
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js +260 -0
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts +115 -0
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/PrismaAdapter.js +366 -0
- package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/RedisAdapter.d.ts +71 -0
- package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/RedisAdapter.js +231 -0
- package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts +69 -0
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/SQLiteAdapter.js +312 -0
- package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/index.d.ts +17 -0
- package/dist/cjs/src/adapters/index.d.ts.map +1 -0
- package/dist/cjs/src/adapters/index.js +21 -0
- package/dist/cjs/src/adapters/index.js.map +1 -0
- package/dist/cjs/src/constants/index.d.ts +10 -0
- package/dist/cjs/src/constants/index.d.ts.map +1 -0
- package/dist/cjs/src/constants/index.js +13 -0
- package/dist/cjs/src/constants/index.js.map +1 -0
- package/dist/cjs/src/core/Agent.d.ts +232 -0
- package/dist/cjs/src/core/Agent.d.ts.map +1 -0
- package/dist/cjs/src/core/Agent.js +741 -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/cjs/src/core/PersistenceManager.d.ts +98 -0
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/cjs/src/core/PersistenceManager.js +261 -0
- 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 +194 -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 +202 -0
- package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
- package/dist/cjs/src/core/ResponseModal.d.ts +222 -0
- package/dist/cjs/src/core/ResponseModal.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponseModal.js +1588 -0
- package/dist/cjs/src/core/ResponseModal.js.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts +175 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.js +549 -0
- package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
- package/dist/cjs/src/core/Route.d.ts +181 -0
- package/dist/cjs/src/core/Route.d.ts.map +1 -0
- package/dist/cjs/src/core/Route.js +541 -0
- package/dist/cjs/src/core/Route.js.map +1 -0
- package/dist/cjs/src/core/RoutingEngine.d.ts +159 -0
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/src/core/RoutingEngine.js +961 -0
- package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/src/core/SessionManager.d.ts +94 -0
- package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
- package/dist/cjs/src/core/SessionManager.js +239 -0
- package/dist/cjs/src/core/SessionManager.js.map +1 -0
- package/dist/cjs/src/core/Step.d.ts +170 -0
- package/dist/cjs/src/core/Step.d.ts.map +1 -0
- package/dist/cjs/src/core/Step.js +448 -0
- package/dist/cjs/src/core/Step.js.map +1 -0
- package/dist/cjs/src/core/ToolManager.d.ts +234 -0
- package/dist/cjs/src/core/ToolManager.d.ts.map +1 -0
- package/dist/cjs/src/core/ToolManager.js +1117 -0
- package/dist/cjs/src/core/ToolManager.js.map +1 -0
- package/dist/cjs/src/index.d.ts +44 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/src/index.js +88 -0
- package/dist/cjs/src/index.js.map +1 -0
- package/dist/cjs/src/providers/AnthropicProvider.d.ts +43 -0
- package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/cjs/src/providers/AnthropicProvider.js +377 -0
- package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/cjs/src/providers/GeminiProvider.d.ts +58 -0
- package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/cjs/src/providers/GeminiProvider.js +489 -0
- package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
- package/dist/cjs/src/providers/OpenAIProvider.d.ts +52 -0
- package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/cjs/src/providers/OpenAIProvider.js +395 -0
- package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts +56 -0
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/cjs/src/providers/OpenRouterProvider.js +409 -0
- package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/cjs/src/providers/index.d.ts +13 -0
- package/dist/cjs/src/providers/index.d.ts.map +1 -0
- package/dist/cjs/src/providers/index.js +16 -0
- package/dist/cjs/src/providers/index.js.map +1 -0
- package/dist/cjs/src/types/agent.d.ts +181 -0
- package/dist/cjs/src/types/agent.d.ts.map +1 -0
- package/dist/cjs/src/types/agent.js +21 -0
- package/dist/cjs/src/types/agent.js.map +1 -0
- package/dist/cjs/src/types/ai.d.ts +143 -0
- package/dist/cjs/src/types/ai.d.ts.map +1 -0
- package/dist/cjs/src/types/ai.js +6 -0
- package/dist/cjs/src/types/ai.js.map +1 -0
- package/dist/cjs/src/types/history.d.ts +178 -0
- 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 +22 -0
- package/dist/cjs/src/types/index.d.ts.map +1 -0
- package/dist/cjs/src/types/index.js +37 -0
- package/dist/cjs/src/types/index.js.map +1 -0
- package/dist/cjs/src/types/persistence.d.ts +209 -0
- package/dist/cjs/src/types/persistence.d.ts.map +1 -0
- package/dist/cjs/src/types/persistence.js +7 -0
- package/dist/cjs/src/types/persistence.js.map +1 -0
- package/dist/cjs/src/types/route.d.ts +238 -0
- package/dist/cjs/src/types/route.d.ts.map +1 -0
- package/dist/cjs/src/types/route.js +6 -0
- package/dist/cjs/src/types/route.js.map +1 -0
- package/dist/cjs/src/types/routing.d.ts +16 -0
- package/dist/cjs/src/types/routing.d.ts.map +1 -0
- package/dist/cjs/src/types/routing.js +3 -0
- package/dist/cjs/src/types/routing.js.map +1 -0
- package/dist/cjs/src/types/schema.d.ts +22 -0
- package/dist/cjs/src/types/schema.d.ts.map +1 -0
- package/dist/cjs/src/types/schema.js +3 -0
- package/dist/cjs/src/types/schema.js.map +1 -0
- 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 +88 -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/src/types/tool.d.ts +130 -0
- package/dist/cjs/src/types/tool.d.ts.map +1 -0
- package/dist/cjs/src/types/tool.js +19 -0
- package/dist/cjs/src/types/tool.js.map +1 -0
- 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 +32 -0
- package/dist/cjs/src/utils/clone.js.map +1 -0
- package/dist/cjs/src/utils/condition.d.ts +38 -0
- package/dist/cjs/src/utils/condition.d.ts.map +1 -0
- package/dist/cjs/src/utils/condition.js +168 -0
- package/dist/cjs/src/utils/condition.js.map +1 -0
- package/dist/cjs/src/utils/event.d.ts +6 -0
- package/dist/cjs/src/utils/event.d.ts.map +1 -0
- package/dist/cjs/src/utils/event.js +20 -0
- package/dist/cjs/src/utils/event.js.map +1 -0
- package/dist/cjs/src/utils/history.d.ts +60 -0
- package/dist/cjs/src/utils/history.d.ts.map +1 -0
- package/dist/cjs/src/utils/history.js +274 -0
- package/dist/cjs/src/utils/history.js.map +1 -0
- package/dist/cjs/src/utils/id.d.ts +25 -0
- package/dist/cjs/src/utils/id.d.ts.map +1 -0
- package/dist/cjs/src/utils/id.js +70 -0
- package/dist/cjs/src/utils/id.js.map +1 -0
- package/dist/cjs/src/utils/index.d.ts +15 -0
- package/dist/cjs/src/utils/index.d.ts.map +1 -0
- package/dist/cjs/src/utils/index.js +64 -0
- package/dist/cjs/src/utils/index.js.map +1 -0
- package/dist/cjs/src/utils/json.d.ts +16 -0
- package/dist/cjs/src/utils/json.d.ts.map +1 -0
- package/dist/cjs/src/utils/json.js +47 -0
- package/dist/cjs/src/utils/json.js.map +1 -0
- package/dist/cjs/src/utils/logger.d.ts +10 -0
- package/dist/cjs/src/utils/logger.d.ts.map +1 -0
- package/dist/cjs/src/utils/logger.js +23 -0
- package/dist/cjs/src/utils/logger.js.map +1 -0
- package/dist/cjs/src/utils/retry.d.ts +10 -0
- package/dist/cjs/src/utils/retry.d.ts.map +1 -0
- package/dist/cjs/src/utils/retry.js +76 -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/src/utils/session.js +170 -0
- package/dist/cjs/src/utils/session.js.map +1 -0
- package/dist/cjs/src/utils/template.d.ts +155 -0
- package/dist/cjs/src/utils/template.d.ts.map +1 -0
- package/dist/cjs/src/utils/template.js +383 -0
- package/dist/cjs/src/utils/template.js.map +1 -0
- package/dist/src/adapters/MemoryAdapter.d.ts +47 -0
- package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/src/adapters/MemoryAdapter.js +198 -0
- package/dist/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/src/adapters/MongoAdapter.d.ts +97 -0
- package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/src/adapters/MongoAdapter.js +164 -0
- package/dist/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/src/adapters/OpenSearchAdapter.d.ts +169 -0
- package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/src/adapters/OpenSearchAdapter.js +454 -0
- package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/src/adapters/PostgreSQLAdapter.d.ts +71 -0
- package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/src/adapters/PostgreSQLAdapter.js +256 -0
- package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/src/adapters/PrismaAdapter.d.ts +115 -0
- package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/src/adapters/PrismaAdapter.js +362 -0
- package/dist/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/src/adapters/RedisAdapter.d.ts +71 -0
- package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/src/adapters/RedisAdapter.js +227 -0
- package/dist/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/src/adapters/SQLiteAdapter.d.ts +69 -0
- package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/src/adapters/SQLiteAdapter.js +308 -0
- package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/src/adapters/index.d.ts +17 -0
- package/dist/src/adapters/index.d.ts.map +1 -0
- package/dist/src/adapters/index.js +11 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/constants/index.d.ts +10 -0
- package/dist/src/constants/index.d.ts.map +1 -0
- package/dist/src/constants/index.js +10 -0
- package/dist/src/constants/index.js.map +1 -0
- package/dist/src/core/Agent.d.ts +232 -0
- package/dist/src/core/Agent.d.ts.map +1 -0
- package/dist/src/core/Agent.js +737 -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/src/core/PersistenceManager.d.ts +98 -0
- package/dist/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/src/core/PersistenceManager.js +257 -0
- 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 +190 -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 +198 -0
- package/dist/src/core/ResponseEngine.js.map +1 -0
- package/dist/src/core/ResponseModal.d.ts +222 -0
- package/dist/src/core/ResponseModal.d.ts.map +1 -0
- package/dist/src/core/ResponseModal.js +1583 -0
- package/dist/src/core/ResponseModal.js.map +1 -0
- package/dist/src/core/ResponsePipeline.d.ts +175 -0
- package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/src/core/ResponsePipeline.js +545 -0
- package/dist/src/core/ResponsePipeline.js.map +1 -0
- package/dist/src/core/Route.d.ts +181 -0
- package/dist/src/core/Route.d.ts.map +1 -0
- package/dist/src/core/Route.js +537 -0
- package/dist/src/core/Route.js.map +1 -0
- package/dist/src/core/RoutingEngine.d.ts +159 -0
- package/dist/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/src/core/RoutingEngine.js +957 -0
- package/dist/src/core/RoutingEngine.js.map +1 -0
- package/dist/src/core/SessionManager.d.ts +94 -0
- package/dist/src/core/SessionManager.d.ts.map +1 -0
- package/dist/src/core/SessionManager.js +235 -0
- package/dist/src/core/SessionManager.js.map +1 -0
- package/dist/src/core/Step.d.ts +170 -0
- package/dist/src/core/Step.d.ts.map +1 -0
- package/dist/src/core/Step.js +444 -0
- package/dist/src/core/Step.js.map +1 -0
- package/dist/src/core/ToolManager.d.ts +234 -0
- package/dist/src/core/ToolManager.d.ts.map +1 -0
- package/dist/src/core/ToolManager.js +1111 -0
- package/dist/src/core/ToolManager.js.map +1 -0
- package/dist/src/index.d.ts +44 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +37 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/providers/AnthropicProvider.d.ts +43 -0
- package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/src/providers/AnthropicProvider.js +370 -0
- package/dist/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/src/providers/GeminiProvider.d.ts +58 -0
- package/dist/src/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/src/providers/GeminiProvider.js +485 -0
- package/dist/src/providers/GeminiProvider.js.map +1 -0
- package/dist/src/providers/OpenAIProvider.d.ts +52 -0
- package/dist/src/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/src/providers/OpenAIProvider.js +388 -0
- package/dist/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/src/providers/OpenRouterProvider.d.ts +56 -0
- package/dist/src/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/src/providers/OpenRouterProvider.js +402 -0
- package/dist/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/src/providers/index.d.ts +13 -0
- package/dist/src/providers/index.d.ts.map +1 -0
- package/dist/src/providers/index.js +9 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/src/types/agent.d.ts +181 -0
- package/dist/src/types/agent.d.ts.map +1 -0
- package/dist/src/types/agent.js +18 -0
- package/dist/src/types/agent.js.map +1 -0
- package/dist/src/types/ai.d.ts +143 -0
- package/dist/src/types/ai.d.ts.map +1 -0
- package/dist/src/types/ai.js +5 -0
- package/dist/src/types/ai.js.map +1 -0
- package/dist/src/types/history.d.ts +178 -0
- 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 +22 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +12 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/persistence.d.ts +209 -0
- package/dist/src/types/persistence.d.ts.map +1 -0
- package/dist/src/types/persistence.js +6 -0
- package/dist/src/types/persistence.js.map +1 -0
- package/dist/src/types/route.d.ts +238 -0
- package/dist/src/types/route.d.ts.map +1 -0
- package/dist/src/types/route.js +5 -0
- package/dist/src/types/route.js.map +1 -0
- package/dist/src/types/routing.d.ts +16 -0
- package/dist/src/types/routing.d.ts.map +1 -0
- package/dist/src/types/routing.js +2 -0
- package/dist/src/types/routing.js.map +1 -0
- package/dist/src/types/schema.d.ts +22 -0
- package/dist/src/types/schema.d.ts.map +1 -0
- package/dist/src/types/schema.js +2 -0
- package/dist/src/types/schema.js.map +1 -0
- 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 +88 -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/src/types/tool.d.ts +130 -0
- package/dist/src/types/tool.d.ts.map +1 -0
- package/dist/src/types/tool.js +16 -0
- package/dist/src/types/tool.js.map +1 -0
- 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 +29 -0
- package/dist/src/utils/clone.js.map +1 -0
- package/dist/src/utils/condition.d.ts +38 -0
- package/dist/src/utils/condition.d.ts.map +1 -0
- package/dist/src/utils/condition.js +161 -0
- package/dist/src/utils/condition.js.map +1 -0
- package/dist/src/utils/event.d.ts +6 -0
- package/dist/src/utils/event.d.ts.map +1 -0
- package/dist/src/utils/event.js +17 -0
- package/dist/src/utils/event.js.map +1 -0
- package/dist/src/utils/history.d.ts +60 -0
- package/dist/src/utils/history.d.ts.map +1 -0
- package/dist/src/utils/history.js +263 -0
- package/dist/src/utils/history.js.map +1 -0
- package/dist/src/utils/id.d.ts +25 -0
- package/dist/src/utils/id.d.ts.map +1 -0
- package/dist/src/utils/id.js +64 -0
- package/dist/src/utils/id.js.map +1 -0
- package/dist/src/utils/index.d.ts +15 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +23 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/json.d.ts +16 -0
- package/dist/src/utils/json.d.ts.map +1 -0
- package/dist/src/utils/json.js +43 -0
- package/dist/src/utils/json.js.map +1 -0
- package/dist/src/utils/logger.d.ts +10 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +17 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/retry.d.ts +10 -0
- package/dist/src/utils/retry.d.ts.map +1 -0
- package/dist/src/utils/retry.js +71 -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/src/utils/session.js +160 -0
- package/dist/src/utils/session.js.map +1 -0
- package/dist/src/utils/template.d.ts +155 -0
- package/dist/src/utils/template.d.ts.map +1 -0
- package/dist/src/utils/template.js +374 -0
- package/dist/src/utils/template.js.map +1 -0
- package/docs/CONTRIBUTING.md +521 -0
- package/docs/README.md +228 -0
- package/docs/api/README.md +3258 -0
- package/docs/api/overview.md +1134 -0
- package/docs/architecture/data-extraction-flow.md +363 -0
- package/docs/core/agent/README.md +902 -0
- package/docs/core/agent/context-management.md +796 -0
- package/docs/core/agent/session-management.md +641 -0
- 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 +287 -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 +247 -0
- package/docs/core/conversation-flows/step-transitions.md +595 -0
- package/docs/core/conversation-flows/steps.md +154 -0
- package/docs/core/error-handling.md +638 -0
- package/docs/core/persistence/adapters.md +255 -0
- package/docs/core/persistence/session-storage.md +644 -0
- package/docs/core/routing/intelligent-routing.md +466 -0
- package/docs/core/tools/tool-definition.md +970 -0
- package/docs/core/tools/tool-scoping.md +819 -0
- package/docs/guides/advanced-patterns/publishing.md +186 -0
- package/docs/guides/error-handling-patterns.md +578 -0
- package/docs/guides/getting-started/README.md +696 -0
- package/docs/guides/migration/README.md +72 -0
- package/docs/guides/migration/flexible-routing-conditions.md +375 -0
- package/docs/guides/migration/response-modal-refactor.md +518 -0
- package/examples/advanced-patterns/knowledge-based-agent.ts +735 -0
- package/examples/advanced-patterns/persistent-onboarding.ts +728 -0
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +556 -0
- package/examples/advanced-patterns/streaming-responses.ts +578 -0
- package/examples/ai-providers/anthropic-integration.ts +388 -0
- package/examples/ai-providers/openai-integration.ts +228 -0
- package/examples/condition-patterns/function-only-conditions.ts +365 -0
- package/examples/condition-patterns/mixed-array-conditions.ts +477 -0
- package/examples/condition-patterns/route-skipif-patterns.ts +468 -0
- package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
- package/examples/condition-patterns/string-only-conditions.ts +296 -0
- package/examples/conversation-flows/completion-transitions.ts +318 -0
- package/examples/core-concepts/basic-agent.ts +503 -0
- package/examples/core-concepts/modern-streaming-api.ts +309 -0
- package/examples/core-concepts/schema-driven-extraction.ts +332 -0
- package/examples/core-concepts/session-management.ts +494 -0
- package/examples/integrations/database-integration.ts +630 -0
- package/examples/integrations/healthcare-integration.ts +595 -0
- package/examples/integrations/search-integration.ts +530 -0
- package/examples/integrations/server-session-management.ts +307 -0
- package/examples/persistence/custom-adapter.ts +529 -0
- package/examples/persistence/database-persistence.ts +583 -0
- package/examples/persistence/memory-sessions.ts +495 -0
- package/examples/persistence/prisma-schema.example.prisma +74 -0
- package/examples/persistence/redis-persistence.ts +488 -0
- package/examples/tools/basic-tools.ts +765 -0
- package/examples/tools/data-enrichment-tools.ts +593 -0
- package/package.json +125 -0
- package/src/adapters/MemoryAdapter.ts +273 -0
- package/src/adapters/MongoAdapter.ts +304 -0
- package/src/adapters/OpenSearchAdapter.ts +670 -0
- package/src/adapters/PostgreSQLAdapter.ts +428 -0
- package/src/adapters/PrismaAdapter.ts +553 -0
- package/src/adapters/RedisAdapter.ts +377 -0
- package/src/adapters/SQLiteAdapter.ts +459 -0
- package/src/adapters/index.ts +43 -0
- package/src/constants/index.ts +10 -0
- package/src/core/Agent.ts +970 -0
- package/src/core/Events.ts +164 -0
- package/src/core/PersistenceManager.ts +353 -0
- package/src/core/PromptComposer.ts +253 -0
- package/src/core/ResponseEngine.ts +306 -0
- package/src/core/ResponseModal.ts +2050 -0
- package/src/core/ResponsePipeline.ts +864 -0
- package/src/core/Route.ts +677 -0
- package/src/core/RoutingEngine.ts +1396 -0
- package/src/core/SessionManager.ts +297 -0
- package/src/core/Step.ts +593 -0
- package/src/core/ToolManager.ts +1394 -0
- package/src/index.ts +155 -0
- package/src/providers/AnthropicProvider.ts +560 -0
- package/src/providers/GeminiProvider.ts +683 -0
- package/src/providers/OpenAIProvider.ts +602 -0
- package/src/providers/OpenRouterProvider.ts +613 -0
- package/src/providers/index.ts +16 -0
- package/src/types/agent.ts +196 -0
- package/src/types/ai.ts +158 -0
- package/src/types/history.ts +206 -0
- package/src/types/index.ts +119 -0
- package/src/types/persistence.ts +251 -0
- package/src/types/route.ts +272 -0
- package/src/types/routing.ts +18 -0
- package/src/types/schema.ts +23 -0
- package/src/types/session.ts +74 -0
- package/src/types/template.ts +104 -0
- package/src/types/tool.ts +174 -0
- package/src/utils/clone.ts +34 -0
- package/src/utils/condition.ts +190 -0
- package/src/utils/event.ts +16 -0
- package/src/utils/history.ts +306 -0
- package/src/utils/id.ts +73 -0
- package/src/utils/index.ts +69 -0
- package/src/utils/json.ts +46 -0
- package/src/utils/logger.ts +19 -0
- package/src/utils/retry.ts +97 -0
- package/src/utils/session.ts +204 -0
- package/src/utils/template.ts +444 -0
|
@@ -0,0 +1,970 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Agent implementation
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type {
|
|
6
|
+
AgentOptions,
|
|
7
|
+
Term,
|
|
8
|
+
Guideline,
|
|
9
|
+
GuidelineMatch,
|
|
10
|
+
Tool,
|
|
11
|
+
Event,
|
|
12
|
+
RouteOptions,
|
|
13
|
+
SessionState,
|
|
14
|
+
Template,
|
|
15
|
+
AgentResponseStreamChunk,
|
|
16
|
+
AgentResponse,
|
|
17
|
+
StructuredSchema,
|
|
18
|
+
ValidationError,
|
|
19
|
+
ValidationResult,
|
|
20
|
+
|
|
21
|
+
} from "../types";
|
|
22
|
+
import type { StreamOptions, GenerateOptions, RespondParams } from "./ResponseModal";
|
|
23
|
+
import {
|
|
24
|
+
mergeCollected,
|
|
25
|
+
logger,
|
|
26
|
+
LoggerLevel,
|
|
27
|
+
render,
|
|
28
|
+
createTemplateContext,
|
|
29
|
+
createConditionEvaluator,
|
|
30
|
+
} from "../utils";
|
|
31
|
+
|
|
32
|
+
import { Route } from "./Route";
|
|
33
|
+
import { Step } from "./Step";
|
|
34
|
+
import { PersistenceManager } from "./PersistenceManager";
|
|
35
|
+
import { SessionManager } from "./SessionManager";
|
|
36
|
+
import { RoutingEngine } from "./RoutingEngine";
|
|
37
|
+
|
|
38
|
+
import { ResponseModal } from "./ResponseModal";
|
|
39
|
+
import { ToolManager } from "./ToolManager";
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Error thrown when data validation fails
|
|
43
|
+
*/
|
|
44
|
+
class DataValidationError extends Error {
|
|
45
|
+
constructor(public errors: ValidationError[], message?: string) {
|
|
46
|
+
super(message || "Data validation failed");
|
|
47
|
+
this.name = "DataValidationError";
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Error thrown when route configuration is invalid
|
|
53
|
+
*/
|
|
54
|
+
class RouteConfigurationError extends Error {
|
|
55
|
+
constructor(public routeTitle: string, public invalidFields: string[], message?: string) {
|
|
56
|
+
super(message || `Route configuration error in '${routeTitle}'`);
|
|
57
|
+
this.name = "RouteConfigurationError";
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Main Agent class with generic context and data support
|
|
63
|
+
*/
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
65
|
+
export class Agent<TContext = any, TData = any> {
|
|
66
|
+
private terms: Term<TContext, TData>[] = [];
|
|
67
|
+
private guidelines: Guideline<TContext, TData>[] = [];
|
|
68
|
+
private tools: Tool<TContext, TData>[] = [];
|
|
69
|
+
private routes: Route<TContext, TData>[] = [];
|
|
70
|
+
private context: TContext | undefined;
|
|
71
|
+
private persistenceManager: PersistenceManager<TData> | undefined;
|
|
72
|
+
private routingEngine: RoutingEngine<TContext, TData>;
|
|
73
|
+
private responseModal: ResponseModal<TContext, TData>;
|
|
74
|
+
private currentSession?: SessionState<TData>;
|
|
75
|
+
private knowledgeBase: Record<string, unknown> = {};
|
|
76
|
+
private schema?: StructuredSchema;
|
|
77
|
+
private collectedData: Partial<TData> = {};
|
|
78
|
+
|
|
79
|
+
/** Public session manager for easy session management */
|
|
80
|
+
public session: SessionManager<TData>;
|
|
81
|
+
|
|
82
|
+
/** Public tool manager for simplified tool creation and management */
|
|
83
|
+
public tool: ToolManager<TContext, TData>;
|
|
84
|
+
|
|
85
|
+
constructor(private readonly options: AgentOptions<TContext, TData>) {
|
|
86
|
+
// Set log level based on debug option
|
|
87
|
+
if (options.debug) {
|
|
88
|
+
logger.setLevel(LoggerLevel.DEBUG);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Validate context configuration
|
|
92
|
+
if (options.context !== undefined && options.contextProvider) {
|
|
93
|
+
throw new Error(
|
|
94
|
+
"Cannot provide both 'context' and 'contextProvider'. Choose one."
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Initialize and validate agent-level schema if provided
|
|
99
|
+
if (options.schema) {
|
|
100
|
+
this.schema = options.schema;
|
|
101
|
+
this.validateSchema(this.schema);
|
|
102
|
+
logger.debug("[Agent] Agent-level schema initialized and validated");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Initialize context if provided
|
|
106
|
+
this.context = options.context;
|
|
107
|
+
|
|
108
|
+
// Initialize collected data with initial data if provided
|
|
109
|
+
if (options.initialData) {
|
|
110
|
+
if (this.schema) {
|
|
111
|
+
const validation = this.validateData(options.initialData);
|
|
112
|
+
if (!validation.valid) {
|
|
113
|
+
throw new Error(
|
|
114
|
+
`Initial data validation failed: ${validation.errors.map(e => e.message).join(', ')}`
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
this.collectedData = { ...options.initialData };
|
|
119
|
+
logger.debug("[Agent] Initial data set:", this.collectedData);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Initialize current session if provided
|
|
123
|
+
this.currentSession = options.session;
|
|
124
|
+
|
|
125
|
+
// Initialize routing engine
|
|
126
|
+
this.routingEngine = new RoutingEngine<TContext, TData>({
|
|
127
|
+
maxCandidates: 5,
|
|
128
|
+
allowRouteSwitch: true,
|
|
129
|
+
switchThreshold: 70,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// Initialize ResponseModal for handling all response generation
|
|
133
|
+
this.responseModal = new ResponseModal<TContext, TData>(this);
|
|
134
|
+
|
|
135
|
+
// Initialize persistence if configured
|
|
136
|
+
if (options.persistence) {
|
|
137
|
+
try {
|
|
138
|
+
// Validate persistence configuration
|
|
139
|
+
if (!options.persistence.adapter) {
|
|
140
|
+
throw new Error("Persistence adapter is required when persistence is configured");
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (!options.persistence.adapter.sessionRepository) {
|
|
144
|
+
throw new Error("Persistence adapter must provide a sessionRepository");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (!options.persistence.adapter.messageRepository) {
|
|
148
|
+
throw new Error("Persistence adapter must provide a messageRepository");
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
this.persistenceManager = new PersistenceManager<TData>(options.persistence);
|
|
152
|
+
|
|
153
|
+
// Initialize the adapter if it has an initialize method
|
|
154
|
+
if (options.persistence.adapter.initialize) {
|
|
155
|
+
options.persistence.adapter.initialize().catch((error) => {
|
|
156
|
+
logger.error(
|
|
157
|
+
"[Agent] Persistence adapter initialization failed:",
|
|
158
|
+
error instanceof Error ? error.message : String(error)
|
|
159
|
+
);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
} catch (error) {
|
|
163
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
164
|
+
logger.error("[Agent] Failed to initialize persistence:", errorMessage);
|
|
165
|
+
throw new Error(`Failed to initialize persistence: ${errorMessage}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Initialize from options - use create methods for consistency
|
|
170
|
+
if (options.terms) {
|
|
171
|
+
options.terms.forEach((term) => {
|
|
172
|
+
this.createTerm(term);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (options.guidelines) {
|
|
177
|
+
options.guidelines.forEach((guideline) => {
|
|
178
|
+
this.createGuideline(guideline);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (options.tools) {
|
|
183
|
+
options.tools.forEach((tool) => {
|
|
184
|
+
this.createTool(tool);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (options.routes) {
|
|
189
|
+
options.routes.forEach((routeOptions) => {
|
|
190
|
+
this.createRoute(routeOptions);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Initialize knowledge base
|
|
195
|
+
if (options.knowledgeBase) {
|
|
196
|
+
this.knowledgeBase = { ...options.knowledgeBase };
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Initialize session manager with reference to this agent for bidirectional sync
|
|
200
|
+
this.session = new SessionManager<TData>(this.persistenceManager, this);
|
|
201
|
+
|
|
202
|
+
// Initialize tool manager with proper type inference
|
|
203
|
+
this.tool = new ToolManager<TContext, TData>(this);
|
|
204
|
+
|
|
205
|
+
// Store sessionId for later use in getOrCreate calls
|
|
206
|
+
if (options.sessionId) {
|
|
207
|
+
this.session.setDefaultSessionId(options.sessionId);
|
|
208
|
+
// The session will be loaded on first getOrCreate call
|
|
209
|
+
this.session.getOrCreate(options.sessionId).then((session) => {
|
|
210
|
+
// Sync session data to agent collected data
|
|
211
|
+
if (session.data && Object.keys(session.data).length > 0) {
|
|
212
|
+
this.collectedData = { ...session.data };
|
|
213
|
+
logger.debug("[Agent] Synced session data to collected data:", this.collectedData);
|
|
214
|
+
}
|
|
215
|
+
}).catch((err) => {
|
|
216
|
+
logger.error("Failed to start session", err);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Validate the agent-level schema structure
|
|
223
|
+
* @private
|
|
224
|
+
*/
|
|
225
|
+
private validateSchema(schema: StructuredSchema): void {
|
|
226
|
+
if (!schema || typeof schema !== 'object') {
|
|
227
|
+
throw new Error(
|
|
228
|
+
"Agent schema must be a valid JSON Schema object. " +
|
|
229
|
+
"Provide a schema with 'type': 'object' and 'properties' to define the data structure."
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (schema.type !== 'object') {
|
|
234
|
+
throw new Error(
|
|
235
|
+
`Agent schema must be of type 'object', but received '${String(schema.type)}'. ` +
|
|
236
|
+
"Agent-level schemas must define object structures for data collection."
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (!schema.properties || typeof schema.properties !== 'object') {
|
|
241
|
+
throw new Error(
|
|
242
|
+
"Agent schema must have a 'properties' field defining the data fields. " +
|
|
243
|
+
"Example: { type: 'object', properties: { name: { type: 'string' }, email: { type: 'string' } } }"
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
logger.debug("[Agent] Schema validation passed");
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Validate data against the agent-level schema
|
|
252
|
+
*/
|
|
253
|
+
validateData(data: Partial<TData>): ValidationResult {
|
|
254
|
+
if (!this.schema) {
|
|
255
|
+
// No schema defined, consider all data valid
|
|
256
|
+
return { valid: true, errors: [], warnings: [] };
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const errors: ValidationError[] = [];
|
|
260
|
+
const warnings: ValidationError[] = [];
|
|
261
|
+
|
|
262
|
+
// Basic validation - check if provided fields exist in schema
|
|
263
|
+
if (this.schema.properties) {
|
|
264
|
+
for (const [key, value] of Object.entries(data)) {
|
|
265
|
+
if (!(key in this.schema.properties)) {
|
|
266
|
+
errors.push({
|
|
267
|
+
field: key,
|
|
268
|
+
value,
|
|
269
|
+
message: `Field '${key}' is not defined in agent schema`,
|
|
270
|
+
schemaPath: `properties.${key}`
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Check required fields if specified
|
|
277
|
+
if (this.schema.required && Array.isArray(this.schema.required)) {
|
|
278
|
+
for (const requiredField of this.schema.required) {
|
|
279
|
+
if (!(requiredField in data) || data[requiredField as keyof TData] === undefined) {
|
|
280
|
+
warnings.push({
|
|
281
|
+
field: requiredField,
|
|
282
|
+
value: undefined,
|
|
283
|
+
message: `Required field '${requiredField}' is missing`,
|
|
284
|
+
schemaPath: `required`
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return {
|
|
291
|
+
valid: errors.length === 0,
|
|
292
|
+
errors,
|
|
293
|
+
warnings
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Check if a field is valid according to the agent schema
|
|
299
|
+
* @param field - The field key to validate
|
|
300
|
+
* @returns true if field exists in schema or no schema is defined, false otherwise
|
|
301
|
+
*/
|
|
302
|
+
isValidSchemaField(field: keyof TData): boolean {
|
|
303
|
+
if (!this.schema || !this.schema.properties) {
|
|
304
|
+
// No schema defined, consider all fields valid
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return field as string in this.schema.properties;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Get the current collected data
|
|
313
|
+
*/
|
|
314
|
+
getCollectedData(): Partial<TData> {
|
|
315
|
+
// Ensure agent collected data is synced with session
|
|
316
|
+
this.syncSessionDataToCollectedData();
|
|
317
|
+
return { ...this.collectedData };
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Update collected data with validation
|
|
322
|
+
*/
|
|
323
|
+
async updateCollectedData(updates: Partial<TData>): Promise<void> {
|
|
324
|
+
// Validate the updates
|
|
325
|
+
const validation = this.validateData(updates);
|
|
326
|
+
if (!validation.valid) {
|
|
327
|
+
const errorMessages = validation.errors.map(e => e.message).join(', ');
|
|
328
|
+
throw new DataValidationError(validation.errors, `Data validation failed: ${errorMessages}`);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Log warnings if any
|
|
332
|
+
if (validation.warnings.length > 0) {
|
|
333
|
+
const warningMessages = validation.warnings.map(w => w.message).join(', ');
|
|
334
|
+
logger.warn(`[Agent] Data validation warnings: ${warningMessages}`);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// Merge updates with current data
|
|
338
|
+
const previousData = { ...this.collectedData };
|
|
339
|
+
this.collectedData = {
|
|
340
|
+
...this.collectedData,
|
|
341
|
+
...updates
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
// Trigger agent-level lifecycle hook if configured
|
|
345
|
+
if (this.options.hooks?.onDataUpdate) {
|
|
346
|
+
this.collectedData = await this.options.hooks.onDataUpdate(
|
|
347
|
+
this.collectedData,
|
|
348
|
+
previousData
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Update current session if it exists to keep it in sync
|
|
353
|
+
if (this.currentSession) {
|
|
354
|
+
this.currentSession = mergeCollected(this.currentSession, this.collectedData);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// Also update the session manager's session data (avoid circular call)
|
|
358
|
+
const sessionManagerSession = this.session.current;
|
|
359
|
+
if (sessionManagerSession) {
|
|
360
|
+
sessionManagerSession.data = { ...this.collectedData };
|
|
361
|
+
sessionManagerSession.metadata!.lastUpdatedAt = new Date();
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
logger.debug("[Agent] Collected data updated:", updates);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Get agent name
|
|
369
|
+
*/
|
|
370
|
+
get name(): string {
|
|
371
|
+
return this.options.name;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Get agent description
|
|
376
|
+
*/
|
|
377
|
+
get description(): string | undefined {
|
|
378
|
+
return this.options.description;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Get agent goal
|
|
383
|
+
*/
|
|
384
|
+
get goal(): string | undefined {
|
|
385
|
+
return this.options.goal;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Get agent identity
|
|
390
|
+
*/
|
|
391
|
+
get identity(): Template<TContext> | undefined {
|
|
392
|
+
return this.options.identity;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Create a new route (journey) using agent-level data type
|
|
397
|
+
*/
|
|
398
|
+
createRoute(
|
|
399
|
+
options: RouteOptions<TContext, TData>
|
|
400
|
+
): Route<TContext, TData> {
|
|
401
|
+
// Validate that requiredFields exist in agent schema
|
|
402
|
+
if (options.requiredFields && this.schema?.properties) {
|
|
403
|
+
const invalidRequiredFields = options.requiredFields.filter(
|
|
404
|
+
field => !(String(field) in this.schema!.properties!)
|
|
405
|
+
);
|
|
406
|
+
if (invalidRequiredFields.length > 0) {
|
|
407
|
+
throw new RouteConfigurationError(
|
|
408
|
+
options.title,
|
|
409
|
+
invalidRequiredFields.map(f => String(f)),
|
|
410
|
+
`Invalid required fields in route '${options.title}': ${invalidRequiredFields.join(', ')}. ` +
|
|
411
|
+
`Must be valid keys from agent schema. Available fields: ${Object.keys(this.schema.properties).join(', ')}.`
|
|
412
|
+
);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Validate that optionalFields exist in agent schema
|
|
417
|
+
if (options.optionalFields && this.schema?.properties) {
|
|
418
|
+
const invalidOptionalFields = options.optionalFields.filter(
|
|
419
|
+
field => !(String(field) in this.schema!.properties!)
|
|
420
|
+
);
|
|
421
|
+
if (invalidOptionalFields.length > 0) {
|
|
422
|
+
throw new RouteConfigurationError(
|
|
423
|
+
options.title,
|
|
424
|
+
invalidOptionalFields.map(f => String(f)),
|
|
425
|
+
`Invalid optional fields in route '${options.title}': ${invalidOptionalFields.join(', ')}. ` +
|
|
426
|
+
`Must be valid keys from agent schema. Available fields: ${Object.keys(this.schema.properties).join(', ')}.`
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
const route = new Route<TContext, TData>(options, this);
|
|
432
|
+
this.routes.push(route);
|
|
433
|
+
return route;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Create a domain term for the glossary
|
|
438
|
+
*/
|
|
439
|
+
createTerm(term: Term<TContext, TData>): this {
|
|
440
|
+
this.terms.push(term);
|
|
441
|
+
return this;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Create a behavioral guideline
|
|
446
|
+
*/
|
|
447
|
+
createGuideline(guideline: Guideline<TContext, TData>): this {
|
|
448
|
+
const guidelineWithId = {
|
|
449
|
+
...guideline,
|
|
450
|
+
id: guideline.id || `guideline_${this.guidelines.length}`,
|
|
451
|
+
enabled: guideline.enabled !== false, // Default to true
|
|
452
|
+
};
|
|
453
|
+
this.guidelines.push(guidelineWithId);
|
|
454
|
+
return this;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* Add a tool to the agent using the unified Tool interface
|
|
459
|
+
* Creates and adds the tool to agent scope in one operation (BREAKING CHANGE: replaces createTool)
|
|
460
|
+
*/
|
|
461
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
462
|
+
addTool<TResult = any>(
|
|
463
|
+
tool: Tool<TContext, TData, TResult>
|
|
464
|
+
): this {
|
|
465
|
+
// Validate tool before adding
|
|
466
|
+
if (!tool || !tool.id || !tool.handler) {
|
|
467
|
+
throw new Error('Invalid tool: must have id and handler properties');
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// Add directly to agent's tools array, preserving the TResult type
|
|
471
|
+
this.tools.push(tool);
|
|
472
|
+
logger.debug(`[Agent] Added tool to agent scope: ${tool.id}`);
|
|
473
|
+
return this;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Register a tool at the agent level (legacy method for backward compatibility)
|
|
478
|
+
* @deprecated Use addTool() with Tool interface instead
|
|
479
|
+
*/
|
|
480
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
481
|
+
createTool<TResult = any>(tool: Tool<TContext, TData, TResult>): this {
|
|
482
|
+
// Validate tool before adding
|
|
483
|
+
if (!tool || !tool.id || !tool.handler) {
|
|
484
|
+
throw new Error('Invalid tool: must have id and handler properties');
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
this.tools.push(tool);
|
|
488
|
+
logger.debug(`[Agent] Created tool (legacy): ${tool.id}`);
|
|
489
|
+
return this;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Register multiple tools at the agent level
|
|
494
|
+
*/
|
|
495
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
496
|
+
registerTools<TResult = any>(tools: Tool<TContext, TData, TResult>[]): this {
|
|
497
|
+
tools.forEach((tool) => {
|
|
498
|
+
// Validate each tool before adding
|
|
499
|
+
if (!tool || !tool.id || !tool.handler) {
|
|
500
|
+
throw new Error(`Invalid tool in batch: must have id and handler properties (tool: ${tool?.id || 'unknown'})`);
|
|
501
|
+
}
|
|
502
|
+
this.tools.push(tool);
|
|
503
|
+
});
|
|
504
|
+
logger.debug(`[Agent] Registered ${tools.length} tools`);
|
|
505
|
+
return this;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* Update the agent's context
|
|
510
|
+
* Triggers both agent-level and route-specific onContextUpdate lifecycle hooks if configured
|
|
511
|
+
*/
|
|
512
|
+
async updateContext(updates: Partial<TContext>): Promise<void> {
|
|
513
|
+
const previousContext = this.context;
|
|
514
|
+
|
|
515
|
+
// Merge updates with current context
|
|
516
|
+
this.context = {
|
|
517
|
+
...(this.context as Record<string, unknown>),
|
|
518
|
+
...(updates as Record<string, unknown>),
|
|
519
|
+
} as TContext;
|
|
520
|
+
|
|
521
|
+
// Trigger route-specific lifecycle hook if configured and session has current route
|
|
522
|
+
if (this.currentSession?.currentRoute) {
|
|
523
|
+
const currentRoute = this.routes.find(
|
|
524
|
+
(r) => r.id === this.currentSession!.currentRoute?.id
|
|
525
|
+
);
|
|
526
|
+
if (
|
|
527
|
+
currentRoute?.hooks?.onContextUpdate &&
|
|
528
|
+
previousContext !== undefined
|
|
529
|
+
) {
|
|
530
|
+
await currentRoute.handleContextUpdate(this.context, previousContext);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// Trigger agent-level lifecycle hook if configured
|
|
535
|
+
if (this.options.hooks?.onContextUpdate && previousContext !== undefined) {
|
|
536
|
+
await this.options.hooks.onContextUpdate(this.context, previousContext);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* Update collected data in session with lifecycle hook support
|
|
542
|
+
* Triggers both agent-level and route-specific onDataUpdate lifecycle hooks if configured
|
|
543
|
+
* @internal
|
|
544
|
+
*/
|
|
545
|
+
private async updateData(
|
|
546
|
+
session: SessionState<TData>,
|
|
547
|
+
dataUpdate: Partial<TData>
|
|
548
|
+
): Promise<SessionState<TData>> {
|
|
549
|
+
const previousCollected = { ...session.data };
|
|
550
|
+
|
|
551
|
+
// Merge new collected data
|
|
552
|
+
let newCollected = {
|
|
553
|
+
...session.data,
|
|
554
|
+
...dataUpdate,
|
|
555
|
+
};
|
|
556
|
+
|
|
557
|
+
// Trigger route-specific lifecycle hook if configured and session has a current route
|
|
558
|
+
if (session.currentRoute) {
|
|
559
|
+
const currentRoute = this.routes.find(
|
|
560
|
+
(r) => r.id === session.currentRoute?.id
|
|
561
|
+
);
|
|
562
|
+
if (currentRoute?.hooks?.onDataUpdate) {
|
|
563
|
+
newCollected = await currentRoute.handleDataUpdate(
|
|
564
|
+
newCollected,
|
|
565
|
+
previousCollected
|
|
566
|
+
);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// Trigger agent-level lifecycle hook if configured
|
|
571
|
+
if (this.options.hooks?.onDataUpdate) {
|
|
572
|
+
newCollected = (await this.options.hooks.onDataUpdate(
|
|
573
|
+
newCollected,
|
|
574
|
+
previousCollected
|
|
575
|
+
));
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
// Update agent's collected data to stay in sync
|
|
579
|
+
this.collectedData = { ...newCollected };
|
|
580
|
+
|
|
581
|
+
// Return updated session
|
|
582
|
+
return mergeCollected(session, newCollected);
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* Get current context (fetches from provider if configured)
|
|
587
|
+
*/
|
|
588
|
+
async getContext(): Promise<TContext | undefined> {
|
|
589
|
+
// If context provider is configured, use it to fetch fresh context
|
|
590
|
+
if (this.options.contextProvider) {
|
|
591
|
+
return await this.options.contextProvider();
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
// Otherwise return the stored context
|
|
595
|
+
return this.context;
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Get current schema
|
|
599
|
+
*/
|
|
600
|
+
getSchema(): StructuredSchema | undefined {
|
|
601
|
+
return this.schema;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
/**
|
|
605
|
+
* Generate a response based on history and context as a stream
|
|
606
|
+
*/
|
|
607
|
+
async *respondStream(params: RespondParams<TContext, TData>): AsyncGenerator<AgentResponseStreamChunk<TData>> {
|
|
608
|
+
// Delegate to ResponseModal
|
|
609
|
+
yield* this.responseModal.respondStream(params);
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
/**
|
|
613
|
+
* Generate a response based on history and context
|
|
614
|
+
*/
|
|
615
|
+
async respond(params: RespondParams<TContext, TData>): Promise<AgentResponse<TData>> {
|
|
616
|
+
// Delegate to ResponseModal
|
|
617
|
+
return this.responseModal.respond(params);
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
/**
|
|
621
|
+
* Get all routes
|
|
622
|
+
*/
|
|
623
|
+
getRoutes(): Route<TContext, TData>[] {
|
|
624
|
+
return [...this.routes];
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
/**
|
|
628
|
+
* Get agent options
|
|
629
|
+
* @internal Used by ResponseModal
|
|
630
|
+
*/
|
|
631
|
+
getAgentOptions(): AgentOptions<TContext, TData> {
|
|
632
|
+
return this.options;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/**
|
|
636
|
+
* Get routing engine
|
|
637
|
+
* @internal Used by ResponseModal
|
|
638
|
+
*/
|
|
639
|
+
getRoutingEngine(): RoutingEngine<TContext, TData> {
|
|
640
|
+
return this.routingEngine;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/**
|
|
644
|
+
* Get the updateData method bound to this agent
|
|
645
|
+
* @internal Used by ResponseModal
|
|
646
|
+
*/
|
|
647
|
+
getUpdateDataMethod(): (session: SessionState<TData>, dataUpdate: Partial<TData>) => Promise<SessionState<TData>> {
|
|
648
|
+
return this.updateData.bind(this);
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
|
|
652
|
+
|
|
653
|
+
/**
|
|
654
|
+
* Get all terms
|
|
655
|
+
*/
|
|
656
|
+
getTerms(): Term<TContext, TData>[] {
|
|
657
|
+
return [...this.terms];
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
/**
|
|
661
|
+
* Get all tools
|
|
662
|
+
*/
|
|
663
|
+
getTools(): Tool<TContext, TData>[] {
|
|
664
|
+
return [...this.tools];
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
/**
|
|
674
|
+
* Get all guidelines
|
|
675
|
+
*/
|
|
676
|
+
getGuidelines(): Guideline<TContext, TData>[] {
|
|
677
|
+
return [...this.guidelines];
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
/**
|
|
681
|
+
* Evaluate and match active guidelines based on their conditions
|
|
682
|
+
* Returns guidelines that should be active given the current context
|
|
683
|
+
*/
|
|
684
|
+
async evaluateGuidelines(
|
|
685
|
+
context?: TContext,
|
|
686
|
+
session?: SessionState<TData>,
|
|
687
|
+
history?: Event[]
|
|
688
|
+
): Promise<GuidelineMatch<TContext, TData>[]> {
|
|
689
|
+
const templateContext = { context, session, history, data: session?.data };
|
|
690
|
+
const evaluator = createConditionEvaluator(templateContext);
|
|
691
|
+
const matches: GuidelineMatch<TContext, TData>[] = [];
|
|
692
|
+
|
|
693
|
+
for (const guideline of this.guidelines) {
|
|
694
|
+
// Skip disabled guidelines
|
|
695
|
+
if (guideline.enabled === false) {
|
|
696
|
+
continue;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
if (guideline.condition) {
|
|
700
|
+
const evaluation = await evaluator.evaluateCondition(guideline.condition, 'AND');
|
|
701
|
+
|
|
702
|
+
// Include guideline if:
|
|
703
|
+
// 1. No programmatic conditions (only strings) - always active
|
|
704
|
+
// 2. Programmatic conditions evaluate to true
|
|
705
|
+
if (!evaluation.hasProgrammaticConditions || evaluation.programmaticResult) {
|
|
706
|
+
const rationale = evaluation.aiContextStrings.length > 0
|
|
707
|
+
? `Condition met: ${evaluation.aiContextStrings.join(" AND ")}`
|
|
708
|
+
: evaluation.hasProgrammaticConditions
|
|
709
|
+
? "Programmatic condition evaluated to true"
|
|
710
|
+
: "Always active (no conditions)";
|
|
711
|
+
|
|
712
|
+
matches.push({
|
|
713
|
+
guideline,
|
|
714
|
+
rationale
|
|
715
|
+
});
|
|
716
|
+
}
|
|
717
|
+
} else {
|
|
718
|
+
// No condition means always active
|
|
719
|
+
matches.push({
|
|
720
|
+
guideline,
|
|
721
|
+
rationale: "Always active (no conditions)"
|
|
722
|
+
});
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
return matches;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
/**
|
|
730
|
+
* Get the agent's knowledge base
|
|
731
|
+
*/
|
|
732
|
+
getKnowledgeBase(): Record<string, unknown> {
|
|
733
|
+
return { ...this.knowledgeBase };
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
|
|
738
|
+
/**
|
|
739
|
+
* Get the persistence manager (if configured)
|
|
740
|
+
*/
|
|
741
|
+
getPersistenceManager(): PersistenceManager<TData> | undefined {
|
|
742
|
+
return this.persistenceManager;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
/**
|
|
746
|
+
* Check if persistence is enabled
|
|
747
|
+
*/
|
|
748
|
+
hasPersistence(): boolean {
|
|
749
|
+
return this.persistenceManager !== undefined;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
/**
|
|
753
|
+
* Set the current session for convenience methods
|
|
754
|
+
* @param session - Session step to use for subsequent calls
|
|
755
|
+
*/
|
|
756
|
+
setCurrentSession(session: SessionState): void {
|
|
757
|
+
this.currentSession = session;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
/**
|
|
761
|
+
* Get the current session (if set)
|
|
762
|
+
*/
|
|
763
|
+
getCurrentSession(): SessionState | undefined {
|
|
764
|
+
return this.currentSession;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
/**
|
|
768
|
+
* Execute a prepare or finalize function/tool
|
|
769
|
+
* @internal Used by ResponseModal
|
|
770
|
+
*/
|
|
771
|
+
async executePrepareFinalize(
|
|
772
|
+
prepareOrFinalize:
|
|
773
|
+
| string
|
|
774
|
+
| Tool<TContext, TData>
|
|
775
|
+
| ((context: TContext, data?: Partial<TData>) => void | Promise<void>)
|
|
776
|
+
| undefined,
|
|
777
|
+
context: TContext,
|
|
778
|
+
data?: Partial<TData>,
|
|
779
|
+
route?: Route<TContext, TData>,
|
|
780
|
+
step?: Step<TContext, TData>
|
|
781
|
+
): Promise<void> {
|
|
782
|
+
if (!prepareOrFinalize) return;
|
|
783
|
+
|
|
784
|
+
if (typeof prepareOrFinalize === "function") {
|
|
785
|
+
// It's a function - call it directly
|
|
786
|
+
await prepareOrFinalize(context, data);
|
|
787
|
+
} else {
|
|
788
|
+
// It's a tool reference - find and execute the tool
|
|
789
|
+
let tool: Tool<TContext, TData> | undefined;
|
|
790
|
+
|
|
791
|
+
if (typeof prepareOrFinalize === "string") {
|
|
792
|
+
// Tool ID - use ToolManager to find it across all scopes
|
|
793
|
+
tool = this.tool.find(prepareOrFinalize, undefined, step, route);
|
|
794
|
+
} else {
|
|
795
|
+
// Tool object - validate it has required properties
|
|
796
|
+
if (prepareOrFinalize.id && typeof prepareOrFinalize.handler === 'function') {
|
|
797
|
+
tool = prepareOrFinalize;
|
|
798
|
+
} else {
|
|
799
|
+
logger.error(`[Agent] Invalid tool object for prepare/finalize: missing id or invalid handler`);
|
|
800
|
+
return;
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
if (tool) {
|
|
805
|
+
// Use ToolManager for execution
|
|
806
|
+
const result = await this.tool.executeTool({
|
|
807
|
+
tool,
|
|
808
|
+
context,
|
|
809
|
+
updateContext: this.updateContext.bind(this),
|
|
810
|
+
updateData: this.updateCollectedData.bind(this),
|
|
811
|
+
history: [], // Empty history for prepare/finalize
|
|
812
|
+
data,
|
|
813
|
+
});
|
|
814
|
+
|
|
815
|
+
if (!result.success) {
|
|
816
|
+
logger.error(
|
|
817
|
+
`[Agent] Tool execution failed in prepare/finalize: ${result.error}`
|
|
818
|
+
);
|
|
819
|
+
throw new Error(`Tool execution failed: ${result.error}`);
|
|
820
|
+
}
|
|
821
|
+
} else {
|
|
822
|
+
logger.warn(
|
|
823
|
+
`[Agent] Tool not found for prepare/finalize: ${typeof prepareOrFinalize === "string"
|
|
824
|
+
? prepareOrFinalize
|
|
825
|
+
: "inline tool"
|
|
826
|
+
}`
|
|
827
|
+
);
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
/**
|
|
833
|
+
* Clear the current session
|
|
834
|
+
*/
|
|
835
|
+
clearCurrentSession(): void {
|
|
836
|
+
this.currentSession = undefined;
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
/**
|
|
840
|
+
* Sync session data to agent collected data
|
|
841
|
+
* @internal Used to keep agent and session data in sync
|
|
842
|
+
*/
|
|
843
|
+
private syncSessionDataToCollectedData(): void {
|
|
844
|
+
const sessionData = this.session.getData();
|
|
845
|
+
if (sessionData && Object.keys(sessionData).length > 0) {
|
|
846
|
+
this.collectedData = { ...sessionData };
|
|
847
|
+
logger.debug("[Agent] Synced session data to collected data:", this.collectedData);
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
/**
|
|
852
|
+
* Get collected data from current session or agent-level collected data
|
|
853
|
+
* @param routeId - Optional route ID to get data for (uses current route if not provided)
|
|
854
|
+
* @returns The collected data from the current session or agent-level data
|
|
855
|
+
*/
|
|
856
|
+
getData(): Partial<TData> {
|
|
857
|
+
// Ensure agent collected data is synced with session
|
|
858
|
+
this.syncSessionDataToCollectedData();
|
|
859
|
+
|
|
860
|
+
// If we have a current session, use session data
|
|
861
|
+
if (this.currentSession) {
|
|
862
|
+
// With agent-level data, all routes share the same data structure
|
|
863
|
+
// No need for route-specific data access
|
|
864
|
+
return (this.currentSession.data) || {};
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
// Otherwise, return agent-level collected data
|
|
868
|
+
return this.getCollectedData();
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
/**
|
|
872
|
+
* Manually transition to a different route
|
|
873
|
+
* Sets a pending transition that will be executed on the next respond() call
|
|
874
|
+
*
|
|
875
|
+
* @param routeIdOrTitle - Route ID or title to transition to
|
|
876
|
+
* @param session - Session step to update (uses current session if not provided)
|
|
877
|
+
* @param condition - Optional AI-evaluated condition for the transition
|
|
878
|
+
* @returns Updated session with pending transition
|
|
879
|
+
*
|
|
880
|
+
* @example
|
|
881
|
+
* // After route completes
|
|
882
|
+
* if (response.isRouteComplete && response.session) {
|
|
883
|
+
* const updatedSession = agent.nextStepRoute("feedback-collection", response.session);
|
|
884
|
+
* // Next respond() call will automatically transition to feedback route
|
|
885
|
+
* const nextResponse = await agent.respond({ history, session: updatedSession });
|
|
886
|
+
* }
|
|
887
|
+
*/
|
|
888
|
+
async nextStepRoute(
|
|
889
|
+
routeIdOrTitle: string,
|
|
890
|
+
session?: SessionState<TData>,
|
|
891
|
+
condition?: Template<TContext, TData>,
|
|
892
|
+
history?: Event[]
|
|
893
|
+
): Promise<SessionState<TData>> {
|
|
894
|
+
const targetSession = session || this.currentSession;
|
|
895
|
+
|
|
896
|
+
if (!targetSession) {
|
|
897
|
+
throw new Error(
|
|
898
|
+
"No session provided and no current session available. Please provide a session to transition."
|
|
899
|
+
);
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
// Find target route by ID or title
|
|
903
|
+
const targetRoute = this.routes.find(
|
|
904
|
+
(r) => r.id === routeIdOrTitle || r.title === routeIdOrTitle
|
|
905
|
+
);
|
|
906
|
+
|
|
907
|
+
if (!targetRoute) {
|
|
908
|
+
throw new Error(
|
|
909
|
+
`Route not found: ${routeIdOrTitle}. Available routes: ${this.routes
|
|
910
|
+
.map((r) => r.title)
|
|
911
|
+
.join(", ")}`
|
|
912
|
+
);
|
|
913
|
+
}
|
|
914
|
+
const templateContext = createTemplateContext({
|
|
915
|
+
context: this.context,
|
|
916
|
+
session,
|
|
917
|
+
history,
|
|
918
|
+
data: this.currentSession?.data,
|
|
919
|
+
});
|
|
920
|
+
const renderedCondition = await render(condition, templateContext);
|
|
921
|
+
|
|
922
|
+
const updatedSession: SessionState<TData> = {
|
|
923
|
+
...targetSession,
|
|
924
|
+
pendingTransition: {
|
|
925
|
+
targetRouteId: targetRoute.id,
|
|
926
|
+
condition: renderedCondition,
|
|
927
|
+
reason: "route_complete",
|
|
928
|
+
},
|
|
929
|
+
};
|
|
930
|
+
|
|
931
|
+
// Update current session if using it
|
|
932
|
+
if (!session && this.currentSession) {
|
|
933
|
+
this.currentSession = updatedSession;
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
logger.debug(
|
|
937
|
+
`[Agent] Set pending transition to route: ${targetRoute.title}`
|
|
938
|
+
);
|
|
939
|
+
|
|
940
|
+
return updatedSession;
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
/**
|
|
944
|
+
* Simplified respond method using SessionManager
|
|
945
|
+
* Automatically manages conversation history through the session
|
|
946
|
+
*/
|
|
947
|
+
async chat(
|
|
948
|
+
message?: string,
|
|
949
|
+
options?: GenerateOptions<TContext>
|
|
950
|
+
): Promise<AgentResponse<TData>> {
|
|
951
|
+
// Delegate to ResponseModal.generate()
|
|
952
|
+
return this.responseModal.generate(message, options);
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
/**
|
|
956
|
+
* Modern streaming API - simple interface like chat() but returns a stream
|
|
957
|
+
* Automatically manages conversation history through the session
|
|
958
|
+
*/
|
|
959
|
+
async *stream(
|
|
960
|
+
message?: string,
|
|
961
|
+
options?: StreamOptions<TContext>
|
|
962
|
+
): AsyncGenerator<AgentResponseStreamChunk<TData>> {
|
|
963
|
+
// Delegate to ResponseModal with the same options structure as chat()
|
|
964
|
+
yield* this.responseModal.stream(message, {
|
|
965
|
+
history: options?.history,
|
|
966
|
+
contextOverride: options?.contextOverride,
|
|
967
|
+
signal: options?.signal,
|
|
968
|
+
});
|
|
969
|
+
}
|
|
970
|
+
}
|