@falai/agent 2.2.3 → 2.4.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 +2 -2
- package/dist/adapters/MemoryAdapter.d.ts.map +1 -1
- package/dist/adapters/MemoryAdapter.js +10 -1
- package/dist/adapters/MemoryAdapter.js.map +1 -1
- package/dist/adapters/MongoAdapter.d.ts.map +1 -1
- package/dist/adapters/MongoAdapter.js +33 -2
- package/dist/adapters/MongoAdapter.js.map +1 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenSearchAdapter.js +15 -1
- package/dist/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.js +35 -5
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/adapters/PrismaAdapter.d.ts.map +1 -1
- package/dist/adapters/PrismaAdapter.js +58 -15
- package/dist/adapters/PrismaAdapter.js.map +1 -1
- package/dist/adapters/RedisAdapter.d.ts.map +1 -1
- package/dist/adapters/RedisAdapter.js +10 -1
- package/dist/adapters/RedisAdapter.js.map +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/adapters/SQLiteAdapter.js +38 -6
- package/dist/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.js +10 -1
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.js +33 -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 +15 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js +35 -5
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.js +58 -15
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.js +10 -1
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.js +38 -6
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/core/Agent.d.ts +28 -18
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +58 -68
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.js +14 -20
- package/dist/cjs/core/AutoChainExecutor.js.map +1 -1
- package/dist/cjs/core/BranchEvaluator.d.ts +4 -3
- package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -1
- package/dist/cjs/core/BranchEvaluator.js +18 -23
- package/dist/cjs/core/BranchEvaluator.js.map +1 -1
- package/dist/cjs/core/Flow.d.ts +2 -1
- package/dist/cjs/core/Flow.d.ts.map +1 -1
- package/dist/cjs/core/Flow.js +10 -3
- package/dist/cjs/core/Flow.js.map +1 -1
- package/dist/cjs/core/FlowRouter.d.ts +1 -0
- package/dist/cjs/core/FlowRouter.d.ts.map +1 -1
- package/dist/cjs/core/FlowRouter.js +28 -5
- package/dist/cjs/core/FlowRouter.js.map +1 -1
- package/dist/cjs/core/PersistenceManager.d.ts +3 -0
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
- package/dist/cjs/core/PersistenceManager.js +57 -5
- package/dist/cjs/core/PersistenceManager.js.map +1 -1
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
- package/dist/cjs/core/PromptComposer.js +24 -10
- package/dist/cjs/core/PromptComposer.js.map +1 -1
- package/dist/cjs/core/ResponseGenerationError.d.ts +30 -0
- package/dist/cjs/core/ResponseGenerationError.d.ts.map +1 -0
- package/dist/cjs/core/ResponseGenerationError.js +37 -0
- package/dist/cjs/core/ResponseGenerationError.js.map +1 -0
- package/dist/cjs/core/ResponseModal.d.ts +43 -96
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
- package/dist/cjs/core/ResponseModal.js +184 -1183
- package/dist/cjs/core/ResponseModal.js.map +1 -1
- package/dist/cjs/core/ResponsePipeline.d.ts +58 -152
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/cjs/core/ResponsePipeline.js +408 -457
- package/dist/cjs/core/ResponsePipeline.js.map +1 -1
- package/dist/cjs/core/SessionFinalizer.d.ts +34 -0
- package/dist/cjs/core/SessionFinalizer.d.ts.map +1 -0
- package/dist/cjs/core/SessionFinalizer.js +61 -0
- package/dist/cjs/core/SessionFinalizer.js.map +1 -0
- package/dist/cjs/core/SessionManager.d.ts +1 -1
- package/dist/cjs/core/SessionManager.d.ts.map +1 -1
- package/dist/cjs/core/SessionManager.js +18 -7
- package/dist/cjs/core/SessionManager.js.map +1 -1
- package/dist/cjs/core/SignalCoordinator.d.ts +103 -0
- package/dist/cjs/core/SignalCoordinator.d.ts.map +1 -0
- package/dist/cjs/core/SignalCoordinator.js +207 -0
- package/dist/cjs/core/SignalCoordinator.js.map +1 -0
- package/dist/cjs/core/SignalEvaluator.d.ts +2 -2
- package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -1
- package/dist/cjs/core/SignalEvaluator.js +13 -27
- package/dist/cjs/core/SignalEvaluator.js.map +1 -1
- package/dist/cjs/core/SignalProcessor.d.ts.map +1 -1
- package/dist/cjs/core/SignalProcessor.js +1 -3
- package/dist/cjs/core/SignalProcessor.js.map +1 -1
- package/dist/cjs/core/Step.d.ts +3 -1
- package/dist/cjs/core/Step.d.ts.map +1 -1
- package/dist/cjs/core/Step.js +10 -3
- package/dist/cjs/core/Step.js.map +1 -1
- package/dist/cjs/core/StepLifecycle.d.ts +33 -0
- package/dist/cjs/core/StepLifecycle.d.ts.map +1 -0
- package/dist/cjs/core/StepLifecycle.js +97 -0
- package/dist/cjs/core/StepLifecycle.js.map +1 -0
- package/dist/cjs/core/ToolLoopExecutor.d.ts +104 -0
- package/dist/cjs/core/ToolLoopExecutor.d.ts.map +1 -0
- package/dist/cjs/core/ToolLoopExecutor.js +391 -0
- package/dist/cjs/core/ToolLoopExecutor.js.map +1 -0
- package/dist/cjs/core/ToolManager.d.ts +1 -1
- package/dist/cjs/core/ToolManager.d.ts.map +1 -1
- package/dist/cjs/core/ToolManager.js.map +1 -1
- package/dist/cjs/index.d.ts +4 -5
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +7 -6
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts +2 -0
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.js +28 -56
- package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
- package/dist/cjs/providers/DeepSeekProvider.d.ts +25 -21
- package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
- package/dist/cjs/providers/DeepSeekProvider.js +48 -407
- package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts +2 -0
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +27 -56
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +129 -0
- package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -0
- package/dist/cjs/providers/OpenAICompatibleProvider.js +485 -0
- package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -0
- package/dist/cjs/providers/OpenAIProvider.d.ts +9 -28
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.js +23 -417
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.d.ts +10 -27
- package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.js +28 -417
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
- package/dist/cjs/providers/errorClassification.d.ts +61 -0
- package/dist/cjs/providers/errorClassification.d.ts.map +1 -0
- package/dist/cjs/providers/errorClassification.js +123 -0
- package/dist/cjs/providers/errorClassification.js.map +1 -0
- package/dist/cjs/providers/index.d.ts +4 -0
- package/dist/cjs/providers/index.d.ts.map +1 -1
- package/dist/cjs/providers/index.js +7 -1
- package/dist/cjs/providers/index.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +2 -1
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/ai.d.ts +20 -0
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/errors.d.ts +33 -0
- package/dist/cjs/types/errors.d.ts.map +1 -1
- package/dist/cjs/types/errors.js +37 -1
- package/dist/cjs/types/errors.js.map +1 -1
- package/dist/cjs/types/flow.d.ts +10 -5
- 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 +5 -4
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js +3 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/persistence.d.ts +43 -2
- package/dist/cjs/types/persistence.d.ts.map +1 -1
- package/dist/cjs/types/session.d.ts +8 -0
- package/dist/cjs/types/session.d.ts.map +1 -1
- package/dist/cjs/types/signals.d.ts +21 -11
- package/dist/cjs/types/signals.d.ts.map +1 -1
- package/dist/cjs/types/template.d.ts +3 -1
- package/dist/cjs/types/template.d.ts.map +1 -1
- package/dist/cjs/types/tool.d.ts +4 -4
- package/dist/cjs/types/tool.d.ts.map +1 -1
- package/dist/cjs/utils/condition.d.ts +19 -0
- package/dist/cjs/utils/condition.d.ts.map +1 -1
- package/dist/cjs/utils/condition.js +86 -15
- package/dist/cjs/utils/condition.js.map +1 -1
- package/dist/cjs/utils/session.d.ts +1 -0
- package/dist/cjs/utils/session.d.ts.map +1 -1
- package/dist/cjs/utils/session.js +1 -0
- package/dist/cjs/utils/session.js.map +1 -1
- package/dist/core/Agent.d.ts +28 -18
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +58 -68
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/AutoChainExecutor.d.ts.map +1 -1
- package/dist/core/AutoChainExecutor.js +14 -20
- package/dist/core/AutoChainExecutor.js.map +1 -1
- package/dist/core/BranchEvaluator.d.ts +4 -3
- package/dist/core/BranchEvaluator.d.ts.map +1 -1
- package/dist/core/BranchEvaluator.js +18 -23
- package/dist/core/BranchEvaluator.js.map +1 -1
- package/dist/core/Flow.d.ts +2 -1
- package/dist/core/Flow.d.ts.map +1 -1
- package/dist/core/Flow.js +10 -3
- package/dist/core/Flow.js.map +1 -1
- package/dist/core/FlowRouter.d.ts +1 -0
- package/dist/core/FlowRouter.d.ts.map +1 -1
- package/dist/core/FlowRouter.js +28 -5
- package/dist/core/FlowRouter.js.map +1 -1
- package/dist/core/PersistenceManager.d.ts +3 -0
- package/dist/core/PersistenceManager.d.ts.map +1 -1
- package/dist/core/PersistenceManager.js +58 -6
- package/dist/core/PersistenceManager.js.map +1 -1
- package/dist/core/PromptComposer.d.ts.map +1 -1
- package/dist/core/PromptComposer.js +24 -10
- package/dist/core/PromptComposer.js.map +1 -1
- package/dist/core/ResponseGenerationError.d.ts +30 -0
- package/dist/core/ResponseGenerationError.d.ts.map +1 -0
- package/dist/core/ResponseGenerationError.js +33 -0
- package/dist/core/ResponseGenerationError.js.map +1 -0
- package/dist/core/ResponseModal.d.ts +43 -96
- package/dist/core/ResponseModal.d.ts.map +1 -1
- package/dist/core/ResponseModal.js +177 -1175
- package/dist/core/ResponseModal.js.map +1 -1
- package/dist/core/ResponsePipeline.d.ts +58 -152
- package/dist/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/core/ResponsePipeline.js +409 -458
- package/dist/core/ResponsePipeline.js.map +1 -1
- package/dist/core/SessionFinalizer.d.ts +34 -0
- package/dist/core/SessionFinalizer.d.ts.map +1 -0
- package/dist/core/SessionFinalizer.js +57 -0
- package/dist/core/SessionFinalizer.js.map +1 -0
- package/dist/core/SessionManager.d.ts +1 -1
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +18 -7
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/SignalCoordinator.d.ts +103 -0
- package/dist/core/SignalCoordinator.d.ts.map +1 -0
- package/dist/core/SignalCoordinator.js +203 -0
- package/dist/core/SignalCoordinator.js.map +1 -0
- package/dist/core/SignalEvaluator.d.ts +2 -2
- package/dist/core/SignalEvaluator.d.ts.map +1 -1
- package/dist/core/SignalEvaluator.js +13 -27
- package/dist/core/SignalEvaluator.js.map +1 -1
- package/dist/core/SignalProcessor.d.ts.map +1 -1
- package/dist/core/SignalProcessor.js +1 -3
- package/dist/core/SignalProcessor.js.map +1 -1
- package/dist/core/Step.d.ts +3 -1
- package/dist/core/Step.d.ts.map +1 -1
- package/dist/core/Step.js +10 -3
- package/dist/core/Step.js.map +1 -1
- package/dist/core/StepLifecycle.d.ts +33 -0
- package/dist/core/StepLifecycle.d.ts.map +1 -0
- package/dist/core/StepLifecycle.js +93 -0
- package/dist/core/StepLifecycle.js.map +1 -0
- package/dist/core/ToolLoopExecutor.d.ts +104 -0
- package/dist/core/ToolLoopExecutor.d.ts.map +1 -0
- package/dist/core/ToolLoopExecutor.js +387 -0
- package/dist/core/ToolLoopExecutor.js.map +1 -0
- package/dist/core/ToolManager.d.ts +1 -1
- package/dist/core/ToolManager.d.ts.map +1 -1
- package/dist/core/ToolManager.js.map +1 -1
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts +2 -0
- package/dist/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/providers/AnthropicProvider.js +22 -50
- package/dist/providers/AnthropicProvider.js.map +1 -1
- package/dist/providers/DeepSeekProvider.d.ts +25 -21
- package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
- package/dist/providers/DeepSeekProvider.js +49 -408
- package/dist/providers/DeepSeekProvider.js.map +1 -1
- package/dist/providers/GeminiProvider.d.ts +2 -0
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +21 -50
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/OpenAICompatibleProvider.d.ts +129 -0
- package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -0
- package/dist/providers/OpenAICompatibleProvider.js +481 -0
- package/dist/providers/OpenAICompatibleProvider.js.map +1 -0
- package/dist/providers/OpenAIProvider.d.ts +9 -28
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +23 -417
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/providers/OpenRouterProvider.d.ts +10 -27
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/OpenRouterProvider.js +28 -417
- package/dist/providers/OpenRouterProvider.js.map +1 -1
- package/dist/providers/errorClassification.d.ts +61 -0
- package/dist/providers/errorClassification.d.ts.map +1 -0
- package/dist/providers/errorClassification.js +116 -0
- package/dist/providers/errorClassification.js.map +1 -0
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +2 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/types/agent.d.ts +2 -1
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/ai.d.ts +20 -0
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/errors.d.ts +33 -0
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/errors.js +34 -0
- package/dist/types/errors.js.map +1 -1
- package/dist/types/flow.d.ts +10 -5
- 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 +5 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/persistence.d.ts +43 -2
- package/dist/types/persistence.d.ts.map +1 -1
- package/dist/types/session.d.ts +8 -0
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/signals.d.ts +21 -11
- package/dist/types/signals.d.ts.map +1 -1
- package/dist/types/template.d.ts +3 -1
- package/dist/types/template.d.ts.map +1 -1
- package/dist/types/tool.d.ts +4 -4
- package/dist/types/tool.d.ts.map +1 -1
- package/dist/utils/condition.d.ts +19 -0
- package/dist/utils/condition.d.ts.map +1 -1
- package/dist/utils/condition.js +84 -15
- package/dist/utils/condition.js.map +1 -1
- package/dist/utils/session.d.ts +1 -0
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +1 -0
- package/dist/utils/session.js.map +1 -1
- package/docs/README.md +1 -1
- package/docs/guides/branching.md +1 -1
- package/docs/guides/compaction.md +12 -5
- package/docs/guides/conditions.md +15 -2
- package/docs/guides/error-handling.md +59 -9
- package/docs/guides/instructions.md +2 -2
- package/docs/guides/persistence.md +69 -2
- package/docs/guides/streaming.md +3 -1
- package/docs/migration/README.md +5 -1
- package/docs/migration/v2-3-to-v2-4.md +316 -0
- package/docs/reference/adapters.md +55 -7
- package/docs/reference/branches.md +2 -2
- package/docs/reference/create-agent.md +3 -3
- package/docs/reference/errors.md +66 -1
- package/docs/reference/flow.md +1 -1
- package/docs/reference/instruction.md +4 -4
- package/docs/reference/providers.md +100 -3
- package/docs/reference/signals.md +18 -8
- package/docs/reference/step.md +2 -2
- package/docs/reference/tool.md +3 -1
- package/docs/start/05-go-to-production.md +3 -0
- package/package.json +1 -1
- package/src/adapters/MemoryAdapter.ts +15 -1
- package/src/adapters/MongoAdapter.ts +41 -2
- package/src/adapters/OpenSearchAdapter.ts +24 -1
- package/src/adapters/PostgreSQLAdapter.ts +45 -5
- package/src/adapters/PrismaAdapter.ts +82 -16
- package/src/adapters/RedisAdapter.ts +19 -1
- package/src/adapters/SQLiteAdapter.ts +47 -5
- package/src/core/Agent.ts +70 -85
- package/src/core/AutoChainExecutor.ts +27 -57
- package/src/core/BranchEvaluator.ts +24 -30
- package/src/core/Flow.ts +10 -3
- package/src/core/FlowRouter.ts +36 -4
- package/src/core/PersistenceManager.ts +79 -10
- package/src/core/PromptComposer.ts +25 -12
- package/src/core/ResponseGenerationError.ts +56 -0
- package/src/core/ResponseModal.ts +241 -1465
- package/src/core/ResponsePipeline.ts +492 -662
- package/src/core/SessionFinalizer.ts +78 -0
- package/src/core/SessionManager.ts +21 -9
- package/src/core/SignalCoordinator.ts +263 -0
- package/src/core/SignalEvaluator.ts +14 -30
- package/src/core/SignalProcessor.ts +1 -4
- package/src/core/Step.ts +11 -3
- package/src/core/StepLifecycle.ts +139 -0
- package/src/core/ToolLoopExecutor.ts +492 -0
- package/src/core/ToolManager.ts +2 -1
- package/src/index.ts +7 -5
- package/src/providers/AnthropicProvider.ts +30 -72
- package/src/providers/DeepSeekProvider.ts +74 -586
- package/src/providers/GeminiProvider.ts +29 -70
- package/src/providers/OpenAICompatibleProvider.ts +738 -0
- package/src/providers/OpenAIProvider.ts +29 -602
- package/src/providers/OpenRouterProvider.ts +38 -596
- package/src/providers/errorClassification.ts +172 -0
- package/src/providers/index.ts +13 -0
- package/src/types/agent.ts +2 -1
- package/src/types/ai.ts +22 -0
- package/src/types/errors.ts +57 -0
- package/src/types/flow.ts +10 -5
- package/src/types/history.ts +1 -2
- package/src/types/index.ts +5 -1
- package/src/types/persistence.ts +50 -2
- package/src/types/session.ts +9 -0
- package/src/types/signals.ts +23 -11
- package/src/types/template.ts +3 -1
- package/src/types/tool.ts +10 -10
- package/src/utils/condition.ts +115 -18
- package/src/utils/session.ts +2 -0
package/src/core/FlowRouter.ts
CHANGED
|
@@ -67,6 +67,7 @@ export interface BuildStepSelectionPromptParams<
|
|
|
67
67
|
context?: TContext;
|
|
68
68
|
session?: SessionState<TData>;
|
|
69
69
|
stepConditionContext?: string[]; // AI context strings from step conditions
|
|
70
|
+
stepExclusionContext?: string[]; // AI exclusion strings from step conditions
|
|
70
71
|
}
|
|
71
72
|
|
|
72
73
|
export interface BuildRoutingPromptParams<TContext = unknown, TData = unknown> {
|
|
@@ -384,9 +385,11 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
|
|
|
384
385
|
|
|
385
386
|
// Collect AI context strings from step conditions
|
|
386
387
|
const stepConditionContext: string[] = [];
|
|
388
|
+
const stepExclusionContext: string[] = [];
|
|
387
389
|
for (const candidate of candidates) {
|
|
388
390
|
const whenResult = await candidate.step.evaluateWhen(templateContext);
|
|
389
391
|
stepConditionContext.push(...whenResult.aiContextStrings);
|
|
392
|
+
stepExclusionContext.push(...whenResult.aiExclusionStrings);
|
|
390
393
|
}
|
|
391
394
|
|
|
392
395
|
// Check if any candidate is a completion marker (isFlowComplete = true)
|
|
@@ -403,6 +406,7 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
|
|
|
403
406
|
context,
|
|
404
407
|
session: updatedSession,
|
|
405
408
|
stepConditionContext,
|
|
409
|
+
stepExclusionContext,
|
|
406
410
|
includeCompletion: hasCompletionOption,
|
|
407
411
|
});
|
|
408
412
|
|
|
@@ -1100,6 +1104,7 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
|
|
|
1100
1104
|
context,
|
|
1101
1105
|
session,
|
|
1102
1106
|
stepConditionContext,
|
|
1107
|
+
stepExclusionContext,
|
|
1103
1108
|
includeCompletion = false,
|
|
1104
1109
|
} = params;
|
|
1105
1110
|
const templateContext = createTemplateContext({ context, session, history });
|
|
@@ -1152,8 +1157,9 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
|
|
|
1152
1157
|
const whenResult = await candidate.step.evaluateWhen(templateContext);
|
|
1153
1158
|
if (whenResult.aiContextStrings.length > 0) {
|
|
1154
1159
|
parts.push(` When any condition matches: ${whenResult.aiContextStrings.join(" OR ")}`);
|
|
1155
|
-
}
|
|
1156
|
-
|
|
1160
|
+
}
|
|
1161
|
+
if (whenResult.aiExclusionStrings.length > 0) {
|
|
1162
|
+
parts.push(` Do not choose when any condition matches: ${whenResult.aiExclusionStrings.join(" OR ")}`);
|
|
1157
1163
|
}
|
|
1158
1164
|
}
|
|
1159
1165
|
|
|
@@ -1185,6 +1191,18 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
|
|
|
1185
1191
|
);
|
|
1186
1192
|
}
|
|
1187
1193
|
|
|
1194
|
+
if (stepExclusionContext && stepExclusionContext.length > 0) {
|
|
1195
|
+
await pc.addInstruction(
|
|
1196
|
+
[
|
|
1197
|
+
"",
|
|
1198
|
+
"Additional step exclusion context:",
|
|
1199
|
+
...stepExclusionContext.map(ctx => `- ${ctx}`),
|
|
1200
|
+
"",
|
|
1201
|
+
"Avoid selecting steps when their exclusion context matches.",
|
|
1202
|
+
].join("\n")
|
|
1203
|
+
);
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1188
1206
|
// Add decision prompt
|
|
1189
1207
|
const decisionRules = [
|
|
1190
1208
|
"Task: Decide which step to transition to based on:",
|
|
@@ -1424,6 +1442,7 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
|
|
|
1424
1442
|
"Available steps in active route (choose one to transition to):",
|
|
1425
1443
|
];
|
|
1426
1444
|
const activeStepConditionContext: string[] = [];
|
|
1445
|
+
const activeStepExclusionContext: string[] = [];
|
|
1427
1446
|
|
|
1428
1447
|
for (const step of activeFlowSteps) {
|
|
1429
1448
|
const idx = activeFlowSteps.indexOf(step);
|
|
@@ -1438,8 +1457,10 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
|
|
|
1438
1457
|
if (whenResult.aiContextStrings.length > 0) {
|
|
1439
1458
|
stepInfo.push(` When any condition matches: ${whenResult.aiContextStrings.join(" OR ")}`);
|
|
1440
1459
|
activeStepConditionContext.push(...whenResult.aiContextStrings);
|
|
1441
|
-
}
|
|
1442
|
-
|
|
1460
|
+
}
|
|
1461
|
+
if (whenResult.aiExclusionStrings.length > 0) {
|
|
1462
|
+
stepInfo.push(` Do not choose when any condition matches: ${whenResult.aiExclusionStrings.join(" OR ")}`);
|
|
1463
|
+
activeStepExclusionContext.push(...whenResult.aiExclusionStrings);
|
|
1443
1464
|
}
|
|
1444
1465
|
}
|
|
1445
1466
|
|
|
@@ -1472,6 +1493,17 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
|
|
|
1472
1493
|
].join("\n")
|
|
1473
1494
|
);
|
|
1474
1495
|
}
|
|
1496
|
+
if (activeStepExclusionContext.length > 0) {
|
|
1497
|
+
await pc.addInstruction(
|
|
1498
|
+
[
|
|
1499
|
+
"",
|
|
1500
|
+
"Additional step exclusion context:",
|
|
1501
|
+
...activeStepExclusionContext.map(ctx => `- ${ctx}`),
|
|
1502
|
+
"",
|
|
1503
|
+
"Avoid selecting steps when their exclusion context matches.",
|
|
1504
|
+
].join("\n")
|
|
1505
|
+
);
|
|
1506
|
+
}
|
|
1475
1507
|
}
|
|
1476
1508
|
}
|
|
1477
1509
|
|
|
@@ -18,7 +18,8 @@ import type {
|
|
|
18
18
|
PersistenceAdapter,
|
|
19
19
|
CollectedStateData,
|
|
20
20
|
} from "../types";
|
|
21
|
-
import { createSession, sessionStepToData, sessionDataToStep } from "../utils";
|
|
21
|
+
import { createSession, sessionStepToData, sessionDataToStep, logger } from "../utils";
|
|
22
|
+
import { SessionConflictError } from "../types/errors";
|
|
22
23
|
import { convertMessagesToHistory } from "./Events";
|
|
23
24
|
|
|
24
25
|
/**
|
|
@@ -29,6 +30,8 @@ export class PersistenceManager<TData = Record<string, unknown>> {
|
|
|
29
30
|
private config: PersistenceConfig<TData>;
|
|
30
31
|
private sessionRepository: SessionRepository<TData>;
|
|
31
32
|
private messageRepository: MessageRepository;
|
|
33
|
+
/** Per-session in-process save queue; see saveSessionState. */
|
|
34
|
+
private saveQueues = new Map<string, Promise<SessionData<TData> | null>>();
|
|
32
35
|
|
|
33
36
|
constructor(config: PersistenceConfig<TData>) {
|
|
34
37
|
this.config = {
|
|
@@ -233,6 +236,28 @@ export class PersistenceManager<TData = Record<string, unknown>> {
|
|
|
233
236
|
async saveSessionState(
|
|
234
237
|
sessionId: string,
|
|
235
238
|
sessionStep: SessionState<TData>
|
|
239
|
+
): Promise<SessionData<TData> | null> {
|
|
240
|
+
// Serialize same-process saves per session: concurrent saves of the same
|
|
241
|
+
// in-memory session would otherwise race the version compare-and-swap and
|
|
242
|
+
// spuriously conflict with each other. Cross-process conflicts (two
|
|
243
|
+
// independently loaded copies) still throw SessionConflictError.
|
|
244
|
+
const previous = this.saveQueues.get(sessionId) ?? Promise.resolve();
|
|
245
|
+
const run = previous
|
|
246
|
+
.catch(() => undefined)
|
|
247
|
+
.then(() => this.doSaveSessionState(sessionId, sessionStep));
|
|
248
|
+
this.saveQueues.set(sessionId, run);
|
|
249
|
+
try {
|
|
250
|
+
return await run;
|
|
251
|
+
} finally {
|
|
252
|
+
if (this.saveQueues.get(sessionId) === run) {
|
|
253
|
+
this.saveQueues.delete(sessionId);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
private async doSaveSessionState(
|
|
259
|
+
sessionId: string,
|
|
260
|
+
sessionStep: SessionState<TData>
|
|
236
261
|
): Promise<SessionData<TData> | null> {
|
|
237
262
|
// Validate input parameters
|
|
238
263
|
if (!sessionId || typeof sessionId !== 'string') {
|
|
@@ -256,21 +281,31 @@ export class PersistenceManager<TData = Record<string, unknown>> {
|
|
|
256
281
|
throw new Error(`Failed to convert session step to persistence data: ${errorMessage}`);
|
|
257
282
|
}
|
|
258
283
|
|
|
284
|
+
// Stamp the configured schema version so loads can detect stale state
|
|
285
|
+
if (this.config.schemaVersion !== undefined) {
|
|
286
|
+
persistenceData.collectedData.schemaVersion = this.config.schemaVersion;
|
|
287
|
+
}
|
|
288
|
+
|
|
259
289
|
try {
|
|
260
290
|
// First try to find existing session
|
|
261
291
|
const existingSession = await this.sessionRepository.findById(sessionId);
|
|
262
292
|
|
|
293
|
+
let saved: SessionData<TData> | null;
|
|
263
294
|
if (existingSession) {
|
|
264
|
-
//
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
295
|
+
// Compare-and-swap on the session's version: a concurrent writer
|
|
296
|
+
// bumped it since we loaded, the adapter throws SessionConflictError
|
|
297
|
+
saved = await this.sessionRepository.update(
|
|
298
|
+
sessionId,
|
|
299
|
+
{
|
|
300
|
+
currentFlow: persistenceData.currentFlow,
|
|
301
|
+
currentStep: persistenceData.currentStep,
|
|
302
|
+
collectedData: persistenceData.collectedData,
|
|
303
|
+
lastMessageAt: new Date(),
|
|
304
|
+
},
|
|
305
|
+
{ expectedVersion: sessionStep.version }
|
|
306
|
+
);
|
|
271
307
|
} else {
|
|
272
|
-
|
|
273
|
-
return await this.sessionRepository.create({
|
|
308
|
+
saved = await this.sessionRepository.create({
|
|
274
309
|
id: sessionId,
|
|
275
310
|
userId: persistenceData.collectedData.metadata?.userId
|
|
276
311
|
? JSON.stringify(persistenceData.collectedData.metadata?.userId)
|
|
@@ -280,9 +315,21 @@ export class PersistenceManager<TData = Record<string, unknown>> {
|
|
|
280
315
|
currentStep: persistenceData.currentStep,
|
|
281
316
|
collectedData: persistenceData.collectedData,
|
|
282
317
|
messageCount: 0,
|
|
318
|
+
version: 1,
|
|
283
319
|
});
|
|
284
320
|
}
|
|
321
|
+
|
|
322
|
+
// Propagate the new version so the next save of this in-memory session
|
|
323
|
+
// passes the compare-and-swap
|
|
324
|
+
if (saved?.version !== undefined) {
|
|
325
|
+
sessionStep.version = saved.version;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return saved;
|
|
285
329
|
} catch (error) {
|
|
330
|
+
if (error instanceof SessionConflictError) {
|
|
331
|
+
throw error;
|
|
332
|
+
}
|
|
286
333
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
287
334
|
throw new Error(`Failed to save session state to persistence: ${errorMessage}`);
|
|
288
335
|
}
|
|
@@ -301,6 +348,28 @@ export class PersistenceManager<TData = Record<string, unknown>> {
|
|
|
301
348
|
return null;
|
|
302
349
|
}
|
|
303
350
|
|
|
351
|
+
// Upgrade state written under an older user schema before reconstructing
|
|
352
|
+
if (
|
|
353
|
+
this.config.schemaVersion !== undefined &&
|
|
354
|
+
sessionData.collectedData &&
|
|
355
|
+
sessionData.collectedData.schemaVersion !== this.config.schemaVersion
|
|
356
|
+
) {
|
|
357
|
+
const fromVersion = sessionData.collectedData.schemaVersion;
|
|
358
|
+
if (this.config.migrateSession) {
|
|
359
|
+
sessionData.collectedData = await this.config.migrateSession(
|
|
360
|
+
sessionData.collectedData,
|
|
361
|
+
fromVersion
|
|
362
|
+
);
|
|
363
|
+
sessionData.collectedData.schemaVersion = this.config.schemaVersion;
|
|
364
|
+
} else {
|
|
365
|
+
logger.warn(
|
|
366
|
+
`[PersistenceManager] Session "${sessionId}" was written with schemaVersion ` +
|
|
367
|
+
`${fromVersion ?? 'none'} but the agent is configured with ${this.config.schemaVersion}, ` +
|
|
368
|
+
`and no migrateSession is configured. Loading state as-is.`
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
304
373
|
// Reconstruct SessionState from SessionData
|
|
305
374
|
const sessionState = sessionDataToStep<TData>(sessionId, sessionData);
|
|
306
375
|
|
|
@@ -4,6 +4,7 @@ import { render, renderMany, formatKnowledgeBase, createTemplateContext } from "
|
|
|
4
4
|
import { TemplateContext } from "../types/template";
|
|
5
5
|
import { PromptSectionCache } from "./PromptSectionCache";
|
|
6
6
|
import { logger } from "../utils";
|
|
7
|
+
import { splitWhenConditions } from "../utils/condition";
|
|
7
8
|
|
|
8
9
|
export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
9
10
|
private parts: string[] = [];
|
|
@@ -209,10 +210,18 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
|
209
210
|
if (!text) continue;
|
|
210
211
|
|
|
211
212
|
const whenContextStrings = g.when
|
|
212
|
-
? (
|
|
213
|
-
: [];
|
|
214
|
-
const
|
|
215
|
-
|
|
213
|
+
? splitWhenConditions(g.when)
|
|
214
|
+
: { positive: [], negative: [] };
|
|
215
|
+
const conditionParts = [
|
|
216
|
+
whenContextStrings.positive.length > 0
|
|
217
|
+
? `apply only when: ${whenContextStrings.positive.join(" OR ")}`
|
|
218
|
+
: undefined,
|
|
219
|
+
whenContextStrings.negative.length > 0
|
|
220
|
+
? `do not apply when: ${whenContextStrings.negative.join(" OR ")}`
|
|
221
|
+
: undefined,
|
|
222
|
+
].filter((part): part is string => part !== undefined);
|
|
223
|
+
const condition = conditionParts.length > 0
|
|
224
|
+
? ` (${conditionParts.join("; ")})`
|
|
216
225
|
: "";
|
|
217
226
|
|
|
218
227
|
lines.push(`- ${kindPrefix(g.kind)} ${caption} ${text}${condition}`);
|
|
@@ -333,14 +342,18 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
|
333
342
|
|
|
334
343
|
const compute = (): string | null => {
|
|
335
344
|
const renderedFlows = flows.map((r, i) => {
|
|
336
|
-
// v2: `when` is string | string[] (AI-evaluated).
|
|
337
|
-
const whenContextStrings
|
|
338
|
-
? (
|
|
339
|
-
: [];
|
|
340
|
-
const
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
345
|
+
// v2: `when` is string | string[] (AI-evaluated). Split into positives and exclusions.
|
|
346
|
+
const whenContextStrings = r.when
|
|
347
|
+
? splitWhenConditions(r.when)
|
|
348
|
+
: { positive: [], negative: [] };
|
|
349
|
+
const conditionParts: string[] = [];
|
|
350
|
+
if (whenContextStrings.positive.length > 0) {
|
|
351
|
+
conditionParts.push(`\n\n **Triggered when:** ${whenContextStrings.positive.join(" OR ")}`);
|
|
352
|
+
}
|
|
353
|
+
if (whenContextStrings.negative.length > 0) {
|
|
354
|
+
conditionParts.push(`\n\n **Do not trigger when:** ${whenContextStrings.negative.join(" OR ")}`);
|
|
355
|
+
}
|
|
356
|
+
const conditions = conditionParts.join("");
|
|
344
357
|
const desc = r.description
|
|
345
358
|
? `\n\n **Description:** ${r.description}`
|
|
346
359
|
: "";
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error type for response-generation failures, shared by the response
|
|
3
|
+
* coordinator and its collaborators.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Error details for response generation failures
|
|
8
|
+
*/
|
|
9
|
+
interface ResponseGenerationErrorDetails {
|
|
10
|
+
originalError?: unknown;
|
|
11
|
+
params?: Record<string, unknown>;
|
|
12
|
+
phase?: string;
|
|
13
|
+
context?: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Error class for response generation failures
|
|
18
|
+
*/
|
|
19
|
+
export class ResponseGenerationError extends Error {
|
|
20
|
+
constructor(
|
|
21
|
+
message: string,
|
|
22
|
+
public readonly details?: ResponseGenerationErrorDetails
|
|
23
|
+
) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = 'ResponseGenerationError';
|
|
26
|
+
|
|
27
|
+
// Preserve stack trace from original error if available
|
|
28
|
+
if (details?.originalError instanceof Error && details.originalError.stack) {
|
|
29
|
+
this.stack = `${this.stack}\nCaused by: ${details.originalError.stack}`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Create a ResponseGenerationError from an unknown error
|
|
35
|
+
*/
|
|
36
|
+
static fromError(
|
|
37
|
+
error: unknown,
|
|
38
|
+
phase: string,
|
|
39
|
+
params?: Record<string, unknown>,
|
|
40
|
+
context?: Record<string, unknown>
|
|
41
|
+
): ResponseGenerationError {
|
|
42
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
43
|
+
return new ResponseGenerationError(
|
|
44
|
+
`[ResponseGenerationError] Response generation failed in ${phase}: ${message}. ` +
|
|
45
|
+
`Check provider configuration and the ${phase} phase handler.`,
|
|
46
|
+
{ originalError: error, params, phase, context }
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Check if an error is a ResponseGenerationError
|
|
52
|
+
*/
|
|
53
|
+
static isResponseGenerationError(error: unknown): error is ResponseGenerationError {
|
|
54
|
+
return error instanceof ResponseGenerationError;
|
|
55
|
+
}
|
|
56
|
+
}
|