@falai/agent 0.9.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +304 -72
- package/dist/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/adapters/MemoryAdapter.js.map +1 -0
- package/dist/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/adapters/MongoAdapter.js.map +1 -0
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/{src/adapters → adapters}/PrismaAdapter.js +3 -2
- package/dist/adapters/PrismaAdapter.js.map +1 -0
- package/dist/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/{src/adapters → adapters}/RedisAdapter.js +3 -3
- package/dist/adapters/RedisAdapter.js.map +1 -0
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -0
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -0
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/{src → cjs}/adapters/PrismaAdapter.d.ts.map +1 -1
- package/dist/cjs/{src/adapters → adapters}/PrismaAdapter.js +3 -2
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/{src/adapters → adapters}/RedisAdapter.js +2 -2
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -0
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/cjs/adapters/index.js.map +1 -0
- package/dist/cjs/constants/index.js.map +1 -0
- package/dist/{src → cjs}/core/Agent.d.ts +25 -6
- package/dist/cjs/core/Agent.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/Agent.js +121 -37
- package/dist/cjs/core/Agent.js.map +1 -0
- package/dist/cjs/core/BatchExecutor.d.ts +353 -0
- package/dist/cjs/core/BatchExecutor.d.ts.map +1 -0
- package/dist/cjs/core/BatchExecutor.js +842 -0
- package/dist/cjs/core/BatchExecutor.js.map +1 -0
- package/dist/cjs/core/BatchPromptBuilder.d.ts +86 -0
- package/dist/cjs/core/BatchPromptBuilder.d.ts.map +1 -0
- package/dist/cjs/core/BatchPromptBuilder.js +201 -0
- package/dist/cjs/core/BatchPromptBuilder.js.map +1 -0
- package/dist/cjs/core/Events.js.map +1 -0
- package/dist/cjs/core/PersistenceManager.js.map +1 -0
- package/dist/{src → cjs}/core/PromptComposer.d.ts +1 -1
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/PromptComposer.js +44 -7
- package/dist/cjs/core/PromptComposer.js.map +1 -0
- package/dist/{src → cjs}/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +202 -0
- package/dist/cjs/core/ResponseEngine.js.map +1 -0
- package/dist/{src → cjs}/core/ResponseModal.d.ts +54 -3
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/ResponseModal.js +807 -121
- package/dist/cjs/core/ResponseModal.js.map +1 -0
- package/dist/{src → cjs}/core/ResponsePipeline.d.ts +10 -6
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/ResponsePipeline.js +60 -25
- package/dist/cjs/core/ResponsePipeline.js.map +1 -0
- package/dist/{src → cjs}/core/Route.d.ts +46 -10
- package/dist/cjs/core/Route.d.ts.map +1 -0
- package/dist/cjs/core/Route.js +541 -0
- package/dist/cjs/core/Route.js.map +1 -0
- package/dist/cjs/{src/core → core}/RoutingEngine.d.ts +35 -5
- package/dist/cjs/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/RoutingEngine.js +360 -98
- package/dist/cjs/core/RoutingEngine.js.map +1 -0
- package/dist/{src → cjs}/core/SessionManager.d.ts +9 -1
- package/dist/cjs/core/SessionManager.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/SessionManager.js +27 -5
- package/dist/cjs/core/SessionManager.js.map +1 -0
- package/dist/cjs/core/Step.d.ts +170 -0
- package/dist/cjs/core/Step.d.ts.map +1 -0
- package/dist/cjs/core/Step.js +448 -0
- package/dist/cjs/core/Step.js.map +1 -0
- package/dist/cjs/core/ToolManager.d.ts +234 -0
- package/dist/cjs/core/ToolManager.d.ts.map +1 -0
- package/dist/cjs/core/ToolManager.js +1117 -0
- package/dist/cjs/core/ToolManager.js.map +1 -0
- package/dist/{src → cjs}/index.d.ts +5 -3
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/{src/index.js → index.js} +16 -3
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/{src/providers → providers}/AnthropicProvider.js +18 -18
- package/dist/cjs/providers/AnthropicProvider.js.map +1 -0
- package/dist/{src → cjs}/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/{src/providers → providers}/GeminiProvider.js +123 -51
- package/dist/cjs/providers/GeminiProvider.js.map +1 -0
- package/dist/cjs/{src/providers → providers}/OpenAIProvider.js +19 -19
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -0
- package/dist/cjs/{src/providers → providers}/OpenRouterProvider.js +19 -19
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -0
- package/dist/cjs/providers/index.js.map +1 -0
- package/dist/cjs/{src/types → types}/agent.d.ts +12 -4
- package/dist/cjs/types/agent.d.ts.map +1 -0
- package/dist/cjs/types/agent.js.map +1 -0
- package/dist/{src → cjs}/types/ai.js.map +1 -1
- package/dist/cjs/types/history.js.map +1 -0
- package/dist/cjs/{src/types → types}/index.d.ts +5 -3
- package/dist/{src → cjs}/types/index.d.ts.map +1 -1
- package/dist/cjs/{src/types → types}/index.js +8 -1
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/persistence.js.map +1 -0
- package/dist/cjs/{src/types → types}/route.d.ts +116 -15
- package/dist/cjs/types/route.d.ts.map +1 -0
- package/dist/cjs/{src/types → types}/route.js.map +1 -1
- package/dist/cjs/types/session.js.map +1 -0
- package/dist/cjs/types/template.d.ts +88 -0
- package/dist/cjs/types/template.d.ts.map +1 -0
- package/dist/cjs/types/tool.d.ts +130 -0
- package/dist/cjs/types/tool.d.ts.map +1 -0
- package/dist/cjs/types/tool.js +19 -0
- package/dist/cjs/types/tool.js.map +1 -0
- package/dist/cjs/utils/clone.js.map +1 -0
- package/dist/cjs/utils/condition.d.ts +38 -0
- package/dist/cjs/utils/condition.d.ts.map +1 -0
- package/dist/cjs/utils/condition.js +168 -0
- package/dist/cjs/utils/condition.js.map +1 -0
- package/dist/cjs/utils/event.js.map +1 -0
- package/dist/cjs/utils/history.js.map +1 -0
- package/dist/cjs/utils/id.js.map +1 -0
- package/dist/cjs/{src/utils → utils}/index.d.ts +3 -1
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/{src/utils → utils}/index.js +12 -1
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/json.d.ts +16 -0
- package/dist/cjs/utils/json.d.ts.map +1 -0
- package/dist/cjs/utils/json.js +47 -0
- package/dist/cjs/utils/json.js.map +1 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/{src → cjs}/utils/retry.d.ts +0 -3
- package/dist/cjs/utils/retry.d.ts.map +1 -0
- package/dist/cjs/{src/utils → utils}/retry.js +8 -7
- package/dist/cjs/utils/retry.js.map +1 -0
- package/dist/cjs/utils/session.js.map +1 -0
- package/dist/{src → cjs}/utils/template.d.ts +48 -0
- package/dist/cjs/utils/template.d.ts.map +1 -0
- package/dist/cjs/{src/utils → utils}/template.js +100 -0
- package/dist/cjs/utils/template.js.map +1 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/{cjs/src/core → core}/Agent.d.ts +25 -6
- package/dist/core/Agent.d.ts.map +1 -0
- package/dist/{src/core → core}/Agent.js +122 -38
- package/dist/core/Agent.js.map +1 -0
- package/dist/core/BatchExecutor.d.ts +353 -0
- package/dist/core/BatchExecutor.d.ts.map +1 -0
- package/dist/core/BatchExecutor.js +837 -0
- package/dist/core/BatchExecutor.js.map +1 -0
- package/dist/core/BatchPromptBuilder.d.ts +86 -0
- package/dist/core/BatchPromptBuilder.d.ts.map +1 -0
- package/dist/core/BatchPromptBuilder.js +197 -0
- package/dist/core/BatchPromptBuilder.js.map +1 -0
- package/dist/core/Events.d.ts.map +1 -0
- package/dist/core/Events.js.map +1 -0
- package/dist/core/PersistenceManager.d.ts.map +1 -0
- package/dist/core/PersistenceManager.js.map +1 -0
- package/dist/{cjs/src/core → core}/PromptComposer.d.ts +1 -1
- package/dist/core/PromptComposer.d.ts.map +1 -0
- package/dist/{src/core → core}/PromptComposer.js +45 -8
- package/dist/core/PromptComposer.js.map +1 -0
- package/dist/core/ResponseEngine.d.ts.map +1 -0
- package/dist/core/ResponseEngine.js +198 -0
- package/dist/core/ResponseEngine.js.map +1 -0
- package/dist/{cjs/src/core → core}/ResponseModal.d.ts +54 -3
- package/dist/core/ResponseModal.d.ts.map +1 -0
- package/dist/{src/core → core}/ResponseModal.js +807 -121
- package/dist/core/ResponseModal.js.map +1 -0
- package/dist/{cjs/src/core → core}/ResponsePipeline.d.ts +10 -6
- package/dist/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/{src/core → core}/ResponsePipeline.js +60 -25
- package/dist/core/ResponsePipeline.js.map +1 -0
- package/dist/{cjs/src/core → core}/Route.d.ts +46 -10
- package/dist/core/Route.d.ts.map +1 -0
- package/dist/core/Route.js +537 -0
- package/dist/core/Route.js.map +1 -0
- package/dist/{src/core → core}/RoutingEngine.d.ts +35 -5
- package/dist/core/RoutingEngine.d.ts.map +1 -0
- package/dist/{src/core → core}/RoutingEngine.js +343 -81
- package/dist/core/RoutingEngine.js.map +1 -0
- package/dist/{cjs/src/core → core}/SessionManager.d.ts +9 -1
- package/dist/core/SessionManager.d.ts.map +1 -0
- package/dist/{src/core → core}/SessionManager.js +27 -5
- package/dist/core/SessionManager.js.map +1 -0
- package/dist/core/Step.d.ts +170 -0
- package/dist/core/Step.d.ts.map +1 -0
- package/dist/core/Step.js +444 -0
- package/dist/core/Step.js.map +1 -0
- package/dist/core/ToolManager.d.ts +234 -0
- package/dist/core/ToolManager.d.ts.map +1 -0
- package/dist/core/ToolManager.js +1111 -0
- package/dist/core/ToolManager.js.map +1 -0
- package/dist/{cjs/src/index.d.ts → index.d.ts} +5 -3
- package/dist/index.d.ts.map +1 -0
- package/dist/{src/index.js → index.js} +4 -1
- package/dist/index.js.map +1 -0
- package/dist/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/AnthropicProvider.js +17 -17
- package/dist/providers/AnthropicProvider.js.map +1 -0
- package/dist/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/GeminiProvider.js +123 -51
- package/dist/providers/GeminiProvider.js.map +1 -0
- package/dist/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/OpenAIProvider.js +18 -18
- package/dist/providers/OpenAIProvider.js.map +1 -0
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/OpenRouterProvider.js +18 -18
- package/dist/providers/OpenRouterProvider.js.map +1 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/{src/types → types}/agent.d.ts +12 -4
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/ai.d.ts.map +1 -0
- package/dist/types/ai.js.map +1 -0
- package/dist/types/history.d.ts.map +1 -0
- package/dist/types/history.js.map +1 -0
- package/dist/{src/types → types}/index.d.ts +5 -3
- package/dist/types/index.d.ts.map +1 -0
- package/dist/{src/types → types}/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/persistence.d.ts.map +1 -0
- package/dist/types/persistence.js.map +1 -0
- package/dist/{src/types → types}/route.d.ts +116 -15
- package/dist/types/route.d.ts.map +1 -0
- package/dist/{src/types → types}/route.js.map +1 -1
- package/dist/types/routing.d.ts.map +1 -0
- package/dist/{cjs/src/types → types}/routing.js.map +1 -1
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/{cjs/src/types → types}/schema.js.map +1 -1
- package/dist/types/session.d.ts.map +1 -0
- package/dist/{src/types → types}/session.js.map +1 -1
- package/dist/types/template.d.ts +88 -0
- package/dist/types/template.d.ts.map +1 -0
- package/dist/{cjs/src/types → types}/template.js.map +1 -1
- package/dist/types/tool.d.ts +130 -0
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js +16 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/utils/clone.d.ts.map +1 -0
- package/dist/utils/clone.js.map +1 -0
- package/dist/utils/condition.d.ts +38 -0
- package/dist/utils/condition.d.ts.map +1 -0
- package/dist/utils/condition.js +161 -0
- package/dist/utils/condition.js.map +1 -0
- package/dist/utils/event.d.ts.map +1 -0
- package/dist/utils/event.js.map +1 -0
- package/dist/utils/history.d.ts.map +1 -0
- package/dist/utils/history.js.map +1 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/{src/utils → utils}/index.d.ts +3 -1
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/{src/utils → utils}/index.js +5 -1
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json.d.ts +16 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +43 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/{cjs/src/utils → utils}/retry.d.ts +0 -3
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/{src/utils → utils}/retry.js +5 -4
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/session.d.ts.map +1 -0
- package/dist/utils/session.js.map +1 -0
- package/dist/{cjs/src/utils → utils}/template.d.ts +48 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/{src/utils → utils}/template.js +98 -0
- package/dist/utils/template.js.map +1 -0
- package/docs/CONTRIBUTING.md +40 -0
- package/docs/README.md +12 -5
- package/docs/api/README.md +295 -56
- package/docs/api/overview.md +272 -31
- package/docs/architecture/data-extraction-flow.md +363 -0
- package/docs/architecture/multi-step-execution.md +243 -0
- package/docs/core/agent/README.md +120 -5
- package/docs/core/agent/session-management.md +153 -6
- package/docs/core/ai-integration/prompt-composition.md +135 -0
- package/docs/core/ai-integration/response-processing.md +261 -4
- package/docs/core/conversation-flows/data-collection.md +143 -0
- package/docs/core/conversation-flows/routes.md +132 -2
- package/docs/core/conversation-flows/step-transitions.md +132 -0
- package/docs/core/conversation-flows/steps.md +112 -0
- package/docs/core/error-handling.md +831 -0
- package/docs/core/routing/intelligent-routing.md +118 -0
- package/docs/core/tools/tool-definition.md +684 -60
- package/docs/core/tools/tool-scoping.md +244 -53
- package/docs/guides/error-handling-patterns.md +578 -0
- package/docs/guides/getting-started/README.md +423 -31
- package/docs/guides/migration/README.md +23 -0
- package/docs/guides/migration/flexible-routing-conditions.md +375 -0
- package/docs/guides/migration/multi-step-execution.md +303 -0
- package/examples/advanced-patterns/knowledge-based-agent.ts +107 -30
- package/examples/advanced-patterns/persistent-onboarding.ts +70 -48
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +82 -12
- package/examples/advanced-patterns/streaming-responses.ts +2 -2
- package/examples/ai-providers/anthropic-integration.ts +13 -9
- package/examples/ai-providers/openai-integration.ts +12 -8
- 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 +48 -7
- package/examples/core-concepts/basic-agent.ts +158 -98
- package/examples/core-concepts/schema-driven-extraction.ts +43 -16
- package/examples/core-concepts/session-management.ts +117 -29
- package/examples/integrations/database-integration.ts +6 -6
- package/examples/integrations/healthcare-integration.ts +25 -39
- package/examples/integrations/search-integration.ts +8 -8
- package/examples/integrations/server-session-management.ts +11 -11
- package/examples/persistence/database-persistence.ts +15 -15
- package/examples/persistence/memory-sessions.ts +6 -6
- package/examples/persistence/redis-persistence.ts +7 -9
- package/examples/tools/basic-tools.ts +293 -89
- package/examples/tools/data-enrichment-tools.ts +189 -79
- package/package.json +6 -4
- package/src/adapters/PrismaAdapter.ts +3 -2
- package/src/adapters/RedisAdapter.ts +3 -3
- package/src/core/Agent.ts +152 -46
- package/src/core/BatchExecutor.ts +1156 -0
- package/src/core/BatchPromptBuilder.ts +275 -0
- package/src/core/PromptComposer.ts +53 -16
- package/src/core/ResponseEngine.ts +143 -4
- package/src/core/ResponseModal.ts +1035 -137
- package/src/core/ResponsePipeline.ts +99 -65
- package/src/core/Route.ts +262 -34
- package/src/core/RoutingEngine.ts +467 -120
- package/src/core/SessionManager.ts +39 -7
- package/src/core/Step.ts +338 -32
- package/src/core/ToolManager.ts +1394 -0
- package/src/index.ts +27 -3
- package/src/providers/AnthropicProvider.ts +17 -17
- package/src/providers/GeminiProvider.ts +129 -60
- package/src/providers/OpenAIProvider.ts +18 -18
- package/src/providers/OpenRouterProvider.ts +18 -18
- package/src/types/agent.ts +12 -4
- package/src/types/index.ts +25 -3
- package/src/types/route.ts +136 -15
- package/src/types/template.ts +70 -2
- package/src/types/tool.ts +116 -25
- package/src/utils/condition.ts +190 -0
- package/src/utils/index.ts +12 -0
- package/src/utils/json.ts +46 -0
- package/src/utils/retry.ts +5 -4
- package/src/utils/template.ts +109 -0
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/MemoryAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/MongoAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/PrismaAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/RedisAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/index.d.ts.map +0 -1
- package/dist/cjs/src/adapters/index.js.map +0 -1
- package/dist/cjs/src/constants/index.d.ts.map +0 -1
- package/dist/cjs/src/constants/index.js.map +0 -1
- package/dist/cjs/src/core/Agent.d.ts.map +0 -1
- package/dist/cjs/src/core/Agent.js.map +0 -1
- package/dist/cjs/src/core/Events.d.ts.map +0 -1
- package/dist/cjs/src/core/Events.js.map +0 -1
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +0 -1
- package/dist/cjs/src/core/PersistenceManager.js.map +0 -1
- package/dist/cjs/src/core/PromptComposer.d.ts.map +0 -1
- package/dist/cjs/src/core/PromptComposer.js.map +0 -1
- package/dist/cjs/src/core/ResponseEngine.d.ts.map +0 -1
- package/dist/cjs/src/core/ResponseEngine.js +0 -84
- package/dist/cjs/src/core/ResponseEngine.js.map +0 -1
- package/dist/cjs/src/core/ResponseModal.d.ts.map +0 -1
- package/dist/cjs/src/core/ResponseModal.js.map +0 -1
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +0 -1
- package/dist/cjs/src/core/ResponsePipeline.js.map +0 -1
- package/dist/cjs/src/core/Route.d.ts.map +0 -1
- package/dist/cjs/src/core/Route.js +0 -343
- package/dist/cjs/src/core/Route.js.map +0 -1
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/src/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/src/core/SessionManager.d.ts.map +0 -1
- package/dist/cjs/src/core/SessionManager.js.map +0 -1
- package/dist/cjs/src/core/Step.d.ts +0 -96
- package/dist/cjs/src/core/Step.d.ts.map +0 -1
- package/dist/cjs/src/core/Step.js +0 -206
- package/dist/cjs/src/core/Step.js.map +0 -1
- package/dist/cjs/src/core/ToolExecutor.d.ts +0 -45
- package/dist/cjs/src/core/ToolExecutor.d.ts.map +0 -1
- package/dist/cjs/src/core/ToolExecutor.js +0 -84
- package/dist/cjs/src/core/ToolExecutor.js.map +0 -1
- package/dist/cjs/src/index.d.ts.map +0 -1
- package/dist/cjs/src/index.js.map +0 -1
- package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/AnthropicProvider.js.map +0 -1
- package/dist/cjs/src/providers/GeminiProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/GeminiProvider.js.map +0 -1
- package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/OpenAIProvider.js.map +0 -1
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/OpenRouterProvider.js.map +0 -1
- package/dist/cjs/src/providers/index.d.ts.map +0 -1
- package/dist/cjs/src/providers/index.js.map +0 -1
- package/dist/cjs/src/types/agent.d.ts.map +0 -1
- package/dist/cjs/src/types/agent.js.map +0 -1
- package/dist/cjs/src/types/ai.d.ts.map +0 -1
- package/dist/cjs/src/types/ai.js.map +0 -1
- package/dist/cjs/src/types/history.d.ts.map +0 -1
- package/dist/cjs/src/types/history.js.map +0 -1
- package/dist/cjs/src/types/index.d.ts.map +0 -1
- package/dist/cjs/src/types/index.js.map +0 -1
- package/dist/cjs/src/types/persistence.d.ts.map +0 -1
- package/dist/cjs/src/types/persistence.js.map +0 -1
- package/dist/cjs/src/types/route.d.ts.map +0 -1
- package/dist/cjs/src/types/routing.d.ts.map +0 -1
- package/dist/cjs/src/types/schema.d.ts.map +0 -1
- package/dist/cjs/src/types/session.d.ts.map +0 -1
- package/dist/cjs/src/types/session.js.map +0 -1
- package/dist/cjs/src/types/template.d.ts +0 -30
- package/dist/cjs/src/types/template.d.ts.map +0 -1
- package/dist/cjs/src/types/tool.d.ts +0 -60
- package/dist/cjs/src/types/tool.d.ts.map +0 -1
- package/dist/cjs/src/types/tool.js +0 -6
- package/dist/cjs/src/types/tool.js.map +0 -1
- package/dist/cjs/src/utils/clone.d.ts.map +0 -1
- package/dist/cjs/src/utils/clone.js.map +0 -1
- package/dist/cjs/src/utils/event.d.ts.map +0 -1
- package/dist/cjs/src/utils/event.js.map +0 -1
- package/dist/cjs/src/utils/history.d.ts.map +0 -1
- package/dist/cjs/src/utils/history.js.map +0 -1
- package/dist/cjs/src/utils/id.d.ts.map +0 -1
- package/dist/cjs/src/utils/id.js.map +0 -1
- package/dist/cjs/src/utils/index.d.ts.map +0 -1
- package/dist/cjs/src/utils/index.js.map +0 -1
- package/dist/cjs/src/utils/logger.d.ts.map +0 -1
- package/dist/cjs/src/utils/logger.js.map +0 -1
- package/dist/cjs/src/utils/retry.d.ts.map +0 -1
- package/dist/cjs/src/utils/retry.js.map +0 -1
- package/dist/cjs/src/utils/session.d.ts.map +0 -1
- package/dist/cjs/src/utils/session.js.map +0 -1
- package/dist/cjs/src/utils/template.d.ts.map +0 -1
- package/dist/cjs/src/utils/template.js.map +0 -1
- package/dist/src/adapters/MemoryAdapter.js.map +0 -1
- package/dist/src/adapters/MongoAdapter.js.map +0 -1
- package/dist/src/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/src/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/src/adapters/PrismaAdapter.js.map +0 -1
- package/dist/src/adapters/RedisAdapter.js.map +0 -1
- package/dist/src/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/src/adapters/index.js.map +0 -1
- package/dist/src/constants/index.js.map +0 -1
- package/dist/src/core/Agent.d.ts.map +0 -1
- package/dist/src/core/Agent.js.map +0 -1
- package/dist/src/core/Events.js.map +0 -1
- package/dist/src/core/PersistenceManager.js.map +0 -1
- package/dist/src/core/PromptComposer.d.ts.map +0 -1
- package/dist/src/core/PromptComposer.js.map +0 -1
- package/dist/src/core/ResponseEngine.js +0 -80
- package/dist/src/core/ResponseEngine.js.map +0 -1
- package/dist/src/core/ResponseModal.d.ts.map +0 -1
- package/dist/src/core/ResponseModal.js.map +0 -1
- package/dist/src/core/ResponsePipeline.d.ts.map +0 -1
- package/dist/src/core/ResponsePipeline.js.map +0 -1
- package/dist/src/core/Route.d.ts.map +0 -1
- package/dist/src/core/Route.js +0 -339
- package/dist/src/core/Route.js.map +0 -1
- package/dist/src/core/RoutingEngine.d.ts.map +0 -1
- package/dist/src/core/RoutingEngine.js.map +0 -1
- package/dist/src/core/SessionManager.d.ts.map +0 -1
- package/dist/src/core/SessionManager.js.map +0 -1
- package/dist/src/core/Step.d.ts +0 -96
- package/dist/src/core/Step.d.ts.map +0 -1
- package/dist/src/core/Step.js +0 -202
- package/dist/src/core/Step.js.map +0 -1
- package/dist/src/core/ToolExecutor.d.ts +0 -45
- package/dist/src/core/ToolExecutor.d.ts.map +0 -1
- package/dist/src/core/ToolExecutor.js +0 -80
- package/dist/src/core/ToolExecutor.js.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/providers/AnthropicProvider.js.map +0 -1
- package/dist/src/providers/GeminiProvider.js.map +0 -1
- package/dist/src/providers/OpenAIProvider.js.map +0 -1
- package/dist/src/providers/OpenRouterProvider.js.map +0 -1
- package/dist/src/providers/index.js.map +0 -1
- package/dist/src/types/agent.d.ts.map +0 -1
- package/dist/src/types/agent.js.map +0 -1
- package/dist/src/types/history.js.map +0 -1
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/types/persistence.js.map +0 -1
- package/dist/src/types/route.d.ts.map +0 -1
- package/dist/src/types/template.d.ts +0 -30
- package/dist/src/types/template.d.ts.map +0 -1
- package/dist/src/types/tool.d.ts +0 -60
- package/dist/src/types/tool.d.ts.map +0 -1
- package/dist/src/types/tool.js +0 -5
- package/dist/src/types/tool.js.map +0 -1
- package/dist/src/utils/clone.js.map +0 -1
- package/dist/src/utils/event.js.map +0 -1
- package/dist/src/utils/history.js.map +0 -1
- package/dist/src/utils/id.js.map +0 -1
- package/dist/src/utils/index.d.ts.map +0 -1
- package/dist/src/utils/index.js.map +0 -1
- package/dist/src/utils/logger.js.map +0 -1
- package/dist/src/utils/retry.d.ts.map +0 -1
- package/dist/src/utils/retry.js.map +0 -1
- package/dist/src/utils/session.js.map +0 -1
- package/dist/src/utils/template.d.ts.map +0 -1
- package/dist/src/utils/template.js.map +0 -1
- package/docs/core/tools/tool-execution.md +0 -815
- package/src/core/ToolExecutor.ts +0 -126
- /package/dist/{cjs/src/adapters → adapters}/MemoryAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/MemoryAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/MongoAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/MongoAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/OpenSearchAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/PostgreSQLAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/PrismaAdapter.d.ts +0 -0
- /package/dist/{cjs/src/adapters → adapters}/RedisAdapter.d.ts +0 -0
- /package/dist/{cjs/src/adapters → adapters}/SQLiteAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/index.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/index.js +0 -0
- /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/MemoryAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/MongoAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/PrismaAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts.map +0 -0
- /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/index.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/index.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/index.js +0 -0
- /package/dist/cjs/{src/constants → constants}/index.d.ts +0 -0
- /package/dist/{src → cjs}/constants/index.d.ts.map +0 -0
- /package/dist/cjs/{src/constants → constants}/index.js +0 -0
- /package/dist/cjs/{src/core → core}/Events.d.ts +0 -0
- /package/dist/{src → cjs}/core/Events.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/Events.js +0 -0
- /package/dist/cjs/{src/core → core}/PersistenceManager.d.ts +0 -0
- /package/dist/{src → cjs}/core/PersistenceManager.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/PersistenceManager.js +0 -0
- /package/dist/cjs/{src/core → core}/ResponseEngine.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
- /package/dist/{src → cjs}/providers/AnthropicProvider.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/GeminiProvider.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
- /package/dist/{src → cjs}/providers/OpenAIProvider.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
- /package/dist/{src → cjs}/providers/OpenRouterProvider.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/index.d.ts +0 -0
- /package/dist/{src → cjs}/providers/index.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/index.js +0 -0
- /package/dist/cjs/{src/types → types}/agent.js +0 -0
- /package/dist/cjs/{src/types → types}/ai.d.ts +0 -0
- /package/dist/{src → cjs}/types/ai.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/ai.js +0 -0
- /package/dist/cjs/{src/types → types}/history.d.ts +0 -0
- /package/dist/{src → cjs}/types/history.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/history.js +0 -0
- /package/dist/cjs/{src/types → types}/persistence.d.ts +0 -0
- /package/dist/{src → cjs}/types/persistence.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/persistence.js +0 -0
- /package/dist/cjs/{src/types → types}/route.js +0 -0
- /package/dist/cjs/{src/types → types}/routing.d.ts +0 -0
- /package/dist/{src → cjs}/types/routing.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/routing.js +0 -0
- /package/dist/{src → cjs}/types/routing.js.map +0 -0
- /package/dist/cjs/{src/types → types}/schema.d.ts +0 -0
- /package/dist/{src → cjs}/types/schema.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/schema.js +0 -0
- /package/dist/{src → cjs}/types/schema.js.map +0 -0
- /package/dist/cjs/{src/types → types}/session.d.ts +0 -0
- /package/dist/{src → cjs}/types/session.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/session.js +0 -0
- /package/dist/cjs/{src/types → types}/template.js +0 -0
- /package/dist/{src → cjs}/types/template.js.map +0 -0
- /package/dist/cjs/{src/utils → utils}/clone.d.ts +0 -0
- /package/dist/{src → cjs}/utils/clone.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/clone.js +0 -0
- /package/dist/cjs/{src/utils → utils}/event.d.ts +0 -0
- /package/dist/{src → cjs}/utils/event.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/event.js +0 -0
- /package/dist/cjs/{src/utils → utils}/history.d.ts +0 -0
- /package/dist/{src → cjs}/utils/history.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/history.js +0 -0
- /package/dist/cjs/{src/utils → utils}/id.d.ts +0 -0
- /package/dist/{src → cjs}/utils/id.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/id.js +0 -0
- /package/dist/cjs/{src/utils → utils}/logger.d.ts +0 -0
- /package/dist/{src → cjs}/utils/logger.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/logger.js +0 -0
- /package/dist/cjs/{src/utils → utils}/session.d.ts +0 -0
- /package/dist/{src → cjs}/utils/session.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/session.js +0 -0
- /package/dist/{src/constants → constants}/index.d.ts +0 -0
- /package/dist/{src/constants → constants}/index.js +0 -0
- /package/dist/{src/core → core}/Events.d.ts +0 -0
- /package/dist/{src/core → core}/Events.js +0 -0
- /package/dist/{src/core → core}/PersistenceManager.d.ts +0 -0
- /package/dist/{src/core → core}/PersistenceManager.js +0 -0
- /package/dist/{src/core → core}/ResponseEngine.d.ts +0 -0
- /package/dist/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/GeminiProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/index.d.ts +0 -0
- /package/dist/{src/providers → providers}/index.js +0 -0
- /package/dist/{src/types → types}/agent.js +0 -0
- /package/dist/{src/types → types}/ai.d.ts +0 -0
- /package/dist/{src/types → types}/ai.js +0 -0
- /package/dist/{src/types → types}/history.d.ts +0 -0
- /package/dist/{src/types → types}/history.js +0 -0
- /package/dist/{src/types → types}/persistence.d.ts +0 -0
- /package/dist/{src/types → types}/persistence.js +0 -0
- /package/dist/{src/types → types}/route.js +0 -0
- /package/dist/{src/types → types}/routing.d.ts +0 -0
- /package/dist/{src/types → types}/routing.js +0 -0
- /package/dist/{src/types → types}/schema.d.ts +0 -0
- /package/dist/{src/types → types}/schema.js +0 -0
- /package/dist/{src/types → types}/session.d.ts +0 -0
- /package/dist/{src/types → types}/session.js +0 -0
- /package/dist/{src/types → types}/template.js +0 -0
- /package/dist/{src/utils → utils}/clone.d.ts +0 -0
- /package/dist/{src/utils → utils}/clone.js +0 -0
- /package/dist/{src/utils → utils}/event.d.ts +0 -0
- /package/dist/{src/utils → utils}/event.js +0 -0
- /package/dist/{src/utils → utils}/history.d.ts +0 -0
- /package/dist/{src/utils → utils}/history.js +0 -0
- /package/dist/{src/utils → utils}/id.d.ts +0 -0
- /package/dist/{src/utils → utils}/id.js +0 -0
- /package/dist/{src/utils → utils}/logger.d.ts +0 -0
- /package/dist/{src/utils → utils}/logger.js +0 -0
- /package/dist/{src/utils → utils}/session.d.ts +0 -0
- /package/dist/{src/utils → utils}/session.js +0 -0
|
@@ -3,48 +3,60 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.RoutingEngine = void 0;
|
|
4
4
|
const utils_1 = require("../utils");
|
|
5
5
|
const PromptComposer_1 = require("./PromptComposer");
|
|
6
|
-
const event_1 = require("../utils/event");
|
|
7
|
-
const logger_1 = require("../utils/logger");
|
|
8
|
-
const template_1 = require("../utils/template");
|
|
9
6
|
const constants_1 = require("../constants");
|
|
7
|
+
const utils_2 = require("../utils");
|
|
10
8
|
class RoutingEngine {
|
|
11
9
|
constructor(options) {
|
|
12
10
|
this.options = options;
|
|
13
11
|
}
|
|
14
12
|
/**
|
|
15
|
-
*
|
|
16
|
-
* Skips route scoring and only does step selection
|
|
13
|
+
* Enter a route if not already in it, merging initial data
|
|
17
14
|
* @private
|
|
18
15
|
*/
|
|
19
|
-
|
|
20
|
-
const { route, session, history, agentOptions, provider, context, signal } = params;
|
|
21
|
-
let updatedSession = session;
|
|
22
|
-
const selectedRoute = route;
|
|
23
|
-
// Check if this single route is complete
|
|
24
|
-
const completedRoutes = route.isComplete(session.data || {}) ? [route] : [];
|
|
25
|
-
// Enter route if not already in it
|
|
16
|
+
enterRouteIfNeeded(session, route) {
|
|
26
17
|
if (!session.currentRoute || session.currentRoute.id !== route.id) {
|
|
27
|
-
updatedSession = (0, utils_1.enterRoute)(session, route.id, route.title);
|
|
18
|
+
let updatedSession = (0, utils_1.enterRoute)(session, route.id, route.title);
|
|
28
19
|
if (route.initialData) {
|
|
29
20
|
updatedSession = (0, utils_1.mergeCollected)(updatedSession, route.initialData);
|
|
30
|
-
|
|
21
|
+
utils_2.logger.debug(`[RoutingEngine] Merged initial data for route ${route.title}:`, route.initialData);
|
|
31
22
|
}
|
|
32
|
-
|
|
23
|
+
utils_2.logger.debug(`[RoutingEngine] Entered route: ${route.title}`);
|
|
24
|
+
return updatedSession;
|
|
33
25
|
}
|
|
34
|
-
|
|
26
|
+
return session;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Optimized decision for single-route scenarios
|
|
30
|
+
* Skips route scoring and only does step selection
|
|
31
|
+
* @private
|
|
32
|
+
*/
|
|
33
|
+
async decideSingleRouteStep(params) {
|
|
34
|
+
const { route, session, history, agentOptions, provider, context, signal } = params;
|
|
35
|
+
const selectedRoute = route;
|
|
36
|
+
// Enter route if not already in it (this may merge initial data)
|
|
37
|
+
const updatedSession = this.enterRouteIfNeeded(session, route);
|
|
38
|
+
// Check if this single route is complete (use updated session data)
|
|
39
|
+
const completedRoutes = route.isComplete(updatedSession.data || {}) ? [route] : [];
|
|
40
|
+
// Get candidate steps using new condition evaluation
|
|
41
|
+
const templateContext = (0, utils_2.createTemplateContext)({
|
|
42
|
+
context,
|
|
43
|
+
session: updatedSession,
|
|
44
|
+
history,
|
|
45
|
+
data: updatedSession.data
|
|
46
|
+
});
|
|
35
47
|
const currentStep = updatedSession.currentStep
|
|
36
48
|
? route.getStep(updatedSession.currentStep.id)
|
|
37
49
|
: undefined;
|
|
38
|
-
const candidates = this.
|
|
50
|
+
const candidates = await this.getCandidateStepsWithConditions(route, currentStep, templateContext);
|
|
39
51
|
if (candidates.length === 0) {
|
|
40
|
-
|
|
52
|
+
utils_2.logger.warn(`[RoutingEngine] Single-route: No valid steps found`);
|
|
41
53
|
return { selectedRoute, session: updatedSession };
|
|
42
54
|
}
|
|
43
|
-
// If only one candidate, check if
|
|
55
|
+
// If only one candidate, check if it's a completion marker
|
|
44
56
|
if (candidates.length === 1) {
|
|
45
|
-
const
|
|
46
|
-
if (isRouteComplete) {
|
|
47
|
-
|
|
57
|
+
const candidate = candidates[0];
|
|
58
|
+
if (candidate.isRouteComplete) {
|
|
59
|
+
utils_2.logger.debug(`[RoutingEngine] Single-route: Route complete - all required fields collected or END_ROUTE reached`);
|
|
48
60
|
// Don't return a selectedStep when route is complete - there's no step to enter
|
|
49
61
|
return {
|
|
50
62
|
selectedRoute,
|
|
@@ -55,18 +67,39 @@ class RoutingEngine {
|
|
|
55
67
|
};
|
|
56
68
|
}
|
|
57
69
|
else {
|
|
58
|
-
|
|
70
|
+
utils_2.logger.debug(`[RoutingEngine] Single-route: Only one valid step: ${candidate.step.id}`);
|
|
59
71
|
return {
|
|
60
72
|
selectedRoute,
|
|
61
|
-
selectedStep:
|
|
73
|
+
selectedStep: candidate.step,
|
|
62
74
|
session: updatedSession,
|
|
63
75
|
isRouteComplete: false,
|
|
64
76
|
completedRoutes,
|
|
65
77
|
};
|
|
66
78
|
}
|
|
67
79
|
}
|
|
80
|
+
// No candidates means route is likely complete or has no valid next steps
|
|
81
|
+
if (candidates.length === 0) {
|
|
82
|
+
const dataComplete = route.isComplete(updatedSession.data || {});
|
|
83
|
+
utils_2.logger.debug(`[RoutingEngine] Single-route: No valid steps found - ` +
|
|
84
|
+
`(data: ${dataComplete ? 'complete' : 'incomplete'}, marking as ${dataComplete ? 'complete' : 'incomplete'})`);
|
|
85
|
+
return {
|
|
86
|
+
selectedRoute,
|
|
87
|
+
selectedStep: undefined,
|
|
88
|
+
session: updatedSession,
|
|
89
|
+
isRouteComplete: dataComplete,
|
|
90
|
+
completedRoutes,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
68
93
|
// Multiple candidates - use AI to select best step
|
|
69
|
-
const lastUserMessage = (0,
|
|
94
|
+
const lastUserMessage = (0, utils_2.getLastMessageFromHistory)(history);
|
|
95
|
+
// Collect AI context strings from step conditions
|
|
96
|
+
const stepConditionContext = [];
|
|
97
|
+
for (const candidate of candidates) {
|
|
98
|
+
const whenResult = await candidate.step.evaluateWhen(templateContext);
|
|
99
|
+
stepConditionContext.push(...whenResult.aiContextStrings);
|
|
100
|
+
}
|
|
101
|
+
// Check if any candidate is a completion marker (isRouteComplete = true)
|
|
102
|
+
const hasCompletionOption = candidates.some(c => c.isRouteComplete);
|
|
70
103
|
const stepPrompt = await this.buildStepSelectionPrompt({
|
|
71
104
|
route,
|
|
72
105
|
currentStep,
|
|
@@ -77,8 +110,10 @@ class RoutingEngine {
|
|
|
77
110
|
agentOptions,
|
|
78
111
|
context,
|
|
79
112
|
session: updatedSession,
|
|
113
|
+
stepConditionContext,
|
|
114
|
+
includeEndRoute: hasCompletionOption,
|
|
80
115
|
});
|
|
81
|
-
const stepSchema = this.buildStepSelectionSchema(candidates.map((c) => c.step));
|
|
116
|
+
const stepSchema = this.buildStepSelectionSchema(candidates.filter(c => !c.isRouteComplete).map((c) => c.step), hasCompletionOption);
|
|
82
117
|
const stepResult = await provider.generateMessage({
|
|
83
118
|
prompt: stepPrompt,
|
|
84
119
|
history,
|
|
@@ -90,13 +125,26 @@ class RoutingEngine {
|
|
|
90
125
|
},
|
|
91
126
|
});
|
|
92
127
|
const selectedStepId = stepResult.structured?.selectedStepId;
|
|
128
|
+
// Check if AI selected END_ROUTE
|
|
129
|
+
if (selectedStepId === constants_1.END_ROUTE_ID) {
|
|
130
|
+
utils_2.logger.debug(`[RoutingEngine] Single-route: AI selected END_ROUTE - completing route`);
|
|
131
|
+
utils_2.logger.debug(`[RoutingEngine] Single-route: Reasoning: ${stepResult.structured?.reasoning}`);
|
|
132
|
+
return {
|
|
133
|
+
selectedRoute,
|
|
134
|
+
selectedStep: undefined,
|
|
135
|
+
responseDirectives: stepResult.structured?.responseDirectives,
|
|
136
|
+
session: updatedSession,
|
|
137
|
+
isRouteComplete: true,
|
|
138
|
+
completedRoutes,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
93
141
|
const selectedStep = candidates.find((c) => c.step.id === selectedStepId);
|
|
94
142
|
if (selectedStep) {
|
|
95
|
-
|
|
96
|
-
|
|
143
|
+
utils_2.logger.debug(`[RoutingEngine] Single-route: AI selected step: ${selectedStep.step.id}`);
|
|
144
|
+
utils_2.logger.debug(`[RoutingEngine] Single-route: Reasoning: ${stepResult.structured?.reasoning}`);
|
|
97
145
|
}
|
|
98
146
|
else {
|
|
99
|
-
|
|
147
|
+
utils_2.logger.warn(`[RoutingEngine] Single-route: Invalid step ID returned, using first candidate`);
|
|
100
148
|
}
|
|
101
149
|
return {
|
|
102
150
|
selectedRoute,
|
|
@@ -107,16 +155,17 @@ class RoutingEngine {
|
|
|
107
155
|
};
|
|
108
156
|
}
|
|
109
157
|
/**
|
|
110
|
-
* Recursively traverse step chain to find first non-skipped step or END_ROUTE
|
|
158
|
+
* Recursively traverse step chain to find first non-skipped step or END_ROUTE using new condition evaluation
|
|
111
159
|
* @private
|
|
112
160
|
*/
|
|
113
|
-
|
|
161
|
+
async findFirstValidStepRecursiveWithConditions(currentStep, templateContext, visited) {
|
|
114
162
|
// Prevent infinite loops
|
|
115
163
|
if (visited.has(currentStep.id)) {
|
|
116
|
-
return {};
|
|
164
|
+
return { aiContextStrings: [] };
|
|
117
165
|
}
|
|
118
166
|
visited.add(currentStep.id);
|
|
119
167
|
const transitions = currentStep.getTransitions();
|
|
168
|
+
const allAiContextStrings = [];
|
|
120
169
|
for (const transition of transitions) {
|
|
121
170
|
const target = transition;
|
|
122
171
|
// Check for END_ROUTE transition
|
|
@@ -124,43 +173,72 @@ class RoutingEngine {
|
|
|
124
173
|
// Found END_ROUTE - route is complete
|
|
125
174
|
return {
|
|
126
175
|
isRouteComplete: true,
|
|
176
|
+
aiContextStrings: allAiContextStrings,
|
|
127
177
|
};
|
|
128
178
|
}
|
|
129
179
|
if (!target)
|
|
130
180
|
continue;
|
|
181
|
+
// Evaluate skipIf condition using new system
|
|
182
|
+
const skipResult = await target.evaluateSkipIf(templateContext);
|
|
183
|
+
allAiContextStrings.push(...skipResult.aiContextStrings);
|
|
131
184
|
// If target should NOT be skipped, we found our step
|
|
132
|
-
if (!
|
|
133
|
-
|
|
185
|
+
if (!skipResult.shouldSkip) {
|
|
186
|
+
utils_2.logger.debug(`[RoutingEngine] Found valid step after skipping: ${target.id}`);
|
|
134
187
|
return {
|
|
135
188
|
step: target,
|
|
136
189
|
isRouteComplete: false,
|
|
190
|
+
aiContextStrings: allAiContextStrings,
|
|
137
191
|
};
|
|
138
192
|
}
|
|
139
193
|
// Target should be skipped too - recurse deeper
|
|
140
|
-
|
|
141
|
-
const result = this.
|
|
194
|
+
utils_2.logger.debug(`[RoutingEngine] Skipping step ${target.id} (skipIf condition met), continuing traversal...`);
|
|
195
|
+
const result = await this.findFirstValidStepRecursiveWithConditions(target, templateContext, visited);
|
|
196
|
+
// Collect AI context from recursive call
|
|
197
|
+
if (result.aiContextStrings) {
|
|
198
|
+
allAiContextStrings.push(...result.aiContextStrings);
|
|
199
|
+
}
|
|
142
200
|
// If we found something (a valid step or END_ROUTE), return it
|
|
143
201
|
if (result.step || result.isRouteComplete) {
|
|
144
|
-
return
|
|
202
|
+
return {
|
|
203
|
+
...result,
|
|
204
|
+
aiContextStrings: allAiContextStrings,
|
|
205
|
+
};
|
|
145
206
|
}
|
|
146
207
|
}
|
|
147
208
|
// No valid steps or END_ROUTE found in this branch
|
|
148
|
-
return {};
|
|
209
|
+
return { aiContextStrings: allAiContextStrings };
|
|
149
210
|
}
|
|
150
211
|
/**
|
|
151
|
-
* Identify valid next candidate steps
|
|
212
|
+
* Identify valid next candidate steps using new condition evaluation system
|
|
152
213
|
* Returns step with isRouteComplete flag if route is complete (all steps skipped + has END_ROUTE transition)
|
|
214
|
+
*
|
|
215
|
+
* NEW: Automatically completes route when all required fields are collected
|
|
153
216
|
*/
|
|
154
|
-
|
|
217
|
+
async getCandidateStepsWithConditions(route, currentStep, templateContext) {
|
|
155
218
|
const candidates = [];
|
|
219
|
+
const data = templateContext.data || {};
|
|
220
|
+
// Check if all required fields are collected
|
|
221
|
+
const allRequiredFieldsCollected = route.isComplete(data);
|
|
156
222
|
if (!currentStep) {
|
|
223
|
+
// Entering route for the first time
|
|
224
|
+
// If all required fields already collected, route is immediately complete
|
|
225
|
+
if (allRequiredFieldsCollected) {
|
|
226
|
+
utils_2.logger.debug(`[RoutingEngine] Route ${route.title} complete on entry: all required fields already collected`);
|
|
227
|
+
// Return a completion marker - use initial step with completion flag
|
|
228
|
+
candidates.push({
|
|
229
|
+
step: route.initialStep,
|
|
230
|
+
isRouteComplete: true,
|
|
231
|
+
});
|
|
232
|
+
return candidates;
|
|
233
|
+
}
|
|
157
234
|
const initialStep = route.initialStep;
|
|
158
|
-
|
|
235
|
+
const skipResult = await initialStep.evaluateSkipIf(templateContext);
|
|
236
|
+
if (skipResult.shouldSkip) {
|
|
159
237
|
// Initial step should be skipped - recursively traverse to find first non-skipped step or END_ROUTE
|
|
160
|
-
const result = this.
|
|
238
|
+
const result = await this.findFirstValidStepRecursiveWithConditions(initialStep, templateContext, new Set());
|
|
161
239
|
if (result.isRouteComplete) {
|
|
162
240
|
// All steps are skipped and we reached END_ROUTE
|
|
163
|
-
|
|
241
|
+
utils_2.logger.debug(`[RoutingEngine] Route complete on entry: all steps skipped, END_ROUTE reached`);
|
|
164
242
|
candidates.push({
|
|
165
243
|
step: initialStep,
|
|
166
244
|
isRouteComplete: true,
|
|
@@ -183,6 +261,55 @@ class RoutingEngine {
|
|
|
183
261
|
}
|
|
184
262
|
return candidates;
|
|
185
263
|
}
|
|
264
|
+
// Check if all required fields are now collected (may have been collected during this step)
|
|
265
|
+
if (allRequiredFieldsCollected) {
|
|
266
|
+
// Required fields are complete - check if we should continue for optional fields
|
|
267
|
+
const transitions = currentStep.getTransitions();
|
|
268
|
+
const optionalFieldCandidates = [];
|
|
269
|
+
for (const transition of transitions) {
|
|
270
|
+
const target = transition;
|
|
271
|
+
// Check for END_ROUTE transition
|
|
272
|
+
if (target && target.id === constants_1.END_ROUTE_ID) {
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
if (!target)
|
|
276
|
+
continue;
|
|
277
|
+
// Check if this step collects only optional fields
|
|
278
|
+
const collectsOnlyOptional = target.collect && target.collect.length > 0 &&
|
|
279
|
+
target.collect.every(field => route.optionalFields?.includes(field));
|
|
280
|
+
if (collectsOnlyOptional) {
|
|
281
|
+
// This step collects optional fields - it's a candidate
|
|
282
|
+
const skipResult = await target.evaluateSkipIf(templateContext);
|
|
283
|
+
if (!skipResult.shouldSkip) {
|
|
284
|
+
optionalFieldCandidates.push({
|
|
285
|
+
step: target,
|
|
286
|
+
isRouteComplete: false,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// If we have optional field candidates, include them along with END_ROUTE option
|
|
292
|
+
if (optionalFieldCandidates.length > 0) {
|
|
293
|
+
utils_2.logger.debug(`[RoutingEngine] Required fields complete, but ${optionalFieldCandidates.length} optional field steps available`);
|
|
294
|
+
// Add optional field steps as candidates
|
|
295
|
+
candidates.push(...optionalFieldCandidates);
|
|
296
|
+
// Also add END_ROUTE as a candidate (AI can choose to skip optional fields)
|
|
297
|
+
candidates.push({
|
|
298
|
+
step: currentStep,
|
|
299
|
+
isRouteComplete: true,
|
|
300
|
+
});
|
|
301
|
+
return candidates;
|
|
302
|
+
}
|
|
303
|
+
// No optional fields to collect - route is complete
|
|
304
|
+
utils_2.logger.debug(`[RoutingEngine] Route ${route.title} complete: all required fields collected, no optional fields remain`);
|
|
305
|
+
return [
|
|
306
|
+
{
|
|
307
|
+
step: currentStep,
|
|
308
|
+
isRouteComplete: true,
|
|
309
|
+
},
|
|
310
|
+
];
|
|
311
|
+
}
|
|
312
|
+
// Required fields not yet complete - continue normal step progression
|
|
186
313
|
const transitions = currentStep.getTransitions();
|
|
187
314
|
let hasEndRoute = false;
|
|
188
315
|
for (const transition of transitions) {
|
|
@@ -194,10 +321,11 @@ class RoutingEngine {
|
|
|
194
321
|
}
|
|
195
322
|
if (!target)
|
|
196
323
|
continue;
|
|
197
|
-
|
|
198
|
-
|
|
324
|
+
const skipResult = await target.evaluateSkipIf(templateContext);
|
|
325
|
+
if (skipResult.shouldSkip) {
|
|
326
|
+
utils_2.logger.debug(`[RoutingEngine] Skipping step ${target.id} (skipIf condition met)`);
|
|
199
327
|
// Recursively traverse to find next valid step or END_ROUTE
|
|
200
|
-
const result = this.
|
|
328
|
+
const result = await this.findFirstValidStepRecursiveWithConditions(target, templateContext, new Set([currentStep.id]) // Already visited current step
|
|
201
329
|
);
|
|
202
330
|
if (result.isRouteComplete) {
|
|
203
331
|
hasEndRoute = true;
|
|
@@ -220,7 +348,7 @@ class RoutingEngine {
|
|
|
220
348
|
if (candidates.length === 0) {
|
|
221
349
|
// If current step has END_ROUTE transition, the route is complete
|
|
222
350
|
if (hasEndRoute) {
|
|
223
|
-
|
|
351
|
+
utils_2.logger.debug(`[RoutingEngine] Route complete: all steps processed, END_ROUTE reached`);
|
|
224
352
|
// Return current step with completion flag
|
|
225
353
|
return [
|
|
226
354
|
{
|
|
@@ -230,7 +358,8 @@ class RoutingEngine {
|
|
|
230
358
|
];
|
|
231
359
|
}
|
|
232
360
|
// Otherwise, stay in current step if it's still valid
|
|
233
|
-
|
|
361
|
+
const currentSkipResult = await currentStep.evaluateSkipIf(templateContext);
|
|
362
|
+
if (!currentSkipResult.shouldSkip) {
|
|
234
363
|
candidates.push({
|
|
235
364
|
step: currentStep,
|
|
236
365
|
isRouteComplete: hasEndRoute || false,
|
|
@@ -255,7 +384,7 @@ class RoutingEngine {
|
|
|
255
384
|
const completedRoutes = this.evaluateRouteCompletions(routes, session.data || {});
|
|
256
385
|
// Log completed routes
|
|
257
386
|
if (completedRoutes.length > 0) {
|
|
258
|
-
|
|
387
|
+
utils_2.logger.debug(`[RoutingEngine] Found ${completedRoutes.length} completed routes: ${completedRoutes.map(r => r.title).join(', ')}`);
|
|
259
388
|
}
|
|
260
389
|
// OPTIMIZATION: Single route - skip route scoring, only do step selection
|
|
261
390
|
if (routes.length === 1) {
|
|
@@ -273,39 +402,70 @@ class RoutingEngine {
|
|
|
273
402
|
completedRoutes,
|
|
274
403
|
};
|
|
275
404
|
}
|
|
276
|
-
const lastUserMessage = (0,
|
|
405
|
+
const lastUserMessage = (0, utils_2.getLastMessageFromHistory)(history);
|
|
406
|
+
const templateContext = (0, utils_2.createTemplateContext)({
|
|
407
|
+
context,
|
|
408
|
+
session,
|
|
409
|
+
history,
|
|
410
|
+
data: session.data
|
|
411
|
+
});
|
|
412
|
+
// Apply route filtering with new condition evaluation system
|
|
413
|
+
const skipIfResult = await this.filterRoutesBySkipIf(routes, templateContext);
|
|
414
|
+
const whenResult = await this.filterRoutesByWhen(skipIfResult.eligibleRoutes, templateContext);
|
|
415
|
+
// Collect all AI context strings from route conditions
|
|
416
|
+
const routeConditionContext = [...skipIfResult.aiContextStrings, ...whenResult.aiContextStrings];
|
|
417
|
+
// Use filtered routes for further processing
|
|
418
|
+
const eligibleRoutes = whenResult.eligibleRoutes;
|
|
419
|
+
utils_2.logger.debug(`[RoutingEngine] Route filtering: ${routes.length} total → ${skipIfResult.eligibleRoutes.length} after skipIf → ${eligibleRoutes.length} after when`);
|
|
277
420
|
let activeRouteSteps;
|
|
278
421
|
let activeRoute;
|
|
279
422
|
let isRouteComplete = false;
|
|
423
|
+
let updatedSession = session;
|
|
280
424
|
if (session.currentRoute) {
|
|
281
|
-
activeRoute =
|
|
425
|
+
activeRoute = eligibleRoutes.find((r) => r.id === session.currentRoute?.id);
|
|
282
426
|
if (activeRoute) {
|
|
283
427
|
const currentStep = session.currentStep
|
|
284
428
|
? activeRoute.getStep(session.currentStep.id)
|
|
285
429
|
: undefined;
|
|
286
|
-
const
|
|
430
|
+
const activeTemplateContext = (0, utils_2.createTemplateContext)({
|
|
431
|
+
...templateContext,
|
|
432
|
+
session: updatedSession,
|
|
433
|
+
data: updatedSession.data
|
|
434
|
+
});
|
|
435
|
+
const candidates = await this.getCandidateStepsWithConditions(activeRoute, currentStep, activeTemplateContext);
|
|
287
436
|
// Check if route is complete
|
|
437
|
+
// getCandidateStepsWithConditions now automatically handles completion when required fields are collected
|
|
288
438
|
if (candidates.length === 1 && candidates[0].isRouteComplete) {
|
|
289
439
|
isRouteComplete = true;
|
|
290
|
-
|
|
440
|
+
utils_2.logger.debug(`[RoutingEngine] Route ${activeRoute.title} is complete - all required fields collected or END_ROUTE reached`);
|
|
291
441
|
// Don't include steps in routing if route is complete
|
|
292
442
|
activeRouteSteps = undefined;
|
|
293
443
|
}
|
|
444
|
+
else if (candidates.length === 0) {
|
|
445
|
+
// No candidates - check if data is complete
|
|
446
|
+
const dataComplete = activeRoute.isComplete(updatedSession.data || {});
|
|
447
|
+
isRouteComplete = dataComplete;
|
|
448
|
+
utils_2.logger.debug(`[RoutingEngine] Route ${activeRoute.title} has no valid steps - ` +
|
|
449
|
+
`marking as ${isRouteComplete ? 'complete' : 'incomplete'}`);
|
|
450
|
+
activeRouteSteps = undefined;
|
|
451
|
+
}
|
|
294
452
|
else {
|
|
453
|
+
// Multiple candidates or single non-complete candidate
|
|
295
454
|
activeRouteSteps = candidates.map((c) => c.step);
|
|
296
|
-
|
|
455
|
+
utils_2.logger.debug(`[RoutingEngine] Found ${activeRouteSteps.length} candidate steps for active route`);
|
|
297
456
|
}
|
|
298
457
|
}
|
|
299
458
|
}
|
|
300
|
-
const routingSchema = this.buildDynamicRoutingSchema(
|
|
459
|
+
const routingSchema = this.buildDynamicRoutingSchema(eligibleRoutes, undefined, activeRouteSteps);
|
|
301
460
|
const routingPrompt = await this.buildRoutingPrompt({
|
|
302
461
|
history,
|
|
303
|
-
routes,
|
|
462
|
+
routes: eligibleRoutes,
|
|
304
463
|
lastMessage: lastUserMessage,
|
|
305
464
|
agentOptions,
|
|
306
465
|
session,
|
|
307
466
|
activeRouteSteps,
|
|
308
467
|
context,
|
|
468
|
+
routeConditionContext, // Pass AI context strings from route conditions
|
|
309
469
|
});
|
|
310
470
|
const routingResult = await provider.generateMessage({
|
|
311
471
|
prompt: routingPrompt,
|
|
@@ -320,40 +480,39 @@ class RoutingEngine {
|
|
|
320
480
|
let selectedRoute;
|
|
321
481
|
let selectedStep;
|
|
322
482
|
let responseDirectives;
|
|
323
|
-
let updatedSession = session;
|
|
324
483
|
if (routingResult.structured?.routes) {
|
|
325
484
|
// Use cross-route completion evaluation to select optimal route
|
|
326
|
-
const optimalRoute = this.selectOptimalRoute(
|
|
327
|
-
//
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
|
|
485
|
+
const optimalRoute = this.selectOptimalRoute(eligibleRoutes, updatedSession.data || {}, routingResult.structured.routes);
|
|
486
|
+
// If no optimal route found, check why
|
|
487
|
+
if (!optimalRoute) {
|
|
488
|
+
if (eligibleRoutes.length === 0) {
|
|
489
|
+
// No routes passed filtering
|
|
490
|
+
utils_2.logger.debug(`[RoutingEngine] No eligible routes available - all routes filtered out`);
|
|
491
|
+
selectedRoute = undefined;
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
// Routes exist but selectOptimalRoute returned undefined
|
|
495
|
+
// This means all routes are 100% complete
|
|
496
|
+
utils_2.logger.debug(`[RoutingEngine] No optimal route found - all ${eligibleRoutes.length} eligible routes are complete`);
|
|
497
|
+
selectedRoute = undefined;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
else {
|
|
501
|
+
selectedRoute = optimalRoute;
|
|
502
|
+
}
|
|
336
503
|
responseDirectives = routingResult.structured.responseDirectives;
|
|
337
504
|
if (selectedRoute === activeRoute &&
|
|
338
505
|
routingResult.structured.selectedStepId &&
|
|
339
506
|
activeRoute) {
|
|
340
507
|
selectedStep = activeRoute.getStep(routingResult.structured.selectedStepId);
|
|
341
508
|
if (selectedStep) {
|
|
342
|
-
|
|
343
|
-
|
|
509
|
+
utils_2.logger.debug(`[RoutingEngine] AI selected step: ${selectedStep.id} in active route`);
|
|
510
|
+
utils_2.logger.debug(`[RoutingEngine] Step reasoning: ${routingResult.structured.stepReasoning}`);
|
|
344
511
|
}
|
|
345
512
|
}
|
|
346
513
|
if (selectedRoute) {
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
session.currentRoute.id !== selectedRoute.id) {
|
|
350
|
-
updatedSession = (0, utils_1.enterRoute)(session, selectedRoute.id, selectedRoute.title);
|
|
351
|
-
if (selectedRoute.initialData) {
|
|
352
|
-
updatedSession = (0, utils_1.mergeCollected)(updatedSession, selectedRoute.initialData);
|
|
353
|
-
logger_1.logger.debug(`[RoutingEngine] Merged initial data:`, selectedRoute.initialData);
|
|
354
|
-
}
|
|
355
|
-
logger_1.logger.debug(`[RoutingEngine] Entered route: ${selectedRoute.title}`);
|
|
356
|
-
}
|
|
514
|
+
utils_2.logger.debug(`[RoutingEngine] Selected route: ${selectedRoute.title}`);
|
|
515
|
+
updatedSession = this.enterRouteIfNeeded(updatedSession, selectedRoute);
|
|
357
516
|
}
|
|
358
517
|
}
|
|
359
518
|
return {
|
|
@@ -365,6 +524,52 @@ class RoutingEngine {
|
|
|
365
524
|
completedRoutes,
|
|
366
525
|
};
|
|
367
526
|
}
|
|
527
|
+
/**
|
|
528
|
+
* Filter routes based on skipIf conditions
|
|
529
|
+
* @param routes - All available routes
|
|
530
|
+
* @param templateContext - Context for condition evaluation
|
|
531
|
+
* @returns Object with eligible routes and collected AI context strings
|
|
532
|
+
*/
|
|
533
|
+
async filterRoutesBySkipIf(routes, templateContext) {
|
|
534
|
+
const eligibleRoutes = [];
|
|
535
|
+
const aiContextStrings = [];
|
|
536
|
+
for (const route of routes) {
|
|
537
|
+
const skipResult = await route.evaluateSkipIf(templateContext);
|
|
538
|
+
// Collect AI context strings from skipIf conditions
|
|
539
|
+
aiContextStrings.push(...skipResult.aiContextStrings);
|
|
540
|
+
// If route should not be skipped, it's eligible
|
|
541
|
+
if (!skipResult.programmaticResult) {
|
|
542
|
+
eligibleRoutes.push(route);
|
|
543
|
+
}
|
|
544
|
+
else {
|
|
545
|
+
utils_2.logger.debug(`[RoutingEngine] Skipping route ${route.title} (skipIf condition met)`);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return { eligibleRoutes, aiContextStrings };
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Filter routes based on when conditions
|
|
552
|
+
* @param routes - Routes that passed skipIf filtering
|
|
553
|
+
* @param templateContext - Context for condition evaluation
|
|
554
|
+
* @returns Object with eligible routes and collected AI context strings
|
|
555
|
+
*/
|
|
556
|
+
async filterRoutesByWhen(routes, templateContext) {
|
|
557
|
+
const eligibleRoutes = [];
|
|
558
|
+
const aiContextStrings = [];
|
|
559
|
+
for (const route of routes) {
|
|
560
|
+
const whenResult = await route.evaluateWhen(templateContext);
|
|
561
|
+
// Collect AI context strings from when conditions
|
|
562
|
+
aiContextStrings.push(...whenResult.aiContextStrings);
|
|
563
|
+
// If route has no programmatic conditions or they evaluate to true, it's eligible
|
|
564
|
+
if (!whenResult.hasProgrammaticConditions || whenResult.programmaticResult) {
|
|
565
|
+
eligibleRoutes.push(route);
|
|
566
|
+
}
|
|
567
|
+
else {
|
|
568
|
+
utils_2.logger.debug(`[RoutingEngine] Route ${route.title} not eligible (when condition not met)`);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
return { eligibleRoutes, aiContextStrings };
|
|
572
|
+
}
|
|
368
573
|
/**
|
|
369
574
|
* Evaluate all routes for completion based on collected data
|
|
370
575
|
* @param routes - All available routes
|
|
@@ -391,6 +596,7 @@ class RoutingEngine {
|
|
|
391
596
|
/**
|
|
392
597
|
* Find the best route to continue based on completion status and user intent
|
|
393
598
|
* Prioritizes routes that are partially complete but not finished
|
|
599
|
+
* IMPORTANT: Completed routes are excluded to prevent re-entering finished tasks
|
|
394
600
|
* @param routes - All available routes
|
|
395
601
|
* @param data - Currently collected agent-level data
|
|
396
602
|
* @param routeScores - AI-generated route scores from routing decision
|
|
@@ -403,8 +609,10 @@ class RoutingEngine {
|
|
|
403
609
|
for (const route of routes) {
|
|
404
610
|
const aiScore = routeScores[route.id] || 0;
|
|
405
611
|
const completionProgress = completionStatus.get(route.id) || 0;
|
|
406
|
-
//
|
|
407
|
-
|
|
612
|
+
// ALWAYS skip fully completed routes to prevent re-entering finished tasks
|
|
613
|
+
// Users should not be forced back into completed routes
|
|
614
|
+
if (completionProgress >= 1.0) {
|
|
615
|
+
utils_2.logger.debug(`[RoutingEngine] Excluding completed route: ${route.title} (100% complete)`);
|
|
408
616
|
continue;
|
|
409
617
|
}
|
|
410
618
|
// Boost partially complete routes that match user intent
|
|
@@ -418,7 +626,7 @@ class RoutingEngine {
|
|
|
418
626
|
// Sort by weighted score and return the best option
|
|
419
627
|
weightedScores.sort((a, b) => b.score - a.score);
|
|
420
628
|
if (weightedScores.length > 0) {
|
|
421
|
-
|
|
629
|
+
utils_2.logger.debug(`[RoutingEngine] Selected optimal route: ${weightedScores[0].route.title} ` +
|
|
422
630
|
`(AI: ${routeScores[weightedScores[0].route.id]}, ` +
|
|
423
631
|
`Completion: ${(completionStatus.get(weightedScores[0].route.id) || 0) * 100}%, ` +
|
|
424
632
|
`Weighted: ${weightedScores[0].score})`);
|
|
@@ -431,8 +639,8 @@ class RoutingEngine {
|
|
|
431
639
|
* @private
|
|
432
640
|
*/
|
|
433
641
|
async buildStepSelectionPrompt(params) {
|
|
434
|
-
const { route, currentStep, candidates, data, history, lastMessage, agentOptions, context, session, } = params;
|
|
435
|
-
const templateContext = { context, session, history };
|
|
642
|
+
const { route, currentStep, candidates, data, history, lastMessage, agentOptions, context, session, stepConditionContext, includeEndRoute = false, } = params;
|
|
643
|
+
const templateContext = (0, utils_2.createTemplateContext)({ context, session, history });
|
|
436
644
|
const pc = new PromptComposer_1.PromptComposer(templateContext);
|
|
437
645
|
// Add agent metadata
|
|
438
646
|
if (agentOptions) {
|
|
@@ -457,7 +665,7 @@ class RoutingEngine {
|
|
|
457
665
|
// Add conversation history
|
|
458
666
|
await pc.addInteractionHistory(history);
|
|
459
667
|
await pc.addLastMessage(lastMessage);
|
|
460
|
-
// Add candidate steps
|
|
668
|
+
// Add candidate steps with condition context
|
|
461
669
|
const stepDescriptions = [];
|
|
462
670
|
for (const candidate of candidates) {
|
|
463
671
|
const idx = candidates.indexOf(candidate);
|
|
@@ -465,9 +673,15 @@ class RoutingEngine {
|
|
|
465
673
|
`${idx + 1}. Step ID: ${candidate.step.id}`,
|
|
466
674
|
` Description: ${candidate.step.description || "N/A"}`,
|
|
467
675
|
];
|
|
676
|
+
// Add when condition context
|
|
468
677
|
if (candidate.step.when) {
|
|
469
|
-
const
|
|
470
|
-
|
|
678
|
+
const whenResult = await candidate.step.evaluateWhen(templateContext);
|
|
679
|
+
if (whenResult.aiContextStrings.length > 0) {
|
|
680
|
+
parts.push(` When conditions: ${whenResult.aiContextStrings.join(", ")}`);
|
|
681
|
+
}
|
|
682
|
+
else if (typeof candidate.step.when === 'string') {
|
|
683
|
+
parts.push(` When this step should be completed: ${candidate.step.when}`);
|
|
684
|
+
}
|
|
471
685
|
}
|
|
472
686
|
if (candidate.step.requires && candidate.step.requires.length > 0) {
|
|
473
687
|
parts.push(` Required Data: ${candidate.step.requires.join(", ")}`);
|
|
@@ -478,8 +692,18 @@ class RoutingEngine {
|
|
|
478
692
|
stepDescriptions.push(parts.join("\n"));
|
|
479
693
|
}
|
|
480
694
|
await pc.addInstruction(`Available Steps to Transition To:\n${stepDescriptions.join("\n\n")}`);
|
|
695
|
+
// Add step condition context if available
|
|
696
|
+
if (stepConditionContext && stepConditionContext.length > 0) {
|
|
697
|
+
await pc.addInstruction([
|
|
698
|
+
"",
|
|
699
|
+
"Additional step context from conditions:",
|
|
700
|
+
...stepConditionContext.map(ctx => `- ${ctx}`),
|
|
701
|
+
"",
|
|
702
|
+
"Consider this context when selecting the most appropriate step.",
|
|
703
|
+
].join("\n"));
|
|
704
|
+
}
|
|
481
705
|
// Add decision prompt
|
|
482
|
-
|
|
706
|
+
const decisionRules = [
|
|
483
707
|
"Task: Decide which step to transition to based on:",
|
|
484
708
|
"1. The user's current message and intent",
|
|
485
709
|
"2. The conversation history and context",
|
|
@@ -492,16 +716,24 @@ class RoutingEngine {
|
|
|
492
716
|
"- If a step requires data we don't have, consider if we should collect it now",
|
|
493
717
|
"- Choose the step that makes the most sense for moving the conversation forward",
|
|
494
718
|
"- Steps with skipIf conditions that are met have already been filtered out",
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
719
|
+
];
|
|
720
|
+
if (includeEndRoute) {
|
|
721
|
+
decisionRules.push("", `- You can select '${constants_1.END_ROUTE_ID}' to complete this route if:`, " * All required data has been collected", " * The user's intent suggests they're done with this task", " * No further steps are needed to fulfill the user's request");
|
|
722
|
+
}
|
|
723
|
+
decisionRules.push("", "Return ONLY JSON matching the provided schema.");
|
|
724
|
+
await pc.addInstruction(decisionRules.join("\n"));
|
|
498
725
|
return pc.build();
|
|
499
726
|
}
|
|
500
727
|
/**
|
|
501
728
|
* Build schema for step selection
|
|
502
729
|
* @private
|
|
503
730
|
*/
|
|
504
|
-
buildStepSelectionSchema(validSteps) {
|
|
731
|
+
buildStepSelectionSchema(validSteps, includeEndRoute = false) {
|
|
732
|
+
const stepIds = validSteps.map((s) => s.id);
|
|
733
|
+
// Add END_ROUTE as an option if requested (when required fields are complete)
|
|
734
|
+
if (includeEndRoute) {
|
|
735
|
+
stepIds.push(constants_1.END_ROUTE_ID);
|
|
736
|
+
}
|
|
505
737
|
return {
|
|
506
738
|
description: "Step transition decision based on conversation context and collected data",
|
|
507
739
|
type: "object",
|
|
@@ -514,8 +746,10 @@ class RoutingEngine {
|
|
|
514
746
|
selectedStepId: {
|
|
515
747
|
type: "string",
|
|
516
748
|
nullable: false,
|
|
517
|
-
description:
|
|
518
|
-
|
|
749
|
+
description: includeEndRoute
|
|
750
|
+
? `The ID of the selected step to transition to, or '${constants_1.END_ROUTE_ID}' to complete the route`
|
|
751
|
+
: "The ID of the selected step to transition to",
|
|
752
|
+
enum: stepIds,
|
|
519
753
|
},
|
|
520
754
|
responseDirectives: {
|
|
521
755
|
type: "array",
|
|
@@ -591,8 +825,8 @@ class RoutingEngine {
|
|
|
591
825
|
return base;
|
|
592
826
|
}
|
|
593
827
|
async buildRoutingPrompt(params) {
|
|
594
|
-
const { history, routes, lastMessage, agentOptions, session, activeRouteSteps, context, } = params;
|
|
595
|
-
const templateContext = { context, session, history };
|
|
828
|
+
const { history, routes, lastMessage, agentOptions, session, activeRouteSteps, context, routeConditionContext, } = params;
|
|
829
|
+
const templateContext = (0, utils_2.createTemplateContext)({ context, session, history });
|
|
596
830
|
const pc = new PromptComposer_1.PromptComposer(templateContext);
|
|
597
831
|
if (agentOptions) {
|
|
598
832
|
await pc.addAgentMeta(agentOptions);
|
|
@@ -644,15 +878,23 @@ class RoutingEngine {
|
|
|
644
878
|
"",
|
|
645
879
|
"Available steps in active route (choose one to transition to):",
|
|
646
880
|
];
|
|
881
|
+
const activeStepConditionContext = [];
|
|
647
882
|
for (const step of activeRouteSteps) {
|
|
648
883
|
const idx = activeRouteSteps.indexOf(step);
|
|
649
884
|
stepInfo.push(`${idx + 1}. Step: ${step.id}`);
|
|
650
885
|
if (step.description) {
|
|
651
886
|
stepInfo.push(` Description: ${step.description}`);
|
|
652
887
|
}
|
|
653
|
-
|
|
888
|
+
// Collect AI context from step conditions
|
|
654
889
|
if (step.when) {
|
|
655
|
-
|
|
890
|
+
const whenResult = await step.evaluateWhen(templateContext);
|
|
891
|
+
if (whenResult.aiContextStrings.length > 0) {
|
|
892
|
+
stepInfo.push(` When conditions: ${whenResult.aiContextStrings.join(", ")}`);
|
|
893
|
+
activeStepConditionContext.push(...whenResult.aiContextStrings);
|
|
894
|
+
}
|
|
895
|
+
else if (typeof step.when === 'string') {
|
|
896
|
+
stepInfo.push(` When this step should be completed: ${step.when}`);
|
|
897
|
+
}
|
|
656
898
|
}
|
|
657
899
|
if (step.requires && step.requires.length > 0) {
|
|
658
900
|
stepInfo.push(` Required data: ${step.requires.join(", ")}`);
|
|
@@ -668,11 +910,31 @@ class RoutingEngine {
|
|
|
668
910
|
stepInfo.push("- The logical next step in the conversation");
|
|
669
911
|
stepInfo.push("- Whether conditions for steps are met");
|
|
670
912
|
await pc.addInstruction(stepInfo.join("\n"));
|
|
913
|
+
// Add active step condition context if available
|
|
914
|
+
if (activeStepConditionContext.length > 0) {
|
|
915
|
+
await pc.addInstruction([
|
|
916
|
+
"",
|
|
917
|
+
"Additional context from step conditions:",
|
|
918
|
+
...activeStepConditionContext.map(ctx => `- ${ctx}`),
|
|
919
|
+
"",
|
|
920
|
+
"Use this context to inform your step selection decision.",
|
|
921
|
+
].join("\n"));
|
|
922
|
+
}
|
|
671
923
|
}
|
|
672
924
|
}
|
|
673
925
|
await pc.addInteractionHistory(history);
|
|
674
926
|
await pc.addLastMessage(lastMessage);
|
|
675
927
|
await pc.addRoutingOverview(routes);
|
|
928
|
+
// Add route condition context if available
|
|
929
|
+
if (routeConditionContext && routeConditionContext.length > 0) {
|
|
930
|
+
await pc.addInstruction([
|
|
931
|
+
"",
|
|
932
|
+
"Additional routing context from route conditions:",
|
|
933
|
+
...routeConditionContext.map(ctx => `- ${ctx}`),
|
|
934
|
+
"",
|
|
935
|
+
"Consider this context when scoring routes for relevance.",
|
|
936
|
+
].join("\n"));
|
|
937
|
+
}
|
|
676
938
|
await pc.addInstruction([
|
|
677
939
|
"Scoring rules:",
|
|
678
940
|
"- 90-100: explicit keywords + clear intent",
|