@falai/agent 0.8.1 → 0.9.0-alpha-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +306 -133
- package/dist/{adapters → cjs/src/adapters}/MemoryAdapter.d.ts +4 -4
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/MemoryAdapter.js +41 -21
- package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/{adapters → cjs/src/adapters}/MongoAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/MongoAdapter.js +2 -1
- package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
- package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.js +35 -5
- package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/RedisAdapter.js +3 -2
- package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/{adapters → cjs/src/adapters}/SQLiteAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
- package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/index.d.ts.map +1 -0
- package/dist/cjs/src/adapters/index.js.map +1 -0
- package/dist/cjs/src/constants/index.d.ts.map +1 -0
- package/dist/cjs/src/constants/index.js.map +1 -0
- package/dist/{core → cjs/src/core}/Agent.d.ts +65 -67
- package/dist/cjs/src/core/Agent.d.ts.map +1 -0
- package/dist/cjs/src/core/Agent.js +1433 -0
- package/dist/cjs/src/core/Agent.js.map +1 -0
- package/dist/cjs/src/core/Events.d.ts +26 -0
- package/dist/cjs/src/core/Events.d.ts.map +1 -0
- package/dist/cjs/src/core/Events.js +144 -0
- package/dist/cjs/src/core/Events.js.map +1 -0
- package/dist/{core → cjs/src/core}/PersistenceManager.d.ts +21 -19
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/PersistenceManager.js +50 -20
- package/dist/cjs/src/core/PersistenceManager.js.map +1 -0
- package/dist/cjs/src/core/PromptComposer.d.ts +27 -0
- package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -0
- package/dist/cjs/src/core/PromptComposer.js +157 -0
- package/dist/cjs/src/core/PromptComposer.js.map +1 -0
- package/dist/cjs/src/core/ResponseEngine.d.ts +31 -0
- package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponseEngine.js +84 -0
- package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts +143 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.js +446 -0
- package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
- package/dist/cjs/src/core/Route.d.ts +126 -0
- package/dist/cjs/src/core/Route.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/Route.js +116 -20
- package/dist/cjs/src/core/Route.js.map +1 -0
- package/dist/{core → cjs/src/core}/RoutingEngine.d.ts +33 -38
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/RoutingEngine.js +102 -108
- package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/src/core/SessionManager.d.ts +76 -0
- package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
- package/dist/cjs/src/core/SessionManager.js +197 -0
- package/dist/cjs/src/core/SessionManager.js.map +1 -0
- package/dist/cjs/src/core/Step.d.ts +96 -0
- package/dist/cjs/src/core/Step.d.ts.map +1 -0
- package/dist/cjs/src/core/Step.js +206 -0
- package/dist/cjs/src/core/Step.js.map +1 -0
- package/dist/cjs/src/core/ToolExecutor.d.ts +43 -0
- package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/ToolExecutor.js +19 -18
- package/dist/cjs/src/core/ToolExecutor.js.map +1 -0
- package/dist/{index.d.ts → cjs/src/index.d.ts} +7 -15
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/{index.js → src/index.js} +21 -19
- package/dist/cjs/src/index.js.map +1 -0
- package/dist/cjs/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
- package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/AnthropicProvider.js +54 -2
- package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/{providers → cjs/src/providers}/GeminiProvider.d.ts +1 -1
- package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/GeminiProvider.js +65 -0
- package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
- package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenAIProvider.js +70 -1
- package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/{providers → cjs/src/providers}/OpenRouterProvider.d.ts +1 -1
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenRouterProvider.js +76 -0
- package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/cjs/src/providers/index.d.ts.map +1 -0
- package/dist/cjs/src/providers/index.js.map +1 -0
- package/dist/cjs/{types → src/types}/agent.d.ts +52 -33
- package/dist/cjs/src/types/agent.d.ts.map +1 -0
- package/dist/cjs/src/types/agent.js.map +1 -0
- package/dist/cjs/{types → src/types}/ai.d.ts +7 -0
- package/dist/cjs/src/types/ai.d.ts.map +1 -0
- package/dist/cjs/src/types/ai.js.map +1 -0
- package/dist/{types → cjs/src/types}/history.d.ts +76 -18
- package/dist/cjs/src/types/history.d.ts.map +1 -0
- package/dist/cjs/src/types/history.js +33 -0
- package/dist/cjs/src/types/history.js.map +1 -0
- package/dist/cjs/src/types/index.d.ts +20 -0
- package/dist/cjs/src/types/index.d.ts.map +1 -0
- package/dist/cjs/src/types/index.js +30 -0
- package/dist/cjs/src/types/index.js.map +1 -0
- package/dist/{types → cjs/src/types}/persistence.d.ts +39 -23
- package/dist/cjs/src/types/persistence.d.ts.map +1 -0
- package/dist/cjs/src/types/persistence.js.map +1 -0
- package/dist/cjs/{types → src/types}/route.d.ts +85 -31
- package/dist/cjs/src/types/route.d.ts.map +1 -0
- package/dist/cjs/{types → src/types}/route.js.map +1 -1
- package/dist/cjs/src/types/routing.d.ts.map +1 -0
- package/dist/{types → cjs/src/types}/routing.js.map +1 -1
- package/dist/cjs/src/types/schema.d.ts.map +1 -0
- package/dist/{types → cjs/src/types}/schema.js.map +1 -1
- package/dist/cjs/src/types/session.d.ts +70 -0
- package/dist/cjs/src/types/session.d.ts.map +1 -0
- package/dist/cjs/src/types/session.js +6 -0
- package/dist/cjs/src/types/session.js.map +1 -0
- package/dist/cjs/src/types/template.d.ts +30 -0
- package/dist/cjs/src/types/template.d.ts.map +1 -0
- package/dist/cjs/src/types/template.js +3 -0
- package/dist/cjs/src/types/template.js.map +1 -0
- package/dist/cjs/{types → src/types}/tool.d.ts +6 -8
- package/dist/cjs/src/types/tool.d.ts.map +1 -0
- package/dist/cjs/{types → src/types}/tool.js.map +1 -1
- package/dist/cjs/src/utils/clone.d.ts +8 -0
- package/dist/cjs/src/utils/clone.d.ts.map +1 -0
- package/dist/cjs/src/utils/clone.js +36 -0
- package/dist/cjs/src/utils/clone.js.map +1 -0
- package/dist/{utils → cjs/src/utils}/event.d.ts +1 -1
- package/dist/cjs/src/utils/event.d.ts.map +1 -0
- package/dist/cjs/{utils → src/utils}/event.js +2 -2
- package/dist/cjs/src/utils/event.js.map +1 -0
- package/dist/cjs/src/utils/history.d.ts +31 -0
- package/dist/cjs/src/utils/history.d.ts.map +1 -0
- package/dist/cjs/src/utils/history.js +128 -0
- package/dist/cjs/src/utils/history.js.map +1 -0
- package/dist/cjs/src/utils/id.d.ts.map +1 -0
- package/dist/cjs/src/utils/id.js.map +1 -0
- package/dist/cjs/src/utils/index.d.ts +13 -0
- package/dist/cjs/src/utils/index.d.ts.map +1 -0
- package/dist/cjs/src/utils/index.js +49 -0
- package/dist/cjs/src/utils/index.js.map +1 -0
- package/dist/cjs/src/utils/logger.d.ts.map +1 -0
- package/dist/cjs/src/utils/logger.js.map +1 -0
- package/dist/cjs/src/utils/retry.d.ts.map +1 -0
- package/dist/cjs/src/utils/retry.js.map +1 -0
- package/dist/cjs/src/utils/session.d.ts +51 -0
- package/dist/cjs/src/utils/session.d.ts.map +1 -0
- package/dist/cjs/{types → src/utils}/session.js +34 -11
- package/dist/cjs/src/utils/session.js.map +1 -0
- package/dist/cjs/src/utils/template.d.ts +107 -0
- package/dist/cjs/src/utils/template.d.ts.map +1 -0
- package/dist/cjs/src/utils/template.js +283 -0
- package/dist/cjs/src/utils/template.js.map +1 -0
- package/dist/{cjs → src}/adapters/MemoryAdapter.d.ts +4 -4
- package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/MemoryAdapter.js +41 -21
- package/dist/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/{cjs → src}/adapters/MongoAdapter.d.ts +3 -3
- package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/MongoAdapter.js +2 -1
- package/dist/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
- package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
- package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
- package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
- package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
- package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/PrismaAdapter.js +35 -5
- package/dist/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
- package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/RedisAdapter.js +3 -2
- package/dist/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/{cjs → src}/adapters/SQLiteAdapter.d.ts +3 -3
- package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
- package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/constants/index.js.map +1 -0
- package/dist/{cjs → src}/core/Agent.d.ts +65 -67
- package/dist/src/core/Agent.d.ts.map +1 -0
- package/dist/src/core/Agent.js +1429 -0
- package/dist/src/core/Agent.js.map +1 -0
- package/dist/src/core/Events.d.ts +26 -0
- package/dist/src/core/Events.d.ts.map +1 -0
- package/dist/src/core/Events.js +137 -0
- package/dist/src/core/Events.js.map +1 -0
- package/dist/{cjs → src}/core/PersistenceManager.d.ts +21 -19
- package/dist/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/{core → src/core}/PersistenceManager.js +47 -17
- package/dist/src/core/PersistenceManager.js.map +1 -0
- package/dist/src/core/PromptComposer.d.ts +27 -0
- package/dist/src/core/PromptComposer.d.ts.map +1 -0
- package/dist/src/core/PromptComposer.js +153 -0
- package/dist/src/core/PromptComposer.js.map +1 -0
- package/dist/src/core/ResponseEngine.d.ts +31 -0
- package/dist/src/core/ResponseEngine.d.ts.map +1 -0
- package/dist/src/core/ResponseEngine.js +80 -0
- package/dist/src/core/ResponseEngine.js.map +1 -0
- package/dist/src/core/ResponsePipeline.d.ts +143 -0
- package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/src/core/ResponsePipeline.js +442 -0
- package/dist/src/core/ResponsePipeline.js.map +1 -0
- package/dist/src/core/Route.d.ts +126 -0
- package/dist/src/core/Route.d.ts.map +1 -0
- package/dist/{core → src/core}/Route.js +116 -20
- package/dist/src/core/Route.js.map +1 -0
- package/dist/{cjs → src}/core/RoutingEngine.d.ts +33 -38
- package/dist/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/{core → src/core}/RoutingEngine.js +98 -104
- package/dist/src/core/RoutingEngine.js.map +1 -0
- package/dist/src/core/SessionManager.d.ts +76 -0
- package/dist/src/core/SessionManager.d.ts.map +1 -0
- package/dist/src/core/SessionManager.js +193 -0
- package/dist/src/core/SessionManager.js.map +1 -0
- package/dist/src/core/Step.d.ts +96 -0
- package/dist/src/core/Step.d.ts.map +1 -0
- package/dist/src/core/Step.js +202 -0
- package/dist/src/core/Step.js.map +1 -0
- package/dist/src/core/ToolExecutor.d.ts +43 -0
- package/dist/src/core/ToolExecutor.d.ts.map +1 -0
- package/dist/src/core/ToolExecutor.js +70 -0
- package/dist/src/core/ToolExecutor.js.map +1 -0
- package/dist/{cjs → src}/index.d.ts +7 -15
- package/dist/src/index.d.ts.map +1 -0
- package/dist/{index.js → src/index.js} +6 -7
- package/dist/src/index.js.map +1 -0
- package/dist/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
- package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/{providers → src/providers}/AnthropicProvider.js +54 -2
- package/dist/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/{cjs → src}/providers/GeminiProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/GeminiProvider.js +65 -0
- package/dist/src/providers/GeminiProvider.js.map +1 -0
- package/dist/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/OpenAIProvider.js +70 -1
- package/dist/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/OpenRouterProvider.js +76 -0
- package/dist/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/{types → src/types}/agent.d.ts +52 -33
- package/dist/src/types/agent.d.ts.map +1 -0
- package/dist/src/types/agent.js.map +1 -0
- package/dist/{types → src/types}/ai.d.ts +7 -0
- package/dist/src/types/ai.d.ts.map +1 -0
- package/dist/{cjs → src}/types/ai.js.map +1 -1
- package/dist/{cjs → src}/types/history.d.ts +76 -18
- package/dist/src/types/history.d.ts.map +1 -0
- package/dist/src/types/history.js +30 -0
- package/dist/src/types/history.js.map +1 -0
- package/dist/src/types/index.d.ts +20 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +10 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/{cjs → src}/types/persistence.d.ts +39 -23
- package/dist/src/types/persistence.d.ts.map +1 -0
- package/dist/src/types/persistence.js.map +1 -0
- package/dist/{types → src/types}/route.d.ts +85 -31
- package/dist/src/types/route.d.ts.map +1 -0
- package/dist/{types → src/types}/route.js.map +1 -1
- package/dist/src/types/session.d.ts +70 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +5 -0
- package/dist/src/types/session.js.map +1 -0
- package/dist/src/types/template.d.ts +30 -0
- package/dist/src/types/template.d.ts.map +1 -0
- package/dist/src/types/template.js +2 -0
- package/dist/src/types/template.js.map +1 -0
- package/dist/{types → src/types}/tool.d.ts +6 -8
- package/dist/{cjs → src}/types/tool.d.ts.map +1 -1
- package/dist/{types → src/types}/tool.js.map +1 -1
- package/dist/src/utils/clone.d.ts +8 -0
- package/dist/src/utils/clone.d.ts.map +1 -0
- package/dist/src/utils/clone.js +33 -0
- package/dist/src/utils/clone.js.map +1 -0
- package/dist/{cjs → src}/utils/event.d.ts +1 -1
- package/dist/{cjs → src}/utils/event.d.ts.map +1 -1
- package/dist/{utils → src/utils}/event.js +1 -1
- package/dist/src/utils/event.js.map +1 -0
- package/dist/src/utils/history.d.ts +31 -0
- package/dist/src/utils/history.d.ts.map +1 -0
- package/dist/src/utils/history.js +121 -0
- package/dist/src/utils/history.js.map +1 -0
- package/dist/src/utils/id.js.map +1 -0
- package/dist/src/utils/index.d.ts +13 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +19 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/session.d.ts +51 -0
- package/dist/src/utils/session.d.ts.map +1 -0
- package/dist/{types → src/utils}/session.js +32 -11
- package/dist/src/utils/session.js.map +1 -0
- package/dist/src/utils/template.d.ts +107 -0
- package/dist/src/utils/template.d.ts.map +1 -0
- package/dist/src/utils/template.js +276 -0
- package/dist/src/utils/template.js.map +1 -0
- package/docs/README.md +174 -68
- package/docs/{API_REFERENCE.md → api/README.md} +890 -251
- package/docs/api/overview.md +798 -0
- package/docs/core/agent/README.md +642 -0
- package/docs/{CONTEXT_MANAGEMENT.md → core/agent/context-management.md} +143 -94
- package/docs/{ARCHITECTURE.md → core/agent/session-management.md} +74 -59
- package/docs/core/ai-integration/prompt-composition.md +196 -0
- package/docs/core/ai-integration/providers.md +515 -0
- package/docs/core/ai-integration/response-processing.md +165 -0
- package/docs/core/conversation-flows/data-collection.md +545 -0
- package/docs/core/conversation-flows/route-dsl.md +479 -0
- package/docs/core/conversation-flows/routes.md +61 -0
- package/docs/core/conversation-flows/step-transitions.md +595 -0
- package/docs/core/conversation-flows/steps.md +130 -0
- package/docs/{ADAPTERS.md → core/persistence/adapters.md} +1 -1
- package/docs/core/persistence/session-storage.md +644 -0
- package/docs/core/routing/intelligent-routing.md +339 -0
- package/docs/core/tools/tool-definition.md +346 -0
- package/docs/core/tools/tool-execution.md +815 -0
- package/docs/core/tools/tool-scoping.md +628 -0
- package/docs/guides/getting-started/README.md +384 -0
- package/examples/{company-qna-agent.ts → advanced-patterns/knowledge-based-agent.ts} +104 -69
- package/examples/{persistent-onboarding.ts → advanced-patterns/persistent-onboarding.ts} +181 -103
- package/examples/{rules-prohibitions.ts → advanced-patterns/route-lifecycle-hooks.ts} +102 -82
- package/examples/{streaming-agent.ts → advanced-patterns/streaming-responses.ts} +90 -69
- package/examples/ai-providers/anthropic-integration.ts +377 -0
- package/examples/{openai-agent.ts → ai-providers/openai-integration.ts} +37 -43
- package/examples/{route-transitions.ts → conversation-flows/completion-transitions.ts} +112 -105
- package/examples/{declarative-agent.ts → core-concepts/basic-agent.ts} +175 -131
- package/examples/core-concepts/schema-driven-extraction.ts +301 -0
- package/examples/core-concepts/session-management.ts +394 -0
- package/examples/integrations/database-integration.ts +615 -0
- package/examples/{healthcare-agent.ts → integrations/healthcare-integration.ts} +204 -111
- package/examples/{opensearch-persistence.ts → integrations/search-integration.ts} +159 -128
- package/examples/integrations/server-session-management.ts +299 -0
- package/examples/persistence/custom-adapter.ts +529 -0
- package/examples/{prisma-persistence.ts → persistence/database-persistence.ts} +168 -241
- package/examples/persistence/memory-sessions.ts +506 -0
- package/examples/{prisma-schema.example.prisma → persistence/prisma-schema.example.prisma} +1 -1
- package/examples/{redis-persistence.ts → persistence/redis-persistence.ts} +152 -173
- package/examples/tools/basic-tools.ts +550 -0
- package/examples/{extracted-data-modification.ts → tools/data-enrichment-tools.ts} +82 -79
- package/package.json +14 -10
- package/src/adapters/MemoryAdapter.ts +74 -46
- package/src/adapters/MongoAdapter.ts +33 -24
- package/src/adapters/OpenSearchAdapter.ts +41 -37
- package/src/adapters/PostgreSQLAdapter.ts +35 -24
- package/src/adapters/PrismaAdapter.ts +69 -27
- package/src/adapters/RedisAdapter.ts +38 -26
- package/src/adapters/SQLiteAdapter.ts +32 -22
- package/src/core/Agent.ts +1093 -478
- package/src/core/Events.ts +100 -112
- package/src/core/PersistenceManager.ts +77 -47
- package/src/core/PromptComposer.ts +158 -85
- package/src/core/ResponseEngine.ts +118 -38
- package/src/core/ResponsePipeline.ts +715 -0
- package/src/core/Route.ts +168 -51
- package/src/core/RoutingEngine.ts +178 -209
- package/src/core/SessionManager.ts +241 -0
- package/src/core/Step.ts +149 -67
- package/src/core/ToolExecutor.ts +37 -42
- package/src/index.ts +31 -37
- package/src/providers/AnthropicProvider.ts +71 -5
- package/src/providers/GeminiProvider.ts +83 -2
- package/src/providers/OpenAIProvider.ts +95 -3
- package/src/providers/OpenRouterProvider.ts +102 -2
- package/src/types/agent.ts +48 -36
- package/src/types/ai.ts +7 -0
- package/src/types/history.ts +91 -18
- package/src/types/index.ts +43 -7
- package/src/types/persistence.ts +46 -28
- package/src/types/route.ts +104 -45
- package/src/types/session.ts +19 -213
- package/src/types/template.ts +36 -0
- package/src/types/tool.ts +9 -11
- package/src/utils/clone.ts +36 -0
- package/src/utils/event.ts +1 -1
- package/src/utils/history.ts +143 -0
- package/src/utils/index.ts +53 -0
- package/src/utils/session.ts +229 -0
- package/src/utils/template.ts +335 -0
- package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/adapters/MemoryAdapter.js.map +0 -1
- package/dist/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/adapters/MongoAdapter.js.map +0 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/adapters/PrismaAdapter.js.map +0 -1
- package/dist/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/adapters/RedisAdapter.js.map +0 -1
- package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js.map +0 -1
- package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
- package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/cjs/adapters/index.js.map +0 -1
- package/dist/cjs/constants/index.js.map +0 -1
- package/dist/cjs/core/Agent.d.ts.map +0 -1
- package/dist/cjs/core/Agent.js +0 -966
- package/dist/cjs/core/Agent.js.map +0 -1
- package/dist/cjs/core/DomainRegistry.d.ts +0 -36
- package/dist/cjs/core/DomainRegistry.d.ts.map +0 -1
- package/dist/cjs/core/DomainRegistry.js +0 -72
- package/dist/cjs/core/DomainRegistry.js.map +0 -1
- package/dist/cjs/core/Events.d.ts +0 -41
- package/dist/cjs/core/Events.d.ts.map +0 -1
- package/dist/cjs/core/Events.js +0 -99
- package/dist/cjs/core/Events.js.map +0 -1
- package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
- package/dist/cjs/core/PersistenceManager.js.map +0 -1
- package/dist/cjs/core/PromptComposer.d.ts +0 -24
- package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
- package/dist/cjs/core/PromptComposer.js +0 -127
- package/dist/cjs/core/PromptComposer.js.map +0 -1
- package/dist/cjs/core/ResponseEngine.d.ts +0 -14
- package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
- package/dist/cjs/core/ResponseEngine.js +0 -56
- package/dist/cjs/core/ResponseEngine.js.map +0 -1
- package/dist/cjs/core/Route.d.ts +0 -90
- package/dist/cjs/core/Route.d.ts.map +0 -1
- package/dist/cjs/core/Route.js.map +0 -1
- package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/core/Step.d.ts +0 -72
- package/dist/cjs/core/Step.d.ts.map +0 -1
- package/dist/cjs/core/Step.js +0 -150
- package/dist/cjs/core/Step.js.map +0 -1
- package/dist/cjs/core/Tool.d.ts +0 -39
- package/dist/cjs/core/Tool.d.ts.map +0 -1
- package/dist/cjs/core/Tool.js +0 -34
- package/dist/cjs/core/Tool.js.map +0 -1
- package/dist/cjs/core/ToolExecutor.d.ts +0 -29
- package/dist/cjs/core/ToolExecutor.d.ts.map +0 -1
- package/dist/cjs/core/ToolExecutor.js.map +0 -1
- package/dist/cjs/core/Transition.d.ts +0 -32
- package/dist/cjs/core/Transition.d.ts.map +0 -1
- package/dist/cjs/core/Transition.js +0 -89
- package/dist/cjs/core/Transition.js.map +0 -1
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +0 -1
- package/dist/cjs/providers/AnthropicProvider.js.map +0 -1
- package/dist/cjs/providers/GeminiProvider.js.map +0 -1
- package/dist/cjs/providers/OpenAIProvider.js.map +0 -1
- package/dist/cjs/providers/OpenRouterProvider.js.map +0 -1
- package/dist/cjs/providers/index.js.map +0 -1
- package/dist/cjs/types/agent.d.ts.map +0 -1
- package/dist/cjs/types/agent.js.map +0 -1
- package/dist/cjs/types/ai.d.ts.map +0 -1
- package/dist/cjs/types/history.d.ts.map +0 -1
- package/dist/cjs/types/history.js +0 -37
- package/dist/cjs/types/history.js.map +0 -1
- package/dist/cjs/types/index.d.ts +0 -12
- package/dist/cjs/types/index.d.ts.map +0 -1
- package/dist/cjs/types/index.js +0 -12
- package/dist/cjs/types/index.js.map +0 -1
- package/dist/cjs/types/persistence.d.ts.map +0 -1
- package/dist/cjs/types/persistence.js.map +0 -1
- package/dist/cjs/types/route.d.ts.map +0 -1
- package/dist/cjs/types/session.d.ts +0 -104
- package/dist/cjs/types/session.d.ts.map +0 -1
- package/dist/cjs/types/session.js.map +0 -1
- package/dist/cjs/utils/event.js.map +0 -1
- package/dist/cjs/utils/id.js.map +0 -1
- package/dist/cjs/utils/logger.js.map +0 -1
- package/dist/cjs/utils/retry.js.map +0 -1
- package/dist/constants/index.d.ts.map +0 -1
- package/dist/constants/index.js.map +0 -1
- package/dist/core/Agent.d.ts.map +0 -1
- package/dist/core/Agent.js +0 -962
- package/dist/core/Agent.js.map +0 -1
- package/dist/core/DomainRegistry.d.ts +0 -36
- package/dist/core/DomainRegistry.d.ts.map +0 -1
- package/dist/core/DomainRegistry.js +0 -68
- package/dist/core/DomainRegistry.js.map +0 -1
- package/dist/core/Events.d.ts +0 -41
- package/dist/core/Events.d.ts.map +0 -1
- package/dist/core/Events.js +0 -94
- package/dist/core/Events.js.map +0 -1
- package/dist/core/PersistenceManager.d.ts.map +0 -1
- package/dist/core/PersistenceManager.js.map +0 -1
- package/dist/core/PromptComposer.d.ts +0 -24
- package/dist/core/PromptComposer.d.ts.map +0 -1
- package/dist/core/PromptComposer.js +0 -123
- package/dist/core/PromptComposer.js.map +0 -1
- package/dist/core/ResponseEngine.d.ts +0 -14
- package/dist/core/ResponseEngine.d.ts.map +0 -1
- package/dist/core/ResponseEngine.js +0 -52
- package/dist/core/ResponseEngine.js.map +0 -1
- package/dist/core/Route.d.ts +0 -90
- package/dist/core/Route.d.ts.map +0 -1
- package/dist/core/Route.js.map +0 -1
- package/dist/core/RoutingEngine.d.ts.map +0 -1
- package/dist/core/RoutingEngine.js.map +0 -1
- package/dist/core/Step.d.ts +0 -72
- package/dist/core/Step.d.ts.map +0 -1
- package/dist/core/Step.js +0 -146
- package/dist/core/Step.js.map +0 -1
- package/dist/core/Tool.d.ts +0 -39
- package/dist/core/Tool.d.ts.map +0 -1
- package/dist/core/Tool.js +0 -31
- package/dist/core/Tool.js.map +0 -1
- package/dist/core/ToolExecutor.d.ts +0 -29
- package/dist/core/ToolExecutor.d.ts.map +0 -1
- package/dist/core/ToolExecutor.js +0 -69
- package/dist/core/ToolExecutor.js.map +0 -1
- package/dist/core/Transition.d.ts +0 -32
- package/dist/core/Transition.d.ts.map +0 -1
- package/dist/core/Transition.js +0 -85
- package/dist/core/Transition.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers/AnthropicProvider.d.ts.map +0 -1
- package/dist/providers/AnthropicProvider.js.map +0 -1
- package/dist/providers/GeminiProvider.d.ts.map +0 -1
- package/dist/providers/GeminiProvider.js.map +0 -1
- package/dist/providers/OpenAIProvider.d.ts.map +0 -1
- package/dist/providers/OpenAIProvider.js.map +0 -1
- package/dist/providers/OpenRouterProvider.d.ts.map +0 -1
- package/dist/providers/OpenRouterProvider.js.map +0 -1
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js.map +0 -1
- package/dist/types/agent.d.ts.map +0 -1
- package/dist/types/agent.js.map +0 -1
- package/dist/types/ai.d.ts.map +0 -1
- package/dist/types/ai.js.map +0 -1
- package/dist/types/history.d.ts.map +0 -1
- package/dist/types/history.js +0 -34
- package/dist/types/history.js.map +0 -1
- package/dist/types/index.d.ts +0 -12
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -6
- package/dist/types/index.js.map +0 -1
- package/dist/types/persistence.d.ts.map +0 -1
- package/dist/types/persistence.js.map +0 -1
- package/dist/types/route.d.ts.map +0 -1
- package/dist/types/routing.d.ts.map +0 -1
- package/dist/types/schema.d.ts.map +0 -1
- package/dist/types/session.d.ts +0 -104
- package/dist/types/session.d.ts.map +0 -1
- package/dist/types/session.js.map +0 -1
- package/dist/types/tool.d.ts.map +0 -1
- package/dist/utils/event.d.ts.map +0 -1
- package/dist/utils/event.js.map +0 -1
- package/dist/utils/id.d.ts.map +0 -1
- package/dist/utils/id.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js.map +0 -1
- package/docs/AGENT.md +0 -535
- package/docs/DOCS.md +0 -263
- package/docs/DOMAINS.md +0 -735
- package/docs/EXAMPLES.md +0 -467
- package/docs/GETTING_STARTED.md +0 -424
- package/docs/PERSISTENCE.md +0 -815
- package/docs/PROVIDERS.md +0 -612
- package/docs/ROUTES.md +0 -1085
- package/docs/STEPS.md +0 -883
- package/examples/business-onboarding.ts +0 -791
- package/examples/custom-database-persistence.ts +0 -574
- package/examples/domain-scoping.ts +0 -366
- package/examples/travel-agent.ts +0 -584
- package/src/core/DomainRegistry.ts +0 -80
- package/src/core/Tool.ts +0 -112
- package/src/core/Transition.ts +0 -115
- /package/dist/{adapters → cjs/src/adapters}/index.d.ts +0 -0
- /package/dist/cjs/{adapters → src/adapters}/index.js +0 -0
- /package/dist/cjs/{constants → src/constants}/index.d.ts +0 -0
- /package/dist/cjs/{constants → src/constants}/index.js +0 -0
- /package/dist/cjs/{providers → src/providers}/index.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/index.js +0 -0
- /package/dist/cjs/{types → src/types}/agent.js +0 -0
- /package/dist/cjs/{types → src/types}/ai.js +0 -0
- /package/dist/cjs/{types → src/types}/persistence.js +0 -0
- /package/dist/cjs/{types → src/types}/route.js +0 -0
- /package/dist/cjs/{types → src/types}/routing.d.ts +0 -0
- /package/dist/cjs/{types → src/types}/routing.js +0 -0
- /package/dist/cjs/{types → src/types}/schema.d.ts +0 -0
- /package/dist/cjs/{types → src/types}/schema.js +0 -0
- /package/dist/cjs/{types → src/types}/tool.js +0 -0
- /package/dist/cjs/{utils → src/utils}/id.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/id.js +0 -0
- /package/dist/cjs/{utils → src/utils}/logger.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/logger.js +0 -0
- /package/dist/cjs/{utils → src/utils}/retry.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/retry.js +0 -0
- /package/dist/{cjs → src}/adapters/index.d.ts +0 -0
- /package/dist/{cjs → src}/adapters/index.d.ts.map +0 -0
- /package/dist/{adapters → src/adapters}/index.js +0 -0
- /package/dist/{constants → src/constants}/index.d.ts +0 -0
- /package/dist/{cjs → src}/constants/index.d.ts.map +0 -0
- /package/dist/{constants → src/constants}/index.js +0 -0
- /package/dist/{providers → src/providers}/index.d.ts +0 -0
- /package/dist/{cjs → src}/providers/index.d.ts.map +0 -0
- /package/dist/{providers → src/providers}/index.js +0 -0
- /package/dist/{types → src/types}/agent.js +0 -0
- /package/dist/{types → src/types}/ai.js +0 -0
- /package/dist/{types → src/types}/persistence.js +0 -0
- /package/dist/{types → src/types}/route.js +0 -0
- /package/dist/{types → src/types}/routing.d.ts +0 -0
- /package/dist/{cjs → src}/types/routing.d.ts.map +0 -0
- /package/dist/{types → src/types}/routing.js +0 -0
- /package/dist/{cjs → src}/types/routing.js.map +0 -0
- /package/dist/{types → src/types}/schema.d.ts +0 -0
- /package/dist/{cjs → src}/types/schema.d.ts.map +0 -0
- /package/dist/{types → src/types}/schema.js +0 -0
- /package/dist/{cjs → src}/types/schema.js.map +0 -0
- /package/dist/{types → src/types}/tool.js +0 -0
- /package/dist/{utils → src/utils}/id.d.ts +0 -0
- /package/dist/{cjs → src}/utils/id.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/id.js +0 -0
- /package/dist/{utils → src/utils}/logger.d.ts +0 -0
- /package/dist/{cjs → src}/utils/logger.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/logger.js +0 -0
- /package/dist/{utils → src/utils}/retry.d.ts +0 -0
- /package/dist/{cjs → src}/utils/retry.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/retry.js +0 -0
- /package/docs/{PUBLISHING.md → guides/advanced-patterns/publishing.md} +0 -0
|
@@ -0,0 +1,595 @@
|
|
|
1
|
+
# Step Transitions & Conditional Logic
|
|
2
|
+
|
|
3
|
+
The step transition system provides intelligent conversation flow control, enabling dynamic, context-aware progression through conversation routes. Unlike linear chatbots, this system can skip irrelevant steps, enforce dependencies, and adapt to user context.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Step transitions handle:
|
|
8
|
+
|
|
9
|
+
- **Conditional Skipping**: Skip steps based on collected data or context
|
|
10
|
+
- **Dependency Enforcement**: Ensure prerequisite data exists before proceeding
|
|
11
|
+
- **Branch Resolution**: Handle multiple possible next steps
|
|
12
|
+
- **Route Completion**: Detect when routes reach their end
|
|
13
|
+
- **Loop Prevention**: Avoid infinite traversal in complex flows
|
|
14
|
+
|
|
15
|
+
## Conditional Skipping
|
|
16
|
+
|
|
17
|
+
### SkipIf Logic
|
|
18
|
+
|
|
19
|
+
The `skipIf` function determines whether a step should be bypassed:
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
const smartRoute = agent
|
|
23
|
+
.createRoute({
|
|
24
|
+
title: "Smart Onboarding",
|
|
25
|
+
|
|
26
|
+
initialStep: {
|
|
27
|
+
prompt: "What's your name?",
|
|
28
|
+
collect: ["name"],
|
|
29
|
+
skipIf: (data) => data.name !== undefined, // Skip if name already known
|
|
30
|
+
},
|
|
31
|
+
})
|
|
32
|
+
.nextStep({
|
|
33
|
+
prompt: "What's your email, {{name}}?",
|
|
34
|
+
collect: ["email"],
|
|
35
|
+
requires: ["name"], // Must have name to proceed
|
|
36
|
+
skipIf: (data) => data.email !== undefined, // Skip if email already known
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Common SkipIf Patterns
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
// Skip based on user preferences
|
|
44
|
+
skipIf: (data) => data.skipNewsletterSignup === true;
|
|
45
|
+
|
|
46
|
+
// Skip if data already exists
|
|
47
|
+
skipIf: (data) => data.userProfile?.completed === true;
|
|
48
|
+
|
|
49
|
+
// Skip based on external conditions
|
|
50
|
+
skipIf: (data) => {
|
|
51
|
+
const now = new Date();
|
|
52
|
+
const lastContact = data.lastContactDate;
|
|
53
|
+
return lastContact && now - lastContact < 24 * 60 * 60 * 1000; // Within 24 hours
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// Skip based on user type
|
|
57
|
+
skipIf: (data) => data.userType === "premium" && data.onboardingComplete;
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Dependency Enforcement
|
|
61
|
+
|
|
62
|
+
### Requires Validation
|
|
63
|
+
|
|
64
|
+
The `requires` array ensures prerequisite data exists:
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
const dependentRoute = agent
|
|
68
|
+
.createRoute({
|
|
69
|
+
title: "Dependent Collection",
|
|
70
|
+
|
|
71
|
+
initialStep: {
|
|
72
|
+
prompt: "What's your name?",
|
|
73
|
+
collect: ["name"],
|
|
74
|
+
},
|
|
75
|
+
})
|
|
76
|
+
.nextStep({
|
|
77
|
+
prompt: "What's your email address?",
|
|
78
|
+
collect: ["email"],
|
|
79
|
+
requires: ["name"], // Cannot proceed without name
|
|
80
|
+
})
|
|
81
|
+
.nextStep({
|
|
82
|
+
prompt: "Should I send updates to {{email}}?",
|
|
83
|
+
collect: ["emailConsent"],
|
|
84
|
+
requires: ["name", "email"], // Needs both name and email
|
|
85
|
+
});
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Complex Requirements
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
const complexRequirements = {
|
|
92
|
+
prompt: "Let's schedule your appointment.",
|
|
93
|
+
collect: ["appointmentDate", "appointmentTime"],
|
|
94
|
+
requires: [
|
|
95
|
+
"name", // Basic info
|
|
96
|
+
"email", // Contact info
|
|
97
|
+
"serviceType", // What service they want
|
|
98
|
+
"availability", // When they're available
|
|
99
|
+
],
|
|
100
|
+
skipIf: (data) => {
|
|
101
|
+
// Skip if appointment already scheduled
|
|
102
|
+
return data.appointmentId !== undefined;
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Step Traversal Logic
|
|
108
|
+
|
|
109
|
+
### Candidate Step Algorithm
|
|
110
|
+
|
|
111
|
+
The system uses a sophisticated algorithm to find valid next steps:
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
// 1. Start with current step's direct transitions
|
|
115
|
+
const transitions = currentStep.getTransitions();
|
|
116
|
+
|
|
117
|
+
// 2. For each transition, evaluate:
|
|
118
|
+
for (const transition of transitions) {
|
|
119
|
+
// Check for END_ROUTE marker
|
|
120
|
+
if (transition.id === END_ROUTE_ID) {
|
|
121
|
+
return { isRouteComplete: true };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Skip steps that should be skipped
|
|
125
|
+
if (transition.shouldSkip(data)) {
|
|
126
|
+
// Recursively traverse to find next valid step
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Check if step has required data
|
|
131
|
+
if (!transition.hasRequires(data)) {
|
|
132
|
+
// Step cannot be entered yet
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Found valid step
|
|
137
|
+
return { step: transition };
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Recursive Traversal
|
|
142
|
+
|
|
143
|
+
For complex flows with skipIf conditions:
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
// Example flow: A -> B -> C -> END
|
|
147
|
+
// If user has already completed B, skip to C
|
|
148
|
+
// If B and C are complete, route is done
|
|
149
|
+
|
|
150
|
+
const flow = agent
|
|
151
|
+
.createRoute({
|
|
152
|
+
title: "Complex Flow",
|
|
153
|
+
|
|
154
|
+
initialStep: {
|
|
155
|
+
/* Step A */
|
|
156
|
+
},
|
|
157
|
+
})
|
|
158
|
+
.nextStep({
|
|
159
|
+
prompt: "Step B content",
|
|
160
|
+
skipIf: (data) => data.stepBComplete,
|
|
161
|
+
})
|
|
162
|
+
.nextStep({
|
|
163
|
+
prompt: "Step C content",
|
|
164
|
+
skipIf: (data) => data.stepCComplete,
|
|
165
|
+
requires: ["stepBComplete"],
|
|
166
|
+
})
|
|
167
|
+
.endRoute();
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Branching Logic
|
|
171
|
+
|
|
172
|
+
### Branch Evaluation
|
|
173
|
+
|
|
174
|
+
When multiple branches exist, the system evaluates each:
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
const branchingRoute = agent
|
|
178
|
+
.createRoute({
|
|
179
|
+
title: "Multi-Path Flow",
|
|
180
|
+
|
|
181
|
+
initialStep: {
|
|
182
|
+
prompt: "What type of help do you need?",
|
|
183
|
+
collect: ["helpType"],
|
|
184
|
+
},
|
|
185
|
+
})
|
|
186
|
+
.branch([
|
|
187
|
+
{
|
|
188
|
+
name: "technical",
|
|
189
|
+
step: {
|
|
190
|
+
prompt: "Technical support question?",
|
|
191
|
+
collect: ["techIssue"],
|
|
192
|
+
requires: ["helpType"],
|
|
193
|
+
when: "if helpType indicates technical issue",
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
name: "billing",
|
|
198
|
+
step: {
|
|
199
|
+
prompt: "Billing question?",
|
|
200
|
+
collect: ["billingIssue"],
|
|
201
|
+
requires: ["helpType"],
|
|
202
|
+
when: "if helpType indicates billing issue",
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: "general",
|
|
207
|
+
step: {
|
|
208
|
+
prompt: "General question?",
|
|
209
|
+
collect: ["generalQuestion"],
|
|
210
|
+
requires: ["helpType"],
|
|
211
|
+
// No 'when' condition - fallback branch
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
]);
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Branch Resolution
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
// The routing engine evaluates branches and selects the best path
|
|
221
|
+
// 1. Check explicit 'when' conditions (AI-evaluated)
|
|
222
|
+
// 2. Fall back to branches without conditions
|
|
223
|
+
// 3. Allow multiple branches if no clear winner
|
|
224
|
+
|
|
225
|
+
// Access specific branches for chaining
|
|
226
|
+
const techBranch = branchingRoute.branches.technical.nextStep({
|
|
227
|
+
prompt: "Let me help with that technical issue...",
|
|
228
|
+
requires: ["techIssue"],
|
|
229
|
+
});
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Route Completion
|
|
233
|
+
|
|
234
|
+
### End Route Detection
|
|
235
|
+
|
|
236
|
+
Routes complete when reaching END_ROUTE:
|
|
237
|
+
|
|
238
|
+
```typescript
|
|
239
|
+
const completeRoute = agent
|
|
240
|
+
.createRoute({
|
|
241
|
+
title: "Task Completion",
|
|
242
|
+
|
|
243
|
+
initialStep: { prompt: "What task?", collect: ["task"] },
|
|
244
|
+
})
|
|
245
|
+
.nextStep({
|
|
246
|
+
prompt: "I'll help with {{task}}",
|
|
247
|
+
requires: ["task"],
|
|
248
|
+
})
|
|
249
|
+
.nextStep({
|
|
250
|
+
prompt: "Task details?",
|
|
251
|
+
collect: ["details"],
|
|
252
|
+
requires: ["task"],
|
|
253
|
+
})
|
|
254
|
+
.endRoute({
|
|
255
|
+
prompt: "Task completed! Anything else?",
|
|
256
|
+
collect: ["satisfaction"], // Optional final collection
|
|
257
|
+
});
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### Completion Handlers
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
const routeWithCompletion = agent.createRoute({
|
|
264
|
+
title: "Workflow",
|
|
265
|
+
|
|
266
|
+
// Simple string transition
|
|
267
|
+
onComplete: "feedback-route",
|
|
268
|
+
|
|
269
|
+
// Or conditional transition
|
|
270
|
+
// onComplete: {
|
|
271
|
+
// nextStep: "success-route",
|
|
272
|
+
// condition: "if workflow succeeded"
|
|
273
|
+
// }
|
|
274
|
+
|
|
275
|
+
// Or dynamic transition
|
|
276
|
+
// onComplete: async (session, context) => {
|
|
277
|
+
// if (session.data?.success) return "success-route";
|
|
278
|
+
// return "retry-route";
|
|
279
|
+
// }
|
|
280
|
+
});
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Advanced Transition Patterns
|
|
284
|
+
|
|
285
|
+
### Circular Flows
|
|
286
|
+
|
|
287
|
+
Handle repeating patterns with proper termination:
|
|
288
|
+
|
|
289
|
+
```typescript
|
|
290
|
+
const iterativeRoute = agent
|
|
291
|
+
.createRoute({
|
|
292
|
+
title: "Iterative Collection",
|
|
293
|
+
|
|
294
|
+
initialStep: {
|
|
295
|
+
prompt: "Add an item (or 'done' to finish)",
|
|
296
|
+
collect: ["currentItem"],
|
|
297
|
+
},
|
|
298
|
+
})
|
|
299
|
+
.nextStep({
|
|
300
|
+
prompt: "Item added: {{currentItem}}. Add another?",
|
|
301
|
+
collect: ["continue"],
|
|
302
|
+
requires: ["currentItem"],
|
|
303
|
+
skipIf: (data) => data.continue === false || data.currentItem === "done",
|
|
304
|
+
})
|
|
305
|
+
.nextStep({
|
|
306
|
+
prompt: "Add another item?",
|
|
307
|
+
collect: ["currentItem"],
|
|
308
|
+
requires: ["continue"],
|
|
309
|
+
// Loops back to previous step
|
|
310
|
+
});
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### State-Based Transitions
|
|
314
|
+
|
|
315
|
+
```typescript
|
|
316
|
+
const statefulRoute = agent
|
|
317
|
+
.createRoute({
|
|
318
|
+
title: "State Machine",
|
|
319
|
+
|
|
320
|
+
initialStep: {
|
|
321
|
+
prompt: "What's your current status?",
|
|
322
|
+
collect: ["status"],
|
|
323
|
+
},
|
|
324
|
+
})
|
|
325
|
+
.branch([
|
|
326
|
+
{
|
|
327
|
+
name: "new",
|
|
328
|
+
step: {
|
|
329
|
+
prompt: "Welcome! Let's get you started.",
|
|
330
|
+
collect: ["onboardingData"],
|
|
331
|
+
when: "if status is 'new'",
|
|
332
|
+
skipIf: (data) => data.status !== "new",
|
|
333
|
+
},
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
name: "returning",
|
|
337
|
+
step: {
|
|
338
|
+
prompt: "Welcome back! What can I help with?",
|
|
339
|
+
collect: ["request"],
|
|
340
|
+
when: "if status is 'returning'",
|
|
341
|
+
skipIf: (data) => data.status !== "returning",
|
|
342
|
+
},
|
|
343
|
+
},
|
|
344
|
+
]);
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
## Lifecycle Integration
|
|
348
|
+
|
|
349
|
+
### Prepare and Finalize Hooks
|
|
350
|
+
|
|
351
|
+
```typescript
|
|
352
|
+
const hookedRoute = agent
|
|
353
|
+
.createRoute({
|
|
354
|
+
title: "Lifecycle Demo",
|
|
355
|
+
|
|
356
|
+
initialStep: {
|
|
357
|
+
prompt: "Starting process...",
|
|
358
|
+
prepare: async (context, data) => {
|
|
359
|
+
// Setup before AI responds
|
|
360
|
+
console.log("Preparing step with context:", context);
|
|
361
|
+
console.log("Current data:", data);
|
|
362
|
+
},
|
|
363
|
+
finalize: async (context, data) => {
|
|
364
|
+
// Cleanup after AI responds
|
|
365
|
+
console.log("Step completed with data:", data);
|
|
366
|
+
await saveProgress(data);
|
|
367
|
+
},
|
|
368
|
+
},
|
|
369
|
+
})
|
|
370
|
+
.nextStep({
|
|
371
|
+
prompt: "Process step...",
|
|
372
|
+
prepare: (context, data) => {
|
|
373
|
+
// Validate state before proceeding
|
|
374
|
+
if (!data.requiredField) {
|
|
375
|
+
throw new Error("Missing required field");
|
|
376
|
+
}
|
|
377
|
+
},
|
|
378
|
+
});
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### Route-Level Hooks
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
const routeWithHooks = agent.createRoute({
|
|
385
|
+
title: "Route Lifecycle",
|
|
386
|
+
|
|
387
|
+
hooks: {
|
|
388
|
+
onDataUpdate: (newData, previousData) => {
|
|
389
|
+
// Validate data changes across the route
|
|
390
|
+
if (newData.criticalField && !isValid(newData.criticalField)) {
|
|
391
|
+
throw new Error("Invalid critical field");
|
|
392
|
+
}
|
|
393
|
+
return newData;
|
|
394
|
+
},
|
|
395
|
+
|
|
396
|
+
onContextUpdate: (newContext, previousContext) => {
|
|
397
|
+
// React to context changes
|
|
398
|
+
console.log("Route context updated");
|
|
399
|
+
},
|
|
400
|
+
},
|
|
401
|
+
});
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
## Error Handling & Recovery
|
|
405
|
+
|
|
406
|
+
### Transition Validation
|
|
407
|
+
|
|
408
|
+
```typescript
|
|
409
|
+
const robustRoute = agent
|
|
410
|
+
.createRoute({
|
|
411
|
+
title: "Error Handling",
|
|
412
|
+
|
|
413
|
+
initialStep: {
|
|
414
|
+
prompt: "What would you like to do?",
|
|
415
|
+
collect: ["action"],
|
|
416
|
+
finalize: async (context, data) => {
|
|
417
|
+
try {
|
|
418
|
+
await validateAction(data.action);
|
|
419
|
+
} catch (error) {
|
|
420
|
+
// Set error state for recovery
|
|
421
|
+
data.actionError = error.message;
|
|
422
|
+
data.needsRecovery = true;
|
|
423
|
+
}
|
|
424
|
+
},
|
|
425
|
+
},
|
|
426
|
+
})
|
|
427
|
+
.nextStep({
|
|
428
|
+
prompt:
|
|
429
|
+
"There was an issue with your request: {{actionError}}. Please try again.",
|
|
430
|
+
collect: ["action"],
|
|
431
|
+
skipIf: (data) => !data.needsRecovery,
|
|
432
|
+
finalize: (context, data) => {
|
|
433
|
+
// Clear error state on successful retry
|
|
434
|
+
delete data.actionError;
|
|
435
|
+
delete data.needsRecovery;
|
|
436
|
+
},
|
|
437
|
+
});
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
### Recovery Patterns
|
|
441
|
+
|
|
442
|
+
```typescript
|
|
443
|
+
const recoveryRoute = agent
|
|
444
|
+
.createRoute({
|
|
445
|
+
title: "Recovery Flow",
|
|
446
|
+
|
|
447
|
+
// Normal flow
|
|
448
|
+
initialStep: {
|
|
449
|
+
/* normal steps */
|
|
450
|
+
},
|
|
451
|
+
|
|
452
|
+
// Recovery branch
|
|
453
|
+
})
|
|
454
|
+
.branch([
|
|
455
|
+
{
|
|
456
|
+
name: "normal",
|
|
457
|
+
step: {
|
|
458
|
+
/* normal processing */
|
|
459
|
+
},
|
|
460
|
+
},
|
|
461
|
+
{
|
|
462
|
+
name: "recovery",
|
|
463
|
+
step: {
|
|
464
|
+
prompt: "I encountered an error. Let's start over.",
|
|
465
|
+
collect: ["resetConfirmation"],
|
|
466
|
+
when: "if error state is detected",
|
|
467
|
+
finalize: (context, data) => {
|
|
468
|
+
// Reset problematic data
|
|
469
|
+
resetSessionData(data);
|
|
470
|
+
},
|
|
471
|
+
},
|
|
472
|
+
},
|
|
473
|
+
]);
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
## Performance Considerations
|
|
477
|
+
|
|
478
|
+
### Efficient Traversal
|
|
479
|
+
|
|
480
|
+
```typescript
|
|
481
|
+
// The system optimizes by:
|
|
482
|
+
// 1. Using visited sets to prevent infinite loops
|
|
483
|
+
// 2. Early termination on END_ROUTE detection
|
|
484
|
+
// 3. Lazy evaluation of skipIf conditions
|
|
485
|
+
// 4. Caching of validation results
|
|
486
|
+
|
|
487
|
+
// Example of efficient validation
|
|
488
|
+
skipIf: (data) => {
|
|
489
|
+
// Cache expensive operations
|
|
490
|
+
if (data._skipCache === undefined) {
|
|
491
|
+
data._skipCache = expensiveCheck(data);
|
|
492
|
+
}
|
|
493
|
+
return data._skipCache;
|
|
494
|
+
};
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
### Memory Management
|
|
498
|
+
|
|
499
|
+
```typescript
|
|
500
|
+
// Clean up temporary data
|
|
501
|
+
finalize: (context, data) => {
|
|
502
|
+
// Remove temporary fields
|
|
503
|
+
delete data._tempField;
|
|
504
|
+
delete data._skipCache;
|
|
505
|
+
|
|
506
|
+
// Compress large data structures if needed
|
|
507
|
+
if (data.largeArray?.length > 100) {
|
|
508
|
+
data.largeArray = data.largeArray.slice(-50); // Keep recent items
|
|
509
|
+
}
|
|
510
|
+
};
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
## Debugging Transitions
|
|
514
|
+
|
|
515
|
+
### Step Inspection
|
|
516
|
+
|
|
517
|
+
```typescript
|
|
518
|
+
// Inspect route structure
|
|
519
|
+
console.log(route.describe());
|
|
520
|
+
|
|
521
|
+
// Check step validity
|
|
522
|
+
const step = route.getStep("step-id");
|
|
523
|
+
console.log("Should skip:", step.shouldSkip(session.data));
|
|
524
|
+
console.log("Has requirements:", step.hasRequires(session.data));
|
|
525
|
+
|
|
526
|
+
// Get all transitions
|
|
527
|
+
const transitions = step.getTransitions();
|
|
528
|
+
console.log(
|
|
529
|
+
"Available transitions:",
|
|
530
|
+
transitions.map((s) => s.id)
|
|
531
|
+
);
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
### Transition Tracing
|
|
535
|
+
|
|
536
|
+
```typescript
|
|
537
|
+
// Enable debug logging
|
|
538
|
+
const agent = new Agent({
|
|
539
|
+
name: "Debug Agent",
|
|
540
|
+
debug: true, // Enables transition logging
|
|
541
|
+
provider: provider,
|
|
542
|
+
});
|
|
543
|
+
|
|
544
|
+
// Logs will show:
|
|
545
|
+
// [RoutingEngine] Found valid step after skipping: step-3
|
|
546
|
+
// [RoutingEngine] Route complete: all data collected, END_ROUTE reached
|
|
547
|
+
// [Agent] Entered step: step-3
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
### Testing Transitions
|
|
551
|
+
|
|
552
|
+
```typescript
|
|
553
|
+
// Test step conditions
|
|
554
|
+
const testData = { name: "John", email: "john@test.com" };
|
|
555
|
+
|
|
556
|
+
const shouldSkip = step.shouldSkip(testData);
|
|
557
|
+
const hasRequirements = step.hasRequires(testData);
|
|
558
|
+
|
|
559
|
+
console.log(`Step ${step.id}:`);
|
|
560
|
+
console.log(`- Should skip: ${shouldSkip}`);
|
|
561
|
+
console.log(`- Has requirements: ${hasRequirements}`);
|
|
562
|
+
console.log(`- Can proceed: ${!shouldSkip && hasRequirements}`);
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
## Best Practices
|
|
566
|
+
|
|
567
|
+
### Transition Design
|
|
568
|
+
|
|
569
|
+
1. **Clear Dependencies**: Make `requires` relationships obvious
|
|
570
|
+
2. **Smart Skipping**: Use `skipIf` to avoid redundant interactions
|
|
571
|
+
3. **Fail Fast**: Validate early to prevent invalid states
|
|
572
|
+
4. **Recovery Paths**: Plan for error conditions and recovery flows
|
|
573
|
+
|
|
574
|
+
### Performance
|
|
575
|
+
|
|
576
|
+
1. **Efficient Conditions**: Cache expensive `skipIf` evaluations
|
|
577
|
+
2. **Minimal Dependencies**: Avoid overly complex requirement chains
|
|
578
|
+
3. **Early Termination**: Use END_ROUTE appropriately
|
|
579
|
+
4. **Memory Cleanup**: Remove temporary data in finalize hooks
|
|
580
|
+
|
|
581
|
+
### Maintainability
|
|
582
|
+
|
|
583
|
+
1. **Descriptive IDs**: Use meaningful step and route identifiers
|
|
584
|
+
2. **Documentation**: Comment complex transition logic
|
|
585
|
+
3. **Testing**: Cover edge cases in transition logic
|
|
586
|
+
4. **Monitoring**: Track transition success rates
|
|
587
|
+
|
|
588
|
+
### User Experience
|
|
589
|
+
|
|
590
|
+
1. **Natural Flow**: Make transitions feel conversational
|
|
591
|
+
2. **Context Preservation**: Maintain conversation context across steps
|
|
592
|
+
3. **Error Recovery**: Handle failures gracefully with clear recovery paths
|
|
593
|
+
4. **Progress Indication**: Show users where they are in multi-step processes
|
|
594
|
+
|
|
595
|
+
The step transition system enables sophisticated conversation flows that can adapt to user context, handle complex branching logic, and maintain data integrity throughout multi-turn interactions.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Steps
|
|
2
|
+
|
|
3
|
+
Steps are the building blocks of conversational routes in @falai/agent. This document covers step configuration, data collection, and transition logic.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Steps represent individual moments in a conversation where the agent can:
|
|
8
|
+
|
|
9
|
+
- Prompt the user for information
|
|
10
|
+
- Collect structured data from responses
|
|
11
|
+
- Execute tools or perform actions
|
|
12
|
+
- Make decisions about conversation flow
|
|
13
|
+
|
|
14
|
+
## Step Configuration
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
const nameStep = bookingRoute.initialStep.nextStep({
|
|
18
|
+
prompt: "What's your name?",
|
|
19
|
+
collect: ["firstName", "lastName"],
|
|
20
|
+
requires: [], // No prerequisites
|
|
21
|
+
skipIf: (data) => data.firstName && data.lastName, // Skip if already collected
|
|
22
|
+
});
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Step Types
|
|
26
|
+
|
|
27
|
+
### Initial Steps
|
|
28
|
+
|
|
29
|
+
The entry point for a route, executed when the route is first activated.
|
|
30
|
+
|
|
31
|
+
### Sequential Steps
|
|
32
|
+
|
|
33
|
+
Steps that follow each other in a linear progression using `nextStep()`.
|
|
34
|
+
|
|
35
|
+
### Branching Steps
|
|
36
|
+
|
|
37
|
+
Steps that can lead to multiple paths using `branch()` with conditional logic.
|
|
38
|
+
|
|
39
|
+
### Terminal Steps
|
|
40
|
+
|
|
41
|
+
Steps that end the route using `END_ROUTE`.
|
|
42
|
+
|
|
43
|
+
## Data Collection
|
|
44
|
+
|
|
45
|
+
Steps collect data through the `collect` array, which maps to the route's JSON schema.
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
const contactStep = nameStep.nextStep({
|
|
49
|
+
prompt: "What's your email and phone number?",
|
|
50
|
+
collect: ["email", "phone"],
|
|
51
|
+
requires: ["firstName"], // Must have name first
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Conditional Logic
|
|
56
|
+
|
|
57
|
+
Steps support various conditional behaviors:
|
|
58
|
+
|
|
59
|
+
- `skipIf`: Skip the step if a condition is met
|
|
60
|
+
- `requires`: Prerequisites that must be satisfied
|
|
61
|
+
- `when`: AI-evaluated conditions for branching
|
|
62
|
+
|
|
63
|
+
## Tool Integration
|
|
64
|
+
|
|
65
|
+
Steps can execute tools before generating AI responses:
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
const weatherStep = planningStep.nextStep({
|
|
69
|
+
prompt: "I'll check the weather for your destination",
|
|
70
|
+
tool: weatherLookupTool,
|
|
71
|
+
requires: ["destination", "travelDate"],
|
|
72
|
+
});
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Step Transitions
|
|
76
|
+
|
|
77
|
+
Steps define what happens next through transitions:
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
// Simple next step
|
|
81
|
+
step.nextStep({
|
|
82
|
+
/* next step config */
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Branching paths
|
|
86
|
+
step.branch([
|
|
87
|
+
{
|
|
88
|
+
name: "optionA",
|
|
89
|
+
step: {
|
|
90
|
+
/* config */
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: "optionB",
|
|
95
|
+
step: {
|
|
96
|
+
/* config */
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
]);
|
|
100
|
+
|
|
101
|
+
// End route
|
|
102
|
+
finalStep.nextStep({ step: END_ROUTE });
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Lifecycle Hooks
|
|
106
|
+
|
|
107
|
+
Steps support `prepare` and `finalize` hooks for setup and cleanup:
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
const dataStep = previousStep.nextStep({
|
|
111
|
+
prompt: "Collecting your information...",
|
|
112
|
+
collect: ["userData"],
|
|
113
|
+
prepare: async (context, data) => {
|
|
114
|
+
// Setup before AI response
|
|
115
|
+
console.log("Preparing data collection");
|
|
116
|
+
},
|
|
117
|
+
finalize: async (context, data) => {
|
|
118
|
+
// Cleanup after AI response
|
|
119
|
+
await saveProgress(data);
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Best Practices
|
|
125
|
+
|
|
126
|
+
- Keep step prompts clear and focused
|
|
127
|
+
- Use appropriate `requires` and `skipIf` conditions
|
|
128
|
+
- Leverage schema validation for data integrity
|
|
129
|
+
- Implement error handling in lifecycle hooks
|
|
130
|
+
- Consider user experience in step sequencing
|