@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,631 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Example: Custom Database Integration with New Session Management
|
|
3
|
-
*
|
|
4
|
-
* This example shows how to integrate with existing database schemas
|
|
5
|
-
* while leveraging the new SessionManager for simplified session handling.
|
|
6
|
-
*
|
|
7
|
-
* Key patterns demonstrated:
|
|
8
|
-
* - Using SessionManager with custom database schemas
|
|
9
|
-
* - Converting between SessionManager and custom database formats
|
|
10
|
-
* - Maintaining backward compatibility with existing systems
|
|
11
|
-
* - Session recovery and continuation patterns
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import {
|
|
15
|
-
Agent,
|
|
16
|
-
GeminiProvider,
|
|
17
|
-
SessionState,
|
|
18
|
-
END_ROUTE,
|
|
19
|
-
History,
|
|
20
|
-
createSessionId,
|
|
21
|
-
} from "../../src";
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Example: Your existing database structure
|
|
25
|
-
* This could be any ORM (Prisma, TypeORM, Drizzle) or query builder
|
|
26
|
-
*/
|
|
27
|
-
interface CustomDatabaseSession {
|
|
28
|
-
id: string;
|
|
29
|
-
userId: string;
|
|
30
|
-
currentRoute?: string;
|
|
31
|
-
currentStep?: string;
|
|
32
|
-
collectedData?: Record<string, unknown>;
|
|
33
|
-
conversationHistory?: Array<{
|
|
34
|
-
role: string;
|
|
35
|
-
content: string;
|
|
36
|
-
name?: string;
|
|
37
|
-
timestamp?: string;
|
|
38
|
-
}>;
|
|
39
|
-
metadata?: Record<string, unknown>;
|
|
40
|
-
createdAt: Date;
|
|
41
|
-
updatedAt: Date;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
interface CustomDatabaseMessage {
|
|
45
|
-
id: string;
|
|
46
|
-
sessionId: string;
|
|
47
|
-
userId: string;
|
|
48
|
-
role: string;
|
|
49
|
-
content: string;
|
|
50
|
-
route?: string;
|
|
51
|
-
step?: string;
|
|
52
|
-
createdAt: Date;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// Mock database - replace with your actual database
|
|
56
|
-
class CustomDatabase {
|
|
57
|
-
private sessions: Map<string, CustomDatabaseSession> = new Map();
|
|
58
|
-
private messages: Map<string, CustomDatabaseMessage[]> = new Map();
|
|
59
|
-
|
|
60
|
-
findSession(id: string): CustomDatabaseSession | null {
|
|
61
|
-
return this.sessions.get(id) || null;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
createSession(
|
|
65
|
-
data: Omit<CustomDatabaseSession, "id" | "createdAt" | "updatedAt">
|
|
66
|
-
): CustomDatabaseSession {
|
|
67
|
-
const session: CustomDatabaseSession = {
|
|
68
|
-
id: createSessionId(),
|
|
69
|
-
...data,
|
|
70
|
-
createdAt: new Date(),
|
|
71
|
-
updatedAt: new Date(),
|
|
72
|
-
};
|
|
73
|
-
this.sessions.set(session.id, session);
|
|
74
|
-
return session;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
updateSession(
|
|
78
|
-
id: string,
|
|
79
|
-
data: Partial<CustomDatabaseSession>
|
|
80
|
-
): CustomDatabaseSession | null {
|
|
81
|
-
const session = this.sessions.get(id);
|
|
82
|
-
if (!session) return null;
|
|
83
|
-
|
|
84
|
-
const updated = {
|
|
85
|
-
...session,
|
|
86
|
-
...data,
|
|
87
|
-
updatedAt: new Date(),
|
|
88
|
-
};
|
|
89
|
-
this.sessions.set(id, updated);
|
|
90
|
-
return updated;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
createMessage(
|
|
94
|
-
data: Omit<CustomDatabaseMessage, "id" | "createdAt">
|
|
95
|
-
): CustomDatabaseMessage {
|
|
96
|
-
const message: CustomDatabaseMessage = {
|
|
97
|
-
id: `msg_${Date.now()}`,
|
|
98
|
-
...data,
|
|
99
|
-
createdAt: new Date(),
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
const messages = this.messages.get(data.sessionId) || [];
|
|
103
|
-
messages.push(message);
|
|
104
|
-
this.messages.set(data.sessionId, messages);
|
|
105
|
-
|
|
106
|
-
return message;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
getSessionMessages(sessionId: string): CustomDatabaseMessage[] {
|
|
110
|
-
return this.messages.get(sessionId) || [];
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Example data type for a customer onboarding route
|
|
115
|
-
interface OnboardingData {
|
|
116
|
-
fullName: string;
|
|
117
|
-
email: string;
|
|
118
|
-
companyName: string;
|
|
119
|
-
phoneNumber?: string;
|
|
120
|
-
industry?: string;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
async function example() {
|
|
124
|
-
const db = new CustomDatabase();
|
|
125
|
-
const userId = "user_123";
|
|
126
|
-
const sessionId = "session_user123_onboarding";
|
|
127
|
-
|
|
128
|
-
// Define onboarding schema
|
|
129
|
-
const onboardingSchema = {
|
|
130
|
-
type: "object",
|
|
131
|
-
properties: {
|
|
132
|
-
fullName: { type: "string" },
|
|
133
|
-
email: { type: "string" },
|
|
134
|
-
companyName: { type: "string" },
|
|
135
|
-
phoneNumber: { type: "string" },
|
|
136
|
-
industry: { type: "string" },
|
|
137
|
-
},
|
|
138
|
-
required: ["fullName", "email", "companyName"],
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
// Create agent with SessionManager (no persistence adapter)
|
|
142
|
-
const agent = new Agent<unknown, OnboardingData>({
|
|
143
|
-
name: "Onboarding Assistant",
|
|
144
|
-
description: "Help new customers get started",
|
|
145
|
-
goal: "Collect customer information efficiently",
|
|
146
|
-
provider: new GeminiProvider({
|
|
147
|
-
apiKey: process.env.GEMINI_API_KEY!,
|
|
148
|
-
model: "models/gemini-2.5-flash",
|
|
149
|
-
}),
|
|
150
|
-
// NEW: Agent-level schema
|
|
151
|
-
schema: onboardingSchema,
|
|
152
|
-
// No persistence - we'll sync manually with our database
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
// Create onboarding route
|
|
156
|
-
const onboardingRoute = agent.createRoute({
|
|
157
|
-
title: "Customer Onboarding",
|
|
158
|
-
description: "Collect customer information",
|
|
159
|
-
when: [
|
|
160
|
-
"User is a new customer",
|
|
161
|
-
"User needs to set up their account",
|
|
162
|
-
],
|
|
163
|
-
// NEW: Required fields for route completion
|
|
164
|
-
requiredFields: ["fullName", "email", "companyName"],
|
|
165
|
-
// NEW: Optional fields that enhance the experience
|
|
166
|
-
optionalFields: ["phoneNumber", "industry"],
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
// Define steps with custom IDs
|
|
170
|
-
onboardingRoute.initialStep
|
|
171
|
-
.nextStep({
|
|
172
|
-
id: "ask_name",
|
|
173
|
-
prompt: "Ask for full name",
|
|
174
|
-
collect: ["fullName"],
|
|
175
|
-
skipIf: (ctx) => !!ctx.data?.fullName,
|
|
176
|
-
})
|
|
177
|
-
.nextStep({
|
|
178
|
-
id: "ask_email",
|
|
179
|
-
prompt: "Ask for email address",
|
|
180
|
-
collect: ["email"],
|
|
181
|
-
skipIf: (ctx) => !!ctx.data?.email,
|
|
182
|
-
})
|
|
183
|
-
.nextStep({
|
|
184
|
-
id: "ask_company",
|
|
185
|
-
prompt: "Ask for company name",
|
|
186
|
-
collect: ["companyName"],
|
|
187
|
-
skipIf: (ctx) => !!ctx.data?.companyName,
|
|
188
|
-
})
|
|
189
|
-
.nextStep({
|
|
190
|
-
id: "ask_phone",
|
|
191
|
-
prompt: "Ask for phone number (optional)",
|
|
192
|
-
collect: ["phoneNumber"],
|
|
193
|
-
})
|
|
194
|
-
.nextStep({
|
|
195
|
-
id: "ask_industry",
|
|
196
|
-
prompt: "Ask for industry",
|
|
197
|
-
collect: ["industry"],
|
|
198
|
-
})
|
|
199
|
-
.nextStep({
|
|
200
|
-
id: "confirm_details",
|
|
201
|
-
prompt: "Confirm all details",
|
|
202
|
-
requires: ["fullName", "email", "companyName"],
|
|
203
|
-
})
|
|
204
|
-
.nextStep({
|
|
205
|
-
id: "complete_onboarding",
|
|
206
|
-
prompt:
|
|
207
|
-
"Thank you! Your account is set up. You will receive a confirmation email shortly.",
|
|
208
|
-
})
|
|
209
|
-
.nextStep({ step: END_ROUTE });
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Load or create session in your custom database
|
|
213
|
-
*/
|
|
214
|
-
let dbSession = db.findSession(sessionId);
|
|
215
|
-
|
|
216
|
-
if (!dbSession) {
|
|
217
|
-
// Create new session in your database
|
|
218
|
-
dbSession = db.createSession({
|
|
219
|
-
userId,
|
|
220
|
-
collectedData: {},
|
|
221
|
-
conversationHistory: [],
|
|
222
|
-
});
|
|
223
|
-
console.log("✨ Created new database session:", dbSession.id);
|
|
224
|
-
} else {
|
|
225
|
-
console.log("📥 Found existing database session:", dbSession.id);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Sync database session with SessionManager
|
|
230
|
-
*/
|
|
231
|
-
// Create or load session in SessionManager
|
|
232
|
-
const sessionState = await agent.session.getOrCreate(dbSession.id);
|
|
233
|
-
|
|
234
|
-
// Restore conversation history from database
|
|
235
|
-
if (dbSession.conversationHistory && dbSession.conversationHistory.length > 0) {
|
|
236
|
-
const history = dbSession.conversationHistory.map(msg => {
|
|
237
|
-
if (msg.role === 'user') {
|
|
238
|
-
return {
|
|
239
|
-
role: 'user' as const,
|
|
240
|
-
content: msg.content,
|
|
241
|
-
name: msg.name,
|
|
242
|
-
};
|
|
243
|
-
} else {
|
|
244
|
-
return {
|
|
245
|
-
role: 'assistant' as const,
|
|
246
|
-
content: msg.content,
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
agent.session.setHistory(history);
|
|
251
|
-
console.log(`📜 Restored ${history.length} messages from database`);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// Restore collected data from database
|
|
255
|
-
if (dbSession.collectedData) {
|
|
256
|
-
await agent.session.setData(dbSession.collectedData);
|
|
257
|
-
console.log("📊 Restored session data from database");
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
console.log("✅ Session synchronized:", {
|
|
261
|
-
sessionId: agent.session.id,
|
|
262
|
-
historyLength: agent.session.getHistory().length,
|
|
263
|
-
data: agent.session.getData(),
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Simulate conversation with automatic sync
|
|
268
|
-
*/
|
|
269
|
-
console.log("\n--- Turn 1 ---");
|
|
270
|
-
|
|
271
|
-
// Add user message to SessionManager
|
|
272
|
-
await agent.session.addMessage("user", "Hi! I'm John Smith and my email is john@acme.com", "User");
|
|
273
|
-
|
|
274
|
-
const response1 = await agent.respond({
|
|
275
|
-
history: agent.session.getHistory(),
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
console.log("🤖 Agent:", response1.message);
|
|
279
|
-
console.log("📊 Data collected:", agent.session.getData());
|
|
280
|
-
|
|
281
|
-
// Add agent response to SessionManager
|
|
282
|
-
await agent.session.addMessage("assistant", response1.message);
|
|
283
|
-
|
|
284
|
-
// Sync SessionManager state back to your database
|
|
285
|
-
await syncSessionToDatabase(agent, db, dbSession.id, userId);
|
|
286
|
-
console.log("💾 Session synced to custom database");
|
|
287
|
-
|
|
288
|
-
// Turn 2: User provides company
|
|
289
|
-
console.log("\n--- Turn 2 ---");
|
|
290
|
-
|
|
291
|
-
await agent.session.addMessage("user", "I work for Acme Corporation", "User");
|
|
292
|
-
|
|
293
|
-
const response2 = await agent.respond({
|
|
294
|
-
history: agent.session.getHistory(),
|
|
295
|
-
});
|
|
296
|
-
|
|
297
|
-
console.log("🤖 Agent:", response2.message);
|
|
298
|
-
console.log("📊 Data collected:", agent.session.getData());
|
|
299
|
-
|
|
300
|
-
await agent.session.addMessage("assistant", response2.message);
|
|
301
|
-
|
|
302
|
-
// Sync to database again
|
|
303
|
-
await syncSessionToDatabase(agent, db, dbSession.id, userId);
|
|
304
|
-
console.log("💾 Session synced to custom database");
|
|
305
|
-
|
|
306
|
-
// Check for route completion
|
|
307
|
-
if (response2.isRouteComplete) {
|
|
308
|
-
console.log("\n✅ Onboarding Complete!");
|
|
309
|
-
await processOnboarding(agent.session.getData());
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Demonstrate session recovery with new Agent instance
|
|
314
|
-
*/
|
|
315
|
-
console.log("\n--- Session Recovery (New Agent Instance) ---");
|
|
316
|
-
|
|
317
|
-
// Create new agent instance (simulating app restart)
|
|
318
|
-
const newAgent = new Agent({
|
|
319
|
-
name: "Onboarding Assistant",
|
|
320
|
-
provider: new GeminiProvider({
|
|
321
|
-
apiKey: process.env.GEMINI_API_KEY!,
|
|
322
|
-
model: "models/gemini-2.5-flash",
|
|
323
|
-
}),
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
// Load session from database and sync to new SessionManager
|
|
327
|
-
const reloadedDbSession = db.findSession(dbSession.id);
|
|
328
|
-
if (!reloadedDbSession) throw new Error("Session not found");
|
|
329
|
-
|
|
330
|
-
// Load session in new agent's SessionManager
|
|
331
|
-
await newAgent.session.getOrCreate(reloadedDbSession.id);
|
|
332
|
-
|
|
333
|
-
// Restore history and data
|
|
334
|
-
if (reloadedDbSession.conversationHistory) {
|
|
335
|
-
const history = reloadedDbSession.conversationHistory.map(msg => {
|
|
336
|
-
if (msg.role === 'user') {
|
|
337
|
-
return {
|
|
338
|
-
role: 'user' as const,
|
|
339
|
-
content: msg.content,
|
|
340
|
-
name: msg.name,
|
|
341
|
-
};
|
|
342
|
-
} else {
|
|
343
|
-
return {
|
|
344
|
-
role: 'assistant' as const,
|
|
345
|
-
content: msg.content,
|
|
346
|
-
};
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
newAgent.session.setHistory(history);
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
if (reloadedDbSession.collectedData) {
|
|
353
|
-
await newAgent.session.setData(reloadedDbSession.collectedData);
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
console.log("✅ Session recovered in new agent:", {
|
|
357
|
-
sessionId: newAgent.session.id,
|
|
358
|
-
historyLength: newAgent.session.getHistory().length,
|
|
359
|
-
data: newAgent.session.getData(),
|
|
360
|
-
});
|
|
361
|
-
|
|
362
|
-
// Continue conversation with recovered session
|
|
363
|
-
await newAgent.session.addMessage("user", "Can you confirm my details?");
|
|
364
|
-
|
|
365
|
-
const confirmResponse = await newAgent.respond({
|
|
366
|
-
history: newAgent.session.getHistory(),
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
console.log("🤖 Confirmation:", confirmResponse.message);
|
|
370
|
-
await newAgent.session.addMessage("assistant", confirmResponse.message);
|
|
371
|
-
|
|
372
|
-
console.log("\n✅ Example complete!");
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
/**
|
|
376
|
-
* Helper function to sync SessionManager state to custom database
|
|
377
|
-
*/
|
|
378
|
-
async function syncSessionToDatabase(
|
|
379
|
-
agent: Agent<unknown, OnboardingData>,
|
|
380
|
-
db: CustomDatabase,
|
|
381
|
-
sessionId: string,
|
|
382
|
-
userId: string
|
|
383
|
-
): Promise<void> {
|
|
384
|
-
const sessionData = agent.session.getData();
|
|
385
|
-
const history = agent.session.getHistory();
|
|
386
|
-
|
|
387
|
-
// Convert SessionManager history to database format
|
|
388
|
-
const conversationHistory = history.map(msg => ({
|
|
389
|
-
role: msg.role,
|
|
390
|
-
content: msg.role === 'assistant' ? (msg.content || '') : msg.content,
|
|
391
|
-
name: msg.role === 'user' ? msg.name : undefined,
|
|
392
|
-
timestamp: new Date().toISOString(),
|
|
393
|
-
}));
|
|
394
|
-
|
|
395
|
-
// Update database session
|
|
396
|
-
db.updateSession(sessionId, {
|
|
397
|
-
collectedData: sessionData,
|
|
398
|
-
conversationHistory,
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
// Save individual messages to database (if needed for your schema)
|
|
402
|
-
const existingMessages = db.getSessionMessages(sessionId);
|
|
403
|
-
const newMessages = history.slice(existingMessages.length);
|
|
404
|
-
|
|
405
|
-
for (const msg of newMessages) {
|
|
406
|
-
db.createMessage({
|
|
407
|
-
sessionId,
|
|
408
|
-
userId,
|
|
409
|
-
role: msg.role,
|
|
410
|
-
content: msg.content,
|
|
411
|
-
});
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
/**
|
|
416
|
-
* Mock function to simulate processing the completed onboarding data.
|
|
417
|
-
*/
|
|
418
|
-
async function processOnboarding(data: Partial<OnboardingData>) {
|
|
419
|
-
console.log("\n🚀 Processing onboarding data...");
|
|
420
|
-
console.log(
|
|
421
|
-
` - Creating account for ${data?.fullName} at ${data?.companyName}`
|
|
422
|
-
);
|
|
423
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
424
|
-
console.log(` - Sending welcome email to ${data?.email}`);
|
|
425
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
426
|
-
console.log("✨ Onboarding processed successfully!");
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
/**
|
|
430
|
-
* Advanced Example: SessionManager with Data Validation Hooks
|
|
431
|
-
*/
|
|
432
|
-
async function advancedExample() {
|
|
433
|
-
const db = new CustomDatabase();
|
|
434
|
-
const sessionId = "session_user456_smart_onboarding";
|
|
435
|
-
|
|
436
|
-
const smartOnboardingSchema = {
|
|
437
|
-
type: "object",
|
|
438
|
-
properties: {
|
|
439
|
-
fullName: { type: "string" },
|
|
440
|
-
email: { type: "string" },
|
|
441
|
-
companyName: { type: "string" },
|
|
442
|
-
phoneNumber: { type: "string" },
|
|
443
|
-
},
|
|
444
|
-
required: ["fullName", "email", "companyName"],
|
|
445
|
-
};
|
|
446
|
-
|
|
447
|
-
const agent = new Agent<unknown, OnboardingData>({
|
|
448
|
-
name: "Smart Onboarding",
|
|
449
|
-
provider: new GeminiProvider({
|
|
450
|
-
apiKey: process.env.GEMINI_API_KEY!,
|
|
451
|
-
model: "models/gemini-2.5-flash",
|
|
452
|
-
}),
|
|
453
|
-
// NEW: Agent-level schema
|
|
454
|
-
schema: smartOnboardingSchema,
|
|
455
|
-
hooks: {
|
|
456
|
-
// Validate and enrich collected data
|
|
457
|
-
onDataUpdate: (data, _previous: Partial<OnboardingData>) => {
|
|
458
|
-
console.log("🔄 Data collected, validating...");
|
|
459
|
-
|
|
460
|
-
// Normalize email
|
|
461
|
-
if (data.email) {
|
|
462
|
-
data.email = data.email.toLowerCase().trim();
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
// Normalize phone
|
|
466
|
-
if (data.phoneNumber) {
|
|
467
|
-
data.phoneNumber = data.phoneNumber.replace(/\D/g, "");
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
return data;
|
|
471
|
-
},
|
|
472
|
-
},
|
|
473
|
-
});
|
|
474
|
-
|
|
475
|
-
const route = agent.createRoute({
|
|
476
|
-
title: "Smart Onboarding",
|
|
477
|
-
// NEW: Required fields for route completion
|
|
478
|
-
requiredFields: ["fullName", "email", "companyName"],
|
|
479
|
-
// NEW: Optional fields
|
|
480
|
-
optionalFields: ["phoneNumber"],
|
|
481
|
-
});
|
|
482
|
-
|
|
483
|
-
route.initialStep.nextStep({
|
|
484
|
-
id: "collect_all",
|
|
485
|
-
prompt: "Collect all information",
|
|
486
|
-
collect: ["fullName", "email", "companyName", "phoneNumber"],
|
|
487
|
-
});
|
|
488
|
-
|
|
489
|
-
// Create database session
|
|
490
|
-
const dbSession = db.createSession({
|
|
491
|
-
userId: "user_456",
|
|
492
|
-
collectedData: {},
|
|
493
|
-
conversationHistory: [],
|
|
494
|
-
});
|
|
495
|
-
|
|
496
|
-
// Load session in SessionManager
|
|
497
|
-
await agent.session.getOrCreate(dbSession.id);
|
|
498
|
-
|
|
499
|
-
// Add user message and respond
|
|
500
|
-
await agent.session.addMessage(
|
|
501
|
-
"user",
|
|
502
|
-
"I'm Alice Johnson, alice@EXAMPLE.COM, working for TechCorp. Phone: (555) 123-4567",
|
|
503
|
-
"User"
|
|
504
|
-
);
|
|
505
|
-
|
|
506
|
-
const response = await agent.respond({
|
|
507
|
-
history: agent.session.getHistory(),
|
|
508
|
-
});
|
|
509
|
-
|
|
510
|
-
console.log("🤖 Agent:", response.message);
|
|
511
|
-
console.log("📊 Normalized data:", agent.session.getData());
|
|
512
|
-
// Shows: { email: "alice@example.com", phoneNumber: "5551234567", ... }
|
|
513
|
-
|
|
514
|
-
await agent.session.addMessage("assistant", response.message);
|
|
515
|
-
|
|
516
|
-
// Sync to custom database
|
|
517
|
-
await syncSessionToDatabase(agent, db, dbSession.id, "user_456");
|
|
518
|
-
|
|
519
|
-
console.log("✅ Validated data saved to custom database!");
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
/**
|
|
523
|
-
* Server Endpoint Example: Express-style API with SessionManager
|
|
524
|
-
*/
|
|
525
|
-
async function serverEndpointExample() {
|
|
526
|
-
const db = new CustomDatabase();
|
|
527
|
-
|
|
528
|
-
// Simulate Express endpoint
|
|
529
|
-
async function handleChatRequest(req: {
|
|
530
|
-
sessionId?: string;
|
|
531
|
-
userId: string;
|
|
532
|
-
message: string;
|
|
533
|
-
}) {
|
|
534
|
-
const { sessionId, userId, message } = req;
|
|
535
|
-
|
|
536
|
-
// Create agent with sessionId (loads existing or creates new)
|
|
537
|
-
const agent = new Agent<unknown, OnboardingData>({
|
|
538
|
-
name: "Customer Support",
|
|
539
|
-
provider: new GeminiProvider({
|
|
540
|
-
apiKey: process.env.GEMINI_API_KEY!,
|
|
541
|
-
model: "models/gemini-2.5-flash",
|
|
542
|
-
}),
|
|
543
|
-
});
|
|
544
|
-
|
|
545
|
-
// Load or create session
|
|
546
|
-
const effectiveSessionId = sessionId || createSessionId();
|
|
547
|
-
await agent.session.getOrCreate(effectiveSessionId);
|
|
548
|
-
|
|
549
|
-
// Try to load from database if session exists
|
|
550
|
-
const dbSession = db.findSession(effectiveSessionId);
|
|
551
|
-
if (dbSession && dbSession.conversationHistory) {
|
|
552
|
-
const history = dbSession.conversationHistory.map(msg => {
|
|
553
|
-
if (msg.role === 'user') {
|
|
554
|
-
return {
|
|
555
|
-
role: 'user' as const,
|
|
556
|
-
content: msg.content,
|
|
557
|
-
name: msg.name,
|
|
558
|
-
};
|
|
559
|
-
} else {
|
|
560
|
-
return {
|
|
561
|
-
role: 'assistant' as const,
|
|
562
|
-
content: msg.content,
|
|
563
|
-
};
|
|
564
|
-
}
|
|
565
|
-
});
|
|
566
|
-
agent.session.setHistory(history);
|
|
567
|
-
|
|
568
|
-
if (dbSession.collectedData) {
|
|
569
|
-
await agent.session.setData(dbSession.collectedData);
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
// Add user message and respond
|
|
574
|
-
await agent.session.addMessage("user", message);
|
|
575
|
-
|
|
576
|
-
const response = await agent.respond({
|
|
577
|
-
history: agent.session.getHistory(),
|
|
578
|
-
});
|
|
579
|
-
|
|
580
|
-
await agent.session.addMessage("assistant", response.message);
|
|
581
|
-
|
|
582
|
-
// Sync back to database
|
|
583
|
-
if (!dbSession) {
|
|
584
|
-
db.createSession({
|
|
585
|
-
userId,
|
|
586
|
-
collectedData: agent.session.getData(),
|
|
587
|
-
conversationHistory: agent.session.getHistory().map(msg => ({
|
|
588
|
-
role: msg.role,
|
|
589
|
-
content: msg.role === 'assistant' ? (msg.content || '') : msg.content,
|
|
590
|
-
name: msg.role === 'user' ? msg.name : undefined,
|
|
591
|
-
timestamp: new Date().toISOString(),
|
|
592
|
-
})),
|
|
593
|
-
});
|
|
594
|
-
} else {
|
|
595
|
-
await syncSessionToDatabase(agent, db, effectiveSessionId, userId);
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
// Return API response
|
|
599
|
-
return {
|
|
600
|
-
message: response.message,
|
|
601
|
-
sessionId: agent.session.id,
|
|
602
|
-
isComplete: response.isRouteComplete,
|
|
603
|
-
data: agent.session.getData(),
|
|
604
|
-
};
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
// Simulate API calls
|
|
608
|
-
console.log("🌐 Simulating server endpoint calls...");
|
|
609
|
-
|
|
610
|
-
const response1 = await handleChatRequest({
|
|
611
|
-
userId: "user_789",
|
|
612
|
-
message: "I need help with my account",
|
|
613
|
-
});
|
|
614
|
-
console.log("📤 Response 1:", response1);
|
|
615
|
-
|
|
616
|
-
const response2 = await handleChatRequest({
|
|
617
|
-
sessionId: response1.sessionId,
|
|
618
|
-
userId: "user_789",
|
|
619
|
-
message: "I can't log in",
|
|
620
|
-
});
|
|
621
|
-
console.log("📤 Response 2:", response2);
|
|
622
|
-
|
|
623
|
-
console.log("✅ Server endpoint example complete!");
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
// Run the example
|
|
627
|
-
if (require.main === module) {
|
|
628
|
-
example().catch(console.error);
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
export { example, advancedExample, serverEndpointExample };
|