@falai/agent 1.2.8 → 2.0.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 +40 -886
- package/dist/adapters/MemoryAdapter.js +2 -2
- package/dist/adapters/MemoryAdapter.js.map +1 -1
- package/dist/adapters/MongoAdapter.js +2 -2
- package/dist/adapters/MongoAdapter.js.map +1 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenSearchAdapter.js +9 -7
- package/dist/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.js +25 -9
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/adapters/PrismaAdapter.js +5 -5
- package/dist/adapters/PrismaAdapter.js.map +1 -1
- package/dist/adapters/RedisAdapter.js +2 -2
- package/dist/adapters/RedisAdapter.js.map +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts +17 -0
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/adapters/SQLiteAdapter.js +30 -11
- package/dist/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.js +2 -2
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.js +2 -2
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.js +5 -5
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.js +2 -2
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/constants/index.d.ts +0 -9
- package/dist/cjs/constants/index.d.ts.map +1 -1
- package/dist/cjs/constants/index.js +2 -11
- package/dist/cjs/constants/index.js.map +1 -1
- package/dist/cjs/core/Agent.d.ts +119 -153
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +471 -324
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
- package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
- package/dist/cjs/core/AutoChainExecutor.js +297 -0
- package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
- package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
- package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
- package/dist/cjs/core/BranchEvaluator.js +130 -0
- package/dist/cjs/core/BranchEvaluator.js.map +1 -0
- package/dist/cjs/core/DirectiveBus.d.ts +88 -0
- package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
- package/dist/cjs/core/DirectiveBus.js +196 -0
- package/dist/cjs/core/DirectiveBus.js.map +1 -0
- package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
- package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
- package/dist/cjs/core/DirectiveChainTracker.js +121 -0
- package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
- package/dist/cjs/core/Flow.d.ts +186 -0
- package/dist/cjs/core/Flow.d.ts.map +1 -0
- package/dist/cjs/core/Flow.js +550 -0
- package/dist/cjs/core/Flow.js.map +1 -0
- package/dist/cjs/core/FlowRouter.d.ts +182 -0
- package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
- package/dist/cjs/core/{RoutingEngine.js → FlowRouter.js} +323 -306
- package/dist/cjs/core/FlowRouter.js.map +1 -0
- package/dist/cjs/core/PersistenceManager.d.ts +2 -2
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
- package/dist/cjs/core/PersistenceManager.js +7 -7
- package/dist/cjs/core/PersistenceManager.js.map +1 -1
- package/dist/cjs/core/PromptComposer.d.ts +21 -8
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
- package/dist/cjs/core/PromptComposer.js +182 -105
- package/dist/cjs/core/PromptComposer.js.map +1 -1
- package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
- package/dist/cjs/core/PromptSectionCache.js +1 -1
- package/dist/cjs/core/ResponseEngine.d.ts +18 -8
- package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +38 -36
- package/dist/cjs/core/ResponseEngine.js.map +1 -1
- package/dist/cjs/core/ResponseModal.d.ts +73 -56
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
- package/dist/cjs/core/ResponseModal.js +1191 -1014
- package/dist/cjs/core/ResponseModal.js.map +1 -1
- package/dist/cjs/core/ResponsePipeline.d.ts +124 -26
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/cjs/core/ResponsePipeline.js +509 -136
- package/dist/cjs/core/ResponsePipeline.js.map +1 -1
- package/dist/cjs/core/SignalEvaluator.d.ts +86 -0
- package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -0
- package/dist/cjs/core/SignalEvaluator.js +333 -0
- package/dist/cjs/core/SignalEvaluator.js.map +1 -0
- package/dist/cjs/core/SignalProcessor.d.ts +152 -0
- package/dist/cjs/core/SignalProcessor.d.ts.map +1 -0
- package/dist/cjs/core/SignalProcessor.js +562 -0
- package/dist/cjs/core/SignalProcessor.js.map +1 -0
- package/dist/cjs/core/Step.d.ts +43 -32
- package/dist/cjs/core/Step.d.ts.map +1 -1
- package/dist/cjs/core/Step.js +221 -126
- package/dist/cjs/core/Step.js.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.d.ts +2 -2
- package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
- package/dist/cjs/core/ToolManager.d.ts +44 -13
- package/dist/cjs/core/ToolManager.d.ts.map +1 -1
- package/dist/cjs/core/ToolManager.js +174 -91
- package/dist/cjs/core/ToolManager.js.map +1 -1
- package/dist/cjs/core/createAgent.d.ts +35 -0
- package/dist/cjs/core/createAgent.d.ts.map +1 -0
- package/dist/cjs/core/createAgent.js +39 -0
- package/dist/cjs/core/createAgent.js.map +1 -0
- package/dist/cjs/core/flow-namespace.d.ts +49 -0
- package/dist/cjs/core/flow-namespace.d.ts.map +1 -0
- package/dist/cjs/core/flow-namespace.js +171 -0
- package/dist/cjs/core/flow-namespace.js.map +1 -0
- package/dist/cjs/index.d.ts +11 -14
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +18 -22
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts +1 -1
- package/dist/cjs/providers/AnthropicProvider.js +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +1 -1
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.js +1 -1
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +183 -54
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/agent.js +0 -6
- package/dist/cjs/types/agent.js.map +1 -1
- package/dist/cjs/types/ai.d.ts +3 -3
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/errors.d.ts +15 -0
- package/dist/cjs/types/errors.d.ts.map +1 -0
- package/dist/cjs/types/errors.js +22 -0
- package/dist/cjs/types/errors.js.map +1 -0
- package/dist/cjs/types/flow.d.ts +513 -0
- package/dist/cjs/types/flow.d.ts.map +1 -0
- package/dist/cjs/types/{route.js → flow.js} +2 -2
- package/dist/cjs/types/flow.js.map +1 -0
- package/dist/cjs/types/index.d.ts +7 -6
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js +6 -2
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/persistence.d.ts +11 -7
- package/dist/cjs/types/persistence.d.ts.map +1 -1
- package/dist/cjs/types/routing.d.ts +1 -1
- package/dist/cjs/types/routing.d.ts.map +1 -1
- package/dist/cjs/types/session.d.ts +24 -23
- package/dist/cjs/types/session.d.ts.map +1 -1
- package/dist/cjs/types/signals.d.ts +248 -0
- package/dist/cjs/types/signals.d.ts.map +1 -0
- package/dist/cjs/types/signals.js +11 -0
- package/dist/cjs/types/signals.js.map +1 -0
- package/dist/cjs/types/template.d.ts +2 -8
- package/dist/cjs/types/template.d.ts.map +1 -1
- package/dist/cjs/types/tool.d.ts +36 -29
- package/dist/cjs/types/tool.d.ts.map +1 -1
- package/dist/cjs/types/tool.js +1 -1
- package/dist/cjs/types/tool.js.map +1 -1
- package/dist/cjs/utils/condition.d.ts +7 -1
- package/dist/cjs/utils/condition.d.ts.map +1 -1
- package/dist/cjs/utils/condition.js.map +1 -1
- package/dist/cjs/utils/id.d.ts +13 -5
- package/dist/cjs/utils/id.d.ts.map +1 -1
- package/dist/cjs/utils/id.js +24 -10
- package/dist/cjs/utils/id.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +2 -2
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +7 -3
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/session.d.ts +44 -5
- package/dist/cjs/utils/session.d.ts.map +1 -1
- package/dist/cjs/utils/session.js +197 -38
- package/dist/cjs/utils/session.js.map +1 -1
- package/dist/constants/index.d.ts +0 -9
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +3 -9
- package/dist/constants/index.js.map +1 -1
- package/dist/core/Agent.d.ts +119 -153
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +472 -325
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/AutoChainExecutor.d.ts +107 -0
- package/dist/core/AutoChainExecutor.d.ts.map +1 -0
- package/dist/core/AutoChainExecutor.js +293 -0
- package/dist/core/AutoChainExecutor.js.map +1 -0
- package/dist/core/BranchEvaluator.d.ts +54 -0
- package/dist/core/BranchEvaluator.d.ts.map +1 -0
- package/dist/core/BranchEvaluator.js +126 -0
- package/dist/core/BranchEvaluator.js.map +1 -0
- package/dist/core/DirectiveBus.d.ts +88 -0
- package/dist/core/DirectiveBus.d.ts.map +1 -0
- package/dist/core/DirectiveBus.js +192 -0
- package/dist/core/DirectiveBus.js.map +1 -0
- package/dist/core/DirectiveChainTracker.d.ts +49 -0
- package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
- package/dist/core/DirectiveChainTracker.js +117 -0
- package/dist/core/DirectiveChainTracker.js.map +1 -0
- package/dist/core/Flow.d.ts +186 -0
- package/dist/core/Flow.d.ts.map +1 -0
- package/dist/core/Flow.js +546 -0
- package/dist/core/Flow.js.map +1 -0
- package/dist/core/FlowRouter.d.ts +182 -0
- package/dist/core/FlowRouter.d.ts.map +1 -0
- package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
- package/dist/core/FlowRouter.js.map +1 -0
- package/dist/core/PersistenceManager.d.ts +2 -2
- package/dist/core/PersistenceManager.d.ts.map +1 -1
- package/dist/core/PersistenceManager.js +7 -7
- package/dist/core/PersistenceManager.js.map +1 -1
- package/dist/core/PromptComposer.d.ts +21 -8
- package/dist/core/PromptComposer.d.ts.map +1 -1
- package/dist/core/PromptComposer.js +183 -106
- package/dist/core/PromptComposer.js.map +1 -1
- package/dist/core/PromptSectionCache.d.ts +1 -1
- package/dist/core/PromptSectionCache.js +1 -1
- package/dist/core/ResponseEngine.d.ts +18 -8
- package/dist/core/ResponseEngine.d.ts.map +1 -1
- package/dist/core/ResponseEngine.js +38 -36
- package/dist/core/ResponseEngine.js.map +1 -1
- package/dist/core/ResponseModal.d.ts +73 -56
- package/dist/core/ResponseModal.d.ts.map +1 -1
- package/dist/core/ResponseModal.js +1193 -1016
- package/dist/core/ResponseModal.js.map +1 -1
- package/dist/core/ResponsePipeline.d.ts +124 -26
- package/dist/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/core/ResponsePipeline.js +509 -137
- package/dist/core/ResponsePipeline.js.map +1 -1
- package/dist/core/SignalEvaluator.d.ts +86 -0
- package/dist/core/SignalEvaluator.d.ts.map +1 -0
- package/dist/core/SignalEvaluator.js +326 -0
- package/dist/core/SignalEvaluator.js.map +1 -0
- package/dist/core/SignalProcessor.d.ts +152 -0
- package/dist/core/SignalProcessor.d.ts.map +1 -0
- package/dist/core/SignalProcessor.js +555 -0
- package/dist/core/SignalProcessor.js.map +1 -0
- package/dist/core/Step.d.ts +43 -32
- package/dist/core/Step.d.ts.map +1 -1
- package/dist/core/Step.js +220 -126
- package/dist/core/Step.js.map +1 -1
- package/dist/core/StreamingToolExecutor.d.ts +2 -2
- package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/core/StreamingToolExecutor.js.map +1 -1
- package/dist/core/ToolManager.d.ts +44 -13
- package/dist/core/ToolManager.d.ts.map +1 -1
- package/dist/core/ToolManager.js +174 -91
- package/dist/core/ToolManager.js.map +1 -1
- package/dist/core/createAgent.d.ts +35 -0
- package/dist/core/createAgent.d.ts.map +1 -0
- package/dist/core/createAgent.js +36 -0
- package/dist/core/createAgent.js.map +1 -0
- package/dist/core/flow-namespace.d.ts +49 -0
- package/dist/core/flow-namespace.d.ts.map +1 -0
- package/dist/core/flow-namespace.js +168 -0
- package/dist/core/flow-namespace.js.map +1 -0
- package/dist/index.d.ts +11 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -12
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts +1 -1
- package/dist/providers/AnthropicProvider.js +1 -1
- package/dist/providers/GeminiProvider.d.ts +1 -1
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +1 -1
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/OpenAIProvider.d.ts +1 -1
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +1 -1
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/types/agent.d.ts +183 -54
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js +0 -6
- package/dist/types/agent.js.map +1 -1
- package/dist/types/ai.d.ts +3 -3
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/errors.d.ts +15 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +18 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/flow.d.ts +513 -0
- package/dist/types/flow.d.ts.map +1 -0
- package/dist/types/flow.js +5 -0
- package/dist/types/flow.js.map +1 -0
- package/dist/types/index.d.ts +7 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/persistence.d.ts +11 -7
- package/dist/types/persistence.d.ts.map +1 -1
- package/dist/types/routing.d.ts +1 -1
- package/dist/types/routing.d.ts.map +1 -1
- package/dist/types/session.d.ts +24 -23
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/signals.d.ts +248 -0
- package/dist/types/signals.d.ts.map +1 -0
- package/dist/types/signals.js +10 -0
- package/dist/types/signals.js.map +1 -0
- package/dist/types/template.d.ts +2 -8
- package/dist/types/template.d.ts.map +1 -1
- package/dist/types/tool.d.ts +36 -29
- package/dist/types/tool.d.ts.map +1 -1
- package/dist/types/tool.js +1 -1
- package/dist/types/tool.js.map +1 -1
- package/dist/utils/condition.d.ts +7 -1
- package/dist/utils/condition.d.ts.map +1 -1
- package/dist/utils/condition.js.map +1 -1
- package/dist/utils/id.d.ts +13 -5
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +22 -9
- package/dist/utils/id.js.map +1 -1
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/session.d.ts +44 -5
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +193 -37
- package/dist/utils/session.js.map +1 -1
- package/docs/README.md +22 -200
- package/docs/concepts/architecture.md +281 -0
- package/docs/concepts/directives.md +400 -0
- package/docs/concepts/pipeline.md +399 -0
- package/docs/guides/branching.md +263 -0
- package/docs/guides/compaction.md +163 -0
- package/docs/guides/conditions.md +167 -0
- package/docs/guides/error-handling.md +176 -0
- package/docs/guides/flow-control.md +409 -0
- package/docs/guides/instructions.md +210 -0
- package/docs/guides/persistence.md +182 -0
- package/docs/guides/streaming.md +137 -0
- package/docs/migration/README.md +14 -0
- package/docs/migration/route-to-flow.md +561 -0
- package/docs/migration/v1-to-v2.md +909 -0
- package/docs/reference/adapters.md +481 -0
- package/docs/reference/branches.md +241 -0
- package/docs/reference/create-agent.md +186 -0
- package/docs/reference/directive.md +243 -0
- package/docs/reference/errors.md +122 -0
- package/docs/reference/flow.md +238 -0
- package/docs/reference/instruction.md +177 -0
- package/docs/reference/pre-directive.md +131 -0
- package/docs/reference/providers.md +227 -0
- package/docs/reference/signals.md +356 -0
- package/docs/reference/step.md +339 -0
- package/docs/reference/tool.md +269 -0
- package/docs/start/01-install.md +81 -0
- package/docs/start/02-first-agent.md +196 -0
- package/docs/start/03-collect-data.md +222 -0
- package/docs/start/04-add-tools.md +276 -0
- package/docs/start/05-go-to-production.md +216 -0
- package/examples/01-quickstart.ts +20 -0
- package/examples/02-data-extraction.ts +90 -0
- package/examples/03-tools.ts +136 -0
- package/examples/04-instructions.ts +100 -0
- package/examples/05-branching.ts +140 -0
- package/examples/06-flow-control.ts +103 -0
- package/examples/07-streaming.ts +69 -0
- package/examples/08-persistence.ts +98 -0
- package/examples/09-signals.ts +144 -0
- package/examples/tsconfig.json +30 -0
- package/package.json +2 -1
- package/src/adapters/MemoryAdapter.ts +3 -3
- package/src/adapters/MongoAdapter.ts +3 -3
- package/src/adapters/OpenSearchAdapter.ts +10 -8
- package/src/adapters/PostgreSQLAdapter.ts +26 -10
- package/src/adapters/PrismaAdapter.ts +6 -6
- package/src/adapters/RedisAdapter.ts +3 -3
- package/src/adapters/SQLiteAdapter.ts +31 -12
- package/src/constants/index.ts +2 -10
- package/src/core/Agent.ts +585 -374
- package/src/core/AutoChainExecutor.ts +440 -0
- package/src/core/BranchEvaluator.ts +167 -0
- package/src/core/DirectiveBus.ts +248 -0
- package/src/core/DirectiveChainTracker.ts +144 -0
- package/src/core/Flow.ts +666 -0
- package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
- package/src/core/PersistenceManager.ts +8 -8
- package/src/core/PromptComposer.ts +209 -140
- package/src/core/PromptSectionCache.ts +1 -1
- package/src/core/ResponseEngine.ts +61 -46
- package/src/core/ResponseModal.ts +1453 -1240
- package/src/core/ResponsePipeline.ts +655 -175
- package/src/core/SignalEvaluator.ts +420 -0
- package/src/core/SignalProcessor.ts +723 -0
- package/src/core/Step.ts +279 -176
- package/src/core/StreamingToolExecutor.ts +4 -4
- package/src/core/ToolManager.ts +200 -97
- package/src/core/createAgent.ts +40 -0
- package/src/core/flow-namespace.ts +219 -0
- package/src/index.ts +42 -36
- package/src/providers/AnthropicProvider.ts +2 -2
- package/src/providers/GeminiProvider.ts +2 -2
- package/src/providers/OpenAIProvider.ts +2 -2
- package/src/types/agent.ts +182 -53
- package/src/types/ai.ts +3 -3
- package/src/types/errors.ts +18 -0
- package/src/types/flow.ts +590 -0
- package/src/types/index.ts +43 -16
- package/src/types/persistence.ts +12 -8
- package/src/types/routing.ts +1 -1
- package/src/types/session.ts +26 -23
- package/src/types/signals.ts +321 -0
- package/src/types/template.ts +3 -11
- package/src/types/tool.ts +50 -42
- package/src/utils/condition.ts +13 -4
- package/src/utils/id.ts +27 -9
- package/src/utils/index.ts +6 -2
- package/src/utils/session.ts +238 -42
- package/dist/cjs/core/BatchExecutor.d.ts +0 -359
- package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
- package/dist/cjs/core/BatchExecutor.js +0 -861
- package/dist/cjs/core/BatchExecutor.js.map +0 -1
- package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
- package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
- package/dist/cjs/core/BatchPromptBuilder.js +0 -223
- package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
- package/dist/cjs/core/Route.d.ts +0 -180
- package/dist/cjs/core/Route.d.ts.map +0 -1
- package/dist/cjs/core/Route.js +0 -542
- package/dist/cjs/core/Route.js.map +0 -1
- package/dist/cjs/core/RoutingEngine.d.ts +0 -185
- package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/types/route.d.ts +0 -336
- package/dist/cjs/types/route.d.ts.map +0 -1
- package/dist/cjs/types/route.js.map +0 -1
- package/dist/core/BatchExecutor.d.ts +0 -359
- package/dist/core/BatchExecutor.d.ts.map +0 -1
- package/dist/core/BatchExecutor.js +0 -856
- package/dist/core/BatchExecutor.js.map +0 -1
- package/dist/core/BatchPromptBuilder.d.ts +0 -89
- package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
- package/dist/core/BatchPromptBuilder.js +0 -219
- package/dist/core/BatchPromptBuilder.js.map +0 -1
- package/dist/core/Route.d.ts +0 -180
- package/dist/core/Route.d.ts.map +0 -1
- package/dist/core/Route.js +0 -538
- package/dist/core/Route.js.map +0 -1
- package/dist/core/RoutingEngine.d.ts +0 -185
- package/dist/core/RoutingEngine.d.ts.map +0 -1
- package/dist/core/RoutingEngine.js.map +0 -1
- package/dist/types/route.d.ts +0 -336
- package/dist/types/route.d.ts.map +0 -1
- package/dist/types/route.js +0 -5
- package/dist/types/route.js.map +0 -1
- package/docs/CONTRIBUTING.md +0 -521
- package/docs/api/README.md +0 -3299
- package/docs/api/overview.md +0 -1410
- package/docs/architecture/data-extraction-flow.md +0 -360
- package/docs/architecture/multi-step-execution.md +0 -277
- package/docs/core/agent/README.md +0 -938
- package/docs/core/agent/context-management.md +0 -796
- package/docs/core/agent/rules-and-prohibitions.md +0 -113
- package/docs/core/agent/session-management.md +0 -693
- package/docs/core/ai-integration/prompt-composition.md +0 -355
- package/docs/core/ai-integration/providers.md +0 -515
- package/docs/core/ai-integration/response-processing.md +0 -433
- package/docs/core/conversation-flows/data-collection.md +0 -772
- package/docs/core/conversation-flows/route-dsl.md +0 -509
- package/docs/core/conversation-flows/routes.md +0 -249
- package/docs/core/conversation-flows/step-transitions.md +0 -731
- package/docs/core/conversation-flows/steps.md +0 -268
- package/docs/core/error-handling.md +0 -830
- package/docs/core/persistence/adapters.md +0 -255
- package/docs/core/persistence/session-storage.md +0 -656
- package/docs/core/routing/intelligent-routing.md +0 -470
- package/docs/core/tools/enhanced-tool.md +0 -186
- package/docs/core/tools/streaming-execution.md +0 -161
- package/docs/core/tools/tool-definition.md +0 -970
- package/docs/core/tools/tool-scoping.md +0 -819
- package/docs/guides/advanced-patterns/publishing.md +0 -186
- package/docs/guides/context-compaction.md +0 -96
- package/docs/guides/error-handling-patterns.md +0 -578
- package/docs/guides/getting-started/README.md +0 -795
- package/docs/guides/migration/README.md +0 -101
- package/docs/guides/migration/flexible-routing-conditions.md +0 -375
- package/docs/guides/migration/multi-step-execution.md +0 -393
- package/docs/guides/migration/response-modal-refactor.md +0 -518
- package/docs/guides/prompt-optimization.md +0 -164
- package/examples/advanced-patterns/context-compaction.ts +0 -223
- package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
- package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
- package/examples/advanced-patterns/streaming-responses.ts +0 -656
- package/examples/ai-providers/anthropic-integration.ts +0 -388
- package/examples/ai-providers/openai-integration.ts +0 -228
- package/examples/condition-patterns/function-only-conditions.ts +0 -365
- package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
- package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
- package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
- package/examples/condition-patterns/string-only-conditions.ts +0 -296
- package/examples/conversation-flows/completion-transitions.ts +0 -318
- package/examples/core-concepts/basic-agent.ts +0 -503
- package/examples/core-concepts/modern-streaming-api.ts +0 -309
- package/examples/core-concepts/schema-driven-extraction.ts +0 -332
- package/examples/core-concepts/session-management.ts +0 -494
- package/examples/integrations/database-integration.ts +0 -631
- package/examples/integrations/healthcare-integration.ts +0 -595
- package/examples/integrations/search-integration.ts +0 -530
- package/examples/integrations/server-session-management.ts +0 -307
- package/examples/persistence/custom-adapter.ts +0 -526
- package/examples/persistence/database-persistence.ts +0 -583
- package/examples/persistence/memory-sessions.ts +0 -495
- package/examples/persistence/prisma-schema.example.prisma +0 -74
- package/examples/persistence/redis-persistence.ts +0 -488
- package/examples/tools/basic-tools.ts +0 -765
- package/examples/tools/data-enrichment-tools.ts +0 -593
- package/examples/tools/enhanced-tool-metadata.ts +0 -268
- package/examples/tools/streaming-tool-execution.ts +0 -283
- package/src/core/BatchExecutor.ts +0 -1187
- package/src/core/BatchPromptBuilder.ts +0 -299
- package/src/core/Route.ts +0 -678
- package/src/types/route.ts +0 -392
|
@@ -1,731 +0,0 @@
|
|
|
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
|
-
## Stopping Conditions in Batch Execution
|
|
16
|
-
|
|
17
|
-
When executing multiple steps in a batch, the engine stops for specific reasons indicated by the `stoppedReason` field in the response.
|
|
18
|
-
|
|
19
|
-
### StoppedReason Values
|
|
20
|
-
|
|
21
|
-
| Reason | Description | Behavior |
|
|
22
|
-
|--------|-------------|----------|
|
|
23
|
-
| `needs_input` | Step requires data not yet available | Batch stops, LLM generates response to collect data |
|
|
24
|
-
| `end_route` | Reached END_ROUTE marker | Route is complete, no more steps to execute |
|
|
25
|
-
| `route_complete` | All steps in route processed | Route finished successfully |
|
|
26
|
-
| `max_steps_reached` | Batch hit the `maxStepsPerBatch` limit | Batch stops, remaining steps execute in subsequent calls |
|
|
27
|
-
| `prepare_error` | Error in prepare hook | Batch stops, error returned with last successful state |
|
|
28
|
-
| `llm_error` | Error during LLM call | Batch stops, session state preserved |
|
|
29
|
-
| `validation_error` | Data validation failed | Batch continues, errors included in response |
|
|
30
|
-
| `finalize_error` | Error in finalize hook | Non-fatal, logged and execution continues |
|
|
31
|
-
|
|
32
|
-
### Needs-Input Stopping
|
|
33
|
-
|
|
34
|
-
The most common stopping condition. A step needs input when:
|
|
35
|
-
|
|
36
|
-
```typescript
|
|
37
|
-
// Step needs input if requires fields are missing
|
|
38
|
-
const step1 = {
|
|
39
|
-
prompt: "Confirm your booking",
|
|
40
|
-
requires: ["hotel", "date"], // Both must be present
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
// Step needs input if collecting and no collect fields have data
|
|
44
|
-
const step2 = {
|
|
45
|
-
prompt: "What's your preference?",
|
|
46
|
-
collect: ["preference", "notes"], // Needs input if BOTH are missing
|
|
47
|
-
};
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### End-Route Stopping
|
|
51
|
-
|
|
52
|
-
Batch stops when reaching the END_ROUTE marker:
|
|
53
|
-
|
|
54
|
-
```typescript
|
|
55
|
-
const finalStep = confirmStep.nextStep({
|
|
56
|
-
prompt: "Booking confirmed! Anything else?",
|
|
57
|
-
}).endRoute(); // Creates END_ROUTE transition
|
|
58
|
-
|
|
59
|
-
// Response will have:
|
|
60
|
-
// stoppedReason: "end_route"
|
|
61
|
-
// isRouteComplete: true
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### Route-Complete Stopping
|
|
65
|
-
|
|
66
|
-
When all steps have been processed without hitting END_ROUTE:
|
|
67
|
-
|
|
68
|
-
```typescript
|
|
69
|
-
// If the last step has no transitions and doesn't need input
|
|
70
|
-
const response = await agent.respond("Complete my booking");
|
|
71
|
-
|
|
72
|
-
// Response will have:
|
|
73
|
-
// stoppedReason: "route_complete"
|
|
74
|
-
// isRouteComplete: true
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### Transitions Within Batched Execution
|
|
78
|
-
|
|
79
|
-
During batch execution, transitions work as follows:
|
|
80
|
-
|
|
81
|
-
1. **Linear transitions** - Steps connected via `nextStep()` are evaluated sequentially
|
|
82
|
-
2. **SkipIf evaluation** - Each step's `skipIf` is checked before inclusion
|
|
83
|
-
3. **Needs-input check** - If a step needs input, batch stops there
|
|
84
|
-
4. **END_ROUTE detection** - Batch stops when reaching route end
|
|
85
|
-
|
|
86
|
-
```typescript
|
|
87
|
-
// Example: Steps A → B → C → END_ROUTE
|
|
88
|
-
// If user provides data for A and B but not C:
|
|
89
|
-
|
|
90
|
-
const response = await agent.respond("Data for A and B");
|
|
91
|
-
|
|
92
|
-
// Batch includes: [A, B]
|
|
93
|
-
// Stops at: C (needs_input)
|
|
94
|
-
// Next call will continue from C
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
### Error Stopping Conditions
|
|
98
|
-
|
|
99
|
-
Errors during batch execution have different behaviors:
|
|
100
|
-
|
|
101
|
-
```typescript
|
|
102
|
-
// Prepare hook error - stops immediately
|
|
103
|
-
const stepWithPrepare = {
|
|
104
|
-
prompt: "Processing...",
|
|
105
|
-
prepare: async (context, data) => {
|
|
106
|
-
if (!data.valid) throw new Error("Invalid data");
|
|
107
|
-
},
|
|
108
|
-
};
|
|
109
|
-
// stoppedReason: "prepare_error"
|
|
110
|
-
// Session state: last successful state preserved
|
|
111
|
-
|
|
112
|
-
// LLM error - stops with preserved state
|
|
113
|
-
// stoppedReason: "llm_error"
|
|
114
|
-
// Session state: preserved from before LLM call
|
|
115
|
-
|
|
116
|
-
// Validation error - continues but reports error
|
|
117
|
-
// stoppedReason: "validation_error"
|
|
118
|
-
// Collected data: partial data preserved
|
|
119
|
-
|
|
120
|
-
// Finalize hook error - logged, continues
|
|
121
|
-
// stoppedReason: original reason (not changed)
|
|
122
|
-
// Error: included in response for logging
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### Checking Stop Reason in Response
|
|
126
|
-
|
|
127
|
-
```typescript
|
|
128
|
-
const response = await agent.respond("Book a hotel");
|
|
129
|
-
|
|
130
|
-
switch (response.stoppedReason) {
|
|
131
|
-
case 'needs_input':
|
|
132
|
-
console.log("Waiting for user input");
|
|
133
|
-
break;
|
|
134
|
-
case 'max_steps_reached':
|
|
135
|
-
console.log("Batch limit reached, more steps pending");
|
|
136
|
-
break;
|
|
137
|
-
case 'end_route':
|
|
138
|
-
case 'route_complete':
|
|
139
|
-
console.log("Route finished:", response.isRouteComplete);
|
|
140
|
-
break;
|
|
141
|
-
case 'prepare_error':
|
|
142
|
-
case 'llm_error':
|
|
143
|
-
console.error("Error occurred:", response.error);
|
|
144
|
-
break;
|
|
145
|
-
case 'validation_error':
|
|
146
|
-
console.warn("Validation issues:", response.error);
|
|
147
|
-
break;
|
|
148
|
-
}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
## Conditional Skipping
|
|
152
|
-
|
|
153
|
-
### SkipIf Logic
|
|
154
|
-
|
|
155
|
-
The `skipIf` function determines whether a step should be bypassed:
|
|
156
|
-
|
|
157
|
-
```typescript
|
|
158
|
-
const smartRoute = agent
|
|
159
|
-
.createRoute({
|
|
160
|
-
title: "Smart Onboarding",
|
|
161
|
-
|
|
162
|
-
initialStep: {
|
|
163
|
-
prompt: "What's your name?",
|
|
164
|
-
collect: ["name"],
|
|
165
|
-
skipIf: (data) => data.name !== undefined, // Skip if name already collected by any route
|
|
166
|
-
},
|
|
167
|
-
})
|
|
168
|
-
.nextStep({
|
|
169
|
-
prompt: "What's your email, {{name}}?",
|
|
170
|
-
collect: ["email"],
|
|
171
|
-
requires: ["name"], // Must have name from agent data to proceed
|
|
172
|
-
skipIf: (data) => data.email !== undefined, // Skip if email already collected by any route
|
|
173
|
-
});
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
### Common SkipIf Patterns
|
|
177
|
-
|
|
178
|
-
```typescript
|
|
179
|
-
// Skip based on user preferences
|
|
180
|
-
skipIf: (data) => data.skipNewsletterSignup === true;
|
|
181
|
-
|
|
182
|
-
// Skip if data already exists
|
|
183
|
-
skipIf: (data) => data.userProfile?.completed === true;
|
|
184
|
-
|
|
185
|
-
// Skip based on external conditions
|
|
186
|
-
skipIf: (data) => {
|
|
187
|
-
const now = new Date();
|
|
188
|
-
const lastContact = data.lastContactDate;
|
|
189
|
-
return lastContact && now - lastContact < 24 * 60 * 60 * 1000; // Within 24 hours
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
// Skip based on user type
|
|
193
|
-
skipIf: (data) => data.userType === "premium" && data.onboardingComplete;
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
## Dependency Enforcement
|
|
197
|
-
|
|
198
|
-
### Requires Validation
|
|
199
|
-
|
|
200
|
-
The `requires` array ensures prerequisite data exists:
|
|
201
|
-
|
|
202
|
-
```typescript
|
|
203
|
-
const dependentRoute = agent
|
|
204
|
-
.createRoute({
|
|
205
|
-
title: "Dependent Collection",
|
|
206
|
-
|
|
207
|
-
initialStep: {
|
|
208
|
-
prompt: "What's your name?",
|
|
209
|
-
collect: ["name"],
|
|
210
|
-
},
|
|
211
|
-
})
|
|
212
|
-
.nextStep({
|
|
213
|
-
prompt: "What's your email address?",
|
|
214
|
-
collect: ["email"],
|
|
215
|
-
requires: ["name"], // Cannot proceed without name
|
|
216
|
-
})
|
|
217
|
-
.nextStep({
|
|
218
|
-
prompt: "Should I send updates to {{email}}?",
|
|
219
|
-
collect: ["emailConsent"],
|
|
220
|
-
requires: ["name", "email"], // Needs both name and email
|
|
221
|
-
});
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
### Complex Requirements
|
|
225
|
-
|
|
226
|
-
```typescript
|
|
227
|
-
const complexRequirements = {
|
|
228
|
-
prompt: "Let's schedule your appointment.",
|
|
229
|
-
collect: ["appointmentDate", "appointmentTime"],
|
|
230
|
-
requires: [
|
|
231
|
-
"name", // Basic info
|
|
232
|
-
"email", // Contact info
|
|
233
|
-
"serviceType", // What service they want
|
|
234
|
-
"availability", // When they're available
|
|
235
|
-
],
|
|
236
|
-
skipIf: (data) => {
|
|
237
|
-
// Skip if appointment already scheduled
|
|
238
|
-
return data.appointmentId !== undefined;
|
|
239
|
-
},
|
|
240
|
-
};
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
## Step Traversal Logic
|
|
244
|
-
|
|
245
|
-
### Candidate Step Algorithm
|
|
246
|
-
|
|
247
|
-
The system uses a sophisticated algorithm to find valid next steps:
|
|
248
|
-
|
|
249
|
-
```typescript
|
|
250
|
-
// 1. Start with current step's direct transitions
|
|
251
|
-
const transitions = currentStep.getTransitions();
|
|
252
|
-
|
|
253
|
-
// 2. For each transition, evaluate:
|
|
254
|
-
for (const transition of transitions) {
|
|
255
|
-
// Check for END_ROUTE marker
|
|
256
|
-
if (transition.id === END_ROUTE_ID) {
|
|
257
|
-
return { isRouteComplete: true };
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// Skip steps that should be skipped
|
|
261
|
-
if (transition.shouldSkip(data)) {
|
|
262
|
-
// Recursively traverse to find next valid step
|
|
263
|
-
continue;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// Check if step has required data
|
|
267
|
-
if (!transition.hasRequires(data)) {
|
|
268
|
-
// Step cannot be entered yet
|
|
269
|
-
continue;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// Found valid step
|
|
273
|
-
return { step: transition };
|
|
274
|
-
}
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
### Recursive Traversal
|
|
278
|
-
|
|
279
|
-
For complex flows with skipIf conditions:
|
|
280
|
-
|
|
281
|
-
```typescript
|
|
282
|
-
// Example flow: A -> B -> C -> END
|
|
283
|
-
// If user has already completed B, skip to C
|
|
284
|
-
// If B and C are complete, route is done
|
|
285
|
-
|
|
286
|
-
const flow = agent
|
|
287
|
-
.createRoute({
|
|
288
|
-
title: "Complex Flow",
|
|
289
|
-
|
|
290
|
-
initialStep: {
|
|
291
|
-
/* Step A */
|
|
292
|
-
},
|
|
293
|
-
})
|
|
294
|
-
.nextStep({
|
|
295
|
-
prompt: "Step B content",
|
|
296
|
-
skipIf: (data) => data.stepBComplete,
|
|
297
|
-
})
|
|
298
|
-
.nextStep({
|
|
299
|
-
prompt: "Step C content",
|
|
300
|
-
skipIf: (data) => data.stepCComplete,
|
|
301
|
-
requires: ["stepBComplete"],
|
|
302
|
-
})
|
|
303
|
-
.endRoute();
|
|
304
|
-
```
|
|
305
|
-
|
|
306
|
-
## Branching Logic
|
|
307
|
-
|
|
308
|
-
### Branch Evaluation
|
|
309
|
-
|
|
310
|
-
When multiple branches exist, the system evaluates each:
|
|
311
|
-
|
|
312
|
-
```typescript
|
|
313
|
-
const branchingRoute = agent
|
|
314
|
-
.createRoute({
|
|
315
|
-
title: "Multi-Path Flow",
|
|
316
|
-
|
|
317
|
-
initialStep: {
|
|
318
|
-
prompt: "What type of help do you need?",
|
|
319
|
-
collect: ["helpType"],
|
|
320
|
-
},
|
|
321
|
-
})
|
|
322
|
-
.branch([
|
|
323
|
-
{
|
|
324
|
-
name: "technical",
|
|
325
|
-
step: {
|
|
326
|
-
prompt: "Technical support question?",
|
|
327
|
-
collect: ["techIssue"],
|
|
328
|
-
requires: ["helpType"],
|
|
329
|
-
when: "if helpType indicates technical issue",
|
|
330
|
-
},
|
|
331
|
-
},
|
|
332
|
-
{
|
|
333
|
-
name: "billing",
|
|
334
|
-
step: {
|
|
335
|
-
prompt: "Billing question?",
|
|
336
|
-
collect: ["billingIssue"],
|
|
337
|
-
requires: ["helpType"],
|
|
338
|
-
when: "if helpType indicates billing issue",
|
|
339
|
-
},
|
|
340
|
-
},
|
|
341
|
-
{
|
|
342
|
-
name: "general",
|
|
343
|
-
step: {
|
|
344
|
-
prompt: "General question?",
|
|
345
|
-
collect: ["generalQuestion"],
|
|
346
|
-
requires: ["helpType"],
|
|
347
|
-
// No 'when' condition - fallback branch
|
|
348
|
-
},
|
|
349
|
-
},
|
|
350
|
-
]);
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
### Branch Resolution
|
|
354
|
-
|
|
355
|
-
```typescript
|
|
356
|
-
// The routing engine evaluates branches and selects the best path
|
|
357
|
-
// 1. Check explicit 'when' conditions (AI-evaluated)
|
|
358
|
-
// 2. Fall back to branches without conditions
|
|
359
|
-
// 3. Allow multiple branches if no clear winner
|
|
360
|
-
|
|
361
|
-
// Access specific branches for chaining
|
|
362
|
-
const techBranch = branchingRoute.branches.technical.nextStep({
|
|
363
|
-
prompt: "Let me help with that technical issue...",
|
|
364
|
-
requires: ["techIssue"],
|
|
365
|
-
});
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
## Route Completion
|
|
369
|
-
|
|
370
|
-
### End Route Detection
|
|
371
|
-
|
|
372
|
-
Routes complete when reaching END_ROUTE:
|
|
373
|
-
|
|
374
|
-
```typescript
|
|
375
|
-
const completeRoute = agent
|
|
376
|
-
.createRoute({
|
|
377
|
-
title: "Task Completion",
|
|
378
|
-
|
|
379
|
-
initialStep: { prompt: "What task?", collect: ["task"] },
|
|
380
|
-
})
|
|
381
|
-
.nextStep({
|
|
382
|
-
prompt: "I'll help with {{task}}",
|
|
383
|
-
requires: ["task"],
|
|
384
|
-
})
|
|
385
|
-
.nextStep({
|
|
386
|
-
prompt: "Task details?",
|
|
387
|
-
collect: ["details"],
|
|
388
|
-
requires: ["task"],
|
|
389
|
-
})
|
|
390
|
-
.endRoute({
|
|
391
|
-
prompt: "Task completed! Anything else?",
|
|
392
|
-
collect: ["satisfaction"], // Optional final collection
|
|
393
|
-
});
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
### Completion Handlers
|
|
397
|
-
|
|
398
|
-
```typescript
|
|
399
|
-
const routeWithCompletion = agent.createRoute({
|
|
400
|
-
title: "Workflow",
|
|
401
|
-
|
|
402
|
-
// Simple string transition
|
|
403
|
-
onComplete: "feedback-route",
|
|
404
|
-
|
|
405
|
-
// Or conditional transition
|
|
406
|
-
// onComplete: {
|
|
407
|
-
// nextStep: "success-route",
|
|
408
|
-
// condition: "if workflow succeeded"
|
|
409
|
-
// }
|
|
410
|
-
|
|
411
|
-
// Or dynamic transition
|
|
412
|
-
// onComplete: async (session, context) => {
|
|
413
|
-
// if (session.data?.success) return "success-route";
|
|
414
|
-
// return "retry-route";
|
|
415
|
-
// }
|
|
416
|
-
});
|
|
417
|
-
```
|
|
418
|
-
|
|
419
|
-
## Advanced Transition Patterns
|
|
420
|
-
|
|
421
|
-
### Circular Flows
|
|
422
|
-
|
|
423
|
-
Handle repeating patterns with proper termination:
|
|
424
|
-
|
|
425
|
-
```typescript
|
|
426
|
-
const iterativeRoute = agent
|
|
427
|
-
.createRoute({
|
|
428
|
-
title: "Iterative Collection",
|
|
429
|
-
|
|
430
|
-
initialStep: {
|
|
431
|
-
prompt: "Add an item (or 'done' to finish)",
|
|
432
|
-
collect: ["currentItem"],
|
|
433
|
-
},
|
|
434
|
-
})
|
|
435
|
-
.nextStep({
|
|
436
|
-
prompt: "Item added: {{currentItem}}. Add another?",
|
|
437
|
-
collect: ["continue"],
|
|
438
|
-
requires: ["currentItem"],
|
|
439
|
-
skipIf: (data) => data.continue === false || data.currentItem === "done",
|
|
440
|
-
})
|
|
441
|
-
.nextStep({
|
|
442
|
-
prompt: "Add another item?",
|
|
443
|
-
collect: ["currentItem"],
|
|
444
|
-
requires: ["continue"],
|
|
445
|
-
// Loops back to previous step
|
|
446
|
-
});
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
### State-Based Transitions
|
|
450
|
-
|
|
451
|
-
```typescript
|
|
452
|
-
const statefulRoute = agent
|
|
453
|
-
.createRoute({
|
|
454
|
-
title: "State Machine",
|
|
455
|
-
|
|
456
|
-
initialStep: {
|
|
457
|
-
prompt: "What's your current status?",
|
|
458
|
-
collect: ["status"],
|
|
459
|
-
},
|
|
460
|
-
})
|
|
461
|
-
.branch([
|
|
462
|
-
{
|
|
463
|
-
name: "new",
|
|
464
|
-
step: {
|
|
465
|
-
prompt: "Welcome! Let's get you started.",
|
|
466
|
-
collect: ["onboardingData"],
|
|
467
|
-
when: "if status is 'new'",
|
|
468
|
-
skipIf: (data) => data.status !== "new",
|
|
469
|
-
},
|
|
470
|
-
},
|
|
471
|
-
{
|
|
472
|
-
name: "returning",
|
|
473
|
-
step: {
|
|
474
|
-
prompt: "Welcome back! What can I help with?",
|
|
475
|
-
collect: ["request"],
|
|
476
|
-
when: "if status is 'returning'",
|
|
477
|
-
skipIf: (data) => data.status !== "returning",
|
|
478
|
-
},
|
|
479
|
-
},
|
|
480
|
-
]);
|
|
481
|
-
```
|
|
482
|
-
|
|
483
|
-
## Lifecycle Integration
|
|
484
|
-
|
|
485
|
-
### Prepare and Finalize Hooks
|
|
486
|
-
|
|
487
|
-
```typescript
|
|
488
|
-
const hookedRoute = agent
|
|
489
|
-
.createRoute({
|
|
490
|
-
title: "Lifecycle Demo",
|
|
491
|
-
|
|
492
|
-
initialStep: {
|
|
493
|
-
prompt: "Starting process...",
|
|
494
|
-
prepare: async (context, data) => {
|
|
495
|
-
// Setup before AI responds
|
|
496
|
-
console.log("Preparing step with context:", context);
|
|
497
|
-
console.log("Current data:", data);
|
|
498
|
-
},
|
|
499
|
-
finalize: async (context, data) => {
|
|
500
|
-
// Cleanup after AI responds
|
|
501
|
-
console.log("Step completed with data:", data);
|
|
502
|
-
await saveProgress(data);
|
|
503
|
-
},
|
|
504
|
-
},
|
|
505
|
-
})
|
|
506
|
-
.nextStep({
|
|
507
|
-
prompt: "Process step...",
|
|
508
|
-
prepare: (context, data) => {
|
|
509
|
-
// Validate state before proceeding
|
|
510
|
-
if (!data.requiredField) {
|
|
511
|
-
throw new Error("Missing required field");
|
|
512
|
-
}
|
|
513
|
-
},
|
|
514
|
-
});
|
|
515
|
-
```
|
|
516
|
-
|
|
517
|
-
### Route-Level Hooks
|
|
518
|
-
|
|
519
|
-
```typescript
|
|
520
|
-
const routeWithHooks = agent.createRoute({
|
|
521
|
-
title: "Route Lifecycle",
|
|
522
|
-
|
|
523
|
-
hooks: {
|
|
524
|
-
onDataUpdate: (newData, previousData) => {
|
|
525
|
-
// Validate data changes across the route
|
|
526
|
-
if (newData.criticalField && !isValid(newData.criticalField)) {
|
|
527
|
-
throw new Error("Invalid critical field");
|
|
528
|
-
}
|
|
529
|
-
return newData;
|
|
530
|
-
},
|
|
531
|
-
|
|
532
|
-
onContextUpdate: (newContext, previousContext) => {
|
|
533
|
-
// React to context changes
|
|
534
|
-
console.log("Route context updated");
|
|
535
|
-
},
|
|
536
|
-
},
|
|
537
|
-
});
|
|
538
|
-
```
|
|
539
|
-
|
|
540
|
-
## Error Handling & Recovery
|
|
541
|
-
|
|
542
|
-
### Transition Validation
|
|
543
|
-
|
|
544
|
-
```typescript
|
|
545
|
-
const robustRoute = agent
|
|
546
|
-
.createRoute({
|
|
547
|
-
title: "Error Handling",
|
|
548
|
-
|
|
549
|
-
initialStep: {
|
|
550
|
-
prompt: "What would you like to do?",
|
|
551
|
-
collect: ["action"],
|
|
552
|
-
finalize: async (context, data) => {
|
|
553
|
-
try {
|
|
554
|
-
await validateAction(data.action);
|
|
555
|
-
} catch (error) {
|
|
556
|
-
// Set error state for recovery
|
|
557
|
-
data.actionError = error.message;
|
|
558
|
-
data.needsRecovery = true;
|
|
559
|
-
}
|
|
560
|
-
},
|
|
561
|
-
},
|
|
562
|
-
})
|
|
563
|
-
.nextStep({
|
|
564
|
-
prompt:
|
|
565
|
-
"There was an issue with your request: {{actionError}}. Please try again.",
|
|
566
|
-
collect: ["action"],
|
|
567
|
-
skipIf: (data) => !data.needsRecovery,
|
|
568
|
-
finalize: (context, data) => {
|
|
569
|
-
// Clear error state on successful retry
|
|
570
|
-
delete data.actionError;
|
|
571
|
-
delete data.needsRecovery;
|
|
572
|
-
},
|
|
573
|
-
});
|
|
574
|
-
```
|
|
575
|
-
|
|
576
|
-
### Recovery Patterns
|
|
577
|
-
|
|
578
|
-
```typescript
|
|
579
|
-
const recoveryRoute = agent
|
|
580
|
-
.createRoute({
|
|
581
|
-
title: "Recovery Flow",
|
|
582
|
-
|
|
583
|
-
// Normal flow
|
|
584
|
-
initialStep: {
|
|
585
|
-
/* normal steps */
|
|
586
|
-
},
|
|
587
|
-
|
|
588
|
-
// Recovery branch
|
|
589
|
-
})
|
|
590
|
-
.branch([
|
|
591
|
-
{
|
|
592
|
-
name: "normal",
|
|
593
|
-
step: {
|
|
594
|
-
/* normal processing */
|
|
595
|
-
},
|
|
596
|
-
},
|
|
597
|
-
{
|
|
598
|
-
name: "recovery",
|
|
599
|
-
step: {
|
|
600
|
-
prompt: "I encountered an error. Let's start over.",
|
|
601
|
-
collect: ["resetConfirmation"],
|
|
602
|
-
when: "if error state is detected",
|
|
603
|
-
finalize: (context, data) => {
|
|
604
|
-
// Reset problematic data
|
|
605
|
-
resetSessionData(data);
|
|
606
|
-
},
|
|
607
|
-
},
|
|
608
|
-
},
|
|
609
|
-
]);
|
|
610
|
-
```
|
|
611
|
-
|
|
612
|
-
## Performance Considerations
|
|
613
|
-
|
|
614
|
-
### Efficient Traversal
|
|
615
|
-
|
|
616
|
-
```typescript
|
|
617
|
-
// The system optimizes by:
|
|
618
|
-
// 1. Using visited sets to prevent infinite loops
|
|
619
|
-
// 2. Early termination on END_ROUTE detection
|
|
620
|
-
// 3. Lazy evaluation of skipIf conditions
|
|
621
|
-
// 4. Caching of validation results
|
|
622
|
-
|
|
623
|
-
// Example of efficient validation
|
|
624
|
-
skipIf: (data) => {
|
|
625
|
-
// Cache expensive operations
|
|
626
|
-
if (data._skipCache === undefined) {
|
|
627
|
-
data._skipCache = expensiveCheck(data);
|
|
628
|
-
}
|
|
629
|
-
return data._skipCache;
|
|
630
|
-
};
|
|
631
|
-
```
|
|
632
|
-
|
|
633
|
-
### Memory Management
|
|
634
|
-
|
|
635
|
-
```typescript
|
|
636
|
-
// Clean up temporary data
|
|
637
|
-
finalize: (context, data) => {
|
|
638
|
-
// Remove temporary fields
|
|
639
|
-
delete data._tempField;
|
|
640
|
-
delete data._skipCache;
|
|
641
|
-
|
|
642
|
-
// Compress large data structures if needed
|
|
643
|
-
if (data.largeArray?.length > 100) {
|
|
644
|
-
data.largeArray = data.largeArray.slice(-50); // Keep recent items
|
|
645
|
-
}
|
|
646
|
-
};
|
|
647
|
-
```
|
|
648
|
-
|
|
649
|
-
## Debugging Transitions
|
|
650
|
-
|
|
651
|
-
### Step Inspection
|
|
652
|
-
|
|
653
|
-
```typescript
|
|
654
|
-
// Inspect route structure
|
|
655
|
-
console.log(route.describe());
|
|
656
|
-
|
|
657
|
-
// Check step validity
|
|
658
|
-
const step = route.getStep("step-id");
|
|
659
|
-
console.log("Should skip:", step.shouldSkip(session.data));
|
|
660
|
-
console.log("Has requirements:", step.hasRequires(session.data));
|
|
661
|
-
|
|
662
|
-
// Get all transitions
|
|
663
|
-
const transitions = step.getTransitions();
|
|
664
|
-
console.log(
|
|
665
|
-
"Available transitions:",
|
|
666
|
-
transitions.map((s) => s.id)
|
|
667
|
-
);
|
|
668
|
-
```
|
|
669
|
-
|
|
670
|
-
### Transition Tracing
|
|
671
|
-
|
|
672
|
-
```typescript
|
|
673
|
-
// Enable debug logging
|
|
674
|
-
const agent = new Agent({
|
|
675
|
-
name: "Debug Agent",
|
|
676
|
-
debug: true, // Enables transition logging
|
|
677
|
-
provider: provider,
|
|
678
|
-
});
|
|
679
|
-
|
|
680
|
-
// Logs will show:
|
|
681
|
-
// [RoutingEngine] Found valid step after skipping: step-3
|
|
682
|
-
// [RoutingEngine] Route complete: all data collected, END_ROUTE reached
|
|
683
|
-
// [Agent] Entered step: step-3
|
|
684
|
-
```
|
|
685
|
-
|
|
686
|
-
### Testing Transitions
|
|
687
|
-
|
|
688
|
-
```typescript
|
|
689
|
-
// Test step conditions
|
|
690
|
-
const testData = { name: "John", email: "john@test.com" };
|
|
691
|
-
|
|
692
|
-
const shouldSkip = step.shouldSkip(testData);
|
|
693
|
-
const hasRequirements = step.hasRequires(testData);
|
|
694
|
-
|
|
695
|
-
console.log(`Step ${step.id}:`);
|
|
696
|
-
console.log(`- Should skip: ${shouldSkip}`);
|
|
697
|
-
console.log(`- Has requirements: ${hasRequirements}`);
|
|
698
|
-
console.log(`- Can proceed: ${!shouldSkip && hasRequirements}`);
|
|
699
|
-
```
|
|
700
|
-
|
|
701
|
-
## Best Practices
|
|
702
|
-
|
|
703
|
-
### Transition Design
|
|
704
|
-
|
|
705
|
-
1. **Clear Dependencies**: Make `requires` relationships obvious
|
|
706
|
-
2. **Smart Skipping**: Use `skipIf` to avoid redundant interactions
|
|
707
|
-
3. **Fail Fast**: Validate early to prevent invalid states
|
|
708
|
-
4. **Recovery Paths**: Plan for error conditions and recovery flows
|
|
709
|
-
|
|
710
|
-
### Performance
|
|
711
|
-
|
|
712
|
-
1. **Efficient Conditions**: Cache expensive `skipIf` evaluations
|
|
713
|
-
2. **Minimal Dependencies**: Avoid overly complex requirement chains
|
|
714
|
-
3. **Early Termination**: Use END_ROUTE appropriately
|
|
715
|
-
4. **Memory Cleanup**: Remove temporary data in finalize hooks
|
|
716
|
-
|
|
717
|
-
### Maintainability
|
|
718
|
-
|
|
719
|
-
1. **Descriptive IDs**: Use meaningful step and route identifiers
|
|
720
|
-
2. **Documentation**: Comment complex transition logic
|
|
721
|
-
3. **Testing**: Cover edge cases in transition logic
|
|
722
|
-
4. **Monitoring**: Track transition success rates
|
|
723
|
-
|
|
724
|
-
### User Experience
|
|
725
|
-
|
|
726
|
-
1. **Natural Flow**: Make transitions feel conversational
|
|
727
|
-
2. **Context Preservation**: Maintain conversation context across steps
|
|
728
|
-
3. **Error Recovery**: Handle failures gracefully with clear recovery paths
|
|
729
|
-
4. **Progress Indication**: Show users where they are in multi-step processes
|
|
730
|
-
|
|
731
|
-
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.
|