@falai/agent 1.2.8 ā 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -886
- package/dist/adapters/MemoryAdapter.js +2 -2
- package/dist/adapters/MemoryAdapter.js.map +1 -1
- package/dist/adapters/MongoAdapter.js +2 -2
- package/dist/adapters/MongoAdapter.js.map +1 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenSearchAdapter.js +9 -7
- package/dist/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.js +25 -9
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/adapters/PrismaAdapter.js +5 -5
- package/dist/adapters/PrismaAdapter.js.map +1 -1
- package/dist/adapters/RedisAdapter.js +2 -2
- package/dist/adapters/RedisAdapter.js.map +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts +17 -0
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/adapters/SQLiteAdapter.js +30 -11
- package/dist/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.js +2 -2
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.js +2 -2
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.js +5 -5
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.js +2 -2
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/constants/index.d.ts +0 -9
- package/dist/cjs/constants/index.d.ts.map +1 -1
- package/dist/cjs/constants/index.js +2 -11
- package/dist/cjs/constants/index.js.map +1 -1
- package/dist/cjs/core/Agent.d.ts +119 -153
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +471 -324
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
- package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
- package/dist/cjs/core/AutoChainExecutor.js +297 -0
- package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
- package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
- package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
- package/dist/cjs/core/BranchEvaluator.js +130 -0
- package/dist/cjs/core/BranchEvaluator.js.map +1 -0
- package/dist/cjs/core/DirectiveBus.d.ts +88 -0
- package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
- package/dist/cjs/core/DirectiveBus.js +196 -0
- package/dist/cjs/core/DirectiveBus.js.map +1 -0
- package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
- package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
- package/dist/cjs/core/DirectiveChainTracker.js +121 -0
- package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
- package/dist/cjs/core/Flow.d.ts +186 -0
- package/dist/cjs/core/Flow.d.ts.map +1 -0
- package/dist/cjs/core/Flow.js +550 -0
- package/dist/cjs/core/Flow.js.map +1 -0
- package/dist/cjs/core/FlowRouter.d.ts +182 -0
- package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
- package/dist/cjs/core/{RoutingEngine.js ā FlowRouter.js} +323 -306
- package/dist/cjs/core/FlowRouter.js.map +1 -0
- package/dist/cjs/core/PersistenceManager.d.ts +2 -2
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
- package/dist/cjs/core/PersistenceManager.js +7 -7
- package/dist/cjs/core/PersistenceManager.js.map +1 -1
- package/dist/cjs/core/PromptComposer.d.ts +21 -8
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
- package/dist/cjs/core/PromptComposer.js +182 -105
- package/dist/cjs/core/PromptComposer.js.map +1 -1
- package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
- package/dist/cjs/core/PromptSectionCache.js +1 -1
- package/dist/cjs/core/ResponseEngine.d.ts +18 -8
- package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +38 -36
- package/dist/cjs/core/ResponseEngine.js.map +1 -1
- package/dist/cjs/core/ResponseModal.d.ts +73 -56
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
- package/dist/cjs/core/ResponseModal.js +1191 -1014
- package/dist/cjs/core/ResponseModal.js.map +1 -1
- package/dist/cjs/core/ResponsePipeline.d.ts +124 -26
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/cjs/core/ResponsePipeline.js +509 -136
- package/dist/cjs/core/ResponsePipeline.js.map +1 -1
- package/dist/cjs/core/SignalEvaluator.d.ts +86 -0
- package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -0
- package/dist/cjs/core/SignalEvaluator.js +333 -0
- package/dist/cjs/core/SignalEvaluator.js.map +1 -0
- package/dist/cjs/core/SignalProcessor.d.ts +152 -0
- package/dist/cjs/core/SignalProcessor.d.ts.map +1 -0
- package/dist/cjs/core/SignalProcessor.js +562 -0
- package/dist/cjs/core/SignalProcessor.js.map +1 -0
- package/dist/cjs/core/Step.d.ts +43 -32
- package/dist/cjs/core/Step.d.ts.map +1 -1
- package/dist/cjs/core/Step.js +221 -126
- package/dist/cjs/core/Step.js.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.d.ts +2 -2
- package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
- package/dist/cjs/core/ToolManager.d.ts +44 -13
- package/dist/cjs/core/ToolManager.d.ts.map +1 -1
- package/dist/cjs/core/ToolManager.js +174 -91
- package/dist/cjs/core/ToolManager.js.map +1 -1
- package/dist/cjs/core/createAgent.d.ts +35 -0
- package/dist/cjs/core/createAgent.d.ts.map +1 -0
- package/dist/cjs/core/createAgent.js +39 -0
- package/dist/cjs/core/createAgent.js.map +1 -0
- package/dist/cjs/core/flow-namespace.d.ts +49 -0
- package/dist/cjs/core/flow-namespace.d.ts.map +1 -0
- package/dist/cjs/core/flow-namespace.js +171 -0
- package/dist/cjs/core/flow-namespace.js.map +1 -0
- package/dist/cjs/index.d.ts +11 -14
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +18 -22
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts +1 -1
- package/dist/cjs/providers/AnthropicProvider.js +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +1 -1
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.js +1 -1
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +183 -54
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/agent.js +0 -6
- package/dist/cjs/types/agent.js.map +1 -1
- package/dist/cjs/types/ai.d.ts +3 -3
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/errors.d.ts +15 -0
- package/dist/cjs/types/errors.d.ts.map +1 -0
- package/dist/cjs/types/errors.js +22 -0
- package/dist/cjs/types/errors.js.map +1 -0
- package/dist/cjs/types/flow.d.ts +513 -0
- package/dist/cjs/types/flow.d.ts.map +1 -0
- package/dist/cjs/types/{route.js ā flow.js} +2 -2
- package/dist/cjs/types/flow.js.map +1 -0
- package/dist/cjs/types/index.d.ts +7 -6
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js +6 -2
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/persistence.d.ts +11 -7
- package/dist/cjs/types/persistence.d.ts.map +1 -1
- package/dist/cjs/types/routing.d.ts +1 -1
- package/dist/cjs/types/routing.d.ts.map +1 -1
- package/dist/cjs/types/session.d.ts +24 -23
- package/dist/cjs/types/session.d.ts.map +1 -1
- package/dist/cjs/types/signals.d.ts +248 -0
- package/dist/cjs/types/signals.d.ts.map +1 -0
- package/dist/cjs/types/signals.js +11 -0
- package/dist/cjs/types/signals.js.map +1 -0
- package/dist/cjs/types/template.d.ts +2 -8
- package/dist/cjs/types/template.d.ts.map +1 -1
- package/dist/cjs/types/tool.d.ts +36 -29
- package/dist/cjs/types/tool.d.ts.map +1 -1
- package/dist/cjs/types/tool.js +1 -1
- package/dist/cjs/types/tool.js.map +1 -1
- package/dist/cjs/utils/condition.d.ts +7 -1
- package/dist/cjs/utils/condition.d.ts.map +1 -1
- package/dist/cjs/utils/condition.js.map +1 -1
- package/dist/cjs/utils/id.d.ts +13 -5
- package/dist/cjs/utils/id.d.ts.map +1 -1
- package/dist/cjs/utils/id.js +24 -10
- package/dist/cjs/utils/id.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +2 -2
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +7 -3
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/session.d.ts +44 -5
- package/dist/cjs/utils/session.d.ts.map +1 -1
- package/dist/cjs/utils/session.js +197 -38
- package/dist/cjs/utils/session.js.map +1 -1
- package/dist/constants/index.d.ts +0 -9
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +3 -9
- package/dist/constants/index.js.map +1 -1
- package/dist/core/Agent.d.ts +119 -153
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +472 -325
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/AutoChainExecutor.d.ts +107 -0
- package/dist/core/AutoChainExecutor.d.ts.map +1 -0
- package/dist/core/AutoChainExecutor.js +293 -0
- package/dist/core/AutoChainExecutor.js.map +1 -0
- package/dist/core/BranchEvaluator.d.ts +54 -0
- package/dist/core/BranchEvaluator.d.ts.map +1 -0
- package/dist/core/BranchEvaluator.js +126 -0
- package/dist/core/BranchEvaluator.js.map +1 -0
- package/dist/core/DirectiveBus.d.ts +88 -0
- package/dist/core/DirectiveBus.d.ts.map +1 -0
- package/dist/core/DirectiveBus.js +192 -0
- package/dist/core/DirectiveBus.js.map +1 -0
- package/dist/core/DirectiveChainTracker.d.ts +49 -0
- package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
- package/dist/core/DirectiveChainTracker.js +117 -0
- package/dist/core/DirectiveChainTracker.js.map +1 -0
- package/dist/core/Flow.d.ts +186 -0
- package/dist/core/Flow.d.ts.map +1 -0
- package/dist/core/Flow.js +546 -0
- package/dist/core/Flow.js.map +1 -0
- package/dist/core/FlowRouter.d.ts +182 -0
- package/dist/core/FlowRouter.d.ts.map +1 -0
- package/dist/core/{RoutingEngine.js ā FlowRouter.js} +322 -305
- package/dist/core/FlowRouter.js.map +1 -0
- package/dist/core/PersistenceManager.d.ts +2 -2
- package/dist/core/PersistenceManager.d.ts.map +1 -1
- package/dist/core/PersistenceManager.js +7 -7
- package/dist/core/PersistenceManager.js.map +1 -1
- package/dist/core/PromptComposer.d.ts +21 -8
- package/dist/core/PromptComposer.d.ts.map +1 -1
- package/dist/core/PromptComposer.js +183 -106
- package/dist/core/PromptComposer.js.map +1 -1
- package/dist/core/PromptSectionCache.d.ts +1 -1
- package/dist/core/PromptSectionCache.js +1 -1
- package/dist/core/ResponseEngine.d.ts +18 -8
- package/dist/core/ResponseEngine.d.ts.map +1 -1
- package/dist/core/ResponseEngine.js +38 -36
- package/dist/core/ResponseEngine.js.map +1 -1
- package/dist/core/ResponseModal.d.ts +73 -56
- package/dist/core/ResponseModal.d.ts.map +1 -1
- package/dist/core/ResponseModal.js +1193 -1016
- package/dist/core/ResponseModal.js.map +1 -1
- package/dist/core/ResponsePipeline.d.ts +124 -26
- package/dist/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/core/ResponsePipeline.js +509 -137
- package/dist/core/ResponsePipeline.js.map +1 -1
- package/dist/core/SignalEvaluator.d.ts +86 -0
- package/dist/core/SignalEvaluator.d.ts.map +1 -0
- package/dist/core/SignalEvaluator.js +326 -0
- package/dist/core/SignalEvaluator.js.map +1 -0
- package/dist/core/SignalProcessor.d.ts +152 -0
- package/dist/core/SignalProcessor.d.ts.map +1 -0
- package/dist/core/SignalProcessor.js +555 -0
- package/dist/core/SignalProcessor.js.map +1 -0
- package/dist/core/Step.d.ts +43 -32
- package/dist/core/Step.d.ts.map +1 -1
- package/dist/core/Step.js +220 -126
- package/dist/core/Step.js.map +1 -1
- package/dist/core/StreamingToolExecutor.d.ts +2 -2
- package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/core/StreamingToolExecutor.js.map +1 -1
- package/dist/core/ToolManager.d.ts +44 -13
- package/dist/core/ToolManager.d.ts.map +1 -1
- package/dist/core/ToolManager.js +174 -91
- package/dist/core/ToolManager.js.map +1 -1
- package/dist/core/createAgent.d.ts +35 -0
- package/dist/core/createAgent.d.ts.map +1 -0
- package/dist/core/createAgent.js +36 -0
- package/dist/core/createAgent.js.map +1 -0
- package/dist/core/flow-namespace.d.ts +49 -0
- package/dist/core/flow-namespace.d.ts.map +1 -0
- package/dist/core/flow-namespace.js +168 -0
- package/dist/core/flow-namespace.js.map +1 -0
- package/dist/index.d.ts +11 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -12
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts +1 -1
- package/dist/providers/AnthropicProvider.js +1 -1
- package/dist/providers/GeminiProvider.d.ts +1 -1
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +1 -1
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/OpenAIProvider.d.ts +1 -1
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +1 -1
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/types/agent.d.ts +183 -54
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js +0 -6
- package/dist/types/agent.js.map +1 -1
- package/dist/types/ai.d.ts +3 -3
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/errors.d.ts +15 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +18 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/flow.d.ts +513 -0
- package/dist/types/flow.d.ts.map +1 -0
- package/dist/types/flow.js +5 -0
- package/dist/types/flow.js.map +1 -0
- package/dist/types/index.d.ts +7 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/persistence.d.ts +11 -7
- package/dist/types/persistence.d.ts.map +1 -1
- package/dist/types/routing.d.ts +1 -1
- package/dist/types/routing.d.ts.map +1 -1
- package/dist/types/session.d.ts +24 -23
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/signals.d.ts +248 -0
- package/dist/types/signals.d.ts.map +1 -0
- package/dist/types/signals.js +10 -0
- package/dist/types/signals.js.map +1 -0
- package/dist/types/template.d.ts +2 -8
- package/dist/types/template.d.ts.map +1 -1
- package/dist/types/tool.d.ts +36 -29
- package/dist/types/tool.d.ts.map +1 -1
- package/dist/types/tool.js +1 -1
- package/dist/types/tool.js.map +1 -1
- package/dist/utils/condition.d.ts +7 -1
- package/dist/utils/condition.d.ts.map +1 -1
- package/dist/utils/condition.js.map +1 -1
- package/dist/utils/id.d.ts +13 -5
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +22 -9
- package/dist/utils/id.js.map +1 -1
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/session.d.ts +44 -5
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +193 -37
- package/dist/utils/session.js.map +1 -1
- package/docs/README.md +22 -200
- package/docs/concepts/architecture.md +281 -0
- package/docs/concepts/directives.md +400 -0
- package/docs/concepts/pipeline.md +399 -0
- package/docs/guides/branching.md +263 -0
- package/docs/guides/compaction.md +163 -0
- package/docs/guides/conditions.md +167 -0
- package/docs/guides/error-handling.md +176 -0
- package/docs/guides/flow-control.md +409 -0
- package/docs/guides/instructions.md +210 -0
- package/docs/guides/persistence.md +182 -0
- package/docs/guides/streaming.md +137 -0
- package/docs/migration/README.md +14 -0
- package/docs/migration/route-to-flow.md +561 -0
- package/docs/migration/v1-to-v2.md +909 -0
- package/docs/reference/adapters.md +481 -0
- package/docs/reference/branches.md +241 -0
- package/docs/reference/create-agent.md +186 -0
- package/docs/reference/directive.md +243 -0
- package/docs/reference/errors.md +122 -0
- package/docs/reference/flow.md +238 -0
- package/docs/reference/instruction.md +177 -0
- package/docs/reference/pre-directive.md +131 -0
- package/docs/reference/providers.md +227 -0
- package/docs/reference/signals.md +356 -0
- package/docs/reference/step.md +339 -0
- package/docs/reference/tool.md +269 -0
- package/docs/start/01-install.md +81 -0
- package/docs/start/02-first-agent.md +196 -0
- package/docs/start/03-collect-data.md +222 -0
- package/docs/start/04-add-tools.md +276 -0
- package/docs/start/05-go-to-production.md +216 -0
- package/examples/01-quickstart.ts +20 -0
- package/examples/02-data-extraction.ts +90 -0
- package/examples/03-tools.ts +136 -0
- package/examples/04-instructions.ts +100 -0
- package/examples/05-branching.ts +140 -0
- package/examples/06-flow-control.ts +103 -0
- package/examples/07-streaming.ts +69 -0
- package/examples/08-persistence.ts +98 -0
- package/examples/09-signals.ts +144 -0
- package/examples/tsconfig.json +30 -0
- package/package.json +2 -1
- package/src/adapters/MemoryAdapter.ts +3 -3
- package/src/adapters/MongoAdapter.ts +3 -3
- package/src/adapters/OpenSearchAdapter.ts +10 -8
- package/src/adapters/PostgreSQLAdapter.ts +26 -10
- package/src/adapters/PrismaAdapter.ts +6 -6
- package/src/adapters/RedisAdapter.ts +3 -3
- package/src/adapters/SQLiteAdapter.ts +31 -12
- package/src/constants/index.ts +2 -10
- package/src/core/Agent.ts +585 -374
- package/src/core/AutoChainExecutor.ts +440 -0
- package/src/core/BranchEvaluator.ts +167 -0
- package/src/core/DirectiveBus.ts +248 -0
- package/src/core/DirectiveChainTracker.ts +144 -0
- package/src/core/Flow.ts +666 -0
- package/src/core/{RoutingEngine.ts ā FlowRouter.ts} +385 -365
- package/src/core/PersistenceManager.ts +8 -8
- package/src/core/PromptComposer.ts +209 -140
- package/src/core/PromptSectionCache.ts +1 -1
- package/src/core/ResponseEngine.ts +61 -46
- package/src/core/ResponseModal.ts +1453 -1240
- package/src/core/ResponsePipeline.ts +655 -175
- package/src/core/SignalEvaluator.ts +420 -0
- package/src/core/SignalProcessor.ts +723 -0
- package/src/core/Step.ts +279 -176
- package/src/core/StreamingToolExecutor.ts +4 -4
- package/src/core/ToolManager.ts +200 -97
- package/src/core/createAgent.ts +40 -0
- package/src/core/flow-namespace.ts +219 -0
- package/src/index.ts +42 -36
- package/src/providers/AnthropicProvider.ts +2 -2
- package/src/providers/GeminiProvider.ts +2 -2
- package/src/providers/OpenAIProvider.ts +2 -2
- package/src/types/agent.ts +182 -53
- package/src/types/ai.ts +3 -3
- package/src/types/errors.ts +18 -0
- package/src/types/flow.ts +590 -0
- package/src/types/index.ts +43 -16
- package/src/types/persistence.ts +12 -8
- package/src/types/routing.ts +1 -1
- package/src/types/session.ts +26 -23
- package/src/types/signals.ts +321 -0
- package/src/types/template.ts +3 -11
- package/src/types/tool.ts +50 -42
- package/src/utils/condition.ts +13 -4
- package/src/utils/id.ts +27 -9
- package/src/utils/index.ts +6 -2
- package/src/utils/session.ts +238 -42
- package/dist/cjs/core/BatchExecutor.d.ts +0 -359
- package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
- package/dist/cjs/core/BatchExecutor.js +0 -861
- package/dist/cjs/core/BatchExecutor.js.map +0 -1
- package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
- package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
- package/dist/cjs/core/BatchPromptBuilder.js +0 -223
- package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
- package/dist/cjs/core/Route.d.ts +0 -180
- package/dist/cjs/core/Route.d.ts.map +0 -1
- package/dist/cjs/core/Route.js +0 -542
- package/dist/cjs/core/Route.js.map +0 -1
- package/dist/cjs/core/RoutingEngine.d.ts +0 -185
- package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/types/route.d.ts +0 -336
- package/dist/cjs/types/route.d.ts.map +0 -1
- package/dist/cjs/types/route.js.map +0 -1
- package/dist/core/BatchExecutor.d.ts +0 -359
- package/dist/core/BatchExecutor.d.ts.map +0 -1
- package/dist/core/BatchExecutor.js +0 -856
- package/dist/core/BatchExecutor.js.map +0 -1
- package/dist/core/BatchPromptBuilder.d.ts +0 -89
- package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
- package/dist/core/BatchPromptBuilder.js +0 -219
- package/dist/core/BatchPromptBuilder.js.map +0 -1
- package/dist/core/Route.d.ts +0 -180
- package/dist/core/Route.d.ts.map +0 -1
- package/dist/core/Route.js +0 -538
- package/dist/core/Route.js.map +0 -1
- package/dist/core/RoutingEngine.d.ts +0 -185
- package/dist/core/RoutingEngine.d.ts.map +0 -1
- package/dist/core/RoutingEngine.js.map +0 -1
- package/dist/types/route.d.ts +0 -336
- package/dist/types/route.d.ts.map +0 -1
- package/dist/types/route.js +0 -5
- package/dist/types/route.js.map +0 -1
- package/docs/CONTRIBUTING.md +0 -521
- package/docs/api/README.md +0 -3299
- package/docs/api/overview.md +0 -1410
- package/docs/architecture/data-extraction-flow.md +0 -360
- package/docs/architecture/multi-step-execution.md +0 -277
- package/docs/core/agent/README.md +0 -938
- package/docs/core/agent/context-management.md +0 -796
- package/docs/core/agent/rules-and-prohibitions.md +0 -113
- package/docs/core/agent/session-management.md +0 -693
- package/docs/core/ai-integration/prompt-composition.md +0 -355
- package/docs/core/ai-integration/providers.md +0 -515
- package/docs/core/ai-integration/response-processing.md +0 -433
- package/docs/core/conversation-flows/data-collection.md +0 -772
- package/docs/core/conversation-flows/route-dsl.md +0 -509
- package/docs/core/conversation-flows/routes.md +0 -249
- package/docs/core/conversation-flows/step-transitions.md +0 -731
- package/docs/core/conversation-flows/steps.md +0 -268
- package/docs/core/error-handling.md +0 -830
- package/docs/core/persistence/adapters.md +0 -255
- package/docs/core/persistence/session-storage.md +0 -656
- package/docs/core/routing/intelligent-routing.md +0 -470
- package/docs/core/tools/enhanced-tool.md +0 -186
- package/docs/core/tools/streaming-execution.md +0 -161
- package/docs/core/tools/tool-definition.md +0 -970
- package/docs/core/tools/tool-scoping.md +0 -819
- package/docs/guides/advanced-patterns/publishing.md +0 -186
- package/docs/guides/context-compaction.md +0 -96
- package/docs/guides/error-handling-patterns.md +0 -578
- package/docs/guides/getting-started/README.md +0 -795
- package/docs/guides/migration/README.md +0 -101
- package/docs/guides/migration/flexible-routing-conditions.md +0 -375
- package/docs/guides/migration/multi-step-execution.md +0 -393
- package/docs/guides/migration/response-modal-refactor.md +0 -518
- package/docs/guides/prompt-optimization.md +0 -164
- package/examples/advanced-patterns/context-compaction.ts +0 -223
- package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
- package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
- package/examples/advanced-patterns/streaming-responses.ts +0 -656
- package/examples/ai-providers/anthropic-integration.ts +0 -388
- package/examples/ai-providers/openai-integration.ts +0 -228
- package/examples/condition-patterns/function-only-conditions.ts +0 -365
- package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
- package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
- package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
- package/examples/condition-patterns/string-only-conditions.ts +0 -296
- package/examples/conversation-flows/completion-transitions.ts +0 -318
- package/examples/core-concepts/basic-agent.ts +0 -503
- package/examples/core-concepts/modern-streaming-api.ts +0 -309
- package/examples/core-concepts/schema-driven-extraction.ts +0 -332
- package/examples/core-concepts/session-management.ts +0 -494
- package/examples/integrations/database-integration.ts +0 -631
- package/examples/integrations/healthcare-integration.ts +0 -595
- package/examples/integrations/search-integration.ts +0 -530
- package/examples/integrations/server-session-management.ts +0 -307
- package/examples/persistence/custom-adapter.ts +0 -526
- package/examples/persistence/database-persistence.ts +0 -583
- package/examples/persistence/memory-sessions.ts +0 -495
- package/examples/persistence/prisma-schema.example.prisma +0 -74
- package/examples/persistence/redis-persistence.ts +0 -488
- package/examples/tools/basic-tools.ts +0 -765
- package/examples/tools/data-enrichment-tools.ts +0 -593
- package/examples/tools/enhanced-tool-metadata.ts +0 -268
- package/examples/tools/streaming-tool-execution.ts +0 -283
- package/src/core/BatchExecutor.ts +0 -1187
- package/src/core/BatchPromptBuilder.ts +0 -299
- package/src/core/Route.ts +0 -678
- package/src/types/route.ts +0 -392
|
@@ -1,728 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Persistent multi-turn onboarding agent example
|
|
3
|
-
* Updated for v2 architecture with session step management and schema-first data extraction
|
|
4
|
-
*
|
|
5
|
-
* NEW: Enhanced with flexible ConditionTemplate patterns:
|
|
6
|
-
* - Mixed route conditions: ["AI context", (ctx) => state_check]
|
|
7
|
-
* - Route skipIf: Skip if onboarding already complete
|
|
8
|
-
* - Step skipIf: Enhanced conditional step skipping with AI context
|
|
9
|
-
* - Programmatic when conditions: (ctx) => data_validation
|
|
10
|
-
* - Performance patterns for condition evaluation
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import {
|
|
14
|
-
Agent,
|
|
15
|
-
type Tool,
|
|
16
|
-
GeminiProvider,
|
|
17
|
-
END_ROUTE,
|
|
18
|
-
} from "../../src";
|
|
19
|
-
|
|
20
|
-
// ============================================================================
|
|
21
|
-
// DATABASE SIMULATION
|
|
22
|
-
// ============================================================================
|
|
23
|
-
|
|
24
|
-
interface SessionData {
|
|
25
|
-
sessionId: string;
|
|
26
|
-
userId: string;
|
|
27
|
-
collectedData: {
|
|
28
|
-
businessName?: string;
|
|
29
|
-
businessDescription?: string;
|
|
30
|
-
industry?: string;
|
|
31
|
-
contactEmail?: string;
|
|
32
|
-
};
|
|
33
|
-
completedSteps: string[];
|
|
34
|
-
lastUpdated: Date;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Simple in-memory database simulation
|
|
38
|
-
const database = new Map<string, SessionData>();
|
|
39
|
-
|
|
40
|
-
const db = {
|
|
41
|
-
sessions: {
|
|
42
|
-
findById(sessionId: string): SessionData | undefined {
|
|
43
|
-
return database.get(sessionId);
|
|
44
|
-
},
|
|
45
|
-
|
|
46
|
-
update(sessionId: string, updates: Partial<SessionData>): void {
|
|
47
|
-
const existing = database.get(sessionId);
|
|
48
|
-
if (existing) {
|
|
49
|
-
database.set(sessionId, {
|
|
50
|
-
...existing,
|
|
51
|
-
...updates,
|
|
52
|
-
lastUpdated: new Date(),
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
|
|
57
|
-
create(sessionData: SessionData): void {
|
|
58
|
-
database.set(sessionData.sessionId, sessionData);
|
|
59
|
-
},
|
|
60
|
-
},
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
// ============================================================================
|
|
64
|
-
// CONTEXT TYPE
|
|
65
|
-
// ============================================================================
|
|
66
|
-
|
|
67
|
-
// Data extraction types for onboarding
|
|
68
|
-
interface OnboardingData {
|
|
69
|
-
businessName?: string;
|
|
70
|
-
businessDescription?: string;
|
|
71
|
-
industry?: string;
|
|
72
|
-
contactEmail?: string;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
interface OnboardingContext {
|
|
76
|
-
sessionId: string;
|
|
77
|
-
userId: string;
|
|
78
|
-
userName?: string;
|
|
79
|
-
collectedData: OnboardingData;
|
|
80
|
-
completedSteps: string[];
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// ============================================================================
|
|
84
|
-
// AGENT FACTORY WITH LIFECYCLE HOOKS
|
|
85
|
-
// ============================================================================
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Creates an onboarding agent with persistent context management
|
|
89
|
-
*
|
|
90
|
-
* PATTERN 1: Factory + Lifecycle Hooks
|
|
91
|
-
* - Load fresh context from database before each response
|
|
92
|
-
* - Persist context updates automatically after changes
|
|
93
|
-
*/
|
|
94
|
-
function createPersistentOnboardingAgent(sessionId: string) {
|
|
95
|
-
// Load session from database
|
|
96
|
-
const session = db.sessions.findById(sessionId);
|
|
97
|
-
|
|
98
|
-
if (!session) {
|
|
99
|
-
throw new Error(`Session ${sessionId} not found`);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Define lifecycle hooks for automatic persistence
|
|
103
|
-
const hooks = {
|
|
104
|
-
// Called after data extraction - validate and enrich collected data
|
|
105
|
-
onDataUpdate: (data: Partial<OnboardingData>) => {
|
|
106
|
-
console.log("š Processing collected data...");
|
|
107
|
-
|
|
108
|
-
// Update completed steps based on what's been data
|
|
109
|
-
const completedSteps: string[] = [];
|
|
110
|
-
if (data.businessName) completedSteps.push("business_info");
|
|
111
|
-
if (data.businessDescription) completedSteps.push("business_description");
|
|
112
|
-
if (data.industry) completedSteps.push("industry");
|
|
113
|
-
if (data.contactEmail) completedSteps.push("contact");
|
|
114
|
-
|
|
115
|
-
// Persist to database
|
|
116
|
-
db.sessions.update(sessionId, {
|
|
117
|
-
collectedData: data,
|
|
118
|
-
completedSteps,
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
return data;
|
|
122
|
-
},
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
const provider = new GeminiProvider({
|
|
126
|
-
apiKey: process.env.GEMINI_API_KEY || "test-key",
|
|
127
|
-
model: "models/gemini-2.5-flash",
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
// Define the onboarding schema
|
|
131
|
-
const onboardingSchema = {
|
|
132
|
-
type: "object",
|
|
133
|
-
properties: {
|
|
134
|
-
businessName: {
|
|
135
|
-
type: "string",
|
|
136
|
-
description: "Name of the business",
|
|
137
|
-
},
|
|
138
|
-
businessDescription: {
|
|
139
|
-
type: "string",
|
|
140
|
-
description: "Brief description of what the business does",
|
|
141
|
-
},
|
|
142
|
-
industry: {
|
|
143
|
-
type: "string",
|
|
144
|
-
description: "Industry the business operates in",
|
|
145
|
-
},
|
|
146
|
-
contactEmail: {
|
|
147
|
-
type: "string",
|
|
148
|
-
description: "Contact email for the business",
|
|
149
|
-
},
|
|
150
|
-
},
|
|
151
|
-
required: ["businessName", "businessDescription"],
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
const agent = new Agent<OnboardingContext, OnboardingData>({
|
|
155
|
-
name: "OnboardingBot",
|
|
156
|
-
description: "A friendly assistant that helps businesses get started",
|
|
157
|
-
goal: "Collect business information efficiently while being conversational",
|
|
158
|
-
provider: provider,
|
|
159
|
-
// NEW: Agent-level schema
|
|
160
|
-
schema: onboardingSchema,
|
|
161
|
-
|
|
162
|
-
// Knowledge base with onboarding best practices
|
|
163
|
-
knowledgeBase: {
|
|
164
|
-
onboardingFlow: {
|
|
165
|
-
stages: [
|
|
166
|
-
"Business identification",
|
|
167
|
-
"Industry classification",
|
|
168
|
-
"Contact information collection",
|
|
169
|
-
"Verification and confirmation",
|
|
170
|
-
],
|
|
171
|
-
averageCompletion: "3-5 minutes",
|
|
172
|
-
dropOffPoints: ["Contact email collection", "Industry classification"],
|
|
173
|
-
},
|
|
174
|
-
businessTypes: {
|
|
175
|
-
retail: {
|
|
176
|
-
commonIndustries: [
|
|
177
|
-
"Fashion",
|
|
178
|
-
"Electronics",
|
|
179
|
-
"Home goods",
|
|
180
|
-
"Food service",
|
|
181
|
-
],
|
|
182
|
-
keyQuestions: ["Store location", "Target customers", "Peak hours"],
|
|
183
|
-
},
|
|
184
|
-
professional: {
|
|
185
|
-
commonIndustries: ["Consulting", "Legal", "Accounting", "Healthcare"],
|
|
186
|
-
keyQuestions: ["Service areas", "Certifications", "Client types"],
|
|
187
|
-
},
|
|
188
|
-
manufacturing: {
|
|
189
|
-
commonIndustries: [
|
|
190
|
-
"Electronics",
|
|
191
|
-
"Automotive",
|
|
192
|
-
"Food processing",
|
|
193
|
-
"Textiles",
|
|
194
|
-
],
|
|
195
|
-
keyQuestions: [
|
|
196
|
-
"Production capacity",
|
|
197
|
-
"Supply chain",
|
|
198
|
-
"Quality standards",
|
|
199
|
-
],
|
|
200
|
-
},
|
|
201
|
-
},
|
|
202
|
-
dataValidation: {
|
|
203
|
-
email: "Must contain @ symbol and valid domain",
|
|
204
|
-
businessName: "2-100 characters, no special characters",
|
|
205
|
-
description: "10-500 characters, describes what the business does",
|
|
206
|
-
},
|
|
207
|
-
completionCriteria: [
|
|
208
|
-
"Business name provided",
|
|
209
|
-
"Business description provided",
|
|
210
|
-
"Industry category selected",
|
|
211
|
-
"Valid contact email provided",
|
|
212
|
-
],
|
|
213
|
-
},
|
|
214
|
-
// Context is loaded fresh from database on each respond() call
|
|
215
|
-
contextProvider: () => {
|
|
216
|
-
console.log("š Loading fresh context from database...");
|
|
217
|
-
const freshSession = db.sessions.findById(sessionId);
|
|
218
|
-
|
|
219
|
-
if (!freshSession) {
|
|
220
|
-
throw new Error(`Session ${sessionId} not found`);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
return {
|
|
224
|
-
sessionId: freshSession.sessionId,
|
|
225
|
-
userId: freshSession.userId,
|
|
226
|
-
collectedData: freshSession.collectedData,
|
|
227
|
-
completedSteps: freshSession.completedSteps,
|
|
228
|
-
};
|
|
229
|
-
},
|
|
230
|
-
hooks, // Enable lifecycle hooks for persistence
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
// ============================================================================
|
|
234
|
-
// TOOLS (with context updates)
|
|
235
|
-
// ============================================================================
|
|
236
|
-
|
|
237
|
-
// OPTION 1: Using contextUpdate in return value
|
|
238
|
-
const saveBusinessInfo: Tool<OnboardingContext, OnboardingData> = {
|
|
239
|
-
id: "save_business_info",
|
|
240
|
-
name: "Business Info Saver",
|
|
241
|
-
description: "Save business name and description",
|
|
242
|
-
parameters: {
|
|
243
|
-
type: "object",
|
|
244
|
-
properties: {
|
|
245
|
-
name: { type: "string", description: "Business name" },
|
|
246
|
-
description: { type: "string", description: "Business description" },
|
|
247
|
-
},
|
|
248
|
-
required: ["name", "description"],
|
|
249
|
-
},
|
|
250
|
-
handler: (toolContext, args) => {
|
|
251
|
-
const name = args?.name as string;
|
|
252
|
-
const description = args?.description as string;
|
|
253
|
-
console.log(`š Saving business info: ${name}`);
|
|
254
|
-
|
|
255
|
-
return {
|
|
256
|
-
data: "Business information saved successfully",
|
|
257
|
-
// Context update is automatically persisted via onContextUpdate hook
|
|
258
|
-
contextUpdate: {
|
|
259
|
-
collectedData: {
|
|
260
|
-
...toolContext.context.collectedData,
|
|
261
|
-
businessName: name,
|
|
262
|
-
businessDescription: description,
|
|
263
|
-
},
|
|
264
|
-
completedSteps: [
|
|
265
|
-
...toolContext.context.completedSteps,
|
|
266
|
-
"business_info",
|
|
267
|
-
],
|
|
268
|
-
},
|
|
269
|
-
};
|
|
270
|
-
},
|
|
271
|
-
};
|
|
272
|
-
|
|
273
|
-
// OPTION 2: Using contextUpdate in return value
|
|
274
|
-
const saveIndustry: Tool<OnboardingContext, OnboardingData> = {
|
|
275
|
-
id: "save_industry",
|
|
276
|
-
name: "Industry Classifier",
|
|
277
|
-
description: "Save business industry",
|
|
278
|
-
parameters: {
|
|
279
|
-
type: "object",
|
|
280
|
-
properties: {
|
|
281
|
-
industry: { type: "string", description: "Business industry" },
|
|
282
|
-
},
|
|
283
|
-
required: ["industry"],
|
|
284
|
-
},
|
|
285
|
-
handler: async (toolContext, args) => {
|
|
286
|
-
const industry = args?.industry as string;
|
|
287
|
-
console.log(`š Saving industry: ${industry}`);
|
|
288
|
-
|
|
289
|
-
return {
|
|
290
|
-
data: "Industry information saved successfully",
|
|
291
|
-
contextUpdate: {
|
|
292
|
-
collectedData: {
|
|
293
|
-
...toolContext.context.collectedData,
|
|
294
|
-
industry,
|
|
295
|
-
},
|
|
296
|
-
completedSteps: [...toolContext.context.completedSteps, "industry"],
|
|
297
|
-
},
|
|
298
|
-
};
|
|
299
|
-
},
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
const saveContactEmail: Tool<OnboardingContext, OnboardingData> = {
|
|
303
|
-
id: "save_contact_email",
|
|
304
|
-
name: "Contact Email Saver",
|
|
305
|
-
description: "Save contact email",
|
|
306
|
-
parameters: {
|
|
307
|
-
type: "object",
|
|
308
|
-
properties: {
|
|
309
|
-
email: { type: "string", description: "Contact email address" },
|
|
310
|
-
},
|
|
311
|
-
required: ["email"],
|
|
312
|
-
},
|
|
313
|
-
handler: async (toolContext, args) => {
|
|
314
|
-
const email = args?.email as string;
|
|
315
|
-
console.log(`š§ Saving contact email: ${email}`);
|
|
316
|
-
|
|
317
|
-
return {
|
|
318
|
-
data: "Contact email saved successfully",
|
|
319
|
-
contextUpdate: {
|
|
320
|
-
collectedData: {
|
|
321
|
-
...toolContext.context.collectedData,
|
|
322
|
-
contactEmail: email,
|
|
323
|
-
},
|
|
324
|
-
completedSteps: [...toolContext.context.completedSteps, "contact"],
|
|
325
|
-
},
|
|
326
|
-
};
|
|
327
|
-
},
|
|
328
|
-
};
|
|
329
|
-
|
|
330
|
-
// ============================================================================
|
|
331
|
-
// ONBOARDING ROUTE WITH DATA EXTRACTION
|
|
332
|
-
// ============================================================================
|
|
333
|
-
|
|
334
|
-
const onboardingRoute = agent.createRoute({
|
|
335
|
-
title: "Business Onboarding",
|
|
336
|
-
description: "Guide user through business information collection",
|
|
337
|
-
// Mixed condition: AI context + programmatic validation
|
|
338
|
-
when: [
|
|
339
|
-
"User is onboarding their business",
|
|
340
|
-
(ctx) => {
|
|
341
|
-
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
342
|
-
return message.includes('onboard') || message.includes('register') ||
|
|
343
|
-
message.includes('business') || message.includes('start');
|
|
344
|
-
}
|
|
345
|
-
],
|
|
346
|
-
// Skip if user already has complete business info
|
|
347
|
-
skipIf: [
|
|
348
|
-
"business information already complete",
|
|
349
|
-
(ctx) => {
|
|
350
|
-
const data = ctx.data;
|
|
351
|
-
return !!(data?.businessName && data?.businessDescription &&
|
|
352
|
-
data?.industry && data?.contactEmail);
|
|
353
|
-
}
|
|
354
|
-
],
|
|
355
|
-
// NEW: Required fields for route completion
|
|
356
|
-
requiredFields: ["businessName", "businessDescription"],
|
|
357
|
-
// NEW: Optional fields that enhance the experience
|
|
358
|
-
optionalFields: ["industry", "contactEmail"],
|
|
359
|
-
endStep: {
|
|
360
|
-
prompt:
|
|
361
|
-
"Summarize all collected information warmly and confirm onboarding is complete",
|
|
362
|
-
},
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
// Step 1: Collect business name and description
|
|
366
|
-
const collectBusinessInfo = onboardingRoute.initialStep.nextStep({
|
|
367
|
-
prompt: "Ask for business name and a brief description",
|
|
368
|
-
collect: ["businessName", "businessDescription"],
|
|
369
|
-
// Mixed skipIf: AI context + programmatic check
|
|
370
|
-
skipIf: [
|
|
371
|
-
"business name and description already provided",
|
|
372
|
-
(ctx) => !!ctx.data?.businessName && !!ctx.data.businessDescription
|
|
373
|
-
],
|
|
374
|
-
// String-only when condition for AI context
|
|
375
|
-
when: "Need to collect basic business information first",
|
|
376
|
-
});
|
|
377
|
-
|
|
378
|
-
// Step 2: Save business info (tool execution)
|
|
379
|
-
const saveBusiness = collectBusinessInfo.nextStep({
|
|
380
|
-
tools: [saveBusinessInfo],
|
|
381
|
-
requires: ["businessName", "businessDescription"],
|
|
382
|
-
// Function-only when condition for programmatic logic
|
|
383
|
-
when: (ctx) => !!ctx.data?.businessName && !!ctx.data?.businessDescription,
|
|
384
|
-
});
|
|
385
|
-
|
|
386
|
-
// Step 3: Collect industry
|
|
387
|
-
const collectIndustry = saveBusiness.nextStep({
|
|
388
|
-
prompt: "Ask what industry the business operates in",
|
|
389
|
-
collect: ["industry"],
|
|
390
|
-
// Mixed skipIf: AI context + programmatic logic
|
|
391
|
-
skipIf: [
|
|
392
|
-
"industry already specified",
|
|
393
|
-
(ctx) => !!ctx.data?.industry
|
|
394
|
-
],
|
|
395
|
-
});
|
|
396
|
-
|
|
397
|
-
// Step 4: Save industry (tool execution)
|
|
398
|
-
const saveIndustryStep = collectIndustry.nextStep({
|
|
399
|
-
tools: [saveIndustry],
|
|
400
|
-
requires: ["industry"],
|
|
401
|
-
});
|
|
402
|
-
|
|
403
|
-
// Step 5: Collect contact email
|
|
404
|
-
const collectContact = saveIndustryStep.nextStep({
|
|
405
|
-
prompt: "Ask for their contact email",
|
|
406
|
-
collect: ["contactEmail"],
|
|
407
|
-
// Function-only skipIf for programmatic check
|
|
408
|
-
skipIf: (ctx) => !!ctx.data?.contactEmail,
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
// Step 6: Save contact (tool execution)
|
|
412
|
-
const saveContact = collectContact.nextStep({
|
|
413
|
-
tools: [saveContactEmail],
|
|
414
|
-
requires: ["contactEmail"],
|
|
415
|
-
});
|
|
416
|
-
|
|
417
|
-
// Step 7: Confirmation - uses route-level endStep
|
|
418
|
-
saveContact.nextStep({ step: END_ROUTE });
|
|
419
|
-
|
|
420
|
-
// Guidelines
|
|
421
|
-
onboardingRoute.createGuideline({
|
|
422
|
-
condition: "User provides invalid email format",
|
|
423
|
-
action: "Politely ask for a valid email address",
|
|
424
|
-
tags: ["validation"],
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
onboardingRoute.createGuideline({
|
|
428
|
-
condition: "User wants to skip a step",
|
|
429
|
-
action: "Explain why the information is important but allow them to skip",
|
|
430
|
-
tags: ["flexibility"],
|
|
431
|
-
});
|
|
432
|
-
|
|
433
|
-
agent.createGuideline({
|
|
434
|
-
condition: "User asks to start over",
|
|
435
|
-
action:
|
|
436
|
-
"Confirm they want to clear their progress, then restart the onboarding",
|
|
437
|
-
tags: ["reset"],
|
|
438
|
-
});
|
|
439
|
-
|
|
440
|
-
return agent;
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
// ============================================================================
|
|
444
|
-
// ALTERNATIVE PATTERN: CONTEXT PROVIDER
|
|
445
|
-
// ============================================================================
|
|
446
|
-
|
|
447
|
-
/**
|
|
448
|
-
* Creates an onboarding agent using the contextProvider pattern
|
|
449
|
-
*
|
|
450
|
-
* PATTERN 2: Context Provider (Always Fresh)
|
|
451
|
-
* - Context is fetched fresh on every respond() call
|
|
452
|
-
* - No need for beforeRespond hook
|
|
453
|
-
* - Still use onContextUpdate for persistence
|
|
454
|
-
*/
|
|
455
|
-
function createOnboardingAgentWithProvider(sessionId: string) {
|
|
456
|
-
const provider = new GeminiProvider({
|
|
457
|
-
apiKey: process.env.GEMINI_API_KEY || "test-key",
|
|
458
|
-
model: "models/gemini-2.5-flash",
|
|
459
|
-
});
|
|
460
|
-
|
|
461
|
-
// Define the onboarding schema
|
|
462
|
-
const onboardingSchema = {
|
|
463
|
-
type: "object",
|
|
464
|
-
properties: {
|
|
465
|
-
businessName: {
|
|
466
|
-
type: "string",
|
|
467
|
-
description: "Name of the business",
|
|
468
|
-
},
|
|
469
|
-
businessDescription: {
|
|
470
|
-
type: "string",
|
|
471
|
-
description: "Brief description of what the business does",
|
|
472
|
-
},
|
|
473
|
-
industry: {
|
|
474
|
-
type: "string",
|
|
475
|
-
description: "Industry the business operates in",
|
|
476
|
-
},
|
|
477
|
-
contactEmail: {
|
|
478
|
-
type: "string",
|
|
479
|
-
description: "Contact email for the business",
|
|
480
|
-
},
|
|
481
|
-
},
|
|
482
|
-
required: ["businessName", "businessDescription"],
|
|
483
|
-
};
|
|
484
|
-
|
|
485
|
-
const agent = new Agent<OnboardingContext, OnboardingData>({
|
|
486
|
-
name: "OnboardingBot",
|
|
487
|
-
description: "A friendly assistant that helps businesses get started",
|
|
488
|
-
provider: provider,
|
|
489
|
-
// NEW: Agent-level schema
|
|
490
|
-
schema: onboardingSchema,
|
|
491
|
-
|
|
492
|
-
// Context is always fetched fresh from database
|
|
493
|
-
contextProvider: () => {
|
|
494
|
-
const session = db.sessions.findById(sessionId);
|
|
495
|
-
if (!session) {
|
|
496
|
-
throw new Error(`Session ${sessionId} not found`);
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
return {
|
|
500
|
-
sessionId: session.sessionId,
|
|
501
|
-
userId: session.userId,
|
|
502
|
-
collectedData: session.collectedData,
|
|
503
|
-
completedSteps: session.completedSteps,
|
|
504
|
-
};
|
|
505
|
-
},
|
|
506
|
-
|
|
507
|
-
// Still persist updates
|
|
508
|
-
hooks: {
|
|
509
|
-
onContextUpdate: (newContext) => {
|
|
510
|
-
db.sessions.update(sessionId, {
|
|
511
|
-
collectedData: newContext.collectedData,
|
|
512
|
-
completedSteps: newContext.completedSteps,
|
|
513
|
-
});
|
|
514
|
-
},
|
|
515
|
-
},
|
|
516
|
-
});
|
|
517
|
-
|
|
518
|
-
// ... rest of agent setup (same as above)
|
|
519
|
-
|
|
520
|
-
return agent;
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
// ============================================================================
|
|
524
|
-
// USAGE EXAMPLE
|
|
525
|
-
// ============================================================================
|
|
526
|
-
|
|
527
|
-
async function main() {
|
|
528
|
-
const sessionId = "session_123";
|
|
529
|
-
const userId = "user_456";
|
|
530
|
-
|
|
531
|
-
// Initialize session in database
|
|
532
|
-
db.sessions.create({
|
|
533
|
-
sessionId,
|
|
534
|
-
userId,
|
|
535
|
-
collectedData: {},
|
|
536
|
-
completedSteps: [],
|
|
537
|
-
lastUpdated: new Date(),
|
|
538
|
-
});
|
|
539
|
-
|
|
540
|
-
// Create agent with fresh context loading
|
|
541
|
-
const agent = createPersistentOnboardingAgent(sessionId);
|
|
542
|
-
|
|
543
|
-
console.log("=== MULTI-TURN CONVERSATION SIMULATION ===\n");
|
|
544
|
-
|
|
545
|
-
// Session is automatically managed by the agent
|
|
546
|
-
console.log("⨠Session ready:", agent.session.id);
|
|
547
|
-
|
|
548
|
-
// Turn 1: Start onboarding
|
|
549
|
-
console.log("š± Turn 1: User starts onboarding");
|
|
550
|
-
|
|
551
|
-
await agent.session.addMessage("user", "Hi, I want to onboard my business", "Alice");
|
|
552
|
-
|
|
553
|
-
const response1 = await agent.respond({
|
|
554
|
-
history: agent.session.getHistory(),
|
|
555
|
-
});
|
|
556
|
-
|
|
557
|
-
console.log("š¤ Bot:", response1.message);
|
|
558
|
-
console.log("š Data after turn 1:", agent.session.getData());
|
|
559
|
-
console.log("š Route:", response1.session?.currentRoute?.title);
|
|
560
|
-
|
|
561
|
-
// Check route completion after turn 1
|
|
562
|
-
console.log("š Route Completion Check (Turn 1):");
|
|
563
|
-
if (response1.isRouteComplete) {
|
|
564
|
-
console.log(" ā
Route completed after turn 1!");
|
|
565
|
-
} else {
|
|
566
|
-
console.log(" ā³ Route still in progress after turn 1");
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
console.log();
|
|
570
|
-
|
|
571
|
-
await agent.session.addMessage("assistant", response1.message);
|
|
572
|
-
|
|
573
|
-
// Turn 2: User provides business info
|
|
574
|
-
console.log("š± Turn 2: User provides business info");
|
|
575
|
-
const history2 = [
|
|
576
|
-
{
|
|
577
|
-
role: "user" as const,
|
|
578
|
-
content: "Hi, I want to onboard my business",
|
|
579
|
-
name: "Alice",
|
|
580
|
-
},
|
|
581
|
-
{
|
|
582
|
-
role: "assistant" as const,
|
|
583
|
-
content: response1.message,
|
|
584
|
-
},
|
|
585
|
-
{
|
|
586
|
-
role: "user" as const,
|
|
587
|
-
content:
|
|
588
|
-
"My business is called 'TechFlow' and we build AI-powered workflow automation tools",
|
|
589
|
-
name: "Alice",
|
|
590
|
-
},
|
|
591
|
-
];
|
|
592
|
-
const response2 = await agent.respond({ history: history2 });
|
|
593
|
-
console.log("š¤ Bot:", response2.message);
|
|
594
|
-
console.log("š Data after turn 2:", response2.session?.data);
|
|
595
|
-
|
|
596
|
-
// Check route completion after turn 2
|
|
597
|
-
console.log("š Route Completion Check (Turn 2):");
|
|
598
|
-
if (response2.isRouteComplete) {
|
|
599
|
-
console.log(" ā
Route completed after turn 2!");
|
|
600
|
-
} else {
|
|
601
|
-
console.log(" ā³ Route still in progress after turn 2");
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
console.log();
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
// Turn 3: User provides industry
|
|
608
|
-
console.log("š± Turn 3: User provides industry");
|
|
609
|
-
const history3 = [
|
|
610
|
-
...history2,
|
|
611
|
-
{
|
|
612
|
-
role: "assistant" as const,
|
|
613
|
-
content: response2.message,
|
|
614
|
-
},
|
|
615
|
-
{
|
|
616
|
-
role: "user" as const,
|
|
617
|
-
content: "We're in the SaaS industry",
|
|
618
|
-
name: "Alice",
|
|
619
|
-
},
|
|
620
|
-
];
|
|
621
|
-
const response3 = await agent.respond({ history: history3 });
|
|
622
|
-
console.log("š¤ Bot:", response3.message);
|
|
623
|
-
console.log("š Data after turn 3:", response3.session?.data);
|
|
624
|
-
|
|
625
|
-
// Check route completion after turn 3
|
|
626
|
-
console.log("š Route Completion Check (Turn 3):");
|
|
627
|
-
if (response3.isRouteComplete) {
|
|
628
|
-
console.log(" ā
Route completed after turn 3!");
|
|
629
|
-
} else {
|
|
630
|
-
console.log(" ā³ Route still in progress after turn 3");
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
console.log();
|
|
634
|
-
|
|
635
|
-
// Turn 4: User provides contact email, completing the flow
|
|
636
|
-
console.log("š± Turn 4: User provides contact email");
|
|
637
|
-
const history4 = [
|
|
638
|
-
...history3,
|
|
639
|
-
{
|
|
640
|
-
role: "assistant" as const,
|
|
641
|
-
content: response3.message,
|
|
642
|
-
},
|
|
643
|
-
{
|
|
644
|
-
role: "user" as const,
|
|
645
|
-
content: "Our contact email is contact@techflow.ai",
|
|
646
|
-
name: "Alice",
|
|
647
|
-
},
|
|
648
|
-
];
|
|
649
|
-
const response4 = await agent.respond({ history: history4 });
|
|
650
|
-
console.log("š¤ Bot:", response4.message);
|
|
651
|
-
console.log("š Data after turn 4:", response4.session?.data);
|
|
652
|
-
|
|
653
|
-
// Check for route completion
|
|
654
|
-
if (response4.isRouteComplete) {
|
|
655
|
-
console.log("\nā
Onboarding complete!");
|
|
656
|
-
await finalizeOnboarding(
|
|
657
|
-
agent.getData() as unknown as OnboardingData
|
|
658
|
-
);
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
// Verify persistence
|
|
662
|
-
console.log("=== PERSISTENCE VERIFICATION ===");
|
|
663
|
-
const finalSession = db.sessions.findById(sessionId);
|
|
664
|
-
console.log(
|
|
665
|
-
"š¾ Final persisted session:",
|
|
666
|
-
JSON.stringify(finalSession, null, 2)
|
|
667
|
-
);
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
// ============================================================================
|
|
671
|
-
// KEY PATTERNS DEMONSTRATED (V2 Architecture)
|
|
672
|
-
// ============================================================================
|
|
673
|
-
|
|
674
|
-
/*
|
|
675
|
-
* ā
PATTERN 1: Session Management (New SessionManager pattern)
|
|
676
|
-
* - agent.session: Automatic session management
|
|
677
|
-
* - agent.session.addMessage(): Add messages to history
|
|
678
|
-
* - Session tracks collected data across turns
|
|
679
|
-
* - Always-on routing respects intent changes
|
|
680
|
-
*
|
|
681
|
-
* ā
PATTERN 2: Schema-First Data Extraction
|
|
682
|
-
* - schema: Define data contracts upfront
|
|
683
|
-
* - Type-safe extraction throughout conversation
|
|
684
|
-
* - skipIf functions for deterministic step logic
|
|
685
|
-
* - requires arrays for prerequisites
|
|
686
|
-
*
|
|
687
|
-
* ā
PATTERN 3: Context Provider (For external data sources)
|
|
688
|
-
* - contextProvider: Load fresh context from database/API
|
|
689
|
-
* - Runs before each respond() call
|
|
690
|
-
* - Perfect for real-time external data
|
|
691
|
-
*
|
|
692
|
-
* ā
PATTERN 4: Lifecycle Hooks (Data validation & enrichment)
|
|
693
|
-
* - onDataUpdate: Process collected data after extraction
|
|
694
|
-
* - Validate, enrich, and persist collected data
|
|
695
|
-
* - Return modified collected data
|
|
696
|
-
*
|
|
697
|
-
* ā
PATTERN 5: Tool Integration (Enhanced context access)
|
|
698
|
-
* - Tools access collected data via context parameter
|
|
699
|
-
* - Can return dataUpdate to modify collected data
|
|
700
|
-
* - Perfect for data validation and enrichment
|
|
701
|
-
*
|
|
702
|
-
* ā
PATTERN 6: Step Progression (Code-based logic)
|
|
703
|
-
* - skipIf: Deterministic functions instead of fuzzy conditions
|
|
704
|
-
* - requires: Prerequisites for step transitions
|
|
705
|
-
* - No more LLM interpretation of step logic
|
|
706
|
-
*/
|
|
707
|
-
|
|
708
|
-
/**
|
|
709
|
-
* Mock function to finalize the onboarding process.
|
|
710
|
-
* @param data - The complete onboarding data.
|
|
711
|
-
*/
|
|
712
|
-
async function finalizeOnboarding(data: OnboardingData) {
|
|
713
|
-
console.log("\n" + "=".repeat(60));
|
|
714
|
-
console.log("š Finalizing Onboarding...");
|
|
715
|
-
console.log("=".repeat(60));
|
|
716
|
-
console.log("Onboarding Details:", JSON.stringify(data, null, 2));
|
|
717
|
-
console.log(` - Sending welcome email to ${data.contactEmail}...`);
|
|
718
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
719
|
-
console.log(" - Scheduling follow-up call...");
|
|
720
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
721
|
-
console.log("⨠Onboarding finalized!");
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
725
|
-
main().catch(console.error);
|
|
726
|
-
}
|
|
727
|
-
|
|
728
|
-
export { createPersistentOnboardingAgent, createOnboardingAgentWithProvider };
|