@falai/agent 0.9.2 → 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 +262 -38
- 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/cjs/{src/core → core}/Agent.d.ts +6 -1
- package/dist/cjs/core/Agent.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/Agent.js +42 -2
- 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 +45 -0
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/ResponseModal.js +686 -66
- package/dist/cjs/core/ResponseModal.js.map +1 -0
- package/dist/{src → cjs}/core/ResponsePipeline.d.ts +2 -2
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/ResponsePipeline.js +13 -6
- package/dist/cjs/core/ResponsePipeline.js.map +1 -0
- package/dist/{src → cjs}/core/Route.d.ts +34 -5
- package/dist/cjs/core/Route.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/Route.js +196 -19
- package/dist/cjs/core/Route.js.map +1 -0
- package/dist/cjs/{src/core → core}/RoutingEngine.d.ts +30 -5
- package/dist/cjs/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/RoutingEngine.js +330 -80
- package/dist/cjs/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/core/SessionManager.js.map +1 -0
- package/dist/{src → cjs}/core/Step.d.ts +31 -10
- package/dist/cjs/core/Step.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/Step.js +105 -10
- package/dist/cjs/core/Step.js.map +1 -0
- package/dist/cjs/core/ToolManager.js.map +1 -0
- package/dist/{src → cjs}/index.d.ts +4 -1
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/{src/index.js → index.js} +12 -1
- 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 +11 -3
- 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 +2 -1
- package/dist/{src → cjs}/types/index.d.ts.map +1 -1
- package/dist/cjs/{src/types → types}/index.js +6 -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 +111 -12
- 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.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/{src/core → core}/Agent.d.ts +6 -1
- package/dist/core/Agent.d.ts.map +1 -0
- package/dist/{src/core → core}/Agent.js +43 -3
- 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 +45 -0
- package/dist/core/ResponseModal.d.ts.map +1 -0
- package/dist/{src/core → core}/ResponseModal.js +686 -66
- package/dist/core/ResponseModal.js.map +1 -0
- package/dist/{cjs/src/core → core}/ResponsePipeline.d.ts +2 -2
- package/dist/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/{src/core → core}/ResponsePipeline.js +13 -6
- package/dist/core/ResponsePipeline.js.map +1 -0
- package/dist/{cjs/src/core → core}/Route.d.ts +34 -5
- package/dist/core/Route.d.ts.map +1 -0
- package/dist/{src/core → core}/Route.js +195 -18
- package/dist/core/Route.js.map +1 -0
- package/dist/{src/core → core}/RoutingEngine.d.ts +30 -5
- package/dist/core/RoutingEngine.d.ts.map +1 -0
- package/dist/{src/core → core}/RoutingEngine.js +310 -60
- package/dist/core/RoutingEngine.js.map +1 -0
- package/dist/core/SessionManager.d.ts.map +1 -0
- package/dist/core/SessionManager.js.map +1 -0
- package/dist/{cjs/src/core → core}/Step.d.ts +31 -10
- package/dist/core/Step.d.ts.map +1 -0
- package/dist/{src/core → core}/Step.js +104 -9
- package/dist/core/Step.js.map +1 -0
- package/dist/core/ToolManager.d.ts.map +1 -0
- package/dist/core/ToolManager.js.map +1 -0
- package/dist/{cjs/src/index.d.ts → index.d.ts} +4 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/{src/index.js → index.js} +3 -0
- 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 +11 -3
- 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 +2 -1
- package/dist/types/index.d.ts.map +1 -0
- package/dist/{src/types → types}/index.js +1 -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 +111 -12
- 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.map +1 -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/api/README.md +221 -12
- package/docs/api/overview.md +202 -3
- 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 +1 -1
- package/docs/core/ai-integration/prompt-composition.md +135 -0
- package/docs/core/ai-integration/response-processing.md +146 -0
- package/docs/core/conversation-flows/data-collection.md +143 -0
- package/docs/core/conversation-flows/routes.md +2 -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 +193 -0
- package/docs/core/routing/intelligent-routing.md +118 -0
- package/docs/guides/getting-started/README.md +284 -3
- 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 +101 -24
- package/examples/advanced-patterns/persistent-onboarding.ts +40 -5
- 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 +4 -4
- package/examples/ai-providers/openai-integration.ts +1 -1
- 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 +54 -33
- package/examples/core-concepts/schema-driven-extraction.ts +33 -9
- package/examples/core-concepts/session-management.ts +51 -16
- package/examples/integrations/database-integration.ts +6 -6
- package/examples/integrations/healthcare-integration.ts +10 -10
- package/examples/integrations/search-integration.ts +8 -8
- package/examples/integrations/server-session-management.ts +8 -8
- package/examples/persistence/database-persistence.ts +15 -15
- package/examples/persistence/memory-sessions.ts +3 -3
- package/examples/persistence/redis-persistence.ts +7 -9
- package/examples/tools/data-enrichment-tools.ts +4 -4
- package/package.json +6 -4
- package/src/adapters/PrismaAdapter.ts +3 -2
- package/src/adapters/RedisAdapter.ts +3 -3
- package/src/core/Agent.ts +54 -2
- 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 +888 -66
- package/src/core/ResponsePipeline.ts +17 -9
- package/src/core/Route.ts +223 -22
- package/src/core/RoutingEngine.ts +426 -83
- package/src/core/Step.ts +144 -16
- package/src/index.ts +19 -0
- 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 +11 -3
- package/src/types/index.ts +12 -1
- package/src/types/route.ts +131 -12
- package/src/types/template.ts +70 -2
- 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.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.map +0 -1
- package/dist/cjs/src/core/Step.js.map +0 -1
- package/dist/cjs/src/core/ToolManager.d.ts.map +0 -1
- package/dist/cjs/src/core/ToolManager.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.map +0 -1
- 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.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.js.map +0 -1
- package/dist/src/core/Step.d.ts.map +0 -1
- package/dist/src/core/Step.js.map +0 -1
- package/dist/src/core/ToolManager.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.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/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/core → core}/SessionManager.d.ts +0 -0
- /package/dist/{src → cjs}/core/SessionManager.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/SessionManager.js +0 -0
- /package/dist/cjs/{src/core → core}/ToolManager.d.ts +0 -0
- /package/dist/{src → cjs}/core/ToolManager.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/ToolManager.js +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/types → types}/tool.d.ts +0 -0
- /package/dist/{src → cjs}/types/tool.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/tool.js +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/core → core}/SessionManager.d.ts +0 -0
- /package/dist/{src/core → core}/SessionManager.js +0 -0
- /package/dist/{src/core → core}/ToolManager.d.ts +0 -0
- /package/dist/{src/core → core}/ToolManager.js +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/types → types}/tool.d.ts +0 -0
- /package/dist/{src/types → types}/tool.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,10 +3,8 @@ 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;
|
|
@@ -20,9 +18,9 @@ class RoutingEngine {
|
|
|
20
18
|
let updatedSession = (0, utils_1.enterRoute)(session, route.id, route.title);
|
|
21
19
|
if (route.initialData) {
|
|
22
20
|
updatedSession = (0, utils_1.mergeCollected)(updatedSession, route.initialData);
|
|
23
|
-
|
|
21
|
+
utils_2.logger.debug(`[RoutingEngine] Merged initial data for route ${route.title}:`, route.initialData);
|
|
24
22
|
}
|
|
25
|
-
|
|
23
|
+
utils_2.logger.debug(`[RoutingEngine] Entered route: ${route.title}`);
|
|
26
24
|
return updatedSession;
|
|
27
25
|
}
|
|
28
26
|
return session;
|
|
@@ -39,21 +37,26 @@ class RoutingEngine {
|
|
|
39
37
|
const updatedSession = this.enterRouteIfNeeded(session, route);
|
|
40
38
|
// Check if this single route is complete (use updated session data)
|
|
41
39
|
const completedRoutes = route.isComplete(updatedSession.data || {}) ? [route] : [];
|
|
42
|
-
// Get candidate steps
|
|
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
|
+
});
|
|
43
47
|
const currentStep = updatedSession.currentStep
|
|
44
48
|
? route.getStep(updatedSession.currentStep.id)
|
|
45
49
|
: undefined;
|
|
46
|
-
const candidates = this.
|
|
50
|
+
const candidates = await this.getCandidateStepsWithConditions(route, currentStep, templateContext);
|
|
47
51
|
if (candidates.length === 0) {
|
|
48
|
-
|
|
52
|
+
utils_2.logger.warn(`[RoutingEngine] Single-route: No valid steps found`);
|
|
49
53
|
return { selectedRoute, session: updatedSession };
|
|
50
54
|
}
|
|
51
|
-
// If only one candidate,
|
|
55
|
+
// If only one candidate, check if it's a completion marker
|
|
52
56
|
if (candidates.length === 1) {
|
|
53
57
|
const candidate = candidates[0];
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
logger_1.logger.debug(`[RoutingEngine] Single-route: Route complete - all data collected, END_ROUTE reached`);
|
|
58
|
+
if (candidate.isRouteComplete) {
|
|
59
|
+
utils_2.logger.debug(`[RoutingEngine] Single-route: Route complete - all required fields collected or END_ROUTE reached`);
|
|
57
60
|
// Don't return a selectedStep when route is complete - there's no step to enter
|
|
58
61
|
return {
|
|
59
62
|
selectedRoute,
|
|
@@ -64,7 +67,7 @@ class RoutingEngine {
|
|
|
64
67
|
};
|
|
65
68
|
}
|
|
66
69
|
else {
|
|
67
|
-
|
|
70
|
+
utils_2.logger.debug(`[RoutingEngine] Single-route: Only one valid step: ${candidate.step.id}`);
|
|
68
71
|
return {
|
|
69
72
|
selectedRoute,
|
|
70
73
|
selectedStep: candidate.step,
|
|
@@ -76,17 +79,27 @@ class RoutingEngine {
|
|
|
76
79
|
}
|
|
77
80
|
// No candidates means route is likely complete or has no valid next steps
|
|
78
81
|
if (candidates.length === 0) {
|
|
79
|
-
|
|
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'})`);
|
|
80
85
|
return {
|
|
81
86
|
selectedRoute,
|
|
82
87
|
selectedStep: undefined,
|
|
83
88
|
session: updatedSession,
|
|
84
|
-
isRouteComplete:
|
|
89
|
+
isRouteComplete: dataComplete,
|
|
85
90
|
completedRoutes,
|
|
86
91
|
};
|
|
87
92
|
}
|
|
88
93
|
// Multiple candidates - use AI to select best step
|
|
89
|
-
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);
|
|
90
103
|
const stepPrompt = await this.buildStepSelectionPrompt({
|
|
91
104
|
route,
|
|
92
105
|
currentStep,
|
|
@@ -97,8 +110,10 @@ class RoutingEngine {
|
|
|
97
110
|
agentOptions,
|
|
98
111
|
context,
|
|
99
112
|
session: updatedSession,
|
|
113
|
+
stepConditionContext,
|
|
114
|
+
includeEndRoute: hasCompletionOption,
|
|
100
115
|
});
|
|
101
|
-
const stepSchema = this.buildStepSelectionSchema(candidates.map((c) => c.step));
|
|
116
|
+
const stepSchema = this.buildStepSelectionSchema(candidates.filter(c => !c.isRouteComplete).map((c) => c.step), hasCompletionOption);
|
|
102
117
|
const stepResult = await provider.generateMessage({
|
|
103
118
|
prompt: stepPrompt,
|
|
104
119
|
history,
|
|
@@ -110,13 +125,26 @@ class RoutingEngine {
|
|
|
110
125
|
},
|
|
111
126
|
});
|
|
112
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
|
+
}
|
|
113
141
|
const selectedStep = candidates.find((c) => c.step.id === selectedStepId);
|
|
114
142
|
if (selectedStep) {
|
|
115
|
-
|
|
116
|
-
|
|
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}`);
|
|
117
145
|
}
|
|
118
146
|
else {
|
|
119
|
-
|
|
147
|
+
utils_2.logger.warn(`[RoutingEngine] Single-route: Invalid step ID returned, using first candidate`);
|
|
120
148
|
}
|
|
121
149
|
return {
|
|
122
150
|
selectedRoute,
|
|
@@ -127,16 +155,17 @@ class RoutingEngine {
|
|
|
127
155
|
};
|
|
128
156
|
}
|
|
129
157
|
/**
|
|
130
|
-
* 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
|
|
131
159
|
* @private
|
|
132
160
|
*/
|
|
133
|
-
|
|
161
|
+
async findFirstValidStepRecursiveWithConditions(currentStep, templateContext, visited) {
|
|
134
162
|
// Prevent infinite loops
|
|
135
163
|
if (visited.has(currentStep.id)) {
|
|
136
|
-
return {};
|
|
164
|
+
return { aiContextStrings: [] };
|
|
137
165
|
}
|
|
138
166
|
visited.add(currentStep.id);
|
|
139
167
|
const transitions = currentStep.getTransitions();
|
|
168
|
+
const allAiContextStrings = [];
|
|
140
169
|
for (const transition of transitions) {
|
|
141
170
|
const target = transition;
|
|
142
171
|
// Check for END_ROUTE transition
|
|
@@ -144,43 +173,72 @@ class RoutingEngine {
|
|
|
144
173
|
// Found END_ROUTE - route is complete
|
|
145
174
|
return {
|
|
146
175
|
isRouteComplete: true,
|
|
176
|
+
aiContextStrings: allAiContextStrings,
|
|
147
177
|
};
|
|
148
178
|
}
|
|
149
179
|
if (!target)
|
|
150
180
|
continue;
|
|
181
|
+
// Evaluate skipIf condition using new system
|
|
182
|
+
const skipResult = await target.evaluateSkipIf(templateContext);
|
|
183
|
+
allAiContextStrings.push(...skipResult.aiContextStrings);
|
|
151
184
|
// If target should NOT be skipped, we found our step
|
|
152
|
-
if (!
|
|
153
|
-
|
|
185
|
+
if (!skipResult.shouldSkip) {
|
|
186
|
+
utils_2.logger.debug(`[RoutingEngine] Found valid step after skipping: ${target.id}`);
|
|
154
187
|
return {
|
|
155
188
|
step: target,
|
|
156
189
|
isRouteComplete: false,
|
|
190
|
+
aiContextStrings: allAiContextStrings,
|
|
157
191
|
};
|
|
158
192
|
}
|
|
159
193
|
// Target should be skipped too - recurse deeper
|
|
160
|
-
|
|
161
|
-
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
|
+
}
|
|
162
200
|
// If we found something (a valid step or END_ROUTE), return it
|
|
163
201
|
if (result.step || result.isRouteComplete) {
|
|
164
|
-
return
|
|
202
|
+
return {
|
|
203
|
+
...result,
|
|
204
|
+
aiContextStrings: allAiContextStrings,
|
|
205
|
+
};
|
|
165
206
|
}
|
|
166
207
|
}
|
|
167
208
|
// No valid steps or END_ROUTE found in this branch
|
|
168
|
-
return {};
|
|
209
|
+
return { aiContextStrings: allAiContextStrings };
|
|
169
210
|
}
|
|
170
211
|
/**
|
|
171
|
-
* Identify valid next candidate steps
|
|
212
|
+
* Identify valid next candidate steps using new condition evaluation system
|
|
172
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
|
|
173
216
|
*/
|
|
174
|
-
|
|
217
|
+
async getCandidateStepsWithConditions(route, currentStep, templateContext) {
|
|
175
218
|
const candidates = [];
|
|
219
|
+
const data = templateContext.data || {};
|
|
220
|
+
// Check if all required fields are collected
|
|
221
|
+
const allRequiredFieldsCollected = route.isComplete(data);
|
|
176
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
|
+
}
|
|
177
234
|
const initialStep = route.initialStep;
|
|
178
|
-
|
|
235
|
+
const skipResult = await initialStep.evaluateSkipIf(templateContext);
|
|
236
|
+
if (skipResult.shouldSkip) {
|
|
179
237
|
// Initial step should be skipped - recursively traverse to find first non-skipped step or END_ROUTE
|
|
180
|
-
const result = this.
|
|
238
|
+
const result = await this.findFirstValidStepRecursiveWithConditions(initialStep, templateContext, new Set());
|
|
181
239
|
if (result.isRouteComplete) {
|
|
182
240
|
// All steps are skipped and we reached END_ROUTE
|
|
183
|
-
|
|
241
|
+
utils_2.logger.debug(`[RoutingEngine] Route complete on entry: all steps skipped, END_ROUTE reached`);
|
|
184
242
|
candidates.push({
|
|
185
243
|
step: initialStep,
|
|
186
244
|
isRouteComplete: true,
|
|
@@ -203,6 +261,55 @@ class RoutingEngine {
|
|
|
203
261
|
}
|
|
204
262
|
return candidates;
|
|
205
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
|
|
206
313
|
const transitions = currentStep.getTransitions();
|
|
207
314
|
let hasEndRoute = false;
|
|
208
315
|
for (const transition of transitions) {
|
|
@@ -214,10 +321,11 @@ class RoutingEngine {
|
|
|
214
321
|
}
|
|
215
322
|
if (!target)
|
|
216
323
|
continue;
|
|
217
|
-
|
|
218
|
-
|
|
324
|
+
const skipResult = await target.evaluateSkipIf(templateContext);
|
|
325
|
+
if (skipResult.shouldSkip) {
|
|
326
|
+
utils_2.logger.debug(`[RoutingEngine] Skipping step ${target.id} (skipIf condition met)`);
|
|
219
327
|
// Recursively traverse to find next valid step or END_ROUTE
|
|
220
|
-
const result = this.
|
|
328
|
+
const result = await this.findFirstValidStepRecursiveWithConditions(target, templateContext, new Set([currentStep.id]) // Already visited current step
|
|
221
329
|
);
|
|
222
330
|
if (result.isRouteComplete) {
|
|
223
331
|
hasEndRoute = true;
|
|
@@ -240,7 +348,7 @@ class RoutingEngine {
|
|
|
240
348
|
if (candidates.length === 0) {
|
|
241
349
|
// If current step has END_ROUTE transition, the route is complete
|
|
242
350
|
if (hasEndRoute) {
|
|
243
|
-
|
|
351
|
+
utils_2.logger.debug(`[RoutingEngine] Route complete: all steps processed, END_ROUTE reached`);
|
|
244
352
|
// Return current step with completion flag
|
|
245
353
|
return [
|
|
246
354
|
{
|
|
@@ -250,7 +358,8 @@ class RoutingEngine {
|
|
|
250
358
|
];
|
|
251
359
|
}
|
|
252
360
|
// Otherwise, stay in current step if it's still valid
|
|
253
|
-
|
|
361
|
+
const currentSkipResult = await currentStep.evaluateSkipIf(templateContext);
|
|
362
|
+
if (!currentSkipResult.shouldSkip) {
|
|
254
363
|
candidates.push({
|
|
255
364
|
step: currentStep,
|
|
256
365
|
isRouteComplete: hasEndRoute || false,
|
|
@@ -275,7 +384,7 @@ class RoutingEngine {
|
|
|
275
384
|
const completedRoutes = this.evaluateRouteCompletions(routes, session.data || {});
|
|
276
385
|
// Log completed routes
|
|
277
386
|
if (completedRoutes.length > 0) {
|
|
278
|
-
|
|
387
|
+
utils_2.logger.debug(`[RoutingEngine] Found ${completedRoutes.length} completed routes: ${completedRoutes.map(r => r.title).join(', ')}`);
|
|
279
388
|
}
|
|
280
389
|
// OPTIMIZATION: Single route - skip route scoring, only do step selection
|
|
281
390
|
if (routes.length === 1) {
|
|
@@ -293,39 +402,70 @@ class RoutingEngine {
|
|
|
293
402
|
completedRoutes,
|
|
294
403
|
};
|
|
295
404
|
}
|
|
296
|
-
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`);
|
|
297
420
|
let activeRouteSteps;
|
|
298
421
|
let activeRoute;
|
|
299
422
|
let isRouteComplete = false;
|
|
423
|
+
let updatedSession = session;
|
|
300
424
|
if (session.currentRoute) {
|
|
301
|
-
activeRoute =
|
|
425
|
+
activeRoute = eligibleRoutes.find((r) => r.id === session.currentRoute?.id);
|
|
302
426
|
if (activeRoute) {
|
|
303
427
|
const currentStep = session.currentStep
|
|
304
428
|
? activeRoute.getStep(session.currentStep.id)
|
|
305
429
|
: undefined;
|
|
306
|
-
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);
|
|
307
436
|
// Check if route is complete
|
|
437
|
+
// getCandidateStepsWithConditions now automatically handles completion when required fields are collected
|
|
308
438
|
if (candidates.length === 1 && candidates[0].isRouteComplete) {
|
|
309
439
|
isRouteComplete = true;
|
|
310
|
-
|
|
440
|
+
utils_2.logger.debug(`[RoutingEngine] Route ${activeRoute.title} is complete - all required fields collected or END_ROUTE reached`);
|
|
311
441
|
// Don't include steps in routing if route is complete
|
|
312
442
|
activeRouteSteps = undefined;
|
|
313
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
|
+
}
|
|
314
452
|
else {
|
|
453
|
+
// Multiple candidates or single non-complete candidate
|
|
315
454
|
activeRouteSteps = candidates.map((c) => c.step);
|
|
316
|
-
|
|
455
|
+
utils_2.logger.debug(`[RoutingEngine] Found ${activeRouteSteps.length} candidate steps for active route`);
|
|
317
456
|
}
|
|
318
457
|
}
|
|
319
458
|
}
|
|
320
|
-
const routingSchema = this.buildDynamicRoutingSchema(
|
|
459
|
+
const routingSchema = this.buildDynamicRoutingSchema(eligibleRoutes, undefined, activeRouteSteps);
|
|
321
460
|
const routingPrompt = await this.buildRoutingPrompt({
|
|
322
461
|
history,
|
|
323
|
-
routes,
|
|
462
|
+
routes: eligibleRoutes,
|
|
324
463
|
lastMessage: lastUserMessage,
|
|
325
464
|
agentOptions,
|
|
326
465
|
session,
|
|
327
466
|
activeRouteSteps,
|
|
328
467
|
context,
|
|
468
|
+
routeConditionContext, // Pass AI context strings from route conditions
|
|
329
469
|
});
|
|
330
470
|
const routingResult = await provider.generateMessage({
|
|
331
471
|
prompt: routingPrompt,
|
|
@@ -340,31 +480,38 @@ class RoutingEngine {
|
|
|
340
480
|
let selectedRoute;
|
|
341
481
|
let selectedStep;
|
|
342
482
|
let responseDirectives;
|
|
343
|
-
let updatedSession = session;
|
|
344
483
|
if (routingResult.structured?.routes) {
|
|
345
484
|
// Use cross-route completion evaluation to select optimal route
|
|
346
|
-
const optimalRoute = this.selectOptimalRoute(
|
|
347
|
-
//
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
|
|
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
|
+
}
|
|
356
503
|
responseDirectives = routingResult.structured.responseDirectives;
|
|
357
504
|
if (selectedRoute === activeRoute &&
|
|
358
505
|
routingResult.structured.selectedStepId &&
|
|
359
506
|
activeRoute) {
|
|
360
507
|
selectedStep = activeRoute.getStep(routingResult.structured.selectedStepId);
|
|
361
508
|
if (selectedStep) {
|
|
362
|
-
|
|
363
|
-
|
|
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}`);
|
|
364
511
|
}
|
|
365
512
|
}
|
|
366
513
|
if (selectedRoute) {
|
|
367
|
-
|
|
514
|
+
utils_2.logger.debug(`[RoutingEngine] Selected route: ${selectedRoute.title}`);
|
|
368
515
|
updatedSession = this.enterRouteIfNeeded(updatedSession, selectedRoute);
|
|
369
516
|
}
|
|
370
517
|
}
|
|
@@ -377,6 +524,52 @@ class RoutingEngine {
|
|
|
377
524
|
completedRoutes,
|
|
378
525
|
};
|
|
379
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
|
+
}
|
|
380
573
|
/**
|
|
381
574
|
* Evaluate all routes for completion based on collected data
|
|
382
575
|
* @param routes - All available routes
|
|
@@ -403,6 +596,7 @@ class RoutingEngine {
|
|
|
403
596
|
/**
|
|
404
597
|
* Find the best route to continue based on completion status and user intent
|
|
405
598
|
* Prioritizes routes that are partially complete but not finished
|
|
599
|
+
* IMPORTANT: Completed routes are excluded to prevent re-entering finished tasks
|
|
406
600
|
* @param routes - All available routes
|
|
407
601
|
* @param data - Currently collected agent-level data
|
|
408
602
|
* @param routeScores - AI-generated route scores from routing decision
|
|
@@ -415,8 +609,10 @@ class RoutingEngine {
|
|
|
415
609
|
for (const route of routes) {
|
|
416
610
|
const aiScore = routeScores[route.id] || 0;
|
|
417
611
|
const completionProgress = completionStatus.get(route.id) || 0;
|
|
418
|
-
//
|
|
419
|
-
|
|
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)`);
|
|
420
616
|
continue;
|
|
421
617
|
}
|
|
422
618
|
// Boost partially complete routes that match user intent
|
|
@@ -430,7 +626,7 @@ class RoutingEngine {
|
|
|
430
626
|
// Sort by weighted score and return the best option
|
|
431
627
|
weightedScores.sort((a, b) => b.score - a.score);
|
|
432
628
|
if (weightedScores.length > 0) {
|
|
433
|
-
|
|
629
|
+
utils_2.logger.debug(`[RoutingEngine] Selected optimal route: ${weightedScores[0].route.title} ` +
|
|
434
630
|
`(AI: ${routeScores[weightedScores[0].route.id]}, ` +
|
|
435
631
|
`Completion: ${(completionStatus.get(weightedScores[0].route.id) || 0) * 100}%, ` +
|
|
436
632
|
`Weighted: ${weightedScores[0].score})`);
|
|
@@ -443,8 +639,8 @@ class RoutingEngine {
|
|
|
443
639
|
* @private
|
|
444
640
|
*/
|
|
445
641
|
async buildStepSelectionPrompt(params) {
|
|
446
|
-
const { route, currentStep, candidates, data, history, lastMessage, agentOptions, context, session, } = params;
|
|
447
|
-
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 });
|
|
448
644
|
const pc = new PromptComposer_1.PromptComposer(templateContext);
|
|
449
645
|
// Add agent metadata
|
|
450
646
|
if (agentOptions) {
|
|
@@ -469,7 +665,7 @@ class RoutingEngine {
|
|
|
469
665
|
// Add conversation history
|
|
470
666
|
await pc.addInteractionHistory(history);
|
|
471
667
|
await pc.addLastMessage(lastMessage);
|
|
472
|
-
// Add candidate steps
|
|
668
|
+
// Add candidate steps with condition context
|
|
473
669
|
const stepDescriptions = [];
|
|
474
670
|
for (const candidate of candidates) {
|
|
475
671
|
const idx = candidates.indexOf(candidate);
|
|
@@ -477,9 +673,15 @@ class RoutingEngine {
|
|
|
477
673
|
`${idx + 1}. Step ID: ${candidate.step.id}`,
|
|
478
674
|
` Description: ${candidate.step.description || "N/A"}`,
|
|
479
675
|
];
|
|
676
|
+
// Add when condition context
|
|
480
677
|
if (candidate.step.when) {
|
|
481
|
-
const
|
|
482
|
-
|
|
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
|
+
}
|
|
483
685
|
}
|
|
484
686
|
if (candidate.step.requires && candidate.step.requires.length > 0) {
|
|
485
687
|
parts.push(` Required Data: ${candidate.step.requires.join(", ")}`);
|
|
@@ -490,8 +692,18 @@ class RoutingEngine {
|
|
|
490
692
|
stepDescriptions.push(parts.join("\n"));
|
|
491
693
|
}
|
|
492
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
|
+
}
|
|
493
705
|
// Add decision prompt
|
|
494
|
-
|
|
706
|
+
const decisionRules = [
|
|
495
707
|
"Task: Decide which step to transition to based on:",
|
|
496
708
|
"1. The user's current message and intent",
|
|
497
709
|
"2. The conversation history and context",
|
|
@@ -504,16 +716,24 @@ class RoutingEngine {
|
|
|
504
716
|
"- If a step requires data we don't have, consider if we should collect it now",
|
|
505
717
|
"- Choose the step that makes the most sense for moving the conversation forward",
|
|
506
718
|
"- Steps with skipIf conditions that are met have already been filtered out",
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
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"));
|
|
510
725
|
return pc.build();
|
|
511
726
|
}
|
|
512
727
|
/**
|
|
513
728
|
* Build schema for step selection
|
|
514
729
|
* @private
|
|
515
730
|
*/
|
|
516
|
-
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
|
+
}
|
|
517
737
|
return {
|
|
518
738
|
description: "Step transition decision based on conversation context and collected data",
|
|
519
739
|
type: "object",
|
|
@@ -526,8 +746,10 @@ class RoutingEngine {
|
|
|
526
746
|
selectedStepId: {
|
|
527
747
|
type: "string",
|
|
528
748
|
nullable: false,
|
|
529
|
-
description:
|
|
530
|
-
|
|
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,
|
|
531
753
|
},
|
|
532
754
|
responseDirectives: {
|
|
533
755
|
type: "array",
|
|
@@ -603,8 +825,8 @@ class RoutingEngine {
|
|
|
603
825
|
return base;
|
|
604
826
|
}
|
|
605
827
|
async buildRoutingPrompt(params) {
|
|
606
|
-
const { history, routes, lastMessage, agentOptions, session, activeRouteSteps, context, } = params;
|
|
607
|
-
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 });
|
|
608
830
|
const pc = new PromptComposer_1.PromptComposer(templateContext);
|
|
609
831
|
if (agentOptions) {
|
|
610
832
|
await pc.addAgentMeta(agentOptions);
|
|
@@ -656,15 +878,23 @@ class RoutingEngine {
|
|
|
656
878
|
"",
|
|
657
879
|
"Available steps in active route (choose one to transition to):",
|
|
658
880
|
];
|
|
881
|
+
const activeStepConditionContext = [];
|
|
659
882
|
for (const step of activeRouteSteps) {
|
|
660
883
|
const idx = activeRouteSteps.indexOf(step);
|
|
661
884
|
stepInfo.push(`${idx + 1}. Step: ${step.id}`);
|
|
662
885
|
if (step.description) {
|
|
663
886
|
stepInfo.push(` Description: ${step.description}`);
|
|
664
887
|
}
|
|
665
|
-
|
|
888
|
+
// Collect AI context from step conditions
|
|
666
889
|
if (step.when) {
|
|
667
|
-
|
|
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
|
+
}
|
|
668
898
|
}
|
|
669
899
|
if (step.requires && step.requires.length > 0) {
|
|
670
900
|
stepInfo.push(` Required data: ${step.requires.join(", ")}`);
|
|
@@ -680,11 +910,31 @@ class RoutingEngine {
|
|
|
680
910
|
stepInfo.push("- The logical next step in the conversation");
|
|
681
911
|
stepInfo.push("- Whether conditions for steps are met");
|
|
682
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
|
+
}
|
|
683
923
|
}
|
|
684
924
|
}
|
|
685
925
|
await pc.addInteractionHistory(history);
|
|
686
926
|
await pc.addLastMessage(lastMessage);
|
|
687
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
|
+
}
|
|
688
938
|
await pc.addInstruction([
|
|
689
939
|
"Scoring rules:",
|
|
690
940
|
"- 90-100: explicit keywords + clear intent",
|