@falai/agent 1.2.8 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -886
- package/dist/adapters/MemoryAdapter.js +2 -2
- package/dist/adapters/MemoryAdapter.js.map +1 -1
- package/dist/adapters/MongoAdapter.js +2 -2
- package/dist/adapters/MongoAdapter.js.map +1 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenSearchAdapter.js +9 -7
- package/dist/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.js +25 -9
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/adapters/PrismaAdapter.js +5 -5
- package/dist/adapters/PrismaAdapter.js.map +1 -1
- package/dist/adapters/RedisAdapter.js +2 -2
- package/dist/adapters/RedisAdapter.js.map +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts +17 -0
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/adapters/SQLiteAdapter.js +30 -11
- package/dist/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.js +2 -2
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.js +2 -2
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.js +5 -5
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.js +2 -2
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/constants/index.d.ts +0 -9
- package/dist/cjs/constants/index.d.ts.map +1 -1
- package/dist/cjs/constants/index.js +2 -11
- package/dist/cjs/constants/index.js.map +1 -1
- package/dist/cjs/core/Agent.d.ts +119 -153
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +471 -324
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
- package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
- package/dist/cjs/core/AutoChainExecutor.js +297 -0
- package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
- package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
- package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
- package/dist/cjs/core/BranchEvaluator.js +130 -0
- package/dist/cjs/core/BranchEvaluator.js.map +1 -0
- package/dist/cjs/core/DirectiveBus.d.ts +88 -0
- package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
- package/dist/cjs/core/DirectiveBus.js +196 -0
- package/dist/cjs/core/DirectiveBus.js.map +1 -0
- package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
- package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
- package/dist/cjs/core/DirectiveChainTracker.js +121 -0
- package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
- package/dist/cjs/core/Flow.d.ts +186 -0
- package/dist/cjs/core/Flow.d.ts.map +1 -0
- package/dist/cjs/core/Flow.js +550 -0
- package/dist/cjs/core/Flow.js.map +1 -0
- package/dist/cjs/core/FlowRouter.d.ts +182 -0
- package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
- package/dist/cjs/core/{RoutingEngine.js → FlowRouter.js} +323 -306
- package/dist/cjs/core/FlowRouter.js.map +1 -0
- package/dist/cjs/core/PersistenceManager.d.ts +2 -2
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
- package/dist/cjs/core/PersistenceManager.js +7 -7
- package/dist/cjs/core/PersistenceManager.js.map +1 -1
- package/dist/cjs/core/PromptComposer.d.ts +21 -8
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
- package/dist/cjs/core/PromptComposer.js +182 -105
- package/dist/cjs/core/PromptComposer.js.map +1 -1
- package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
- package/dist/cjs/core/PromptSectionCache.js +1 -1
- package/dist/cjs/core/ResponseEngine.d.ts +18 -8
- package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +38 -36
- package/dist/cjs/core/ResponseEngine.js.map +1 -1
- package/dist/cjs/core/ResponseModal.d.ts +73 -56
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
- package/dist/cjs/core/ResponseModal.js +1191 -1014
- package/dist/cjs/core/ResponseModal.js.map +1 -1
- package/dist/cjs/core/ResponsePipeline.d.ts +124 -26
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/cjs/core/ResponsePipeline.js +509 -136
- package/dist/cjs/core/ResponsePipeline.js.map +1 -1
- package/dist/cjs/core/SignalEvaluator.d.ts +86 -0
- package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -0
- package/dist/cjs/core/SignalEvaluator.js +333 -0
- package/dist/cjs/core/SignalEvaluator.js.map +1 -0
- package/dist/cjs/core/SignalProcessor.d.ts +152 -0
- package/dist/cjs/core/SignalProcessor.d.ts.map +1 -0
- package/dist/cjs/core/SignalProcessor.js +562 -0
- package/dist/cjs/core/SignalProcessor.js.map +1 -0
- package/dist/cjs/core/Step.d.ts +43 -32
- package/dist/cjs/core/Step.d.ts.map +1 -1
- package/dist/cjs/core/Step.js +221 -126
- package/dist/cjs/core/Step.js.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.d.ts +2 -2
- package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
- package/dist/cjs/core/ToolManager.d.ts +44 -13
- package/dist/cjs/core/ToolManager.d.ts.map +1 -1
- package/dist/cjs/core/ToolManager.js +174 -91
- package/dist/cjs/core/ToolManager.js.map +1 -1
- package/dist/cjs/core/createAgent.d.ts +35 -0
- package/dist/cjs/core/createAgent.d.ts.map +1 -0
- package/dist/cjs/core/createAgent.js +39 -0
- package/dist/cjs/core/createAgent.js.map +1 -0
- package/dist/cjs/core/flow-namespace.d.ts +49 -0
- package/dist/cjs/core/flow-namespace.d.ts.map +1 -0
- package/dist/cjs/core/flow-namespace.js +171 -0
- package/dist/cjs/core/flow-namespace.js.map +1 -0
- package/dist/cjs/index.d.ts +11 -14
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +18 -22
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts +1 -1
- package/dist/cjs/providers/AnthropicProvider.js +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +1 -1
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.js +1 -1
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +183 -54
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/agent.js +0 -6
- package/dist/cjs/types/agent.js.map +1 -1
- package/dist/cjs/types/ai.d.ts +3 -3
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/errors.d.ts +15 -0
- package/dist/cjs/types/errors.d.ts.map +1 -0
- package/dist/cjs/types/errors.js +22 -0
- package/dist/cjs/types/errors.js.map +1 -0
- package/dist/cjs/types/flow.d.ts +513 -0
- package/dist/cjs/types/flow.d.ts.map +1 -0
- package/dist/cjs/types/{route.js → flow.js} +2 -2
- package/dist/cjs/types/flow.js.map +1 -0
- package/dist/cjs/types/index.d.ts +7 -6
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js +6 -2
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/persistence.d.ts +11 -7
- package/dist/cjs/types/persistence.d.ts.map +1 -1
- package/dist/cjs/types/routing.d.ts +1 -1
- package/dist/cjs/types/routing.d.ts.map +1 -1
- package/dist/cjs/types/session.d.ts +24 -23
- package/dist/cjs/types/session.d.ts.map +1 -1
- package/dist/cjs/types/signals.d.ts +248 -0
- package/dist/cjs/types/signals.d.ts.map +1 -0
- package/dist/cjs/types/signals.js +11 -0
- package/dist/cjs/types/signals.js.map +1 -0
- package/dist/cjs/types/template.d.ts +2 -8
- package/dist/cjs/types/template.d.ts.map +1 -1
- package/dist/cjs/types/tool.d.ts +36 -29
- package/dist/cjs/types/tool.d.ts.map +1 -1
- package/dist/cjs/types/tool.js +1 -1
- package/dist/cjs/types/tool.js.map +1 -1
- package/dist/cjs/utils/condition.d.ts +7 -1
- package/dist/cjs/utils/condition.d.ts.map +1 -1
- package/dist/cjs/utils/condition.js.map +1 -1
- package/dist/cjs/utils/id.d.ts +13 -5
- package/dist/cjs/utils/id.d.ts.map +1 -1
- package/dist/cjs/utils/id.js +24 -10
- package/dist/cjs/utils/id.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +2 -2
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +7 -3
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/session.d.ts +44 -5
- package/dist/cjs/utils/session.d.ts.map +1 -1
- package/dist/cjs/utils/session.js +197 -38
- package/dist/cjs/utils/session.js.map +1 -1
- package/dist/constants/index.d.ts +0 -9
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +3 -9
- package/dist/constants/index.js.map +1 -1
- package/dist/core/Agent.d.ts +119 -153
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +472 -325
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/AutoChainExecutor.d.ts +107 -0
- package/dist/core/AutoChainExecutor.d.ts.map +1 -0
- package/dist/core/AutoChainExecutor.js +293 -0
- package/dist/core/AutoChainExecutor.js.map +1 -0
- package/dist/core/BranchEvaluator.d.ts +54 -0
- package/dist/core/BranchEvaluator.d.ts.map +1 -0
- package/dist/core/BranchEvaluator.js +126 -0
- package/dist/core/BranchEvaluator.js.map +1 -0
- package/dist/core/DirectiveBus.d.ts +88 -0
- package/dist/core/DirectiveBus.d.ts.map +1 -0
- package/dist/core/DirectiveBus.js +192 -0
- package/dist/core/DirectiveBus.js.map +1 -0
- package/dist/core/DirectiveChainTracker.d.ts +49 -0
- package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
- package/dist/core/DirectiveChainTracker.js +117 -0
- package/dist/core/DirectiveChainTracker.js.map +1 -0
- package/dist/core/Flow.d.ts +186 -0
- package/dist/core/Flow.d.ts.map +1 -0
- package/dist/core/Flow.js +546 -0
- package/dist/core/Flow.js.map +1 -0
- package/dist/core/FlowRouter.d.ts +182 -0
- package/dist/core/FlowRouter.d.ts.map +1 -0
- package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
- package/dist/core/FlowRouter.js.map +1 -0
- package/dist/core/PersistenceManager.d.ts +2 -2
- package/dist/core/PersistenceManager.d.ts.map +1 -1
- package/dist/core/PersistenceManager.js +7 -7
- package/dist/core/PersistenceManager.js.map +1 -1
- package/dist/core/PromptComposer.d.ts +21 -8
- package/dist/core/PromptComposer.d.ts.map +1 -1
- package/dist/core/PromptComposer.js +183 -106
- package/dist/core/PromptComposer.js.map +1 -1
- package/dist/core/PromptSectionCache.d.ts +1 -1
- package/dist/core/PromptSectionCache.js +1 -1
- package/dist/core/ResponseEngine.d.ts +18 -8
- package/dist/core/ResponseEngine.d.ts.map +1 -1
- package/dist/core/ResponseEngine.js +38 -36
- package/dist/core/ResponseEngine.js.map +1 -1
- package/dist/core/ResponseModal.d.ts +73 -56
- package/dist/core/ResponseModal.d.ts.map +1 -1
- package/dist/core/ResponseModal.js +1193 -1016
- package/dist/core/ResponseModal.js.map +1 -1
- package/dist/core/ResponsePipeline.d.ts +124 -26
- package/dist/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/core/ResponsePipeline.js +509 -137
- package/dist/core/ResponsePipeline.js.map +1 -1
- package/dist/core/SignalEvaluator.d.ts +86 -0
- package/dist/core/SignalEvaluator.d.ts.map +1 -0
- package/dist/core/SignalEvaluator.js +326 -0
- package/dist/core/SignalEvaluator.js.map +1 -0
- package/dist/core/SignalProcessor.d.ts +152 -0
- package/dist/core/SignalProcessor.d.ts.map +1 -0
- package/dist/core/SignalProcessor.js +555 -0
- package/dist/core/SignalProcessor.js.map +1 -0
- package/dist/core/Step.d.ts +43 -32
- package/dist/core/Step.d.ts.map +1 -1
- package/dist/core/Step.js +220 -126
- package/dist/core/Step.js.map +1 -1
- package/dist/core/StreamingToolExecutor.d.ts +2 -2
- package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/core/StreamingToolExecutor.js.map +1 -1
- package/dist/core/ToolManager.d.ts +44 -13
- package/dist/core/ToolManager.d.ts.map +1 -1
- package/dist/core/ToolManager.js +174 -91
- package/dist/core/ToolManager.js.map +1 -1
- package/dist/core/createAgent.d.ts +35 -0
- package/dist/core/createAgent.d.ts.map +1 -0
- package/dist/core/createAgent.js +36 -0
- package/dist/core/createAgent.js.map +1 -0
- package/dist/core/flow-namespace.d.ts +49 -0
- package/dist/core/flow-namespace.d.ts.map +1 -0
- package/dist/core/flow-namespace.js +168 -0
- package/dist/core/flow-namespace.js.map +1 -0
- package/dist/index.d.ts +11 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -12
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts +1 -1
- package/dist/providers/AnthropicProvider.js +1 -1
- package/dist/providers/GeminiProvider.d.ts +1 -1
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +1 -1
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/OpenAIProvider.d.ts +1 -1
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +1 -1
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/types/agent.d.ts +183 -54
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js +0 -6
- package/dist/types/agent.js.map +1 -1
- package/dist/types/ai.d.ts +3 -3
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/errors.d.ts +15 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +18 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/flow.d.ts +513 -0
- package/dist/types/flow.d.ts.map +1 -0
- package/dist/types/flow.js +5 -0
- package/dist/types/flow.js.map +1 -0
- package/dist/types/index.d.ts +7 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/persistence.d.ts +11 -7
- package/dist/types/persistence.d.ts.map +1 -1
- package/dist/types/routing.d.ts +1 -1
- package/dist/types/routing.d.ts.map +1 -1
- package/dist/types/session.d.ts +24 -23
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/signals.d.ts +248 -0
- package/dist/types/signals.d.ts.map +1 -0
- package/dist/types/signals.js +10 -0
- package/dist/types/signals.js.map +1 -0
- package/dist/types/template.d.ts +2 -8
- package/dist/types/template.d.ts.map +1 -1
- package/dist/types/tool.d.ts +36 -29
- package/dist/types/tool.d.ts.map +1 -1
- package/dist/types/tool.js +1 -1
- package/dist/types/tool.js.map +1 -1
- package/dist/utils/condition.d.ts +7 -1
- package/dist/utils/condition.d.ts.map +1 -1
- package/dist/utils/condition.js.map +1 -1
- package/dist/utils/id.d.ts +13 -5
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +22 -9
- package/dist/utils/id.js.map +1 -1
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/session.d.ts +44 -5
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +193 -37
- package/dist/utils/session.js.map +1 -1
- package/docs/README.md +22 -200
- package/docs/concepts/architecture.md +281 -0
- package/docs/concepts/directives.md +400 -0
- package/docs/concepts/pipeline.md +399 -0
- package/docs/guides/branching.md +263 -0
- package/docs/guides/compaction.md +163 -0
- package/docs/guides/conditions.md +167 -0
- package/docs/guides/error-handling.md +176 -0
- package/docs/guides/flow-control.md +409 -0
- package/docs/guides/instructions.md +210 -0
- package/docs/guides/persistence.md +182 -0
- package/docs/guides/streaming.md +137 -0
- package/docs/migration/README.md +14 -0
- package/docs/migration/route-to-flow.md +561 -0
- package/docs/migration/v1-to-v2.md +909 -0
- package/docs/reference/adapters.md +481 -0
- package/docs/reference/branches.md +241 -0
- package/docs/reference/create-agent.md +186 -0
- package/docs/reference/directive.md +243 -0
- package/docs/reference/errors.md +122 -0
- package/docs/reference/flow.md +238 -0
- package/docs/reference/instruction.md +177 -0
- package/docs/reference/pre-directive.md +131 -0
- package/docs/reference/providers.md +227 -0
- package/docs/reference/signals.md +356 -0
- package/docs/reference/step.md +339 -0
- package/docs/reference/tool.md +269 -0
- package/docs/start/01-install.md +81 -0
- package/docs/start/02-first-agent.md +196 -0
- package/docs/start/03-collect-data.md +222 -0
- package/docs/start/04-add-tools.md +276 -0
- package/docs/start/05-go-to-production.md +216 -0
- package/examples/01-quickstart.ts +20 -0
- package/examples/02-data-extraction.ts +90 -0
- package/examples/03-tools.ts +136 -0
- package/examples/04-instructions.ts +100 -0
- package/examples/05-branching.ts +140 -0
- package/examples/06-flow-control.ts +103 -0
- package/examples/07-streaming.ts +69 -0
- package/examples/08-persistence.ts +98 -0
- package/examples/09-signals.ts +144 -0
- package/examples/tsconfig.json +30 -0
- package/package.json +2 -1
- package/src/adapters/MemoryAdapter.ts +3 -3
- package/src/adapters/MongoAdapter.ts +3 -3
- package/src/adapters/OpenSearchAdapter.ts +10 -8
- package/src/adapters/PostgreSQLAdapter.ts +26 -10
- package/src/adapters/PrismaAdapter.ts +6 -6
- package/src/adapters/RedisAdapter.ts +3 -3
- package/src/adapters/SQLiteAdapter.ts +31 -12
- package/src/constants/index.ts +2 -10
- package/src/core/Agent.ts +585 -374
- package/src/core/AutoChainExecutor.ts +440 -0
- package/src/core/BranchEvaluator.ts +167 -0
- package/src/core/DirectiveBus.ts +248 -0
- package/src/core/DirectiveChainTracker.ts +144 -0
- package/src/core/Flow.ts +666 -0
- package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
- package/src/core/PersistenceManager.ts +8 -8
- package/src/core/PromptComposer.ts +209 -140
- package/src/core/PromptSectionCache.ts +1 -1
- package/src/core/ResponseEngine.ts +61 -46
- package/src/core/ResponseModal.ts +1453 -1240
- package/src/core/ResponsePipeline.ts +655 -175
- package/src/core/SignalEvaluator.ts +420 -0
- package/src/core/SignalProcessor.ts +723 -0
- package/src/core/Step.ts +279 -176
- package/src/core/StreamingToolExecutor.ts +4 -4
- package/src/core/ToolManager.ts +200 -97
- package/src/core/createAgent.ts +40 -0
- package/src/core/flow-namespace.ts +219 -0
- package/src/index.ts +42 -36
- package/src/providers/AnthropicProvider.ts +2 -2
- package/src/providers/GeminiProvider.ts +2 -2
- package/src/providers/OpenAIProvider.ts +2 -2
- package/src/types/agent.ts +182 -53
- package/src/types/ai.ts +3 -3
- package/src/types/errors.ts +18 -0
- package/src/types/flow.ts +590 -0
- package/src/types/index.ts +43 -16
- package/src/types/persistence.ts +12 -8
- package/src/types/routing.ts +1 -1
- package/src/types/session.ts +26 -23
- package/src/types/signals.ts +321 -0
- package/src/types/template.ts +3 -11
- package/src/types/tool.ts +50 -42
- package/src/utils/condition.ts +13 -4
- package/src/utils/id.ts +27 -9
- package/src/utils/index.ts +6 -2
- package/src/utils/session.ts +238 -42
- package/dist/cjs/core/BatchExecutor.d.ts +0 -359
- package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
- package/dist/cjs/core/BatchExecutor.js +0 -861
- package/dist/cjs/core/BatchExecutor.js.map +0 -1
- package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
- package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
- package/dist/cjs/core/BatchPromptBuilder.js +0 -223
- package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
- package/dist/cjs/core/Route.d.ts +0 -180
- package/dist/cjs/core/Route.d.ts.map +0 -1
- package/dist/cjs/core/Route.js +0 -542
- package/dist/cjs/core/Route.js.map +0 -1
- package/dist/cjs/core/RoutingEngine.d.ts +0 -185
- package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/types/route.d.ts +0 -336
- package/dist/cjs/types/route.d.ts.map +0 -1
- package/dist/cjs/types/route.js.map +0 -1
- package/dist/core/BatchExecutor.d.ts +0 -359
- package/dist/core/BatchExecutor.d.ts.map +0 -1
- package/dist/core/BatchExecutor.js +0 -856
- package/dist/core/BatchExecutor.js.map +0 -1
- package/dist/core/BatchPromptBuilder.d.ts +0 -89
- package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
- package/dist/core/BatchPromptBuilder.js +0 -219
- package/dist/core/BatchPromptBuilder.js.map +0 -1
- package/dist/core/Route.d.ts +0 -180
- package/dist/core/Route.d.ts.map +0 -1
- package/dist/core/Route.js +0 -538
- package/dist/core/Route.js.map +0 -1
- package/dist/core/RoutingEngine.d.ts +0 -185
- package/dist/core/RoutingEngine.d.ts.map +0 -1
- package/dist/core/RoutingEngine.js.map +0 -1
- package/dist/types/route.d.ts +0 -336
- package/dist/types/route.d.ts.map +0 -1
- package/dist/types/route.js +0 -5
- package/dist/types/route.js.map +0 -1
- package/docs/CONTRIBUTING.md +0 -521
- package/docs/api/README.md +0 -3299
- package/docs/api/overview.md +0 -1410
- package/docs/architecture/data-extraction-flow.md +0 -360
- package/docs/architecture/multi-step-execution.md +0 -277
- package/docs/core/agent/README.md +0 -938
- package/docs/core/agent/context-management.md +0 -796
- package/docs/core/agent/rules-and-prohibitions.md +0 -113
- package/docs/core/agent/session-management.md +0 -693
- package/docs/core/ai-integration/prompt-composition.md +0 -355
- package/docs/core/ai-integration/providers.md +0 -515
- package/docs/core/ai-integration/response-processing.md +0 -433
- package/docs/core/conversation-flows/data-collection.md +0 -772
- package/docs/core/conversation-flows/route-dsl.md +0 -509
- package/docs/core/conversation-flows/routes.md +0 -249
- package/docs/core/conversation-flows/step-transitions.md +0 -731
- package/docs/core/conversation-flows/steps.md +0 -268
- package/docs/core/error-handling.md +0 -830
- package/docs/core/persistence/adapters.md +0 -255
- package/docs/core/persistence/session-storage.md +0 -656
- package/docs/core/routing/intelligent-routing.md +0 -470
- package/docs/core/tools/enhanced-tool.md +0 -186
- package/docs/core/tools/streaming-execution.md +0 -161
- package/docs/core/tools/tool-definition.md +0 -970
- package/docs/core/tools/tool-scoping.md +0 -819
- package/docs/guides/advanced-patterns/publishing.md +0 -186
- package/docs/guides/context-compaction.md +0 -96
- package/docs/guides/error-handling-patterns.md +0 -578
- package/docs/guides/getting-started/README.md +0 -795
- package/docs/guides/migration/README.md +0 -101
- package/docs/guides/migration/flexible-routing-conditions.md +0 -375
- package/docs/guides/migration/multi-step-execution.md +0 -393
- package/docs/guides/migration/response-modal-refactor.md +0 -518
- package/docs/guides/prompt-optimization.md +0 -164
- package/examples/advanced-patterns/context-compaction.ts +0 -223
- package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
- package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
- package/examples/advanced-patterns/streaming-responses.ts +0 -656
- package/examples/ai-providers/anthropic-integration.ts +0 -388
- package/examples/ai-providers/openai-integration.ts +0 -228
- package/examples/condition-patterns/function-only-conditions.ts +0 -365
- package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
- package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
- package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
- package/examples/condition-patterns/string-only-conditions.ts +0 -296
- package/examples/conversation-flows/completion-transitions.ts +0 -318
- package/examples/core-concepts/basic-agent.ts +0 -503
- package/examples/core-concepts/modern-streaming-api.ts +0 -309
- package/examples/core-concepts/schema-driven-extraction.ts +0 -332
- package/examples/core-concepts/session-management.ts +0 -494
- package/examples/integrations/database-integration.ts +0 -631
- package/examples/integrations/healthcare-integration.ts +0 -595
- package/examples/integrations/search-integration.ts +0 -530
- package/examples/integrations/server-session-management.ts +0 -307
- package/examples/persistence/custom-adapter.ts +0 -526
- package/examples/persistence/database-persistence.ts +0 -583
- package/examples/persistence/memory-sessions.ts +0 -495
- package/examples/persistence/prisma-schema.example.prisma +0 -74
- package/examples/persistence/redis-persistence.ts +0 -488
- package/examples/tools/basic-tools.ts +0 -765
- package/examples/tools/data-enrichment-tools.ts +0 -593
- package/examples/tools/enhanced-tool-metadata.ts +0 -268
- package/examples/tools/streaming-tool-execution.ts +0 -283
- package/src/core/BatchExecutor.ts +0 -1187
- package/src/core/BatchPromptBuilder.ts +0 -299
- package/src/core/Route.ts +0 -678
- package/src/types/route.ts +0 -392
package/src/utils/condition.ts
CHANGED
|
@@ -1,14 +1,23 @@
|
|
|
1
|
-
import type { TemplateContext,
|
|
1
|
+
import type { TemplateContext, ConditionEvaluationResult } from "../types/template";
|
|
2
2
|
import { createTemplateContext } from "./template";
|
|
3
3
|
import { logger } from './logger'
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Condition template — kept as a private type for internal use by the evaluator.
|
|
7
|
+
* Removed from the public surface in v2.
|
|
8
|
+
*/
|
|
9
|
+
type ConditionTemplate<TContext = unknown, TData = unknown> =
|
|
10
|
+
| string
|
|
11
|
+
| ((params: TemplateContext<TContext, TData>) => boolean | Promise<boolean>)
|
|
12
|
+
| ConditionTemplate<TContext, TData>[];
|
|
13
|
+
|
|
5
14
|
/**
|
|
6
15
|
* Utility class for evaluating ConditionTemplate instances.
|
|
7
16
|
* Handles mixed string/function conditions and separates programmatic
|
|
8
17
|
* evaluation from AI context collection.
|
|
9
18
|
*/
|
|
10
19
|
export class ConditionEvaluator<TContext = unknown, TData = unknown> {
|
|
11
|
-
constructor(private templateContext: TemplateContext<TContext, TData>) {}
|
|
20
|
+
constructor(private templateContext: TemplateContext<TContext, TData>) { }
|
|
12
21
|
|
|
13
22
|
/**
|
|
14
23
|
* Evaluates a condition template and returns both programmatic results
|
|
@@ -102,10 +111,10 @@ export class ConditionEvaluator<TContext = unknown, TData = unknown> {
|
|
|
102
111
|
|
|
103
112
|
for (const condition of conditions) {
|
|
104
113
|
const conditionResult = await this.evaluateCondition(condition, logic);
|
|
105
|
-
|
|
114
|
+
|
|
106
115
|
// Collect AI context strings
|
|
107
116
|
result.aiContextStrings.push(...conditionResult.aiContextStrings);
|
|
108
|
-
|
|
117
|
+
|
|
109
118
|
// Track if we have programmatic conditions
|
|
110
119
|
if (conditionResult.hasProgrammaticConditions) {
|
|
111
120
|
result.hasProgrammaticConditions = true;
|
package/src/utils/id.ts
CHANGED
|
@@ -25,32 +25,32 @@ function sanitize(str: string): string {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
|
-
* Generate a deterministic
|
|
29
|
-
* Format:
|
|
28
|
+
* Generate a deterministic flow ID
|
|
29
|
+
* Format: flow_{sanitized_title}_{hash}
|
|
30
30
|
*/
|
|
31
|
-
export function
|
|
31
|
+
export function generateFlowId(title: string): string {
|
|
32
32
|
const sanitized = sanitize(title);
|
|
33
33
|
const hash = simpleHash(title);
|
|
34
|
-
return `
|
|
34
|
+
return `flow_${sanitized}_${hash}`;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
/**
|
|
38
38
|
* Generate a deterministic step ID
|
|
39
|
-
* Format: step_{sanitized_description}_{hash} or step_{
|
|
39
|
+
* Format: step_{sanitized_description}_{hash} or step_{flowId}_{index}
|
|
40
40
|
*/
|
|
41
41
|
export function generateStepId(
|
|
42
|
-
|
|
42
|
+
flowId: string,
|
|
43
43
|
description?: string,
|
|
44
44
|
index?: number
|
|
45
45
|
): string {
|
|
46
46
|
if (description) {
|
|
47
47
|
const sanitized = sanitize(description);
|
|
48
|
-
const hash = simpleHash(`${
|
|
48
|
+
const hash = simpleHash(`${flowId}_${description}`);
|
|
49
49
|
return `step_${sanitized}_${hash}`;
|
|
50
50
|
}
|
|
51
51
|
// Fallback for steps without descriptions
|
|
52
|
-
const suffix = index !== undefined ? index : simpleHash(
|
|
53
|
-
return `step_${
|
|
52
|
+
const suffix = index !== undefined ? index : simpleHash(flowId);
|
|
53
|
+
return `step_${flowId}_${suffix}`;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
/**
|
|
@@ -71,3 +71,21 @@ export function generateInlineToolId(stepId: string): string {
|
|
|
71
71
|
const hash = simpleHash(`${stepId}_inline_tool`);
|
|
72
72
|
return `tool_inline_${stepId}_${hash}`;
|
|
73
73
|
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Generate a deterministic signal ID.
|
|
77
|
+
* Format: signal_{sanitized}_{hash}
|
|
78
|
+
*
|
|
79
|
+
* Uses a combination of the signal's title/description/index to produce
|
|
80
|
+
* a stable id that is deterministic within a session (same inputs → same id).
|
|
81
|
+
*/
|
|
82
|
+
export function generateSignalId(
|
|
83
|
+
title?: string,
|
|
84
|
+
description?: string,
|
|
85
|
+
index?: number
|
|
86
|
+
): string {
|
|
87
|
+
const seed = title || description || `signal_${index ?? 0}`;
|
|
88
|
+
const sanitized = sanitize(seed);
|
|
89
|
+
const hash = simpleHash(`signal_${seed}_${index ?? 0}`);
|
|
90
|
+
return `signal_${sanitized}_${hash}`;
|
|
91
|
+
}
|
package/src/utils/index.ts
CHANGED
|
@@ -4,18 +4,22 @@
|
|
|
4
4
|
|
|
5
5
|
// ID generation
|
|
6
6
|
export {
|
|
7
|
-
|
|
7
|
+
generateFlowId,
|
|
8
8
|
generateStepId,
|
|
9
9
|
generateToolId,
|
|
10
10
|
generateInlineToolId,
|
|
11
|
+
generateSignalId,
|
|
11
12
|
} from "./id";
|
|
12
13
|
|
|
13
14
|
// Session management
|
|
14
15
|
export {
|
|
15
16
|
createSession,
|
|
16
17
|
createSessionId,
|
|
17
|
-
|
|
18
|
+
createPersistedState,
|
|
19
|
+
enterFlow,
|
|
18
20
|
enterStep,
|
|
21
|
+
completeCurrentFlow,
|
|
22
|
+
isFlowCompletedThisSession,
|
|
19
23
|
mergeCollected,
|
|
20
24
|
sessionStepToData,
|
|
21
25
|
sessionDataToStep,
|
package/src/utils/session.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { cloneDeep } from "./clone";
|
|
2
2
|
import type { SessionState } from "../types/session";
|
|
3
|
+
import type { Directive } from "../types/flow";
|
|
3
4
|
import type { CollectedStateData } from "../types/persistence";
|
|
5
|
+
import { logger } from "./logger";
|
|
4
6
|
|
|
5
7
|
/**
|
|
6
8
|
* Helper to create a new session
|
|
@@ -34,10 +36,11 @@ export function createSession<TData = Record<string, unknown>>(
|
|
|
34
36
|
return {
|
|
35
37
|
id,
|
|
36
38
|
data: state.data ?? ({} as Partial<TData>),
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
flowHistory: state.flowHistory ?? [],
|
|
40
|
+
currentFlow: state.currentFlow,
|
|
39
41
|
currentStep: state.currentStep,
|
|
40
|
-
|
|
42
|
+
pendingDirective: state.pendingDirective,
|
|
43
|
+
signals: state.signals,
|
|
41
44
|
history: state.history,
|
|
42
45
|
metadata: {
|
|
43
46
|
createdAt: now,
|
|
@@ -55,7 +58,7 @@ export function createSession<TData = Record<string, unknown>>(
|
|
|
55
58
|
return {
|
|
56
59
|
id,
|
|
57
60
|
data: {} as Partial<TData>,
|
|
58
|
-
|
|
61
|
+
flowHistory: [],
|
|
59
62
|
metadata: {
|
|
60
63
|
...metadata,
|
|
61
64
|
createdAt: new Date(),
|
|
@@ -80,40 +83,40 @@ export function cloneSession<TData>(
|
|
|
80
83
|
}
|
|
81
84
|
|
|
82
85
|
/**
|
|
83
|
-
* Helper to update session with new
|
|
84
|
-
* With agent-level data,
|
|
86
|
+
* Helper to update session with new flow
|
|
87
|
+
* With agent-level data, flows share the same data structure
|
|
85
88
|
*/
|
|
86
|
-
export function
|
|
89
|
+
export function enterFlow<TData = Record<string, unknown>>(
|
|
87
90
|
session: SessionState<TData>,
|
|
88
|
-
|
|
89
|
-
|
|
91
|
+
flowId: string,
|
|
92
|
+
flowTitle: string
|
|
90
93
|
): SessionState<TData> {
|
|
91
|
-
// Exit current
|
|
92
|
-
const
|
|
93
|
-
if (session.
|
|
94
|
-
const
|
|
95
|
-
(r) => r.
|
|
94
|
+
// Exit current flow if exists
|
|
95
|
+
const flowHistory = [...(session.flowHistory || [])];
|
|
96
|
+
if (session.currentFlow) {
|
|
97
|
+
const lastFlowIndex = flowHistory.findIndex(
|
|
98
|
+
(r) => r.flowId === session.currentFlow?.id && !r.exitedAt
|
|
96
99
|
);
|
|
97
|
-
if (
|
|
98
|
-
|
|
100
|
+
if (lastFlowIndex >= 0) {
|
|
101
|
+
flowHistory[lastFlowIndex].exitedAt = new Date();
|
|
99
102
|
}
|
|
100
103
|
}
|
|
101
104
|
|
|
102
|
-
// Enter new
|
|
105
|
+
// Enter new flow - data persists across flows at agent level
|
|
103
106
|
const now = new Date();
|
|
104
107
|
return {
|
|
105
108
|
...session,
|
|
106
|
-
|
|
107
|
-
id:
|
|
108
|
-
title:
|
|
109
|
+
currentFlow: {
|
|
110
|
+
id: flowId,
|
|
111
|
+
title: flowTitle,
|
|
109
112
|
enteredAt: now,
|
|
110
113
|
},
|
|
111
114
|
currentStep: undefined,
|
|
112
|
-
// data remains the same - shared across all
|
|
113
|
-
|
|
114
|
-
...
|
|
115
|
+
// data remains the same - shared across all flows
|
|
116
|
+
flowHistory: [
|
|
117
|
+
...flowHistory,
|
|
115
118
|
{
|
|
116
|
-
|
|
119
|
+
flowId: flowId,
|
|
117
120
|
enteredAt: now,
|
|
118
121
|
completed: false,
|
|
119
122
|
},
|
|
@@ -147,6 +150,84 @@ export function enterStep<TData = Record<string, unknown>>(
|
|
|
147
150
|
};
|
|
148
151
|
}
|
|
149
152
|
|
|
153
|
+
/**
|
|
154
|
+
* Helper to release the session to idle state on flow completion.
|
|
155
|
+
*
|
|
156
|
+
* Marks the active flow's `flowHistory` entry as completed (sets
|
|
157
|
+
* `completed: true` and `exitedAt: <now>`), clears `currentFlow` and
|
|
158
|
+
* `currentStep`, and (when `clearOwnedFields` is provided) removes those
|
|
159
|
+
* fields from `session.data` to support `flow.reentrant` re-entry.
|
|
160
|
+
*
|
|
161
|
+
* Does **not** generate any message, copy, or LLM call. The framework
|
|
162
|
+
* speaks no text of its own at the completion boundary — the developer
|
|
163
|
+
* controls every word emitted to the user via flow steps.
|
|
164
|
+
*/
|
|
165
|
+
export function completeCurrentFlow<TData = Record<string, unknown>>(
|
|
166
|
+
session: SessionState<TData>,
|
|
167
|
+
options?: { clearOwnedFields?: ReadonlyArray<keyof TData> }
|
|
168
|
+
): SessionState<TData> {
|
|
169
|
+
const now = new Date();
|
|
170
|
+
const flowHistory = [...(session.flowHistory || [])];
|
|
171
|
+
|
|
172
|
+
if (session.currentFlow) {
|
|
173
|
+
const lastFlowIndex = flowHistory.findIndex(
|
|
174
|
+
(entry) => entry.flowId === session.currentFlow?.id && !entry.exitedAt
|
|
175
|
+
);
|
|
176
|
+
if (lastFlowIndex >= 0) {
|
|
177
|
+
flowHistory[lastFlowIndex] = {
|
|
178
|
+
...flowHistory[lastFlowIndex],
|
|
179
|
+
exitedAt: now,
|
|
180
|
+
completed: true,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
let nextData = session.data;
|
|
186
|
+
if (options?.clearOwnedFields && options.clearOwnedFields.length > 0) {
|
|
187
|
+
const owned = new Set<keyof TData>(options.clearOwnedFields);
|
|
188
|
+
const filtered: Partial<TData> = {};
|
|
189
|
+
for (const key of Object.keys(session.data ?? {}) as (keyof TData)[]) {
|
|
190
|
+
if (!owned.has(key)) {
|
|
191
|
+
(filtered as Record<keyof TData, unknown>)[key] =
|
|
192
|
+
(session.data as Record<keyof TData, unknown>)[key];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
nextData = filtered;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return {
|
|
199
|
+
...session,
|
|
200
|
+
currentFlow: undefined,
|
|
201
|
+
currentStep: undefined,
|
|
202
|
+
flowHistory,
|
|
203
|
+
data: nextData,
|
|
204
|
+
metadata: {
|
|
205
|
+
...session.metadata,
|
|
206
|
+
lastUpdatedAt: now,
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Returns true when the given flow id has a most-recent `flowHistory`
|
|
213
|
+
* entry marked as completed within this session. Used by the router to
|
|
214
|
+
* exclude completed flows from candidate scoring (unless the flow is
|
|
215
|
+
* `reentrant`).
|
|
216
|
+
*/
|
|
217
|
+
export function isFlowCompletedThisSession<TData = Record<string, unknown>>(
|
|
218
|
+
session: SessionState<TData>,
|
|
219
|
+
flowId: string
|
|
220
|
+
): boolean {
|
|
221
|
+
const history = session.flowHistory ?? [];
|
|
222
|
+
for (let i = history.length - 1; i >= 0; i--) {
|
|
223
|
+
const entry = history[i];
|
|
224
|
+
if (entry.flowId === flowId) {
|
|
225
|
+
return entry.completed === true;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
|
|
150
231
|
/**
|
|
151
232
|
* Helper to merge collected data into session
|
|
152
233
|
* Updates agent-level data structure
|
|
@@ -177,21 +258,39 @@ export function mergeCollected<TData = Record<string, unknown>>(
|
|
|
177
258
|
export function sessionStepToData<TData = Record<string, unknown>>(
|
|
178
259
|
session: SessionState<TData>
|
|
179
260
|
): {
|
|
180
|
-
|
|
261
|
+
currentFlow?: string;
|
|
181
262
|
currentStep?: string;
|
|
182
263
|
collectedData: CollectedStateData<TData>;
|
|
183
264
|
} {
|
|
265
|
+
// Strip PreDirective fields before persisting pendingDirective
|
|
266
|
+
let pendingDirective: SessionState<TData>["pendingDirective"] | undefined;
|
|
267
|
+
if (session.pendingDirective) {
|
|
268
|
+
pendingDirective = stripPreDirectiveFields(session.pendingDirective);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const collectedData: CollectedStateData<TData> = {
|
|
272
|
+
data: session.data || {},
|
|
273
|
+
flowHistory: session.flowHistory,
|
|
274
|
+
history: session.history,
|
|
275
|
+
currentFlowTitle: session.currentFlow?.title,
|
|
276
|
+
currentStepDescription: session.currentStep?.description,
|
|
277
|
+
metadata: session.metadata,
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
// Only include pendingDirective when defined (omit key when undefined)
|
|
281
|
+
if (pendingDirective !== undefined) {
|
|
282
|
+
collectedData.pendingDirective = pendingDirective;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Pass through signals bit-identical (reserved for v2.x)
|
|
286
|
+
if (session.signals !== undefined) {
|
|
287
|
+
collectedData.signals = session.signals;
|
|
288
|
+
}
|
|
289
|
+
|
|
184
290
|
return {
|
|
185
|
-
|
|
291
|
+
currentFlow: session.currentFlow?.id,
|
|
186
292
|
currentStep: session.currentStep?.id,
|
|
187
|
-
collectedData
|
|
188
|
-
data: session.data || {},
|
|
189
|
-
routeHistory: session.routeHistory,
|
|
190
|
-
history: session.history, // Include conversation history
|
|
191
|
-
currentRouteTitle: session.currentRoute?.title,
|
|
192
|
-
currentStepDescription: session.currentStep?.description,
|
|
193
|
-
metadata: session.metadata,
|
|
194
|
-
},
|
|
293
|
+
collectedData,
|
|
195
294
|
};
|
|
196
295
|
}
|
|
197
296
|
|
|
@@ -204,26 +303,26 @@ export function sessionStepToData<TData = Record<string, unknown>>(
|
|
|
204
303
|
export function sessionDataToStep<TData = Record<string, unknown>>(
|
|
205
304
|
sessionId: string,
|
|
206
305
|
data: {
|
|
207
|
-
|
|
306
|
+
currentFlow?: string;
|
|
208
307
|
currentStep?: string;
|
|
209
308
|
collectedData?: CollectedStateData<TData>;
|
|
210
309
|
}
|
|
211
310
|
): SessionState<TData> {
|
|
212
311
|
const collectedData: CollectedStateData<TData> = data.collectedData || {
|
|
213
312
|
data: {},
|
|
214
|
-
|
|
313
|
+
flowHistory: [],
|
|
215
314
|
history: [],
|
|
216
315
|
metadata: {},
|
|
217
|
-
|
|
316
|
+
currentFlowTitle: undefined,
|
|
218
317
|
currentStepDescription: undefined,
|
|
219
318
|
};
|
|
220
319
|
|
|
221
|
-
|
|
320
|
+
const session: SessionState<TData> = {
|
|
222
321
|
id: sessionId,
|
|
223
|
-
|
|
322
|
+
currentFlow: data.currentFlow
|
|
224
323
|
? {
|
|
225
|
-
id: data.
|
|
226
|
-
title: collectedData.
|
|
324
|
+
id: data.currentFlow,
|
|
325
|
+
title: collectedData.currentFlowTitle || data.currentFlow,
|
|
227
326
|
enteredAt: new Date(),
|
|
228
327
|
}
|
|
229
328
|
: undefined,
|
|
@@ -235,8 +334,105 @@ export function sessionDataToStep<TData = Record<string, unknown>>(
|
|
|
235
334
|
}
|
|
236
335
|
: undefined,
|
|
237
336
|
data: collectedData.data || {},
|
|
238
|
-
|
|
337
|
+
flowHistory: collectedData.flowHistory || [],
|
|
239
338
|
history: collectedData.history || [],
|
|
240
339
|
metadata: collectedData.metadata || {},
|
|
241
340
|
};
|
|
341
|
+
|
|
342
|
+
// Restore pendingDirective if present (ignore any legacy pendingTransition — per Req 12.3)
|
|
343
|
+
if (collectedData.pendingDirective !== undefined) {
|
|
344
|
+
session.pendingDirective = collectedData.pendingDirective;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Restore signals bit-identical (reserved for v2.x)
|
|
348
|
+
if (collectedData.signals !== undefined) {
|
|
349
|
+
session.signals = collectedData.signals;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return session;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Strip PreDirective-only fields from a directive before persistence.
|
|
358
|
+
*
|
|
359
|
+
* `appendPrompt`, `injectTools`, and `halt` are transient (one-turn lifetime)
|
|
360
|
+
* and must not be serialized. This is a belt-and-suspenders safety net —
|
|
361
|
+
* `Agent.dispatch` already strips before setting `pendingDirective`, and the
|
|
362
|
+
* DirectiveBus's post-LLM drain strips from post-LLM emitters. This function
|
|
363
|
+
* ensures the persistence layer never writes these fields regardless of the
|
|
364
|
+
* upstream path.
|
|
365
|
+
*/
|
|
366
|
+
function stripPreDirectiveFields<TData>(
|
|
367
|
+
directive: Directive<unknown, TData>
|
|
368
|
+
): Directive<unknown, TData> {
|
|
369
|
+
const raw = directive as Record<string, unknown>;
|
|
370
|
+
if (!raw.appendPrompt && !raw.injectTools && raw.halt === undefined) {
|
|
371
|
+
return directive;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
const { appendPrompt, injectTools, halt, ...rest } = raw;
|
|
375
|
+
|
|
376
|
+
const droppedFields = [
|
|
377
|
+
appendPrompt && "appendPrompt",
|
|
378
|
+
injectTools && "injectTools",
|
|
379
|
+
halt !== undefined && "halt",
|
|
380
|
+
].filter(Boolean);
|
|
381
|
+
|
|
382
|
+
if (droppedFields.length > 0) {
|
|
383
|
+
logger.debug(
|
|
384
|
+
`[createPersistedState] Stripped PreDirective-only fields before persistence: ${droppedFields.join(", ")}`
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
return rest as Directive<unknown, TData>;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Prepare a session state for persistence by stripping transient fields.
|
|
393
|
+
*
|
|
394
|
+
* This is the shared helper that every persistence adapter should call before
|
|
395
|
+
* writing session state. It ensures:
|
|
396
|
+
* - `pendingDirective` has PreDirective-only fields (`appendPrompt`,
|
|
397
|
+
* `injectTools`, `halt`) stripped (these are one-turn-lifetime and not
|
|
398
|
+
* serializable across turns).
|
|
399
|
+
* - `pendingDirective` is omitted from the result when `undefined` (adapters
|
|
400
|
+
* should not store a null/undefined key).
|
|
401
|
+
* - `signals` is passed through bit-identical (reserved for v2.x Signals).
|
|
402
|
+
* - Never writes `pendingTransition`.
|
|
403
|
+
*
|
|
404
|
+
* @param session - The in-memory session state to prepare for persistence.
|
|
405
|
+
* @returns A new session state object safe for serialization.
|
|
406
|
+
*/
|
|
407
|
+
export function createPersistedState<TData = Record<string, unknown>>(
|
|
408
|
+
session: SessionState<TData>
|
|
409
|
+
): SessionState<TData> {
|
|
410
|
+
let pendingDirective: Directive<unknown, TData> | undefined =
|
|
411
|
+
session.pendingDirective;
|
|
412
|
+
|
|
413
|
+
if (pendingDirective) {
|
|
414
|
+
pendingDirective = stripPreDirectiveFields(pendingDirective);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// Build the persisted state — omit pendingDirective key entirely when undefined
|
|
418
|
+
const persisted: SessionState<TData> = {
|
|
419
|
+
id: session.id,
|
|
420
|
+
data: session.data,
|
|
421
|
+
flowHistory: session.flowHistory,
|
|
422
|
+
currentFlow: session.currentFlow,
|
|
423
|
+
currentStep: session.currentStep,
|
|
424
|
+
history: session.history,
|
|
425
|
+
metadata: session.metadata,
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
if (pendingDirective !== undefined) {
|
|
429
|
+
persisted.pendingDirective = pendingDirective;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// Pass through signals bit-identical (reserved for v2.x)
|
|
433
|
+
if (session.signals !== undefined) {
|
|
434
|
+
persisted.signals = session.signals;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
return persisted;
|
|
242
438
|
}
|