@falai/agent 1.2.7 → 2.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 +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 +1196 -1015
- 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 +524 -134
- 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/GeminiProvider.d.ts +3 -3
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +16 -14
- package/dist/cjs/providers/GeminiProvider.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 +1198 -1017
- 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 +524 -135
- 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/GeminiProvider.d.ts +3 -3
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +16 -14
- package/dist/providers/GeminiProvider.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 +15 -202
- 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 +15 -0
- package/docs/migration/route-to-flow.md +560 -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 +1458 -1241
- package/src/core/ResponsePipeline.ts +675 -173
- 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/GeminiProvider.ts +17 -15
- 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
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signals — pre-phase escalation with halt + replyWith, post-phase entity capture with extract.
|
|
3
|
+
* Teaches: Signal, SignalContext, SignalDirective, behavior: 'cooldown', extract schema.
|
|
4
|
+
* Read next: docs/reference/signals.md
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
createAgent,
|
|
9
|
+
GeminiProvider,
|
|
10
|
+
createSession,
|
|
11
|
+
type Signal,
|
|
12
|
+
type SignalContext,
|
|
13
|
+
type SignalDirective,
|
|
14
|
+
type SignalFiring,
|
|
15
|
+
} from "@falai/agent";
|
|
16
|
+
|
|
17
|
+
// ─── Types ───────────────────────────────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
interface AppContext {
|
|
20
|
+
supportTier: "free" | "premium";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface AppData {
|
|
24
|
+
topic: string;
|
|
25
|
+
sentiment: string;
|
|
26
|
+
contactName: string;
|
|
27
|
+
contactEmail: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ─── Signal 1: Pre-phase escalation with cooldown ────────────────────────────
|
|
31
|
+
// Detects angry messages BEFORE the LLM responds. Halts normal flow and
|
|
32
|
+
// replies with an escalation notice. Cooldown prevents re-triggering for 60s.
|
|
33
|
+
|
|
34
|
+
const escalationSignal: Signal<AppContext, AppData> = {
|
|
35
|
+
id: "escalation",
|
|
36
|
+
title: "Anger Escalation",
|
|
37
|
+
description: "Detects user frustration and halts to escalate.",
|
|
38
|
+
phase: "pre",
|
|
39
|
+
|
|
40
|
+
when: "The user is expressing strong frustration, anger, or threats to leave",
|
|
41
|
+
|
|
42
|
+
behavior: "cooldown",
|
|
43
|
+
cooldownMs: 60_000,
|
|
44
|
+
|
|
45
|
+
handler(ctx: SignalContext<AppContext, AppData>): SignalDirective<AppContext, AppData> {
|
|
46
|
+
// halt: stops the LLM call from running
|
|
47
|
+
// replyWith: sends a canned response instead
|
|
48
|
+
return {
|
|
49
|
+
halt: true,
|
|
50
|
+
replyWith: "I can see this is frustrating — let me connect you with a specialist right away.",
|
|
51
|
+
dataUpdate: { sentiment: "escalated" },
|
|
52
|
+
stopOtherSignals: true,
|
|
53
|
+
};
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// ─── Signal 2: Post-phase entity capture with extract ────────────────────────
|
|
58
|
+
// After the LLM responds, extracts contact info the user may have provided.
|
|
59
|
+
// Uses `extract` schema so the classifier pulls structured data alongside
|
|
60
|
+
// the match decision.
|
|
61
|
+
|
|
62
|
+
interface ContactExtract {
|
|
63
|
+
name: string | null;
|
|
64
|
+
email: string | null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const contactCaptureSignal: Signal<AppContext, AppData, ContactExtract> = {
|
|
68
|
+
id: "contact_capture",
|
|
69
|
+
title: "Contact Info Capture",
|
|
70
|
+
description: "Extracts name and email from the conversation when mentioned.",
|
|
71
|
+
phase: "post",
|
|
72
|
+
|
|
73
|
+
when: "The user has provided their name or email address in this message",
|
|
74
|
+
|
|
75
|
+
extract: {
|
|
76
|
+
type: "object",
|
|
77
|
+
properties: {
|
|
78
|
+
name: { type: ["string", "null"], description: "The user's full name, or null if not provided" },
|
|
79
|
+
email: { type: ["string", "null"], description: "The user's email address, or null if not provided" },
|
|
80
|
+
},
|
|
81
|
+
required: ["name", "email"],
|
|
82
|
+
} as const,
|
|
83
|
+
|
|
84
|
+
async handler(ctx: SignalContext<AppContext, AppData, ContactExtract>): Promise<void> {
|
|
85
|
+
const { extracted } = ctx;
|
|
86
|
+
|
|
87
|
+
// Only update fields that were actually extracted
|
|
88
|
+
if (extracted.name) {
|
|
89
|
+
await ctx.updateData({ contactName: extracted.name });
|
|
90
|
+
}
|
|
91
|
+
if (extracted.email) {
|
|
92
|
+
await ctx.updateData({ contactEmail: extracted.email });
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
// ─── Agent ───────────────────────────────────────────────────────────────────
|
|
98
|
+
|
|
99
|
+
const agent = createAgent<AppContext, AppData>({
|
|
100
|
+
name: "SupportAgent",
|
|
101
|
+
provider: new GeminiProvider({
|
|
102
|
+
apiKey: process.env.GEMINI_API_KEY!,
|
|
103
|
+
model: "models/gemini-2.5-flash",
|
|
104
|
+
}),
|
|
105
|
+
context: { supportTier: "free" },
|
|
106
|
+
schema: {
|
|
107
|
+
type: "object",
|
|
108
|
+
properties: {
|
|
109
|
+
topic: { type: "string" },
|
|
110
|
+
sentiment: { type: "string" },
|
|
111
|
+
contactName: { type: "string" },
|
|
112
|
+
contactEmail: { type: "string" },
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
signals: [escalationSignal, contactCaptureSignal],
|
|
116
|
+
flows: [
|
|
117
|
+
{
|
|
118
|
+
title: "Support",
|
|
119
|
+
when: "User needs help with a product issue",
|
|
120
|
+
steps: [
|
|
121
|
+
{ id: "triage", prompt: "Identify the user's issue and ask clarifying questions.", collect: ["topic"] },
|
|
122
|
+
{ id: "resolve", prompt: "Provide a solution based on the identified topic." },
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// ─── Run ─────────────────────────────────────────────────────────────────────
|
|
129
|
+
|
|
130
|
+
const session = createSession<AppData>("signals-demo");
|
|
131
|
+
|
|
132
|
+
const response = await agent.respond({
|
|
133
|
+
history: [{ role: "user", content: "This is ridiculous! I've been waiting 3 days. My name is Alex and my email is alex@example.com." }],
|
|
134
|
+
session,
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
console.log(response.message);
|
|
138
|
+
|
|
139
|
+
// Observability: log which signals fired this turn
|
|
140
|
+
if (response.triggeredSignals?.length) {
|
|
141
|
+
for (const firing of response.triggeredSignals as SignalFiring[]) {
|
|
142
|
+
console.log(`[signal] ${firing.id} (${firing.phase}) — ${firing.reason ?? "no reason"}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"lib": [
|
|
6
|
+
"ES2022",
|
|
7
|
+
"DOM"
|
|
8
|
+
],
|
|
9
|
+
"moduleResolution": "bundler",
|
|
10
|
+
"types": [
|
|
11
|
+
"@types/bun"
|
|
12
|
+
],
|
|
13
|
+
"strict": true,
|
|
14
|
+
"esModuleInterop": true,
|
|
15
|
+
"skipLibCheck": true,
|
|
16
|
+
"forceConsistentCasingInFileNames": true,
|
|
17
|
+
"resolveJsonModule": true,
|
|
18
|
+
"allowSyntheticDefaultImports": true,
|
|
19
|
+
"noEmit": true,
|
|
20
|
+
"paths": {
|
|
21
|
+
"@falai/agent": [
|
|
22
|
+
"../src/index.ts"
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
"baseUrl": "."
|
|
26
|
+
},
|
|
27
|
+
"include": [
|
|
28
|
+
"./*.ts"
|
|
29
|
+
]
|
|
30
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@falai/agent",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Standalone, strongly-typed AI Agent framework with route DSL and AI provider strategy",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
"fix:cjs": "echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json",
|
|
45
45
|
"dev": "tsc --watch",
|
|
46
46
|
"typecheck": "tsc --noEmit",
|
|
47
|
+
"typecheck:examples": "tsc --noEmit --project examples/tsconfig.json",
|
|
47
48
|
"lint": "eslint src/**/*.ts",
|
|
48
49
|
"lint:fix": "eslint src/**/*.ts --fix",
|
|
49
50
|
"clean": "rm -rf dist",
|
|
@@ -171,14 +171,14 @@ class MemorySessionRepository<TData = Record<string, unknown>>
|
|
|
171
171
|
return Promise.resolve(null);
|
|
172
172
|
}
|
|
173
173
|
|
|
174
|
-
async
|
|
174
|
+
async updateFlowStep(
|
|
175
175
|
id: string,
|
|
176
|
-
|
|
176
|
+
flow?: string,
|
|
177
177
|
step?: string
|
|
178
178
|
): Promise<SessionData<TData> | null> {
|
|
179
179
|
const session = this.sessions.get(id);
|
|
180
180
|
if (session) {
|
|
181
|
-
session.
|
|
181
|
+
session.currentFlow = flow;
|
|
182
182
|
session.currentStep = step;
|
|
183
183
|
this.sessions.set(id, cloneDeep(session));
|
|
184
184
|
return Promise.resolve(cloneDeep(session));
|
|
@@ -213,13 +213,13 @@ class MongoSessionRepository<TData = Record<string, unknown>>
|
|
|
213
213
|
return await this.update(id, { collectedData });
|
|
214
214
|
}
|
|
215
215
|
|
|
216
|
-
async
|
|
216
|
+
async updateFlowStep(
|
|
217
217
|
id: string,
|
|
218
|
-
|
|
218
|
+
flow?: string,
|
|
219
219
|
step?: string
|
|
220
220
|
): Promise<SessionData<TData> | null> {
|
|
221
221
|
return await this.update(id, {
|
|
222
|
-
|
|
222
|
+
currentFlow: flow,
|
|
223
223
|
currentStep: step,
|
|
224
224
|
});
|
|
225
225
|
}
|
|
@@ -194,9 +194,11 @@ export class OpenSearchAdapter<TData = Record<string, unknown>> implements Persi
|
|
|
194
194
|
userId: { type: "keyword" },
|
|
195
195
|
agentName: { type: "keyword" },
|
|
196
196
|
status: { type: "keyword" },
|
|
197
|
-
|
|
197
|
+
currentFlow: { type: "keyword" },
|
|
198
198
|
currentStep: { type: "keyword" },
|
|
199
199
|
collectedData: { type: "object", enabled: false },
|
|
200
|
+
pendingDirective: { type: "object", enabled: false },
|
|
201
|
+
signals: { type: "object", enabled: false },
|
|
200
202
|
messageCount: { type: "integer" },
|
|
201
203
|
createdAt: { type: "date" },
|
|
202
204
|
updatedAt: { type: "date" },
|
|
@@ -224,7 +226,7 @@ export class OpenSearchAdapter<TData = Record<string, unknown>> implements Persi
|
|
|
224
226
|
userId: { type: "keyword" },
|
|
225
227
|
role: { type: "keyword" },
|
|
226
228
|
content: { type: "text" },
|
|
227
|
-
|
|
229
|
+
flow: { type: "keyword" },
|
|
228
230
|
step: { type: "keyword" },
|
|
229
231
|
toolCalls: { type: "object", enabled: false },
|
|
230
232
|
event: { type: "object", enabled: false },
|
|
@@ -407,17 +409,17 @@ class OpenSearchSessionRepository<TData = Record<string, unknown>>
|
|
|
407
409
|
return await this.findById(id);
|
|
408
410
|
}
|
|
409
411
|
|
|
410
|
-
async
|
|
412
|
+
async updateFlowStep(
|
|
411
413
|
id: string,
|
|
412
|
-
|
|
414
|
+
flow?: string,
|
|
413
415
|
step?: string
|
|
414
416
|
): Promise<SessionData<TData> | null> {
|
|
415
417
|
const doc: Record<string, unknown> = {
|
|
416
418
|
updatedAt: new Date().toISOString(),
|
|
417
419
|
};
|
|
418
420
|
|
|
419
|
-
if (
|
|
420
|
-
doc.
|
|
421
|
+
if (flow !== undefined) {
|
|
422
|
+
doc.currentFlow = flow;
|
|
421
423
|
}
|
|
422
424
|
if (step !== undefined) {
|
|
423
425
|
doc.currentStep = step;
|
|
@@ -479,7 +481,7 @@ class OpenSearchSessionRepository<TData = Record<string, unknown>>
|
|
|
479
481
|
userId: doc.userId as string | undefined,
|
|
480
482
|
agentName: doc.agentName as string | undefined,
|
|
481
483
|
status: doc.status as SessionData<TData>["status"],
|
|
482
|
-
|
|
484
|
+
currentFlow: doc.currentFlow as string | undefined,
|
|
483
485
|
currentStep: doc.currentStep as string | undefined,
|
|
484
486
|
collectedData: doc.collectedData as CollectedStateData<TData> | undefined,
|
|
485
487
|
messageCount: (doc.messageCount as number) || 0,
|
|
@@ -647,7 +649,7 @@ class OpenSearchMessageRepository implements MessageRepository {
|
|
|
647
649
|
userId: doc.userId as string | undefined,
|
|
648
650
|
role: doc.role as MessageData["role"],
|
|
649
651
|
content: doc.content as string,
|
|
650
|
-
|
|
652
|
+
flow: doc.flow as string | undefined,
|
|
651
653
|
step: doc.step as string | undefined,
|
|
652
654
|
toolCalls: doc.toolCalls as
|
|
653
655
|
| Array<{ toolName: string; arguments: Record<string, unknown> }>
|
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* PostgreSQL adapter for persistence
|
|
3
3
|
* Raw SQL adapter for PostgreSQL with custom schemas
|
|
4
|
+
*
|
|
5
|
+
* ## v2 Migration
|
|
6
|
+
*
|
|
7
|
+
* If upgrading from v1, run the following migration on your sessions table:
|
|
8
|
+
*
|
|
9
|
+
* ```sql
|
|
10
|
+
* ALTER TABLE agent_sessions DROP COLUMN IF EXISTS pending_transition;
|
|
11
|
+
* ALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS pending_directive JSONB;
|
|
12
|
+
* ALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS signals JSONB;
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* `pending_directive` stores the serialized `Directive` that the pipeline
|
|
16
|
+
* applies at the start of the next turn. `signals` is a reserved JSONB column
|
|
17
|
+
* for the v2.x Signals feature — pass-through only in v2.0.
|
|
4
18
|
*/
|
|
5
19
|
|
|
6
20
|
import type {
|
|
@@ -111,9 +125,11 @@ export class PostgreSQLAdapter<TData = Record<string, unknown>> implements Persi
|
|
|
111
125
|
user_id VARCHAR(255),
|
|
112
126
|
agent_name VARCHAR(255),
|
|
113
127
|
status VARCHAR(50) DEFAULT 'active',
|
|
114
|
-
|
|
128
|
+
current_flow VARCHAR(255),
|
|
115
129
|
current_step VARCHAR(255),
|
|
116
130
|
collected_data JSONB,
|
|
131
|
+
pending_directive JSONB,
|
|
132
|
+
signals JSONB,
|
|
117
133
|
message_count INTEGER DEFAULT 0,
|
|
118
134
|
last_message_at TIMESTAMP,
|
|
119
135
|
completed_at TIMESTAMP,
|
|
@@ -134,7 +150,7 @@ export class PostgreSQLAdapter<TData = Record<string, unknown>> implements Persi
|
|
|
134
150
|
user_id VARCHAR(255),
|
|
135
151
|
role VARCHAR(50) NOT NULL,
|
|
136
152
|
content TEXT NOT NULL,
|
|
137
|
-
|
|
153
|
+
flow VARCHAR(255),
|
|
138
154
|
step VARCHAR(255),
|
|
139
155
|
tool_calls JSONB,
|
|
140
156
|
event JSONB,
|
|
@@ -242,9 +258,9 @@ class PostgreSQLSessionRepository<TData = Record<string, unknown>>
|
|
|
242
258
|
fields.push(`collected_data = $${paramIndex++}`);
|
|
243
259
|
values.push(JSON.stringify(data.collectedData));
|
|
244
260
|
}
|
|
245
|
-
if (data.
|
|
246
|
-
fields.push(`
|
|
247
|
-
values.push(data.
|
|
261
|
+
if (data.currentFlow !== undefined) {
|
|
262
|
+
fields.push(`current_flow = $${paramIndex++}`);
|
|
263
|
+
values.push(data.currentFlow);
|
|
248
264
|
}
|
|
249
265
|
if (data.currentStep !== undefined) {
|
|
250
266
|
fields.push(`current_step = $${paramIndex++}`);
|
|
@@ -294,13 +310,13 @@ class PostgreSQLSessionRepository<TData = Record<string, unknown>>
|
|
|
294
310
|
return await this.update(id, { collectedData });
|
|
295
311
|
}
|
|
296
312
|
|
|
297
|
-
async
|
|
313
|
+
async updateFlowStep(
|
|
298
314
|
id: string,
|
|
299
|
-
|
|
315
|
+
flow?: string,
|
|
300
316
|
step?: string
|
|
301
317
|
): Promise<SessionData<TData> | null> {
|
|
302
318
|
return await this.update(id, {
|
|
303
|
-
|
|
319
|
+
currentFlow: flow,
|
|
304
320
|
currentStep: step,
|
|
305
321
|
});
|
|
306
322
|
}
|
|
@@ -342,7 +358,7 @@ class PostgreSQLMessageRepository implements MessageRepository {
|
|
|
342
358
|
|
|
343
359
|
const result = await this.client.query<MessageData>(
|
|
344
360
|
`INSERT INTO ${this.tableName}
|
|
345
|
-
(id, session_id, user_id, role, content,
|
|
361
|
+
(id, session_id, user_id, role, content, flow, step, tool_calls, event, created_at)
|
|
346
362
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, NOW())
|
|
347
363
|
RETURNING *`,
|
|
348
364
|
[
|
|
@@ -351,7 +367,7 @@ class PostgreSQLMessageRepository implements MessageRepository {
|
|
|
351
367
|
data.userId || null,
|
|
352
368
|
data.role,
|
|
353
369
|
data.content,
|
|
354
|
-
data.
|
|
370
|
+
data.flow || null,
|
|
355
371
|
data.step || null,
|
|
356
372
|
JSON.stringify(data.toolCalls || null),
|
|
357
373
|
JSON.stringify(data.event || null),
|
|
@@ -248,7 +248,7 @@ class PrismaSessionRepository<TData = Record<string, unknown>>
|
|
|
248
248
|
userId: unmapped.userId as string | undefined,
|
|
249
249
|
agentName: unmapped.agentName as string | undefined,
|
|
250
250
|
status: unmapped.status as "active" | "completed" | "abandoned",
|
|
251
|
-
|
|
251
|
+
currentFlow: unmapped.currentFlow as string | undefined,
|
|
252
252
|
currentStep: unmapped.currentStep as string | undefined,
|
|
253
253
|
collectedData: unmapped.collectedData as CollectedStateData<TData>,
|
|
254
254
|
messageCount: unmapped.messageCount as number | undefined,
|
|
@@ -360,16 +360,16 @@ class PrismaSessionRepository<TData = Record<string, unknown>>
|
|
|
360
360
|
return this.unmapFields(result);
|
|
361
361
|
}
|
|
362
362
|
|
|
363
|
-
async
|
|
363
|
+
async updateFlowStep(
|
|
364
364
|
id: string,
|
|
365
|
-
|
|
365
|
+
flow?: string,
|
|
366
366
|
step?: string
|
|
367
367
|
): Promise<SessionData<TData> | null> {
|
|
368
368
|
const data: Record<string, unknown> = {
|
|
369
369
|
[this.fieldMap.updatedAt || "updatedAt"]: new Date(),
|
|
370
370
|
};
|
|
371
|
-
if (
|
|
372
|
-
data[this.fieldMap.
|
|
371
|
+
if (flow !== undefined) {
|
|
372
|
+
data[this.fieldMap.currentFlow || "currentFlow"] = flow;
|
|
373
373
|
}
|
|
374
374
|
if (step !== undefined) {
|
|
375
375
|
data[this.fieldMap.currentStep || "currentStep"] = step;
|
|
@@ -460,7 +460,7 @@ class PrismaMessageRepository implements MessageRepository {
|
|
|
460
460
|
userId: unmapped.userId as string | undefined,
|
|
461
461
|
role: unmapped.role as MessageRole,
|
|
462
462
|
content: unmapped.content as string,
|
|
463
|
-
|
|
463
|
+
flow: unmapped.flow as string | undefined,
|
|
464
464
|
step: unmapped.step as string | undefined,
|
|
465
465
|
toolCalls: unmapped.toolCalls as
|
|
466
466
|
| Array<{ toolName: string; arguments: Record<string, unknown> }>
|
|
@@ -232,12 +232,12 @@ class RedisSessionRepository<TData = Record<string, unknown>>
|
|
|
232
232
|
return this.update(id, { collectedData });
|
|
233
233
|
}
|
|
234
234
|
|
|
235
|
-
async
|
|
235
|
+
async updateFlowStep(
|
|
236
236
|
id: string,
|
|
237
|
-
|
|
237
|
+
flow?: string,
|
|
238
238
|
step?: string
|
|
239
239
|
): Promise<SessionData<TData> | null> {
|
|
240
|
-
return this.update(id, {
|
|
240
|
+
return this.update(id, { currentFlow: flow, currentStep: step });
|
|
241
241
|
}
|
|
242
242
|
|
|
243
243
|
async incrementMessageCount(id: string): Promise<SessionData<TData> | null> {
|
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SQLite adapter for persistence
|
|
3
3
|
* Lightweight, file-based database perfect for local development
|
|
4
|
+
*
|
|
5
|
+
* ## v2 Migration
|
|
6
|
+
*
|
|
7
|
+
* If upgrading from v1, run the following migration on your sessions table:
|
|
8
|
+
*
|
|
9
|
+
* ```sql
|
|
10
|
+
* -- SQLite 3.35.0+ supports DROP COLUMN:
|
|
11
|
+
* ALTER TABLE agent_sessions DROP COLUMN pending_transition;
|
|
12
|
+
* -- For older versions, recreate the table without pending_transition.
|
|
13
|
+
*
|
|
14
|
+
* ALTER TABLE agent_sessions ADD COLUMN pending_directive TEXT;
|
|
15
|
+
* ALTER TABLE agent_sessions ADD COLUMN signals TEXT;
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* `pending_directive` stores the JSON-serialized `Directive` that the pipeline
|
|
19
|
+
* applies at the start of the next turn. `signals` is a reserved TEXT (JSON)
|
|
20
|
+
* column for the v2.x Signals feature — pass-through only in v2.0.
|
|
4
21
|
*/
|
|
5
22
|
|
|
6
23
|
import type {
|
|
@@ -100,9 +117,11 @@ export class SQLiteAdapter<TData = Record<string, unknown>> implements Persisten
|
|
|
100
117
|
user_id TEXT,
|
|
101
118
|
agent_name TEXT,
|
|
102
119
|
status TEXT DEFAULT 'active',
|
|
103
|
-
|
|
120
|
+
current_flow TEXT,
|
|
104
121
|
current_step TEXT,
|
|
105
122
|
collected_data TEXT,
|
|
123
|
+
pending_directive TEXT,
|
|
124
|
+
signals TEXT,
|
|
106
125
|
message_count INTEGER DEFAULT 0,
|
|
107
126
|
last_message_at TEXT,
|
|
108
127
|
completed_at TEXT,
|
|
@@ -125,7 +144,7 @@ export class SQLiteAdapter<TData = Record<string, unknown>> implements Persisten
|
|
|
125
144
|
user_id TEXT,
|
|
126
145
|
role TEXT NOT NULL,
|
|
127
146
|
content TEXT NOT NULL,
|
|
128
|
-
|
|
147
|
+
flow TEXT,
|
|
129
148
|
step TEXT,
|
|
130
149
|
tool_calls TEXT,
|
|
131
150
|
event TEXT,
|
|
@@ -233,9 +252,9 @@ class SQLiteSessionRepository<TData = Record<string, unknown>>
|
|
|
233
252
|
fields.push("collected_data = ?");
|
|
234
253
|
values.push(JSON.stringify(data.collectedData));
|
|
235
254
|
}
|
|
236
|
-
if (data.
|
|
237
|
-
fields.push("
|
|
238
|
-
values.push(data.
|
|
255
|
+
if (data.currentFlow !== undefined) {
|
|
256
|
+
fields.push("current_flow = ?");
|
|
257
|
+
values.push(data.currentFlow);
|
|
239
258
|
}
|
|
240
259
|
if (data.currentStep !== undefined) {
|
|
241
260
|
fields.push("current_step = ?");
|
|
@@ -286,13 +305,13 @@ class SQLiteSessionRepository<TData = Record<string, unknown>>
|
|
|
286
305
|
return await this.update(id, { collectedData });
|
|
287
306
|
}
|
|
288
307
|
|
|
289
|
-
async
|
|
308
|
+
async updateFlowStep(
|
|
290
309
|
id: string,
|
|
291
|
-
|
|
310
|
+
flow?: string,
|
|
292
311
|
step?: string
|
|
293
312
|
): Promise<SessionData<TData> | null> {
|
|
294
313
|
return await this.update(id, {
|
|
295
|
-
|
|
314
|
+
currentFlow: flow,
|
|
296
315
|
currentStep: step,
|
|
297
316
|
});
|
|
298
317
|
}
|
|
@@ -325,7 +344,7 @@ class SQLiteSessionRepository<TData = Record<string, unknown>>
|
|
|
325
344
|
userId: (row.user_id as string) || undefined,
|
|
326
345
|
agentName: (row.agent_name as string) || undefined,
|
|
327
346
|
status: row.status as SessionStatus,
|
|
328
|
-
|
|
347
|
+
currentFlow: (row.current_flow as string) || undefined,
|
|
329
348
|
currentStep: (row.current_step as string) || undefined,
|
|
330
349
|
collectedData: row.collected_data
|
|
331
350
|
? (JSON.parse(
|
|
@@ -363,7 +382,7 @@ class SQLiteMessageRepository implements MessageRepository {
|
|
|
363
382
|
|
|
364
383
|
const stmt = this.db.prepare(`
|
|
365
384
|
INSERT INTO ${this.tableName}
|
|
366
|
-
(id, session_id, user_id, role, content,
|
|
385
|
+
(id, session_id, user_id, role, content, flow, step, tool_calls, event, created_at)
|
|
367
386
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
368
387
|
`);
|
|
369
388
|
|
|
@@ -373,7 +392,7 @@ class SQLiteMessageRepository implements MessageRepository {
|
|
|
373
392
|
data.userId || null,
|
|
374
393
|
data.role,
|
|
375
394
|
data.content,
|
|
376
|
-
data.
|
|
395
|
+
data.flow || null,
|
|
377
396
|
data.step || null,
|
|
378
397
|
JSON.stringify(data.toolCalls || null),
|
|
379
398
|
JSON.stringify(data.event || null),
|
|
@@ -442,7 +461,7 @@ class SQLiteMessageRepository implements MessageRepository {
|
|
|
442
461
|
userId: (row.user_id as string) || undefined,
|
|
443
462
|
role: row.role as MessageData["role"],
|
|
444
463
|
content: row.content as string,
|
|
445
|
-
|
|
464
|
+
flow: (row.flow as string) || undefined,
|
|
446
465
|
step: (row.step as string) || undefined,
|
|
447
466
|
toolCalls: row.tool_calls
|
|
448
467
|
? (JSON.parse(row.tool_calls as string) as MessageData["toolCalls"])
|
package/src/constants/index.ts
CHANGED
|
@@ -1,10 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*/
|
|
4
|
-
export const END_ROUTE = Symbol("END_ROUTE");
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* String constant for END_ROUTE comparisons
|
|
8
|
-
* Use this when checking if currentStep.id has reached END_ROUTE
|
|
9
|
-
*/
|
|
10
|
-
export const END_ROUTE_ID = "END_ROUTE";
|
|
1
|
+
// Constants module - intentionally empty after END_FLOW removal in v2
|
|
2
|
+
// Flow completion is now implicit: the last step in a flow terminates it.
|