@falai/agent 1.2.8 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -886
- package/dist/adapters/MemoryAdapter.js +2 -2
- package/dist/adapters/MemoryAdapter.js.map +1 -1
- package/dist/adapters/MongoAdapter.js +2 -2
- package/dist/adapters/MongoAdapter.js.map +1 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenSearchAdapter.js +9 -7
- package/dist/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.js +25 -9
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/adapters/PrismaAdapter.js +5 -5
- package/dist/adapters/PrismaAdapter.js.map +1 -1
- package/dist/adapters/RedisAdapter.js +2 -2
- package/dist/adapters/RedisAdapter.js.map +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts +17 -0
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/adapters/SQLiteAdapter.js +30 -11
- package/dist/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.js +2 -2
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.js +2 -2
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.js +5 -5
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.js +2 -2
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/constants/index.d.ts +0 -9
- package/dist/cjs/constants/index.d.ts.map +1 -1
- package/dist/cjs/constants/index.js +2 -11
- package/dist/cjs/constants/index.js.map +1 -1
- package/dist/cjs/core/Agent.d.ts +119 -153
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +471 -324
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
- package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
- package/dist/cjs/core/AutoChainExecutor.js +297 -0
- package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
- package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
- package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
- package/dist/cjs/core/BranchEvaluator.js +130 -0
- package/dist/cjs/core/BranchEvaluator.js.map +1 -0
- package/dist/cjs/core/DirectiveBus.d.ts +88 -0
- package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
- package/dist/cjs/core/DirectiveBus.js +196 -0
- package/dist/cjs/core/DirectiveBus.js.map +1 -0
- package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
- package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
- package/dist/cjs/core/DirectiveChainTracker.js +121 -0
- package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
- package/dist/cjs/core/Flow.d.ts +186 -0
- package/dist/cjs/core/Flow.d.ts.map +1 -0
- package/dist/cjs/core/Flow.js +550 -0
- package/dist/cjs/core/Flow.js.map +1 -0
- package/dist/cjs/core/FlowRouter.d.ts +182 -0
- package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
- package/dist/cjs/core/{RoutingEngine.js → FlowRouter.js} +323 -306
- package/dist/cjs/core/FlowRouter.js.map +1 -0
- package/dist/cjs/core/PersistenceManager.d.ts +2 -2
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
- package/dist/cjs/core/PersistenceManager.js +7 -7
- package/dist/cjs/core/PersistenceManager.js.map +1 -1
- package/dist/cjs/core/PromptComposer.d.ts +21 -8
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
- package/dist/cjs/core/PromptComposer.js +182 -105
- package/dist/cjs/core/PromptComposer.js.map +1 -1
- package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
- package/dist/cjs/core/PromptSectionCache.js +1 -1
- package/dist/cjs/core/ResponseEngine.d.ts +18 -8
- package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +38 -36
- package/dist/cjs/core/ResponseEngine.js.map +1 -1
- package/dist/cjs/core/ResponseModal.d.ts +73 -56
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
- package/dist/cjs/core/ResponseModal.js +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/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/types/agent.d.ts +183 -54
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js +0 -6
- package/dist/types/agent.js.map +1 -1
- package/dist/types/ai.d.ts +3 -3
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/errors.d.ts +15 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +18 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/flow.d.ts +513 -0
- package/dist/types/flow.d.ts.map +1 -0
- package/dist/types/flow.js +5 -0
- package/dist/types/flow.js.map +1 -0
- package/dist/types/index.d.ts +7 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/persistence.d.ts +11 -7
- package/dist/types/persistence.d.ts.map +1 -1
- package/dist/types/routing.d.ts +1 -1
- package/dist/types/routing.d.ts.map +1 -1
- package/dist/types/session.d.ts +24 -23
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/signals.d.ts +248 -0
- package/dist/types/signals.d.ts.map +1 -0
- package/dist/types/signals.js +10 -0
- package/dist/types/signals.js.map +1 -0
- package/dist/types/template.d.ts +2 -8
- package/dist/types/template.d.ts.map +1 -1
- package/dist/types/tool.d.ts +36 -29
- package/dist/types/tool.d.ts.map +1 -1
- package/dist/types/tool.js +1 -1
- package/dist/types/tool.js.map +1 -1
- package/dist/utils/condition.d.ts +7 -1
- package/dist/utils/condition.d.ts.map +1 -1
- package/dist/utils/condition.js.map +1 -1
- package/dist/utils/id.d.ts +13 -5
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +22 -9
- package/dist/utils/id.js.map +1 -1
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/session.d.ts +44 -5
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +193 -37
- package/dist/utils/session.js.map +1 -1
- package/docs/README.md +15 -202
- package/docs/concepts/architecture.md +281 -0
- package/docs/concepts/directives.md +400 -0
- package/docs/concepts/pipeline.md +399 -0
- package/docs/guides/branching.md +263 -0
- package/docs/guides/compaction.md +163 -0
- package/docs/guides/conditions.md +167 -0
- package/docs/guides/error-handling.md +176 -0
- package/docs/guides/flow-control.md +409 -0
- package/docs/guides/instructions.md +210 -0
- package/docs/guides/persistence.md +182 -0
- package/docs/guides/streaming.md +137 -0
- package/docs/migration/README.md +15 -0
- package/docs/migration/route-to-flow.md +560 -0
- package/docs/migration/v1-to-v2.md +909 -0
- package/docs/reference/adapters.md +481 -0
- package/docs/reference/branches.md +241 -0
- package/docs/reference/create-agent.md +186 -0
- package/docs/reference/directive.md +243 -0
- package/docs/reference/errors.md +122 -0
- package/docs/reference/flow.md +238 -0
- package/docs/reference/instruction.md +177 -0
- package/docs/reference/pre-directive.md +131 -0
- package/docs/reference/providers.md +227 -0
- package/docs/reference/signals.md +356 -0
- package/docs/reference/step.md +339 -0
- package/docs/reference/tool.md +269 -0
- package/docs/start/01-install.md +81 -0
- package/docs/start/02-first-agent.md +196 -0
- package/docs/start/03-collect-data.md +222 -0
- package/docs/start/04-add-tools.md +276 -0
- package/docs/start/05-go-to-production.md +216 -0
- package/examples/01-quickstart.ts +20 -0
- package/examples/02-data-extraction.ts +90 -0
- package/examples/03-tools.ts +136 -0
- package/examples/04-instructions.ts +100 -0
- package/examples/05-branching.ts +140 -0
- package/examples/06-flow-control.ts +103 -0
- package/examples/07-streaming.ts +69 -0
- package/examples/08-persistence.ts +98 -0
- package/examples/09-signals.ts +144 -0
- package/examples/tsconfig.json +30 -0
- package/package.json +2 -1
- package/src/adapters/MemoryAdapter.ts +3 -3
- package/src/adapters/MongoAdapter.ts +3 -3
- package/src/adapters/OpenSearchAdapter.ts +10 -8
- package/src/adapters/PostgreSQLAdapter.ts +26 -10
- package/src/adapters/PrismaAdapter.ts +6 -6
- package/src/adapters/RedisAdapter.ts +3 -3
- package/src/adapters/SQLiteAdapter.ts +31 -12
- package/src/constants/index.ts +2 -10
- package/src/core/Agent.ts +585 -374
- package/src/core/AutoChainExecutor.ts +440 -0
- package/src/core/BranchEvaluator.ts +167 -0
- package/src/core/DirectiveBus.ts +248 -0
- package/src/core/DirectiveChainTracker.ts +144 -0
- package/src/core/Flow.ts +666 -0
- package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
- package/src/core/PersistenceManager.ts +8 -8
- package/src/core/PromptComposer.ts +209 -140
- package/src/core/PromptSectionCache.ts +1 -1
- package/src/core/ResponseEngine.ts +61 -46
- package/src/core/ResponseModal.ts +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/types/agent.ts +182 -53
- package/src/types/ai.ts +3 -3
- package/src/types/errors.ts +18 -0
- package/src/types/flow.ts +590 -0
- package/src/types/index.ts +43 -16
- package/src/types/persistence.ts +12 -8
- package/src/types/routing.ts +1 -1
- package/src/types/session.ts +26 -23
- package/src/types/signals.ts +321 -0
- package/src/types/template.ts +3 -11
- package/src/types/tool.ts +50 -42
- package/src/utils/condition.ts +13 -4
- package/src/utils/id.ts +27 -9
- package/src/utils/index.ts +6 -2
- package/src/utils/session.ts +238 -42
- package/dist/cjs/core/BatchExecutor.d.ts +0 -359
- package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
- package/dist/cjs/core/BatchExecutor.js +0 -861
- package/dist/cjs/core/BatchExecutor.js.map +0 -1
- package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
- package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
- package/dist/cjs/core/BatchPromptBuilder.js +0 -223
- package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
- package/dist/cjs/core/Route.d.ts +0 -180
- package/dist/cjs/core/Route.d.ts.map +0 -1
- package/dist/cjs/core/Route.js +0 -542
- package/dist/cjs/core/Route.js.map +0 -1
- package/dist/cjs/core/RoutingEngine.d.ts +0 -185
- package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/types/route.d.ts +0 -336
- package/dist/cjs/types/route.d.ts.map +0 -1
- package/dist/cjs/types/route.js.map +0 -1
- package/dist/core/BatchExecutor.d.ts +0 -359
- package/dist/core/BatchExecutor.d.ts.map +0 -1
- package/dist/core/BatchExecutor.js +0 -856
- package/dist/core/BatchExecutor.js.map +0 -1
- package/dist/core/BatchPromptBuilder.d.ts +0 -89
- package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
- package/dist/core/BatchPromptBuilder.js +0 -219
- package/dist/core/BatchPromptBuilder.js.map +0 -1
- package/dist/core/Route.d.ts +0 -180
- package/dist/core/Route.d.ts.map +0 -1
- package/dist/core/Route.js +0 -538
- package/dist/core/Route.js.map +0 -1
- package/dist/core/RoutingEngine.d.ts +0 -185
- package/dist/core/RoutingEngine.d.ts.map +0 -1
- package/dist/core/RoutingEngine.js.map +0 -1
- package/dist/types/route.d.ts +0 -336
- package/dist/types/route.d.ts.map +0 -1
- package/dist/types/route.js +0 -5
- package/dist/types/route.js.map +0 -1
- package/docs/CONTRIBUTING.md +0 -521
- package/docs/api/README.md +0 -3299
- package/docs/api/overview.md +0 -1410
- package/docs/architecture/data-extraction-flow.md +0 -360
- package/docs/architecture/multi-step-execution.md +0 -277
- package/docs/core/agent/README.md +0 -938
- package/docs/core/agent/context-management.md +0 -796
- package/docs/core/agent/rules-and-prohibitions.md +0 -113
- package/docs/core/agent/session-management.md +0 -693
- package/docs/core/ai-integration/prompt-composition.md +0 -355
- package/docs/core/ai-integration/providers.md +0 -515
- package/docs/core/ai-integration/response-processing.md +0 -433
- package/docs/core/conversation-flows/data-collection.md +0 -772
- package/docs/core/conversation-flows/route-dsl.md +0 -509
- package/docs/core/conversation-flows/routes.md +0 -249
- package/docs/core/conversation-flows/step-transitions.md +0 -731
- package/docs/core/conversation-flows/steps.md +0 -268
- package/docs/core/error-handling.md +0 -830
- package/docs/core/persistence/adapters.md +0 -255
- package/docs/core/persistence/session-storage.md +0 -656
- package/docs/core/routing/intelligent-routing.md +0 -470
- package/docs/core/tools/enhanced-tool.md +0 -186
- package/docs/core/tools/streaming-execution.md +0 -161
- package/docs/core/tools/tool-definition.md +0 -970
- package/docs/core/tools/tool-scoping.md +0 -819
- package/docs/guides/advanced-patterns/publishing.md +0 -186
- package/docs/guides/context-compaction.md +0 -96
- package/docs/guides/error-handling-patterns.md +0 -578
- package/docs/guides/getting-started/README.md +0 -795
- package/docs/guides/migration/README.md +0 -101
- package/docs/guides/migration/flexible-routing-conditions.md +0 -375
- package/docs/guides/migration/multi-step-execution.md +0 -393
- package/docs/guides/migration/response-modal-refactor.md +0 -518
- package/docs/guides/prompt-optimization.md +0 -164
- package/examples/advanced-patterns/context-compaction.ts +0 -223
- package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
- package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
- package/examples/advanced-patterns/streaming-responses.ts +0 -656
- package/examples/ai-providers/anthropic-integration.ts +0 -388
- package/examples/ai-providers/openai-integration.ts +0 -228
- package/examples/condition-patterns/function-only-conditions.ts +0 -365
- package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
- package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
- package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
- package/examples/condition-patterns/string-only-conditions.ts +0 -296
- package/examples/conversation-flows/completion-transitions.ts +0 -318
- package/examples/core-concepts/basic-agent.ts +0 -503
- package/examples/core-concepts/modern-streaming-api.ts +0 -309
- package/examples/core-concepts/schema-driven-extraction.ts +0 -332
- package/examples/core-concepts/session-management.ts +0 -494
- package/examples/integrations/database-integration.ts +0 -631
- package/examples/integrations/healthcare-integration.ts +0 -595
- package/examples/integrations/search-integration.ts +0 -530
- package/examples/integrations/server-session-management.ts +0 -307
- package/examples/persistence/custom-adapter.ts +0 -526
- package/examples/persistence/database-persistence.ts +0 -583
- package/examples/persistence/memory-sessions.ts +0 -495
- package/examples/persistence/prisma-schema.example.prisma +0 -74
- package/examples/persistence/redis-persistence.ts +0 -488
- package/examples/tools/basic-tools.ts +0 -765
- package/examples/tools/data-enrichment-tools.ts +0 -593
- package/examples/tools/enhanced-tool-metadata.ts +0 -268
- package/examples/tools/streaming-tool-execution.ts +0 -283
- package/src/core/BatchExecutor.ts +0 -1187
- package/src/core/BatchPromptBuilder.ts +0 -299
- package/src/core/Route.ts +0 -678
- package/src/types/route.ts +0 -392
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DirectiveBus — per-turn collection mechanism for directives emitted by
|
|
3
|
+
* hooks, tools, and branches.
|
|
4
|
+
*
|
|
5
|
+
* Two phases per turn:
|
|
6
|
+
* 1. Pre-LLM: collects from `prepare` hooks and `onEnter` hooks.
|
|
7
|
+
* 2. Post-LLM: collects from `finalize`, tools via `executeToolCalls`,
|
|
8
|
+
* branches via `evaluateBranches`.
|
|
9
|
+
*
|
|
10
|
+
* Each entry is stamped with an emitter ID for debug logging. At phase
|
|
11
|
+
* boundaries, the bus contents are merged using `flow.merge` and the
|
|
12
|
+
* result is returned via `drain()`.
|
|
13
|
+
*
|
|
14
|
+
* Algorithm 4: position precedence `abort > complete > goTo/goToStep > reset`,
|
|
15
|
+
* ties broken by emission order (last wins).
|
|
16
|
+
*
|
|
17
|
+
* **Validates: Requirements 1.3, 10.4, 10.5, 10.6**
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type { Directive } from "../types/flow";
|
|
21
|
+
import { flow } from "./flow-namespace";
|
|
22
|
+
import { logger } from "../utils";
|
|
23
|
+
|
|
24
|
+
/** Phase of the turn pipeline the bus is currently collecting for. */
|
|
25
|
+
export type DirectiveBusPhase = "pre-llm" | "post-llm";
|
|
26
|
+
|
|
27
|
+
/** A single entry on the bus, stamped with its emitter for debug logging. */
|
|
28
|
+
export interface DirectiveBusEntry<TContext = unknown, TData = unknown> {
|
|
29
|
+
directive: Directive<TContext, TData>;
|
|
30
|
+
emitterId: string;
|
|
31
|
+
phase: DirectiveBusPhase;
|
|
32
|
+
/** Monotonically increasing emission index within the phase. */
|
|
33
|
+
order: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Per-turn directive collection bus.
|
|
38
|
+
*
|
|
39
|
+
* Usage:
|
|
40
|
+
* ```ts
|
|
41
|
+
* const bus = new DirectiveBus();
|
|
42
|
+
* bus.setPhase('pre-llm');
|
|
43
|
+
* bus.emit({ goTo: 'Booking' }, 'step.onEnter:ask_date');
|
|
44
|
+
* bus.emit({ appendPrompt: ['Be concise.'] }, 'step.prepare:ask_date');
|
|
45
|
+
* const merged = bus.drain(); // merges all collected directives
|
|
46
|
+
* bus.setPhase('post-llm');
|
|
47
|
+
* // ... collect post-LLM emissions ...
|
|
48
|
+
* const postMerged = bus.drain();
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export class DirectiveBus<TContext = unknown, TData = unknown> {
|
|
52
|
+
private entries: DirectiveBusEntry<TContext, TData>[] = [];
|
|
53
|
+
private currentPhase: DirectiveBusPhase = "pre-llm";
|
|
54
|
+
private orderCounter = 0;
|
|
55
|
+
|
|
56
|
+
/** Set the current collection phase. Resets the order counter for the new phase. */
|
|
57
|
+
setPhase(phase: DirectiveBusPhase): void {
|
|
58
|
+
this.currentPhase = phase;
|
|
59
|
+
// Order counter is NOT reset — emission order is global within the turn
|
|
60
|
+
// so that cross-phase comparisons (if ever needed) remain consistent.
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Get the current phase. */
|
|
64
|
+
getPhase(): DirectiveBusPhase {
|
|
65
|
+
return this.currentPhase;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Emit a directive onto the bus.
|
|
70
|
+
*
|
|
71
|
+
* @param directive - The directive to collect.
|
|
72
|
+
* @param emitterId - Human-readable identifier of the emitter (for debug logging).
|
|
73
|
+
*/
|
|
74
|
+
emit(directive: Directive<TContext, TData>, emitterId: string): void {
|
|
75
|
+
if (!directive || typeof directive !== "object" || Array.isArray(directive)) {
|
|
76
|
+
return; // Silently ignore non-object values (void returns from hooks)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Check if the directive has any meaningful fields set
|
|
80
|
+
const hasFields = Object.keys(directive).some(
|
|
81
|
+
(k) => (directive as Record<string, unknown>)[k] !== undefined
|
|
82
|
+
);
|
|
83
|
+
if (!hasFields) {
|
|
84
|
+
return; // Empty directive — nothing to collect
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
this.entries.push({
|
|
88
|
+
directive,
|
|
89
|
+
emitterId,
|
|
90
|
+
phase: this.currentPhase,
|
|
91
|
+
order: this.orderCounter++,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
logger.debug(
|
|
95
|
+
`[DirectiveBus] Collected directive from "${emitterId}" (phase=${this.currentPhase}, order=${this.orderCounter - 1})`
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Drain the bus: merge all collected directives for the current phase
|
|
101
|
+
* using Algorithm 4 (position precedence, last-wins tie-breaking,
|
|
102
|
+
* shallow-merge for state writes).
|
|
103
|
+
*
|
|
104
|
+
* Returns `undefined` if no directives were collected.
|
|
105
|
+
* After draining, the entries for the current phase are cleared.
|
|
106
|
+
*/
|
|
107
|
+
drain(): Directive<TContext, TData> | undefined {
|
|
108
|
+
const phaseEntries = this.entries.filter(
|
|
109
|
+
(e) => e.phase === this.currentPhase
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
if (phaseEntries.length === 0) {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Log conflicts when multiple emitters set position or reply fields
|
|
117
|
+
this.logConflicts(phaseEntries);
|
|
118
|
+
|
|
119
|
+
// Merge all directives in emission order using flow.merge (pairwise reduction).
|
|
120
|
+
// flow.merge implements Algorithm 4: position precedence with last-wins tie-breaking.
|
|
121
|
+
let merged: Directive<TContext, TData> = phaseEntries[0].directive;
|
|
122
|
+
for (let i = 1; i < phaseEntries.length; i++) {
|
|
123
|
+
merged = flow.merge(merged, phaseEntries[i].directive);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Strip pre-LLM-only fields from post-LLM phase emissions
|
|
127
|
+
if (this.currentPhase === "post-llm") {
|
|
128
|
+
const asAny = merged as Record<string, unknown>;
|
|
129
|
+
const preLlmFields = ["appendPrompt", "injectTools", "halt"] as const;
|
|
130
|
+
|
|
131
|
+
// Identify which fields are present BEFORE stripping (the merge may
|
|
132
|
+
// alias phaseEntries[0].directive when there is a single emitter, so
|
|
133
|
+
// we must collect emitter names first).
|
|
134
|
+
const droppedFields: string[] = [];
|
|
135
|
+
for (const f of preLlmFields) {
|
|
136
|
+
if (asAny[f] !== undefined) {
|
|
137
|
+
droppedFields.push(f);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (droppedFields.length > 0) {
|
|
142
|
+
// Identify emitters that contributed the dropped fields.
|
|
143
|
+
const emitters = phaseEntries
|
|
144
|
+
.filter((e) => {
|
|
145
|
+
const d = e.directive as Record<string, unknown>;
|
|
146
|
+
return droppedFields.some((f) => d[f] !== undefined);
|
|
147
|
+
})
|
|
148
|
+
.map((e) => e.emitterId);
|
|
149
|
+
|
|
150
|
+
// Now strip the fields from the merged result.
|
|
151
|
+
for (const f of droppedFields) {
|
|
152
|
+
delete asAny[f];
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
logger.debug(
|
|
156
|
+
`[DirectiveBus] Dropped pre-LLM-only fields [${droppedFields.join(", ")}] from post-LLM emitters: ${emitters.join(", ")}`
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Clear entries for the drained phase
|
|
162
|
+
this.entries = this.entries.filter((e) => e.phase !== this.currentPhase);
|
|
163
|
+
|
|
164
|
+
return merged;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Drain ALL entries regardless of phase. Used for final turn cleanup.
|
|
169
|
+
* Returns `undefined` if no directives were collected.
|
|
170
|
+
*/
|
|
171
|
+
drainAll(): Directive<TContext, TData> | undefined {
|
|
172
|
+
if (this.entries.length === 0) {
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
this.logConflicts(this.entries);
|
|
177
|
+
|
|
178
|
+
let merged: Directive<TContext, TData> = this.entries[0].directive;
|
|
179
|
+
for (let i = 1; i < this.entries.length; i++) {
|
|
180
|
+
merged = flow.merge(merged, this.entries[i].directive);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
this.entries = [];
|
|
184
|
+
return merged;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Clear all collected entries and reset the bus for a new turn. */
|
|
188
|
+
clear(): void {
|
|
189
|
+
this.entries = [];
|
|
190
|
+
this.orderCounter = 0;
|
|
191
|
+
this.currentPhase = "pre-llm";
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** Get the number of entries currently on the bus. */
|
|
195
|
+
get size(): number {
|
|
196
|
+
return this.entries.length;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** Get all entries (for inspection/testing). */
|
|
200
|
+
getEntries(): ReadonlyArray<DirectiveBusEntry<TContext, TData>> {
|
|
201
|
+
return this.entries;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** Check if the bus has any entries for the current phase. */
|
|
205
|
+
hasEntries(): boolean {
|
|
206
|
+
return this.entries.some((e) => e.phase === this.currentPhase);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// ─── Private helpers ─────────────────────────────────────────────────────
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Log debug-level conflict warnings when multiple emitters set position
|
|
213
|
+
* fields or reply fields in the same phase.
|
|
214
|
+
*/
|
|
215
|
+
private logConflicts(
|
|
216
|
+
entries: DirectiveBusEntry<TContext, TData>[]
|
|
217
|
+
): void {
|
|
218
|
+
// Check for position field conflicts
|
|
219
|
+
const positionEmitters: Array<{ emitterId: string; field: string }> = [];
|
|
220
|
+
for (const entry of entries) {
|
|
221
|
+
const d = entry.directive as Record<string, unknown>;
|
|
222
|
+
for (const field of ["abort", "complete", "goTo", "goToStep", "reset"]) {
|
|
223
|
+
if (d[field] !== undefined) {
|
|
224
|
+
positionEmitters.push({ emitterId: entry.emitterId, field });
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (positionEmitters.length > 1) {
|
|
229
|
+
const details = positionEmitters
|
|
230
|
+
.map((e) => `${e.emitterId}(${e.field})`)
|
|
231
|
+
.join(", ");
|
|
232
|
+
logger.debug(
|
|
233
|
+
`[DirectiveBus] Multiple position fields in one turn — conflict resolution applied. Emitters: ${details}`
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Check for reply conflicts
|
|
238
|
+
const replyEmitters = entries.filter(
|
|
239
|
+
(e) => (e.directive as Record<string, unknown>).reply !== undefined
|
|
240
|
+
);
|
|
241
|
+
if (replyEmitters.length > 1) {
|
|
242
|
+
const emitterIds = replyEmitters.map((e) => e.emitterId).join(", ");
|
|
243
|
+
logger.debug(
|
|
244
|
+
`[DirectiveBus] Multiple reply fields in one turn — using last emission. Emitters: ${emitterIds}`
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-turn directive chain depth tracker.
|
|
3
|
+
*
|
|
4
|
+
* When directives chain (e.g., tool emits goTo → flow.onEnter emits goTo →
|
|
5
|
+
* flow.onComplete emits complete.next → …), the chain can theoretically loop
|
|
6
|
+
* forever. This tracker counts each directive application within a single turn
|
|
7
|
+
* and throws `FlowConfigurationError` when the configured cap is exceeded.
|
|
8
|
+
*
|
|
9
|
+
* Chain breakers (`abort` mid-chain) stop counting and apply the
|
|
10
|
+
* chain-terminating directive immediately.
|
|
11
|
+
*
|
|
12
|
+
* Validates: Requirements 22.1, 22.2, 22.3
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { FlowConfigurationError } from "./Step";
|
|
16
|
+
import { logger } from "../utils";
|
|
17
|
+
import type { Directive } from "../types/flow";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Entry in the directive chain log — records what was emitted and by whom.
|
|
21
|
+
*/
|
|
22
|
+
export interface DirectiveChainEntry {
|
|
23
|
+
/** Human-readable description of the directive (e.g., "goTo:Booking", "complete", "abort:timeout") */
|
|
24
|
+
description: string;
|
|
25
|
+
/** Identifier of the emitter (e.g., "tool:lookup_order", "hook:onEnter", "pending") */
|
|
26
|
+
emitter: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Tracks directive chain depth within a single turn.
|
|
31
|
+
* Create one instance per turn; discard at turn end.
|
|
32
|
+
*/
|
|
33
|
+
export class DirectiveChainTracker {
|
|
34
|
+
private chain: DirectiveChainEntry[] = [];
|
|
35
|
+
private readonly maxDepth: number;
|
|
36
|
+
|
|
37
|
+
constructor(maxDirectiveChain: number) {
|
|
38
|
+
this.maxDepth = maxDirectiveChain;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Record a directive application in the chain.
|
|
43
|
+
* Throws `FlowConfigurationError` if the chain exceeds `maxDirectiveChain`.
|
|
44
|
+
*
|
|
45
|
+
* @param directive - The directive being applied
|
|
46
|
+
* @param emitter - Identifier of the emitter (for diagnostics)
|
|
47
|
+
* @returns `true` if the directive is a chain breaker (abort) — caller should
|
|
48
|
+
* apply it and stop the chain without further counting.
|
|
49
|
+
*/
|
|
50
|
+
record(directive: Directive, emitter: string): boolean {
|
|
51
|
+
const description = describeDirective(directive);
|
|
52
|
+
|
|
53
|
+
// Check if this is a chain breaker (abort)
|
|
54
|
+
if (directive.abort !== undefined) {
|
|
55
|
+
this.chain.push({ description, emitter });
|
|
56
|
+
logger.debug(
|
|
57
|
+
`[DirectiveChainTracker] Chain breaker (abort) at depth ${this.chain.length}: ${description} from ${emitter}`
|
|
58
|
+
);
|
|
59
|
+
return true; // Chain breaker — apply and stop
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
this.chain.push({ description, emitter });
|
|
63
|
+
|
|
64
|
+
if (this.chain.length > this.maxDepth) {
|
|
65
|
+
const chainDescription = this.chain
|
|
66
|
+
.map((entry, i) => ` ${i + 1}. ${entry.description} (from: ${entry.emitter})`)
|
|
67
|
+
.join("\n");
|
|
68
|
+
|
|
69
|
+
throw new FlowConfigurationError(
|
|
70
|
+
`[FlowConfigurationError] Directive chain cycle detected: ` +
|
|
71
|
+
`chain depth (${this.chain.length}) exceeded maxDirectiveChain (${this.maxDepth}). ` +
|
|
72
|
+
`Review flow hooks and tool handlers for circular redirections.\n` +
|
|
73
|
+
`Chain (in emission order):\n${chainDescription}`
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
logger.debug(
|
|
78
|
+
`[DirectiveChainTracker] Chain depth ${this.chain.length}/${this.maxDepth}: ${description} from ${emitter}`
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
return false; // Not a chain breaker — continue normally
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Current chain depth. */
|
|
85
|
+
get depth(): number {
|
|
86
|
+
return this.chain.length;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** The full chain log (read-only). */
|
|
90
|
+
get entries(): ReadonlyArray<DirectiveChainEntry> {
|
|
91
|
+
return this.chain;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Reset the tracker (e.g., for testing or if the turn is restarted). */
|
|
95
|
+
reset(): void {
|
|
96
|
+
this.chain = [];
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Produce a human-readable one-line description of a directive for diagnostics.
|
|
102
|
+
*/
|
|
103
|
+
function describeDirective(directive: Directive): string {
|
|
104
|
+
if (directive.abort !== undefined) {
|
|
105
|
+
const reason = typeof directive.abort === "string"
|
|
106
|
+
? directive.abort
|
|
107
|
+
: typeof directive.abort === "object"
|
|
108
|
+
? directive.abort.reason
|
|
109
|
+
: "";
|
|
110
|
+
return `abort${reason ? `:${reason}` : ""}`;
|
|
111
|
+
}
|
|
112
|
+
if (directive.goTo !== undefined) {
|
|
113
|
+
const target = typeof directive.goTo === "string"
|
|
114
|
+
? directive.goTo
|
|
115
|
+
: typeof directive.goTo === "object"
|
|
116
|
+
? directive.goTo.flow ?? "(no flow)"
|
|
117
|
+
: "";
|
|
118
|
+
return `goTo:${target}`;
|
|
119
|
+
}
|
|
120
|
+
if (directive.goToStep !== undefined) {
|
|
121
|
+
const target = typeof directive.goToStep === "string"
|
|
122
|
+
? directive.goToStep
|
|
123
|
+
: typeof directive.goToStep === "object"
|
|
124
|
+
? directive.goToStep.step
|
|
125
|
+
: "";
|
|
126
|
+
return `goToStep:${target}`;
|
|
127
|
+
}
|
|
128
|
+
if (directive.complete !== undefined) {
|
|
129
|
+
if (directive.complete === true) return "complete";
|
|
130
|
+
if (typeof directive.complete === "object" && directive.complete.next) {
|
|
131
|
+
return "complete(chained)";
|
|
132
|
+
}
|
|
133
|
+
return "complete";
|
|
134
|
+
}
|
|
135
|
+
if (directive.reset !== undefined) {
|
|
136
|
+
return "reset";
|
|
137
|
+
}
|
|
138
|
+
// State-only or reply-only directive
|
|
139
|
+
const parts: string[] = [];
|
|
140
|
+
if (directive.reply) parts.push("reply");
|
|
141
|
+
if (directive.dataUpdate) parts.push("dataUpdate");
|
|
142
|
+
if (directive.contextUpdate) parts.push("contextUpdate");
|
|
143
|
+
return parts.length > 0 ? parts.join("+") : "(empty)";
|
|
144
|
+
}
|