@falai/agent 2.6.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/adapters/MemoryAdapter.d.ts +1 -1
- package/dist/adapters/MemoryAdapter.d.ts.map +1 -1
- package/dist/adapters/MemoryAdapter.js +32 -36
- package/dist/adapters/MemoryAdapter.js.map +1 -1
- package/dist/adapters/MongoAdapter.d.ts +1 -1
- package/dist/adapters/MongoAdapter.d.ts.map +1 -1
- package/dist/adapters/MongoAdapter.js +2 -2
- package/dist/adapters/MongoAdapter.js.map +1 -1
- package/dist/adapters/OpenSearchAdapter.d.ts +1 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenSearchAdapter.js +3 -3
- package/dist/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts +1 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.js +18 -13
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/adapters/PrismaAdapter.d.ts +1 -1
- package/dist/adapters/PrismaAdapter.d.ts.map +1 -1
- package/dist/adapters/PrismaAdapter.js +3 -3
- package/dist/adapters/PrismaAdapter.js.map +1 -1
- package/dist/adapters/RedisAdapter.d.ts +2 -1
- package/dist/adapters/RedisAdapter.d.ts.map +1 -1
- package/dist/adapters/RedisAdapter.js +77 -27
- package/dist/adapters/RedisAdapter.js.map +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/adapters/SQLiteAdapter.js +9 -31
- package/dist/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/adapters/index.d.ts +13 -13
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/sessionRow.d.ts +22 -0
- package/dist/adapters/sessionRow.d.ts.map +1 -0
- package/dist/adapters/sessionRow.js +48 -0
- package/dist/adapters/sessionRow.js.map +1 -0
- package/dist/cjs/adapters/MemoryAdapter.d.ts +1 -1
- package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.js +39 -43
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.d.ts +1 -1
- package/dist/cjs/adapters/MongoAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.js +4 -4
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js +6 -6
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js +20 -15
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.d.ts +1 -1
- package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.js +7 -7
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts +2 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.js +81 -31
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.js +11 -33
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/adapters/index.d.ts +13 -13
- package/dist/cjs/adapters/index.d.ts.map +1 -1
- package/dist/cjs/adapters/index.js +14 -14
- package/dist/cjs/adapters/index.js.map +1 -1
- package/dist/cjs/adapters/sessionRow.d.ts +22 -0
- package/dist/cjs/adapters/sessionRow.d.ts.map +1 -0
- package/dist/cjs/adapters/sessionRow.js +52 -0
- package/dist/cjs/adapters/sessionRow.js.map +1 -0
- package/dist/cjs/core/Agent.d.ts +19 -11
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +102 -64
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.d.ts +12 -22
- package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.js +46 -49
- package/dist/cjs/core/AutoChainExecutor.js.map +1 -1
- package/dist/cjs/core/BranchEvaluator.d.ts +4 -4
- package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -1
- package/dist/cjs/core/BranchEvaluator.js +6 -6
- package/dist/cjs/core/BranchEvaluator.js.map +1 -1
- package/dist/cjs/core/CompactionEngine.d.ts +16 -3
- package/dist/cjs/core/CompactionEngine.d.ts.map +1 -1
- package/dist/cjs/core/CompactionEngine.js +30 -6
- package/dist/cjs/core/CompactionEngine.js.map +1 -1
- package/dist/cjs/core/DirectiveChainTracker.d.ts +1 -1
- package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -1
- package/dist/cjs/core/DirectiveChainTracker.js +5 -5
- package/dist/cjs/core/DirectiveChainTracker.js.map +1 -1
- package/dist/cjs/core/Events.d.ts +1 -1
- package/dist/cjs/core/Events.d.ts.map +1 -1
- package/dist/cjs/core/Events.js +15 -15
- package/dist/cjs/core/Events.js.map +1 -1
- package/dist/cjs/core/Flow.d.ts +4 -4
- package/dist/cjs/core/Flow.d.ts.map +1 -1
- package/dist/cjs/core/Flow.js +15 -15
- package/dist/cjs/core/Flow.js.map +1 -1
- package/dist/cjs/core/FlowRouter.d.ts +4 -4
- package/dist/cjs/core/FlowRouter.d.ts.map +1 -1
- package/dist/cjs/core/FlowRouter.js +92 -70
- package/dist/cjs/core/FlowRouter.js.map +1 -1
- package/dist/cjs/core/PersistenceManager.d.ts +1 -1
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
- package/dist/cjs/core/PersistenceManager.js +10 -10
- package/dist/cjs/core/PersistenceManager.js.map +1 -1
- package/dist/cjs/core/PromptComposer.d.ts +4 -4
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
- package/dist/cjs/core/PromptComposer.js +13 -13
- package/dist/cjs/core/PromptComposer.js.map +1 -1
- package/dist/cjs/core/PromptSectionCache.d.ts +2 -2
- package/dist/cjs/core/PromptSectionCache.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.d.ts +4 -4
- package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +7 -7
- package/dist/cjs/core/ResponseEngine.js.map +1 -1
- package/dist/cjs/core/ResponseGenerationError.d.ts.map +1 -1
- package/dist/cjs/core/ResponseGenerationError.js +3 -5
- package/dist/cjs/core/ResponseGenerationError.js.map +1 -1
- package/dist/cjs/core/ResponseModal.d.ts +39 -10
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
- package/dist/cjs/core/ResponseModal.js +195 -72
- package/dist/cjs/core/ResponseModal.js.map +1 -1
- package/dist/cjs/core/ResponsePipeline.d.ts +50 -12
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/cjs/core/ResponsePipeline.js +301 -158
- package/dist/cjs/core/ResponsePipeline.js.map +1 -1
- package/dist/cjs/core/SessionFinalizer.d.ts +4 -4
- package/dist/cjs/core/SessionFinalizer.d.ts.map +1 -1
- package/dist/cjs/core/SessionFinalizer.js +36 -9
- package/dist/cjs/core/SessionFinalizer.js.map +1 -1
- package/dist/cjs/core/SessionManager.d.ts +15 -6
- package/dist/cjs/core/SessionManager.d.ts.map +1 -1
- package/dist/cjs/core/SessionManager.js +49 -22
- package/dist/cjs/core/SessionManager.js.map +1 -1
- package/dist/cjs/core/SignalCoordinator.d.ts +5 -5
- package/dist/cjs/core/SignalCoordinator.d.ts.map +1 -1
- package/dist/cjs/core/SignalCoordinator.js +12 -12
- package/dist/cjs/core/SignalCoordinator.js.map +1 -1
- package/dist/cjs/core/SignalEvaluator.d.ts +4 -4
- package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -1
- package/dist/cjs/core/SignalEvaluator.js +6 -6
- package/dist/cjs/core/SignalEvaluator.js.map +1 -1
- package/dist/cjs/core/SignalProcessor.d.ts +6 -6
- package/dist/cjs/core/SignalProcessor.d.ts.map +1 -1
- package/dist/cjs/core/SignalProcessor.js +17 -89
- package/dist/cjs/core/SignalProcessor.js.map +1 -1
- package/dist/cjs/core/Step.d.ts +5 -5
- package/dist/cjs/core/Step.d.ts.map +1 -1
- package/dist/cjs/core/Step.js +65 -17
- package/dist/cjs/core/Step.js.map +1 -1
- package/dist/cjs/core/StepLifecycle.d.ts +18 -8
- package/dist/cjs/core/StepLifecycle.d.ts.map +1 -1
- package/dist/cjs/core/StepLifecycle.js +103 -20
- package/dist/cjs/core/StepLifecycle.js.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.d.ts +1 -1
- package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.js +30 -6
- package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
- package/dist/cjs/core/ToolLoopExecutor.d.ts +8 -4
- package/dist/cjs/core/ToolLoopExecutor.d.ts.map +1 -1
- package/dist/cjs/core/ToolLoopExecutor.js +189 -97
- package/dist/cjs/core/ToolLoopExecutor.js.map +1 -1
- package/dist/cjs/core/ToolManager.d.ts +6 -6
- package/dist/cjs/core/ToolManager.d.ts.map +1 -1
- package/dist/cjs/core/ToolManager.js +102 -79
- package/dist/cjs/core/ToolManager.js.map +1 -1
- package/dist/cjs/core/createAgent.d.ts +2 -2
- package/dist/cjs/core/createAgent.d.ts.map +1 -1
- package/dist/cjs/core/createAgent.js +2 -2
- package/dist/cjs/core/createAgent.js.map +1 -1
- package/dist/cjs/core/flow-namespace.d.ts +16 -1
- package/dist/cjs/core/flow-namespace.d.ts.map +1 -1
- package/dist/cjs/core/flow-namespace.js +26 -4
- package/dist/cjs/core/flow-namespace.js.map +1 -1
- package/dist/cjs/core/toolGates.d.ts +1 -1
- package/dist/cjs/core/toolGates.d.ts.map +1 -1
- package/dist/cjs/core/toolGates.js +3 -3
- package/dist/cjs/core/toolGates.js.map +1 -1
- package/dist/cjs/index.d.ts +50 -45
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +96 -88
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts +25 -35
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.js +30 -426
- package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
- package/dist/cjs/providers/DeepSeekProvider.d.ts +13 -34
- package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
- package/dist/cjs/providers/DeepSeekProvider.js +17 -51
- package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts +22 -75
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +32 -558
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/GenericOpenAICompatibleProvider.d.ts +9 -10
- package/dist/cjs/providers/GenericOpenAICompatibleProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GenericOpenAICompatibleProvider.js +14 -20
- package/dist/cjs/providers/GenericOpenAICompatibleProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +26 -135
- package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAICompatibleProvider.js +40 -496
- package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts +14 -20
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.js +21 -28
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.d.ts +20 -24
- package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.js +22 -38
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
- package/dist/cjs/providers/ProviderAdapter.d.ts +94 -0
- package/dist/cjs/providers/ProviderAdapter.d.ts.map +1 -0
- package/dist/cjs/providers/ProviderAdapter.js +257 -0
- package/dist/cjs/providers/ProviderAdapter.js.map +1 -0
- package/dist/cjs/providers/index.d.ts +21 -18
- package/dist/cjs/providers/index.d.ts.map +1 -1
- package/dist/cjs/providers/index.js +23 -21
- package/dist/cjs/providers/index.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +37 -11
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/ai.d.ts +11 -21
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/compaction.d.ts +2 -2
- package/dist/cjs/types/compaction.d.ts.map +1 -1
- package/dist/cjs/types/errors.d.ts +16 -20
- package/dist/cjs/types/errors.d.ts.map +1 -1
- package/dist/cjs/types/errors.js +17 -18
- package/dist/cjs/types/errors.js.map +1 -1
- package/dist/cjs/types/flow.d.ts +56 -39
- package/dist/cjs/types/flow.d.ts.map +1 -1
- package/dist/cjs/types/history.d.ts +1 -1
- package/dist/cjs/types/history.d.ts.map +1 -1
- package/dist/cjs/types/index.d.ts +17 -17
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js +14 -14
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/persistence.d.ts +2 -2
- package/dist/cjs/types/persistence.d.ts.map +1 -1
- package/dist/cjs/types/session.d.ts +4 -4
- package/dist/cjs/types/session.d.ts.map +1 -1
- package/dist/cjs/types/signals.d.ts +3 -3
- package/dist/cjs/types/signals.d.ts.map +1 -1
- package/dist/cjs/types/template.d.ts +2 -2
- package/dist/cjs/types/template.d.ts.map +1 -1
- package/dist/cjs/types/tool.d.ts +4 -2
- package/dist/cjs/types/tool.d.ts.map +1 -1
- package/dist/cjs/types/tool.js.map +1 -1
- package/dist/cjs/utils/condition.d.ts +1 -1
- package/dist/cjs/utils/condition.d.ts.map +1 -1
- package/dist/cjs/utils/condition.js +6 -6
- package/dist/cjs/utils/condition.js.map +1 -1
- package/dist/cjs/utils/event.d.ts +1 -1
- package/dist/cjs/utils/event.d.ts.map +1 -1
- package/dist/cjs/utils/event.js +2 -2
- package/dist/cjs/utils/event.js.map +1 -1
- package/dist/cjs/utils/history.d.ts +2 -2
- package/dist/cjs/utils/history.d.ts.map +1 -1
- package/dist/cjs/utils/history.js +15 -15
- package/dist/cjs/utils/history.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +11 -13
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +57 -58
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/serialize.d.ts +17 -0
- package/dist/cjs/utils/serialize.d.ts.map +1 -1
- package/dist/cjs/utils/serialize.js +33 -0
- package/dist/cjs/utils/serialize.js.map +1 -1
- package/dist/cjs/utils/session.d.ts +23 -3
- package/dist/cjs/utils/session.d.ts.map +1 -1
- package/dist/cjs/utils/session.js +40 -8
- package/dist/cjs/utils/session.js.map +1 -1
- package/dist/cjs/utils/template.d.ts +3 -3
- package/dist/cjs/utils/template.d.ts.map +1 -1
- package/dist/cjs/utils/template.js +5 -5
- package/dist/cjs/utils/template.js.map +1 -1
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.js +1 -1
- package/dist/core/Agent.d.ts +19 -11
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +53 -15
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/AutoChainExecutor.d.ts +12 -22
- package/dist/core/AutoChainExecutor.d.ts.map +1 -1
- package/dist/core/AutoChainExecutor.js +27 -30
- package/dist/core/AutoChainExecutor.js.map +1 -1
- package/dist/core/BranchEvaluator.d.ts +4 -4
- package/dist/core/BranchEvaluator.d.ts.map +1 -1
- package/dist/core/BranchEvaluator.js +2 -2
- package/dist/core/BranchEvaluator.js.map +1 -1
- package/dist/core/CompactionEngine.d.ts +16 -3
- package/dist/core/CompactionEngine.d.ts.map +1 -1
- package/dist/core/CompactionEngine.js +30 -6
- package/dist/core/CompactionEngine.js.map +1 -1
- package/dist/core/DirectiveChainTracker.d.ts +1 -1
- package/dist/core/DirectiveChainTracker.d.ts.map +1 -1
- package/dist/core/DirectiveChainTracker.js +2 -2
- package/dist/core/DirectiveChainTracker.js.map +1 -1
- package/dist/core/Events.d.ts +1 -1
- package/dist/core/Events.d.ts.map +1 -1
- package/dist/core/Events.js +1 -1
- package/dist/core/Events.js.map +1 -1
- package/dist/core/Flow.d.ts +4 -4
- package/dist/core/Flow.d.ts.map +1 -1
- package/dist/core/Flow.js +3 -3
- package/dist/core/Flow.js.map +1 -1
- package/dist/core/FlowRouter.d.ts +4 -4
- package/dist/core/FlowRouter.d.ts.map +1 -1
- package/dist/core/FlowRouter.js +36 -14
- package/dist/core/FlowRouter.js.map +1 -1
- package/dist/core/PersistenceManager.d.ts +1 -1
- package/dist/core/PersistenceManager.d.ts.map +1 -1
- package/dist/core/PersistenceManager.js +3 -3
- package/dist/core/PersistenceManager.js.map +1 -1
- package/dist/core/PromptComposer.d.ts +4 -4
- package/dist/core/PromptComposer.d.ts.map +1 -1
- package/dist/core/PromptComposer.js +3 -3
- package/dist/core/PromptComposer.js.map +1 -1
- package/dist/core/PromptSectionCache.d.ts +2 -2
- package/dist/core/PromptSectionCache.d.ts.map +1 -1
- package/dist/core/ResponseEngine.d.ts +4 -4
- package/dist/core/ResponseEngine.d.ts.map +1 -1
- package/dist/core/ResponseEngine.js +2 -2
- package/dist/core/ResponseEngine.js.map +1 -1
- package/dist/core/ResponseGenerationError.d.ts.map +1 -1
- package/dist/core/ResponseGenerationError.js +3 -5
- package/dist/core/ResponseGenerationError.js.map +1 -1
- package/dist/core/ResponseModal.d.ts +39 -10
- package/dist/core/ResponseModal.d.ts.map +1 -1
- package/dist/core/ResponseModal.js +152 -29
- package/dist/core/ResponseModal.js.map +1 -1
- package/dist/core/ResponsePipeline.d.ts +50 -12
- package/dist/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/core/ResponsePipeline.js +232 -89
- package/dist/core/ResponsePipeline.js.map +1 -1
- package/dist/core/SessionFinalizer.d.ts +4 -4
- package/dist/core/SessionFinalizer.d.ts.map +1 -1
- package/dist/core/SessionFinalizer.js +32 -5
- package/dist/core/SessionFinalizer.js.map +1 -1
- package/dist/core/SessionManager.d.ts +15 -6
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +46 -19
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/SignalCoordinator.d.ts +5 -5
- package/dist/core/SignalCoordinator.d.ts.map +1 -1
- package/dist/core/SignalCoordinator.js +2 -2
- package/dist/core/SignalCoordinator.js.map +1 -1
- package/dist/core/SignalEvaluator.d.ts +4 -4
- package/dist/core/SignalEvaluator.d.ts.map +1 -1
- package/dist/core/SignalEvaluator.js +2 -2
- package/dist/core/SignalEvaluator.js.map +1 -1
- package/dist/core/SignalProcessor.d.ts +6 -6
- package/dist/core/SignalProcessor.d.ts.map +1 -1
- package/dist/core/SignalProcessor.js +7 -79
- package/dist/core/SignalProcessor.js.map +1 -1
- package/dist/core/Step.d.ts +5 -5
- package/dist/core/Step.d.ts.map +1 -1
- package/dist/core/Step.js +53 -5
- package/dist/core/Step.js.map +1 -1
- package/dist/core/StepLifecycle.d.ts +18 -8
- package/dist/core/StepLifecycle.d.ts.map +1 -1
- package/dist/core/StepLifecycle.js +98 -15
- package/dist/core/StepLifecycle.js.map +1 -1
- package/dist/core/StreamingToolExecutor.d.ts +1 -1
- package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/core/StreamingToolExecutor.js +29 -5
- package/dist/core/StreamingToolExecutor.js.map +1 -1
- package/dist/core/ToolLoopExecutor.d.ts +8 -4
- package/dist/core/ToolLoopExecutor.d.ts.map +1 -1
- package/dist/core/ToolLoopExecutor.js +157 -65
- package/dist/core/ToolLoopExecutor.js.map +1 -1
- package/dist/core/ToolManager.d.ts +6 -6
- package/dist/core/ToolManager.d.ts.map +1 -1
- package/dist/core/ToolManager.js +44 -21
- package/dist/core/ToolManager.js.map +1 -1
- package/dist/core/createAgent.d.ts +2 -2
- package/dist/core/createAgent.d.ts.map +1 -1
- package/dist/core/createAgent.js +1 -1
- package/dist/core/createAgent.js.map +1 -1
- package/dist/core/flow-namespace.d.ts +16 -1
- package/dist/core/flow-namespace.d.ts.map +1 -1
- package/dist/core/flow-namespace.js +23 -1
- package/dist/core/flow-namespace.js.map +1 -1
- package/dist/core/toolGates.d.ts +1 -1
- package/dist/core/toolGates.d.ts.map +1 -1
- package/dist/core/toolGates.js +1 -1
- package/dist/core/toolGates.js.map +1 -1
- package/dist/index.d.ts +50 -45
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -30
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts +25 -35
- package/dist/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/providers/AnthropicProvider.js +30 -423
- package/dist/providers/AnthropicProvider.js.map +1 -1
- package/dist/providers/DeepSeekProvider.d.ts +13 -34
- package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
- package/dist/providers/DeepSeekProvider.js +16 -47
- package/dist/providers/DeepSeekProvider.js.map +1 -1
- package/dist/providers/GeminiProvider.d.ts +22 -75
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +32 -558
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/GenericOpenAICompatibleProvider.d.ts +9 -10
- package/dist/providers/GenericOpenAICompatibleProvider.d.ts.map +1 -1
- package/dist/providers/GenericOpenAICompatibleProvider.js +13 -16
- package/dist/providers/GenericOpenAICompatibleProvider.js.map +1 -1
- package/dist/providers/OpenAICompatibleProvider.d.ts +26 -135
- package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
- package/dist/providers/OpenAICompatibleProvider.js +39 -495
- package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
- package/dist/providers/OpenAIProvider.d.ts +14 -20
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +20 -24
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/providers/OpenRouterProvider.d.ts +20 -24
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/OpenRouterProvider.js +21 -34
- package/dist/providers/OpenRouterProvider.js.map +1 -1
- package/dist/providers/ProviderAdapter.d.ts +94 -0
- package/dist/providers/ProviderAdapter.d.ts.map +1 -0
- package/dist/providers/ProviderAdapter.js +251 -0
- package/dist/providers/ProviderAdapter.js.map +1 -0
- package/dist/providers/index.d.ts +21 -18
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +13 -10
- package/dist/providers/index.js.map +1 -1
- package/dist/types/agent.d.ts +37 -11
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/ai.d.ts +11 -21
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/compaction.d.ts +2 -2
- package/dist/types/compaction.d.ts.map +1 -1
- package/dist/types/errors.d.ts +16 -20
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/errors.js +15 -16
- package/dist/types/errors.js.map +1 -1
- package/dist/types/flow.d.ts +56 -39
- package/dist/types/flow.d.ts.map +1 -1
- package/dist/types/history.d.ts +1 -1
- package/dist/types/history.d.ts.map +1 -1
- package/dist/types/index.d.ts +17 -17
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -4
- package/dist/types/index.js.map +1 -1
- package/dist/types/persistence.d.ts +2 -2
- package/dist/types/persistence.d.ts.map +1 -1
- package/dist/types/session.d.ts +4 -4
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/signals.d.ts +3 -3
- package/dist/types/signals.d.ts.map +1 -1
- package/dist/types/template.d.ts +2 -2
- package/dist/types/template.d.ts.map +1 -1
- package/dist/types/tool.d.ts +4 -2
- package/dist/types/tool.d.ts.map +1 -1
- package/dist/types/tool.js.map +1 -1
- package/dist/utils/condition.d.ts +1 -1
- package/dist/utils/condition.d.ts.map +1 -1
- package/dist/utils/condition.js +2 -2
- package/dist/utils/condition.js.map +1 -1
- package/dist/utils/event.d.ts +1 -1
- package/dist/utils/event.d.ts.map +1 -1
- package/dist/utils/event.js +1 -1
- package/dist/utils/event.js.map +1 -1
- package/dist/utils/history.d.ts +2 -2
- package/dist/utils/history.d.ts.map +1 -1
- package/dist/utils/history.js +1 -1
- package/dist/utils/history.js.map +1 -1
- package/dist/utils/index.d.ts +11 -13
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +11 -12
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/serialize.d.ts +17 -0
- package/dist/utils/serialize.d.ts.map +1 -1
- package/dist/utils/serialize.js +31 -0
- package/dist/utils/serialize.js.map +1 -1
- package/dist/utils/session.d.ts +23 -3
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +35 -6
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/template.d.ts +3 -3
- package/dist/utils/template.d.ts.map +1 -1
- package/dist/utils/template.js +1 -1
- package/dist/utils/template.js.map +1 -1
- package/docs/concepts/architecture.md +3 -3
- package/docs/concepts/directives.md +1 -1
- package/docs/guides/error-handling.md +46 -45
- package/docs/guides/flow-control.md +8 -1
- package/docs/guides/instructions.md +15 -6
- package/docs/guides/persistence.md +12 -5
- package/docs/guides/streaming.md +10 -0
- package/docs/migration/README.md +4 -0
- package/docs/migration/v2-3-to-v2-4.md +4 -0
- package/docs/migration/v2-6-to-v2-7.md +246 -0
- package/docs/reference/adapters.md +15 -1
- package/docs/reference/branches.md +2 -0
- package/docs/reference/create-agent.md +28 -0
- package/docs/reference/directive.md +1 -1
- package/docs/reference/errors.md +30 -32
- package/docs/reference/providers.md +63 -60
- package/docs/reference/step.md +28 -21
- package/docs/reference/tool.md +14 -5
- package/docs/start/02-first-agent.md +8 -4
- package/docs/start/03-collect-data.md +19 -10
- package/examples/01-quickstart.ts +2 -2
- package/examples/02-data-extraction.ts +1 -1
- package/examples/03-tools.ts +1 -1
- package/examples/04-instructions.ts +2 -2
- package/examples/05-branching.ts +3 -3
- package/examples/06-flow-control.ts +3 -3
- package/examples/07-streaming.ts +1 -1
- package/examples/08-persistence.ts +2 -2
- package/examples/09-signals.ts +1 -1
- package/examples/tsconfig.json +6 -3
- package/package.json +9 -7
- package/src/adapters/MemoryAdapter.ts +33 -37
- package/src/adapters/MongoAdapter.ts +3 -3
- package/src/adapters/OpenSearchAdapter.ts +4 -4
- package/src/adapters/PostgreSQLAdapter.ts +26 -21
- package/src/adapters/PrismaAdapter.ts +4 -4
- package/src/adapters/RedisAdapter.ts +84 -37
- package/src/adapters/SQLiteAdapter.ts +13 -34
- package/src/adapters/index.ts +13 -13
- package/src/adapters/sessionRow.ts +57 -0
- package/src/core/Agent.ts +64 -18
- package/src/core/AutoChainExecutor.ts +44 -57
- package/src/core/BranchEvaluator.ts +5 -5
- package/src/core/CompactionEngine.ts +42 -8
- package/src/core/DirectiveChainTracker.ts +3 -3
- package/src/core/Events.ts +2 -2
- package/src/core/Flow.ts +9 -9
- package/src/core/FlowRouter.ts +46 -20
- package/src/core/PersistenceManager.ts +4 -4
- package/src/core/PromptComposer.ts +8 -8
- package/src/core/PromptSectionCache.ts +2 -2
- package/src/core/ResponseEngine.ts +6 -6
- package/src/core/ResponseGenerationError.ts +3 -6
- package/src/core/ResponseModal.ts +205 -39
- package/src/core/ResponsePipeline.ts +301 -107
- package/src/core/SessionFinalizer.ts +40 -10
- package/src/core/SessionManager.ts +61 -27
- package/src/core/SignalCoordinator.ts +7 -7
- package/src/core/SignalEvaluator.ts +6 -6
- package/src/core/SignalProcessor.ts +13 -93
- package/src/core/Step.ts +87 -10
- package/src/core/StepLifecycle.ts +129 -26
- package/src/core/StreamingToolExecutor.ts +33 -8
- package/src/core/ToolLoopExecutor.ts +206 -80
- package/src/core/ToolManager.ts +53 -26
- package/src/core/createAgent.ts +2 -2
- package/src/core/flow-namespace.ts +31 -2
- package/src/core/toolGates.ts +2 -2
- package/src/index.ts +59 -45
- package/src/providers/AnthropicProvider.ts +44 -595
- package/src/providers/DeepSeekProvider.ts +27 -92
- package/src/providers/GeminiProvider.ts +41 -752
- package/src/providers/GenericOpenAICompatibleProvider.ts +19 -27
- package/src/providers/OpenAICompatibleProvider.ts +58 -764
- package/src/providers/OpenAIProvider.ts +31 -55
- package/src/providers/OpenRouterProvider.ts +40 -70
- package/src/providers/ProviderAdapter.ts +368 -0
- package/src/providers/index.ts +21 -23
- package/src/types/agent.ts +36 -11
- package/src/types/ai.ts +11 -21
- package/src/types/compaction.ts +2 -2
- package/src/types/errors.ts +17 -35
- package/src/types/flow.ts +44 -46
- package/src/types/history.ts +1 -1
- package/src/types/index.ts +18 -17
- package/src/types/persistence.ts +2 -2
- package/src/types/session.ts +4 -4
- package/src/types/signals.ts +3 -3
- package/src/types/template.ts +2 -2
- package/src/types/tool.ts +4 -2
- package/src/utils/condition.ts +3 -3
- package/src/utils/event.ts +1 -1
- package/src/utils/history.ts +3 -3
- package/src/utils/index.ts +14 -15
- package/src/utils/serialize.ts +38 -0
- package/src/utils/session.ts +46 -9
- package/src/utils/template.ts +3 -3
- package/dist/cjs/core/DirectiveBus.d.ts +0 -88
- package/dist/cjs/core/DirectiveBus.d.ts.map +0 -1
- package/dist/cjs/core/DirectiveBus.js +0 -196
- package/dist/cjs/core/DirectiveBus.js.map +0 -1
- package/dist/cjs/providers/errorClassification.d.ts +0 -61
- package/dist/cjs/providers/errorClassification.d.ts.map +0 -1
- package/dist/cjs/providers/errorClassification.js +0 -123
- package/dist/cjs/providers/errorClassification.js.map +0 -1
- package/dist/cjs/utils/retry.d.ts +0 -67
- package/dist/cjs/utils/retry.d.ts.map +0 -1
- package/dist/cjs/utils/retry.js +0 -201
- package/dist/cjs/utils/retry.js.map +0 -1
- package/dist/core/DirectiveBus.d.ts +0 -88
- package/dist/core/DirectiveBus.d.ts.map +0 -1
- package/dist/core/DirectiveBus.js +0 -192
- package/dist/core/DirectiveBus.js.map +0 -1
- package/dist/providers/errorClassification.d.ts +0 -61
- package/dist/providers/errorClassification.d.ts.map +0 -1
- package/dist/providers/errorClassification.js +0 -116
- package/dist/providers/errorClassification.js.map +0 -1
- package/dist/utils/retry.d.ts +0 -67
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js +0 -193
- package/dist/utils/retry.js.map +0 -1
- package/src/core/DirectiveBus.ts +0 -248
- package/src/providers/errorClassification.ts +0 -172
- package/src/utils/retry.ts +0 -274
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "v2.6 → v2.7 migration"
|
|
3
|
+
description: "What changed in v2.7: per-turn message/allowedFlows params, the default history bound, finalize-before-persist ordering, soft-failing tools, bare error propagation, and provider client injection."
|
|
4
|
+
type: migration
|
|
5
|
+
order: 3
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# v2.6 → v2.7 Migration
|
|
9
|
+
|
|
10
|
+
**Version:** 2.7.0 — Consumer-fit release surface and correctness batch (tool directives end-to-end, hook desugaring, retry classification, error propagation)
|
|
11
|
+
|
|
12
|
+
## Summary
|
|
13
|
+
|
|
14
|
+
v2.7 is mostly **additive**: `respond()` / `respondStream()` gain `message` and `allowedFlows` parameters and return richer observability (`endedFlows`, `metadata.tokensUsed`), providers accept a pre-configured SDK `client`, and `restoreSession` joins the public barrel. Four behavior changes are worth calling out even though none changes a type signature: the default history bound is now active, step `finalize` runs before persistence, crashed tools report failure to the model instead of throwing, and session load failures propagate.
|
|
15
|
+
|
|
16
|
+
If your integration passes explicit histories and catches errors broadly, the upgrade is usually zero-code. The sections below cover each case.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Table of Contents
|
|
21
|
+
|
|
22
|
+
1. [New turn parameters: `message` and `allowedFlows`](#1-new-turn-parameters-message-and-allowedflows)
|
|
23
|
+
2. [`AgentResponse` gains `endedFlows` and `metadata.tokensUsed`](#2-agentresponse-gains-endedflows-and-metadatatokensused)
|
|
24
|
+
3. [Default history bound is active (400)](#3-default-history-bound-is-active-400)
|
|
25
|
+
4. [Step `finalize` now runs BEFORE persistence](#4-step-finalize-now-runs-before-persistence)
|
|
26
|
+
5. [Crashed tools soft-fail to the model](#5-crashed-tools-soft-fail-to-the-model)
|
|
27
|
+
6. [Tool directives work end-to-end](#6-tool-directives-work-end-to-end)
|
|
28
|
+
7. [Errors propagate typed and bare](#7-errors-propagate-typed-and-bare)
|
|
29
|
+
8. [Step hooks: shorthand and `hooks.*` both run](#8-step-hooks-shorthand-and-hooks-both-run)
|
|
30
|
+
9. [Provider `client` injection and retry classification](#9-provider-client-injection-and-retry-classification)
|
|
31
|
+
10. [`restoreSession` exported](#10-restoresession-exported)
|
|
32
|
+
11. [Behavioral changes to be aware of](#11-behavioral-changes-to-be-aware-of)
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 1. New turn parameters: `message` and `allowedFlows`
|
|
37
|
+
|
|
38
|
+
Both `respond()` and `respondStream()` accept two new optional fields on the shared params object.
|
|
39
|
+
|
|
40
|
+
**`message`** — pass the user's turn instead of appending it to the history yourself. The engine appends it to what the model sees this turn *and* records it on the returned session's history, then appends the assistant reply on top. Callers who hold sessions no longer maintain history arrays by hand.
|
|
41
|
+
|
|
42
|
+
**`allowedFlows`** — restricts this turn's *routing* candidates to the given flow ids/titles. Directive targets (`goTo` etc.) still resolve against the full registry. Use for entry-pin funnels instead of cloning or filtering agents.
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
// ─── v2.6: caller owns the user turn ───
|
|
46
|
+
history.push({ role: "user", content: userInput });
|
|
47
|
+
const response = await agent.respond({ history });
|
|
48
|
+
|
|
49
|
+
// ─── v2.7: the engine owns appending ───
|
|
50
|
+
const response = await agent.respond({
|
|
51
|
+
history,
|
|
52
|
+
message: userInput,
|
|
53
|
+
allowedFlows: ["order"], // optional routing pin
|
|
54
|
+
});
|
|
55
|
+
// response.session.history already carries user + assistant turns
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Existing calls that pass pre-built `history` arrays keep working unchanged.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 2. `AgentResponse` gains `endedFlows` and `metadata.tokensUsed`
|
|
63
|
+
|
|
64
|
+
`respond()` can now tell you directly which flows left their active position during the turn:
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
interface EndedFlow {
|
|
68
|
+
flowId: string;
|
|
69
|
+
title?: string;
|
|
70
|
+
reason: StoppedReason; // 'completed' | 'last_step' | 'goto' | …
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
interface AgentResponse<TData> {
|
|
74
|
+
// …existing fields…
|
|
75
|
+
endedFlows?: EndedFlow[]; // completions, redirects, resets
|
|
76
|
+
metadata?: { tokensUsed?: number }; // provider-reported usage for the primary generation call
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Before, you re-derived exits from `executedSteps` plus session-cursor inspection; `endedFlows` removes the guesswork. `metadata.tokensUsed` is present only when the provider reports usage, and covers only the turn's primary generation call (routing and extraction sub-calls are not included). On streaming turns, provider usage rides on chunk `metadata`; stream chunks do not carry `endedFlows`.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 3. Default history bound is active (400)
|
|
85
|
+
|
|
86
|
+
A hard bound now applies to `session.history` even when you configure no compaction: entries beyond `maxHistoryMessages` (default **400**) are trimmed at end-of-turn finalize — and on interim auto-saves — always keeping whole assistant/tool pairs together. Each trim logs a warning recommending compaction for summarization.
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
const agent = createAgent({
|
|
90
|
+
// …
|
|
91
|
+
maxHistoryMessages: 1000, // raise the bound…
|
|
92
|
+
// …or configure compaction for summarization instead of truncation:
|
|
93
|
+
// compaction: { maxTokens: 8000 },
|
|
94
|
+
});
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Set `maxHistoryMessages: 0` to disable bounding entirely (previous unbounded behavior). Long-running `chat()` / `stream()` sessions can no longer grow until the provider context limit bricks them.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 4. Step `finalize` now runs BEFORE persistence
|
|
102
|
+
|
|
103
|
+
The step `finalize` hook previously ran after the auto-save, so state writes it made could miss the persisted row when the conversation ended on that turn. The order inside end-of-turn finalization is now:
|
|
104
|
+
|
|
105
|
+
1. History bound + deterministic compaction
|
|
106
|
+
2. **`finalize` hook** — its state writes land on this turn's session
|
|
107
|
+
3. **Auto-save to persistence**
|
|
108
|
+
4. Live-session sync
|
|
109
|
+
|
|
110
|
+
No code change is needed — but hooks that "didn't stick" across restarts now do, and a control-flow directive returned by `finalize` queues for the start of the next turn as before.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 5. Crashed tools soft-fail to the model
|
|
115
|
+
|
|
116
|
+
A tool handler that throws used to surface as an error escaping `respond()`. It is now reported **to the model** as a failed tool result — a `role: "tool"` message shaped `{"success":false,"error":"…"}` — so the model can react to the failed call instead of the turn dying (or worse, a fabricated success confirming an action that never happened). Unknown tool names behave the same way.
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
// The turn survives; the model sees the failure and can apologize/retry.
|
|
120
|
+
handler: () => {
|
|
121
|
+
throw new Error("upstream API is down");
|
|
122
|
+
},
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
If you relied on catching handler crashes out of `respond()`, catch them inside the handler instead and return `{ success: false, error }` — same signal to the model, explicit in your code.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 6. Tool directives work end-to-end
|
|
130
|
+
|
|
131
|
+
Directives emitted by tools now reliably reach the engine (previously they could be collected and dropped):
|
|
132
|
+
|
|
133
|
+
- `ctx.dispatch(directive)` mid-handler and returning `{ directive }` are equivalent.
|
|
134
|
+
- State fields (`dataUpdate`, `contextUpdate`) apply immediately.
|
|
135
|
+
- A `reply` directive short-circuits the remaining tool loop — its verbatim text becomes the final message with no follow-up LLM call.
|
|
136
|
+
- Control-flow fields queue on `session.pendingDirective` and steer the next turn (same deferred semantics as `agent.dispatch()`).
|
|
137
|
+
|
|
138
|
+
See [Tool → Directive wiring](../reference/tool.md#directive-wiring-and-turn-semantics).
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 7. Errors propagate typed and bare
|
|
143
|
+
|
|
144
|
+
Two related changes to how turn failures reach your `catch`:
|
|
145
|
+
|
|
146
|
+
- **`ProviderError` propagates bare out of `respond()`** — `instanceof ProviderError` works directly; no unwrapping through `ResponseGenerationError.details.originalError`. Same for `SessionConflictError`.
|
|
147
|
+
- **`ResponseGenerationError` is exported** and exposes the original error on the native `.cause` (as well as `details.originalError`). All other turn failures still wrap into it.
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
// ─── v2.6: unwrap through details ───
|
|
151
|
+
catch (err) {
|
|
152
|
+
const original = (err as { details?: { originalError?: unknown } }).details?.originalError;
|
|
153
|
+
if (original instanceof ProviderError) { /* … */ }
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// ─── v2.7: instanceof survives ───
|
|
157
|
+
import { ProviderError, ResponseGenerationError } from "@falai/agent";
|
|
158
|
+
|
|
159
|
+
catch (err) {
|
|
160
|
+
if (err instanceof ProviderError) {
|
|
161
|
+
// err.code, err.provider, err.cause — branch directly
|
|
162
|
+
}
|
|
163
|
+
if (err instanceof ResponseGenerationError) {
|
|
164
|
+
// err.cause is the original error
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
On streaming turns, errors arrive wrapped as `ResponseGenerationError` on the final chunk's `error` field (with the original on `.cause`) rather than thrown.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 8. Step hooks: shorthand and `hooks.*` both run
|
|
174
|
+
|
|
175
|
+
Declaring a top-level `prepare`/`finalize` alongside `hooks.prepare`/`hooks.finalize` used to silently pick one. Now **both run** — the shorthand first, then the hook — with their directive returns merged via Algorithm 4. One new validation: combining a *tool-form* handler (a tool id or `Tool` object) with a function `hooks.*` entry throws `FlowConfigurationError` at construction, since a single position cannot compose a tool reference with a function.
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
{
|
|
179
|
+
id: "enrich",
|
|
180
|
+
prepare: (context, data) => ({ dataUpdate: { tier: lookupTier(context, data?.email) } }),
|
|
181
|
+
hooks: {
|
|
182
|
+
// ALSO runs — after the shorthand above, results merged
|
|
183
|
+
prepare: ({ data }) => {
|
|
184
|
+
if (data.tier === "blocked") return { halt: true, reply: "Account on hold." };
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## 9. Provider `client` injection and retry classification
|
|
193
|
+
|
|
194
|
+
**`AnthropicProvider` and `GeminiProvider` accept a `client` option** — a pre-configured SDK client that overrides the internally-constructed one. Intended for tests injecting scripted transports; production callers should keep passing `apiKey`.
|
|
195
|
+
|
|
196
|
+
Retry semantics are now uniform and documented: deterministic failures (auth 401/403, invalid request 400/404/422, caller aborts) fail fast without burning the retry budget; retriable failures are rate limits, overloads, timeouts, and network faults. `retryConfig.timeout` also bounds time-to-first-token on streaming calls, so a stream that opens and then stalls is treated as failed and retried before the first delta is committed.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## 10. `restoreSession` exported
|
|
201
|
+
|
|
202
|
+
`restoreSession<TData>(state)` joins the public barrel as the canonical inverse of `createPersistedState(session)` — restore a persisted blob verbatim (collected data and completed-flow history survive the round trip). Prefer it over the ambiguous `createSession(state)` overload in custom persistence code.
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
import { createPersistedState, restoreSession } from "@falai/agent";
|
|
206
|
+
|
|
207
|
+
await store.put(id, JSON.stringify(createPersistedState(session)));
|
|
208
|
+
const restored = restoreSession<MyData>(JSON.parse(await store.get(id)));
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## 11. Behavioral changes to be aware of
|
|
214
|
+
|
|
215
|
+
Not breaking in the type sense, but observable at runtime:
|
|
216
|
+
|
|
217
|
+
- **`SessionManager` load failures propagate.** A failed `sessionRepository.findById` (transient DB error) used to be swallowed and fall through to creating a blank session — which then saved over the existing row, erasing the conversation. The error now throws out of `getOrCreate()` / the first turn. A *missing* row still creates a new session as before.
|
|
218
|
+
- **`MemoryAdapter` state writes now match the SQL adapters.** `updateStatus` / `updateCollectedData` / `updateFlowStep` bump `version` + `updatedAt` exactly like SQLite/PostgreSQL (previously Memory mutated in place without either), and `incrementMessageCount` refreshes timestamps without moving `version`. If you asserted on `MemoryAdapter` versions in your own tests, they may shift by design; all adapters are pinned to one contract in `tests/adapter-contract.test.ts`.
|
|
219
|
+
- **`agent.dispatch` persists when an adapter is configured.** Previously the queued directive was memory-only until the next turn's auto-save — lost if the process ended first (webhook/cron callers). With an adapter + autoSave (the defaults) dispatch now saves immediately through the per-session save queue, so the directive survives process boundaries, and a stale session copy throws `SessionConflictError` instead of silently clobbering another writer. No adapter, or `autoSave: false`: unchanged memory-only behavior.
|
|
220
|
+
- **Failed-turn rollback is unchanged**, but combined with §7 more failures now arrive as typed instances you can branch on rather than wrapped messages to string-match.
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Verification
|
|
225
|
+
|
|
226
|
+
After migrating, run the type checker — it will flag any code that depended on `ResponseGenerationError` being name-matched only, or on provider options that have since widened:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
bun run typecheck
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
To confirm the behavior changes land as described, the relevant suites are:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
bun test tests/consumer-fit-api.test.ts # message/allowedFlows, endedFlows, bare error propagation
|
|
236
|
+
bun test tests/tool-loop-correctness.test.ts # soft-failing tools
|
|
237
|
+
bun test tests/directive-wiring.test.ts # tool directives + finalize-before-persist ordering
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Cross-References
|
|
241
|
+
|
|
242
|
+
- [createAgent reference](../reference/create-agent.md) — `maxHistoryMessages`, turn parameters, response surface
|
|
243
|
+
- [Providers reference](../reference/providers.md) — `client` option and retry classification
|
|
244
|
+
- [Errors reference](../reference/errors.md) — bare `ProviderError`, exported `ResponseGenerationError`
|
|
245
|
+
- [Tool reference](../reference/tool.md) — directive wiring and soft-fail semantics
|
|
246
|
+
- [Adapters reference](../reference/adapters.md) — `createPersistedState` / `restoreSession`
|
|
@@ -73,7 +73,7 @@ Both are **required columns** on every adapter's session schema. v1 schemas had
|
|
|
73
73
|
|
|
74
74
|
## Optimistic locking
|
|
75
75
|
|
|
76
|
-
Every session row carries a `version: number` (on `SessionData` / `SessionState`), incremented by the repository on every update. `SessionRepository.update()` takes an optional compare-and-swap guard:
|
|
76
|
+
Every session row carries a `version: number` (on `SessionData` / `SessionState`), incremented by the repository on every update. One deliberate exception: `incrementMessageCount` is bookkeeping — it refreshes the timestamps but never moves `version`, because count bumps run alongside `saveSessionState`'s compare-and-swap on every turn and would otherwise manufacture false conflicts. The state-writer helpers (`updateStatus`, `updateCollectedData`, `updateFlowStep`) go through `update()` and do bump it, identically on every built-in adapter. `SessionRepository.update()` takes an optional compare-and-swap guard:
|
|
77
77
|
|
|
78
78
|
```typescript
|
|
79
79
|
interface SessionUpdateOptions {
|
|
@@ -126,6 +126,20 @@ await agent.respond({ history: [{ role: "user", content: "Hi again" }] });
|
|
|
126
126
|
|
|
127
127
|
The engine looks the id up via `sessionRepository.findById`, hydrates the full `SessionState` (including `pendingDirective` and `signals`), and continues the turn against the restored state. Unknown ids create a new session with that id — there's no "not found" error path.
|
|
128
128
|
|
|
129
|
+
### Session helpers for custom persistence code
|
|
130
|
+
|
|
131
|
+
When you read or write session rows outside the agent (admin tooling, batch jobs), two exported helpers keep the round trip lossless:
|
|
132
|
+
|
|
133
|
+
- `createPersistedState(session)` — strips transient pre-LLM directive fields (`appendPrompt`, `injectTools`, `halt`) before writing; call it (or an adapter that already does) before serializing.
|
|
134
|
+
- `restoreSession<TData>(state)` — the canonical inverse: rebuilds a `SessionState` from a persisted blob verbatim, so collected data and completed-flow history survive the round trip. Prefer it over the ambiguous `createSession(state)` overload.
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
import { createPersistedState, restoreSession } from "@falai/agent";
|
|
138
|
+
|
|
139
|
+
await store.put(id, JSON.stringify(createPersistedState(session)));
|
|
140
|
+
const session = restoreSession<MyData>(JSON.parse(await store.get(id)));
|
|
141
|
+
```
|
|
142
|
+
|
|
129
143
|
## MemoryAdapter
|
|
130
144
|
|
|
131
145
|
The implicit default. Omit `persistence` entirely to use it; instantiate explicitly only when you want to inspect or clear the store from tests.
|
|
@@ -97,6 +97,8 @@ For each entry in declaration order:
|
|
|
97
97
|
|
|
98
98
|
If no entry matches, branches return `undefined` and resolution falls through to linear `nextStep` / AI step selection. This is the same fall-through used when `branches` is omitted entirely.
|
|
99
99
|
|
|
100
|
+
A matched entry outranks implicit flow completion. Branches are evaluated before the terminus check, so a step with no linear successor — normally the end of the flow — stays alive as long as one of its entries resolves a position. `then: '<own step id>'` is therefore how a flow parks: the step re-renders each turn until a condition sends the conversation elsewhere. Only a fall-through (no entry matched) or an explicit `then: { complete: true }` ends the flow there.
|
|
101
|
+
|
|
100
102
|
The code-first ordering is deliberate: `if` is free, `when` costs tokens. Running `if` first short-circuits the AI call when the predicate already disqualifies the entry.
|
|
101
103
|
|
|
102
104
|
### Resolution of `then`
|
|
@@ -42,6 +42,7 @@ interface AgentOptions<TContext = unknown, TData = unknown> {
|
|
|
42
42
|
persistence?: PersistenceConfig<TData>;
|
|
43
43
|
knowledgeBase?: Record<string, unknown>;
|
|
44
44
|
flowSwitchMargin?: number;
|
|
45
|
+
maxHistoryMessages?: number;
|
|
45
46
|
maxAutoStepsPerTurn?: number;
|
|
46
47
|
maxDirectiveChain?: number;
|
|
47
48
|
maxToolLoops?: number;
|
|
@@ -75,6 +76,7 @@ interface AgentOptions<TContext = unknown, TData = unknown> {
|
|
|
75
76
|
| `persistence` | `PersistenceConfig<TData>` | no | in-memory | Session storage: `adapter`, `autoSave`, `userId`, plus `schemaVersion` / `migrateSession` for upgrading state written by older deployments. Omit for `MemoryAdapter`. |
|
|
76
77
|
| `knowledgeBase` | `Record<string, unknown>` | no | — | Arbitrary JSON inlined into the prompt as background knowledge. |
|
|
77
78
|
| `flowSwitchMargin` | `number` | no | `15` | Margin (0–100) the best alternative flow must exceed the current flow's score by before switching. Higher values make the agent stickier. |
|
|
79
|
+
| `maxHistoryMessages` | `number` | no | `400` | Hard bound on `session.history`. Applied at end-of-turn finalize (and on interim auto-saves): the oldest entries are trimmed — never splitting an assistant/tool pair — and a warning is logged. Use `compaction` for summarization instead of truncation; set `0` to disable bounding entirely. |
|
|
78
80
|
| `maxAutoStepsPerTurn` | `number` | no | `10` | Cap on consecutive `auto: true` steps per turn. Throws `FlowConfigurationError` when exceeded. |
|
|
79
81
|
| `maxDirectiveChain` | `number` | no | `10` | Cap on chained directives per turn (e.g., `goTo` → `onEnter` emits `goTo` → …). Throws `FlowConfigurationError` when exceeded. |
|
|
80
82
|
| `maxToolLoops` | `number` | no | `5` | Cap on tool-call follow-up rounds per turn, after the initial tool batch. Stops executing further tool calls when reached. Applies to both `respond()` and streaming. An explicit `0` disables tool loops. |
|
|
@@ -166,6 +168,32 @@ const agent = createAgent({
|
|
|
166
168
|
});
|
|
167
169
|
```
|
|
168
170
|
|
|
171
|
+
## Turn parameters and response surface
|
|
172
|
+
|
|
173
|
+
`respond()` / `respondStream()` share one params object (`RespondParams`). Beyond the required `history`, two per-turn knobs matter:
|
|
174
|
+
|
|
175
|
+
| Param | Type | Notes |
|
|
176
|
+
|-------|------|-------|
|
|
177
|
+
| `message` | `string` | The user's message for this turn. When set, the engine appends it to the history the model sees **and** to the returned session's history, then appends the assistant reply on top — callers who hold sessions no longer maintain history arrays by hand. Empty replies are not recorded. |
|
|
178
|
+
| `allowedFlows` | `string[]` | Restricts this turn's **routing** candidates to these flow ids/titles. Directive targets (`goTo` etc.) still resolve against the full registry. Use for entry-pin funnels instead of cloning/filtering agents. |
|
|
179
|
+
|
|
180
|
+
On the result side, `AgentResponse` carries:
|
|
181
|
+
|
|
182
|
+
- `endedFlows?: EndedFlow[]` — flows that left their active position this turn (completions, redirects, resets), each as `{ flowId, title?, reason }`. Lets consumers stop re-deriving exits from `executedSteps` + cursor inspection. Streaming chunks do not carry `endedFlows`.
|
|
183
|
+
- `metadata.tokensUsed?` — provider-reported usage for the turn's primary generation call (routing and extraction sub-calls are not included); present only when the provider reports usage. On streaming turns the same value rides on chunk `metadata`.
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
const response = await agent.respond({
|
|
187
|
+
history,
|
|
188
|
+
message: "I'd like the vegetarian menu",
|
|
189
|
+
allowedFlows: ["order"],
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
for (const ended of response.endedFlows ?? []) {
|
|
193
|
+
console.log(`flow "${ended.title ?? ended.flowId}" ended (${ended.reason})`);
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
169
197
|
## Errors
|
|
170
198
|
|
|
171
199
|
`createAgent` runs the same construction-time validation as `new Agent(...)`.
|
|
@@ -74,7 +74,7 @@ Exactly **zero or one** position field may be set per directive. Setting two or
|
|
|
74
74
|
| `abort` | `string` (reason) | `{ reason, clearSession? }` | End the conversation. The string form is sugar for `{ reason: <string> }`. When `clearSession: true`, the session is cleared at the next persistence write. `reply` cannot co-exist with `abort` — an aborted conversation cannot deliver a reply. |
|
|
75
75
|
| `reset` | `true` | `{ step?, clearData?, reason? }` | Restart the current flow. `step` re-enters at a specific step (default: initial). `clearData: true` clears every field declared in the flow's `requiredFields` and `optionalFields`. |
|
|
76
76
|
|
|
77
|
-
Each object form carries an optional `reason: string`. The reason is **observability-only** — it appears in the per-turn directive
|
|
77
|
+
Each object form carries an optional `reason: string`. The reason is **observability-only** — it appears in the per-turn directive-chain debug log so traces are self-explaining. It does not influence routing, merging, or any pipeline decision.
|
|
78
78
|
|
|
79
79
|
### State writes
|
|
80
80
|
|
package/docs/reference/errors.md
CHANGED
|
@@ -9,7 +9,7 @@ order: 12
|
|
|
9
9
|
|
|
10
10
|
> **Where this is introduced:** [Errors](../guides/error-handling.md)
|
|
11
11
|
|
|
12
|
-
`@falai/agent` throws typed `Error` subclasses for every failure mode the framework owns. Catch them by class to discriminate construction errors from runtime errors, and by `error.name` when
|
|
12
|
+
`@falai/agent` throws typed `Error` subclasses for every failure mode the framework owns. Catch them by class to discriminate construction errors from runtime errors, and by `error.name` when a class that is not exported (`DataValidationError`) needs to be matched.
|
|
13
13
|
|
|
14
14
|
Every thrown message follows the same format contract:
|
|
15
15
|
|
|
@@ -32,7 +32,7 @@ class ToolExecutionError extends Error {
|
|
|
32
32
|
}
|
|
33
33
|
class NotImplementedError extends Error { /* name = "NotImplementedError" */ }
|
|
34
34
|
class ProviderError extends Error {
|
|
35
|
-
|
|
35
|
+
kind: ErrorKind; // 'rate' | 'overload' | 'quota' | 'entitlement' | 'auth' | 'context' | …
|
|
36
36
|
// | 'schema_rejected' | 'timeout' | 'network' | 'unknown'
|
|
37
37
|
provider: string; // e.g. "openai"
|
|
38
38
|
cause?: unknown; // original SDK/HTTP error
|
|
@@ -42,10 +42,8 @@ class SessionConflictError extends Error {
|
|
|
42
42
|
expectedVersion: number;
|
|
43
43
|
actualVersion: number | undefined;
|
|
44
44
|
}
|
|
45
|
-
|
|
46
|
-
// Internal — match by `error.name` (not exported from the package barrel)
|
|
47
|
-
class DataValidationError extends Error { errors: ValidationError[] }
|
|
48
45
|
class ResponseGenerationError extends Error {
|
|
46
|
+
cause?: unknown; // native `cause` — the original error
|
|
49
47
|
details?: {
|
|
50
48
|
originalError?: unknown;
|
|
51
49
|
params?: Record<string, unknown>;
|
|
@@ -53,6 +51,9 @@ class ResponseGenerationError extends Error {
|
|
|
53
51
|
context?: Record<string, unknown>;
|
|
54
52
|
};
|
|
55
53
|
}
|
|
54
|
+
|
|
55
|
+
// Internal — match by `error.name` (not exported from the package barrel)
|
|
56
|
+
class DataValidationError extends Error { errors: ValidationError[] }
|
|
56
57
|
```
|
|
57
58
|
|
|
58
59
|
## Fields
|
|
@@ -63,8 +64,8 @@ class ResponseGenerationError extends Error {
|
|
|
63
64
|
| `ToolCreationError` | A `Tool` fails registration (invalid schema, duplicate id, builder threw). | `toolId`, `cause` | Repair the tool definition. Not user-facing. |
|
|
64
65
|
| `ToolExecutionError` | A handler throws, all retries fail, or `validateInput` cannot correct invalid args. | `toolId`, `executionContext`, `cause` | Surface a user-friendly message; optionally `agent.dispatch({ goTo: '<recovery-flow>' })`. |
|
|
65
66
|
| `DataValidationError` | `agent.respond(...)` collects values that violate the declared `schema`. | `errors: ValidationError[]` | Re-prompt for the offending fields, then retry. |
|
|
66
|
-
| `ResponseGenerationError` |
|
|
67
|
-
| `ProviderError` | A provider call fails terminally — retries and `backupModels` exhausted. Normalized across all vendors. | `
|
|
67
|
+
| `ResponseGenerationError` | A turn fails for any reason other than a typed error the framework rethrows bare (see `ProviderError` below) — provider call failure, malformed structured output, hook failure. Exported; also carries the original error on the native `.cause`. | `cause`, `details.phase`, `details.originalError` | Retry with backoff, fall back to a different provider, or surface a soft failure to the user. |
|
|
68
|
+
| `ProviderError` | A provider call fails terminally — retries and `backupModels` exhausted. Normalized across all vendors. Propagates **bare** out of `respond()` (`instanceof` survives — no unwrapping needed). Streaming turns surface it wrapped on the final chunk's `error`. | `kind`, `provider`, `status`, `body`, `cause` | Match on `kind`: back off for `rate`/`overload`, top up for `quota`, fix credentials for `auth`, compact for `context`, fail fast otherwise. |
|
|
68
69
|
| `SessionConflictError` | A session save carries a stale `version` — another writer persisted the session after this one loaded it (concurrent `respond()` calls, parallel webhooks, two tabs). | `sessionId`, `expectedVersion`, `actualVersion` | Reload the session and retry the operation, or surface the conflict. |
|
|
69
70
|
| `NotImplementedError` | A reserved option is set to a value this version does not support (e.g. `routerMode: 'embedding'` in v2.0). | `message` | Use a supported value. |
|
|
70
71
|
|
|
@@ -75,6 +76,7 @@ class ResponseGenerationError extends Error {
|
|
|
75
76
|
```typescript
|
|
76
77
|
import {
|
|
77
78
|
FlowConfigurationError,
|
|
79
|
+
ResponseGenerationError,
|
|
78
80
|
ToolExecutionError,
|
|
79
81
|
NotImplementedError,
|
|
80
82
|
} from "@falai/agent";
|
|
@@ -93,7 +95,9 @@ try {
|
|
|
93
95
|
if (err instanceof Error && err.name === "DataValidationError") {
|
|
94
96
|
return "I need you to clarify a few details — let's try that again.";
|
|
95
97
|
}
|
|
96
|
-
if (err instanceof
|
|
98
|
+
if (err instanceof ResponseGenerationError) {
|
|
99
|
+
// err.cause is the original error — e.g. a provider SDK failure.
|
|
100
|
+
log.warn({ cause: err.cause, phase: err.details?.phase }, err.message);
|
|
97
101
|
return "I'm having trouble reaching the model. Please retry.";
|
|
98
102
|
}
|
|
99
103
|
throw err;
|
|
@@ -102,38 +106,33 @@ try {
|
|
|
102
106
|
|
|
103
107
|
### 2. Matching provider failures by normalized code
|
|
104
108
|
|
|
105
|
-
|
|
109
|
+
`ProviderError` propagates **bare** out of `respond()` — catch it with `instanceof`, no unwrapping. The original SDK/HTTP error is on `.cause`.
|
|
106
110
|
|
|
107
111
|
```typescript
|
|
108
112
|
import { ProviderError } from "@falai/agent";
|
|
109
113
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
return retryWithBackoff(); // transient — wait and retry
|
|
125
|
-
case "auth":
|
|
126
|
-
throw providerError; // config bug — crash loudly
|
|
127
|
-
default:
|
|
128
|
-
log.error({ cause: providerError.cause }, providerError.message);
|
|
129
|
-
return "I'm having trouble reaching the model. Please retry.";
|
|
114
|
+
try {
|
|
115
|
+
const response = await agent.respond({ history });
|
|
116
|
+
} catch (err) {
|
|
117
|
+
if (err instanceof ProviderError) {
|
|
118
|
+
switch (err.kind) {
|
|
119
|
+
case "rate":
|
|
120
|
+
case "overload":
|
|
121
|
+
return retryWithBackoff(); // transient — wait and retry
|
|
122
|
+
case "auth":
|
|
123
|
+
throw err; // config bug — crash loudly
|
|
124
|
+
default:
|
|
125
|
+
log.error({ cause: err.cause }, err.message);
|
|
126
|
+
return "I'm having trouble reaching the model. Please retry.";
|
|
127
|
+
}
|
|
130
128
|
}
|
|
129
|
+
throw err;
|
|
131
130
|
}
|
|
132
131
|
```
|
|
133
132
|
|
|
134
133
|
### 3. Recovering from a session conflict
|
|
135
134
|
|
|
136
|
-
`SessionConflictError` means another writer persisted the session between your load and your save. Reload, then retry.
|
|
135
|
+
`SessionConflictError` means another writer persisted the session between your load and your save. Like `ProviderError`, it propagates bare out of `respond()`. Reload, then retry.
|
|
137
136
|
|
|
138
137
|
```typescript
|
|
139
138
|
import { SessionConflictError } from "@falai/agent";
|
|
@@ -141,8 +140,7 @@ import { SessionConflictError } from "@falai/agent";
|
|
|
141
140
|
try {
|
|
142
141
|
await agent.respond({ history, session });
|
|
143
142
|
} catch (err) {
|
|
144
|
-
|
|
145
|
-
if (err instanceof SessionConflictError || original instanceof SessionConflictError) {
|
|
143
|
+
if (err instanceof SessionConflictError) {
|
|
146
144
|
const fresh = await agent.session.getOrCreate(sessionId);
|
|
147
145
|
return agent.respond({ history, session: fresh });
|
|
148
146
|
}
|