@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
|
@@ -53,7 +53,7 @@ export class PersistenceManager<TData = Record<string, unknown>> {
|
|
|
53
53
|
status: "active",
|
|
54
54
|
collectedData: {
|
|
55
55
|
data: options.initialData || {},
|
|
56
|
-
|
|
56
|
+
flowHistory: [],
|
|
57
57
|
metadata: {},
|
|
58
58
|
},
|
|
59
59
|
messageCount: 0,
|
|
@@ -125,14 +125,14 @@ export class PersistenceManager<TData = Record<string, unknown>> {
|
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
/**
|
|
128
|
-
* Update current
|
|
128
|
+
* Update current flow and step
|
|
129
129
|
*/
|
|
130
|
-
async
|
|
130
|
+
async updateFlowStep(
|
|
131
131
|
sessionId: string,
|
|
132
|
-
|
|
132
|
+
flow?: string,
|
|
133
133
|
step?: string
|
|
134
134
|
): Promise<SessionData<TData> | null> {
|
|
135
|
-
return await this.sessionRepository.
|
|
135
|
+
return await this.sessionRepository.updateFlowStep(sessionId, flow, step);
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
/**
|
|
@@ -146,7 +146,7 @@ export class PersistenceManager<TData = Record<string, unknown>> {
|
|
|
146
146
|
userId,
|
|
147
147
|
role: options.role,
|
|
148
148
|
content: options.content,
|
|
149
|
-
|
|
149
|
+
flow: options.flow,
|
|
150
150
|
step: options.step,
|
|
151
151
|
toolCalls: options.toolCalls,
|
|
152
152
|
event: options.event,
|
|
@@ -263,7 +263,7 @@ export class PersistenceManager<TData = Record<string, unknown>> {
|
|
|
263
263
|
if (existingSession) {
|
|
264
264
|
// Update existing session
|
|
265
265
|
return await this.sessionRepository.update(sessionId, {
|
|
266
|
-
|
|
266
|
+
currentFlow: persistenceData.currentFlow,
|
|
267
267
|
currentStep: persistenceData.currentStep,
|
|
268
268
|
collectedData: persistenceData.collectedData,
|
|
269
269
|
lastMessageAt: new Date(),
|
|
@@ -276,7 +276,7 @@ export class PersistenceManager<TData = Record<string, unknown>> {
|
|
|
276
276
|
? JSON.stringify(persistenceData.collectedData.metadata?.userId)
|
|
277
277
|
: this.config.userId,
|
|
278
278
|
status: "active",
|
|
279
|
-
|
|
279
|
+
currentFlow: persistenceData.currentFlow,
|
|
280
280
|
currentStep: persistenceData.currentStep,
|
|
281
281
|
collectedData: persistenceData.collectedData,
|
|
282
282
|
messageCount: 0,
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import type { Event, Term,
|
|
2
|
-
import type {
|
|
1
|
+
import type { Event, Term, Instruction, AgentOptions, ScopedInstructions, AppliedInstruction } from "../types";
|
|
2
|
+
import type { Flow } from "./Flow";
|
|
3
3
|
import { render, renderMany, formatKnowledgeBase, createTemplateContext } from "../utils/template";
|
|
4
4
|
import { TemplateContext } from "../types/template";
|
|
5
|
-
import {
|
|
5
|
+
import { ConditionEvaluator } from "../utils/condition";
|
|
6
6
|
import { PromptSectionCache } from "./PromptSectionCache";
|
|
7
|
+
import { logger } from "../utils";
|
|
7
8
|
|
|
8
9
|
export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
9
10
|
private parts: string[] = [];
|
|
@@ -11,6 +12,9 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
|
11
12
|
private cache: PromptSectionCache | null;
|
|
12
13
|
private instructionCounter = 0;
|
|
13
14
|
|
|
15
|
+
/** Per-turn applied instructions, reset on every `addInstructions` invocation. */
|
|
16
|
+
public lastAppliedInstructions: AppliedInstruction[] = [];
|
|
17
|
+
|
|
14
18
|
constructor(
|
|
15
19
|
context: TemplateContext<TContext, TData> = createTemplateContext({}),
|
|
16
20
|
cache?: PromptSectionCache
|
|
@@ -21,47 +25,19 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
|
21
25
|
|
|
22
26
|
// Specific, typed sections tailored to the framework
|
|
23
27
|
|
|
24
|
-
async addAgentMeta(agent: AgentOptions<TContext, TData>): Promise<this> {
|
|
28
|
+
async addAgentMeta(agent: Pick<AgentOptions<TContext, TData>, 'name'> & Partial<AgentOptions<TContext, TData>>): Promise<this> {
|
|
25
29
|
const compute = async (): Promise<string | null> => {
|
|
26
30
|
const lines: string[] = [];
|
|
27
31
|
lines.push("## Agent Identity");
|
|
28
32
|
lines.push(
|
|
29
33
|
`You are "${agent.name}". Always refer to yourself by this name.`
|
|
30
34
|
);
|
|
31
|
-
if (agent.
|
|
32
|
-
lines.push(await render(agent.
|
|
33
|
-
}
|
|
34
|
-
if (agent.personality) {
|
|
35
|
-
lines.push(
|
|
36
|
-
`Communicate in the following style: ${await render(
|
|
37
|
-
agent.personality,
|
|
38
|
-
this.renderContext
|
|
39
|
-
)}`
|
|
40
|
-
);
|
|
35
|
+
if (agent.persona) {
|
|
36
|
+
lines.push(await render(agent.persona, this.renderContext));
|
|
41
37
|
}
|
|
42
38
|
if (agent.goal) {
|
|
43
39
|
lines.push(`Your primary goal: ${agent.goal}`);
|
|
44
40
|
}
|
|
45
|
-
if (agent.description) {
|
|
46
|
-
lines.push(`About you: ${agent.description}`);
|
|
47
|
-
}
|
|
48
|
-
if (agent.rules?.length) {
|
|
49
|
-
const renderedRules = await renderMany(agent.rules, this.renderContext);
|
|
50
|
-
lines.push(
|
|
51
|
-
`You MUST always follow these rules:\n- ${renderedRules.join("\n- ")}`
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
if (agent.prohibitions?.length) {
|
|
55
|
-
const renderedProhibitions = await renderMany(
|
|
56
|
-
agent.prohibitions,
|
|
57
|
-
this.renderContext
|
|
58
|
-
);
|
|
59
|
-
lines.push(
|
|
60
|
-
`You MUST NEVER do the following:\n- ${renderedProhibitions.join(
|
|
61
|
-
"\n- "
|
|
62
|
-
)}`
|
|
63
|
-
);
|
|
64
|
-
}
|
|
65
41
|
return lines.join("\n");
|
|
66
42
|
};
|
|
67
43
|
|
|
@@ -74,8 +50,8 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
|
74
50
|
return this;
|
|
75
51
|
}
|
|
76
52
|
|
|
77
|
-
async
|
|
78
|
-
return this.
|
|
53
|
+
async addFlowOverview(flows: Flow<TContext, TData>[]): Promise<this> {
|
|
54
|
+
return this.addActiveFlows(flows);
|
|
79
55
|
}
|
|
80
56
|
|
|
81
57
|
async addScoringRules(): Promise<this> {
|
|
@@ -86,7 +62,7 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
|
86
62
|
"- 50-69: moderate relevance",
|
|
87
63
|
"- 30-49: weak connection or ambiguous",
|
|
88
64
|
"- 0-29: minimal/none",
|
|
89
|
-
"Return ONLY JSON matching the provided schema. Include scores for ALL
|
|
65
|
+
"Return ONLY JSON matching the provided schema. Include scores for ALL flows.",
|
|
90
66
|
].join("\n")}`;
|
|
91
67
|
};
|
|
92
68
|
|
|
@@ -175,80 +151,176 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
|
175
151
|
return this;
|
|
176
152
|
}
|
|
177
153
|
|
|
178
|
-
async
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
//
|
|
203
|
-
|
|
154
|
+
async addInstructions(scoped: ScopedInstructions<TContext, TData>): Promise<this> {
|
|
155
|
+
// Reset the per-turn applied set
|
|
156
|
+
this.lastAppliedInstructions = [];
|
|
157
|
+
|
|
158
|
+
const evaluator = new ConditionEvaluator(this.renderContext);
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Evaluate a single instruction's `if` code predicate(s).
|
|
162
|
+
* Returns true if all predicates pass (AND semantics).
|
|
163
|
+
* If `if` is undefined, returns true (always active).
|
|
164
|
+
*/
|
|
165
|
+
const evaluateIf = async (ifCondition: Instruction<TContext, TData>['if']): Promise<boolean> => {
|
|
166
|
+
if (ifCondition === undefined) return true;
|
|
167
|
+
const predicates = Array.isArray(ifCondition) ? ifCondition : [ifCondition];
|
|
168
|
+
for (const predicate of predicates) {
|
|
169
|
+
try {
|
|
170
|
+
const result = await predicate({
|
|
171
|
+
context: (this.renderContext.context ?? {}) as TContext,
|
|
172
|
+
data: (this.renderContext.data || {}),
|
|
173
|
+
session: (this.renderContext.session ?? { id: '', data: {}, history: [], metadata: {} }) as import("../types/session").SessionState<TData>,
|
|
174
|
+
history: this.renderContext.history || [],
|
|
175
|
+
});
|
|
176
|
+
if (!result) return false;
|
|
177
|
+
} catch {
|
|
178
|
+
// If a predicate throws, treat it as false (skip the instruction)
|
|
179
|
+
return false;
|
|
204
180
|
}
|
|
205
181
|
}
|
|
182
|
+
return true;
|
|
183
|
+
};
|
|
206
184
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
return `- Guideline #${i + 1}: When ${conditionText}, then ${action}`;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
return `- Guideline #${i + 1}: ${action}`;
|
|
221
|
-
})
|
|
222
|
-
);
|
|
185
|
+
/**
|
|
186
|
+
* Evaluate a single instruction's `when` condition.
|
|
187
|
+
* Returns true if the instruction should be active.
|
|
188
|
+
*/
|
|
189
|
+
const evaluateWhen = async (when: Instruction<TContext, TData>['when']): Promise<boolean> => {
|
|
190
|
+
if (when === undefined) return true;
|
|
191
|
+
const evaluation = await evaluator.evaluateCondition(when, 'AND');
|
|
192
|
+
if (!evaluation.hasProgrammaticConditions) return true;
|
|
193
|
+
return evaluation.programmaticResult;
|
|
194
|
+
};
|
|
223
195
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
196
|
+
/**
|
|
197
|
+
* Resolve the kind prefix for rendering.
|
|
198
|
+
* Default kind is 'should'.
|
|
199
|
+
*/
|
|
200
|
+
const kindPrefix = (kind: Instruction<TContext, TData>['kind']): string => {
|
|
201
|
+
const resolved = kind || 'should';
|
|
202
|
+
return `[${resolved}]`;
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Process a scope bucket: filter enabled, evaluate when, collect active lines and applied records.
|
|
207
|
+
*/
|
|
208
|
+
const processScope = async (
|
|
209
|
+
items: Instruction<TContext, TData>[],
|
|
210
|
+
caption: string,
|
|
211
|
+
scope: AppliedInstruction['scope'],
|
|
212
|
+
scopeRef?: string
|
|
213
|
+
): Promise<string[]> => {
|
|
214
|
+
const lines: string[] = [];
|
|
215
|
+
const enabled = items.filter(g => g.enabled !== false);
|
|
216
|
+
|
|
217
|
+
for (const g of enabled) {
|
|
218
|
+
// Evaluate `if` first (free, code-only). Skip `when` if `if` fails.
|
|
219
|
+
const ifPassed = await evaluateIf(g.if);
|
|
220
|
+
if (!ifPassed) continue;
|
|
221
|
+
|
|
222
|
+
// Evaluate `when` (AI condition) only when `if` passed
|
|
223
|
+
const active = await evaluateWhen(g.when);
|
|
224
|
+
if (!active) continue;
|
|
225
|
+
|
|
226
|
+
const text = await render(g.prompt, this.renderContext);
|
|
227
|
+
if (!text) continue;
|
|
228
|
+
|
|
229
|
+
lines.push(`- ${kindPrefix(g.kind)} ${caption} ${text}`);
|
|
230
|
+
this.lastAppliedInstructions.push({
|
|
231
|
+
id: g.id || '',
|
|
232
|
+
scope,
|
|
233
|
+
scopeRef,
|
|
234
|
+
});
|
|
231
235
|
}
|
|
236
|
+
return lines;
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
// Compute functions for each scope
|
|
240
|
+
const computeGlobal = async (): Promise<string | null> => {
|
|
241
|
+
const lines = await processScope(scoped.global, '[Always]', 'global');
|
|
242
|
+
return lines.length > 0 ? lines.join('\n') : null;
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
const computeFlow = async (): Promise<string | null> => {
|
|
246
|
+
if (!scoped.flow) return null;
|
|
247
|
+
const caption = `[In: ${scoped.flow.flowTitle}]`;
|
|
248
|
+
const lines = await processScope(scoped.flow.items, caption, 'flow', scoped.flow.flowTitle);
|
|
249
|
+
return lines.length > 0 ? lines.join('\n') : null;
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
const computeStep = async (): Promise<string | null> => {
|
|
253
|
+
if (!scoped.step) return null;
|
|
254
|
+
const caption = `[Step: ${scoped.step.stepId}]`;
|
|
255
|
+
const lines = await processScope(scoped.step.items, caption, 'step', scoped.step.stepId);
|
|
256
|
+
return lines.length > 0 ? lines.join('\n') : null;
|
|
232
257
|
};
|
|
233
258
|
|
|
234
259
|
if (this.cache) {
|
|
235
|
-
|
|
260
|
+
// Granular three-key approach with header coordination
|
|
261
|
+
// Register header first so it appears before content in resolveAll() output
|
|
262
|
+
this.cache.register('instructionsHeader', 'static', async () => {
|
|
263
|
+
const globalResult = await this.cache!.get('instructionsGlobal');
|
|
264
|
+
const flowResult = scoped.flow ? await this.cache!.get('instructionsFlow') : null;
|
|
265
|
+
const stepResult = scoped.step ? await this.cache!.get('instructionsStep') : null;
|
|
266
|
+
if (globalResult || flowResult || stepResult) {
|
|
267
|
+
return '## Instructions';
|
|
268
|
+
}
|
|
269
|
+
return null;
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
this.cache.register('instructionsGlobal', 'static', computeGlobal);
|
|
273
|
+
|
|
274
|
+
if (scoped.flow) {
|
|
275
|
+
this.cache.register('instructionsFlow', 'static', computeFlow);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
if (scoped.step) {
|
|
279
|
+
this.cache.register('instructionsStep', 'dynamic', computeStep);
|
|
280
|
+
}
|
|
236
281
|
} else {
|
|
237
|
-
|
|
238
|
-
|
|
282
|
+
// No cache: compute inline and push to parts
|
|
283
|
+
const globalLines = await computeGlobal();
|
|
284
|
+
const flowLines = await computeFlow();
|
|
285
|
+
const stepLines = await computeStep();
|
|
286
|
+
|
|
287
|
+
const allLines = [globalLines, flowLines, stepLines].filter(Boolean).join('\n');
|
|
288
|
+
if (allLines) {
|
|
289
|
+
this.parts.push(`## Instructions\n\n${allLines}`);
|
|
290
|
+
}
|
|
239
291
|
}
|
|
292
|
+
|
|
293
|
+
// Debug logging
|
|
294
|
+
if (this.lastAppliedInstructions.length > 0) {
|
|
295
|
+
const globalIds = this.lastAppliedInstructions
|
|
296
|
+
.filter(g => g.scope === 'global')
|
|
297
|
+
.map(g => g.id);
|
|
298
|
+
const flowGroup = this.lastAppliedInstructions.filter(g => g.scope === 'flow');
|
|
299
|
+
const stepGroup = this.lastAppliedInstructions.filter(g => g.scope === 'step');
|
|
300
|
+
|
|
301
|
+
const debugPayload: Record<string, unknown> = { global: globalIds };
|
|
302
|
+
if (flowGroup.length > 0) {
|
|
303
|
+
debugPayload.flow = { flowTitle: scoped.flow?.flowTitle, ids: flowGroup.map(g => g.id) };
|
|
304
|
+
}
|
|
305
|
+
if (stepGroup.length > 0) {
|
|
306
|
+
debugPayload.step = { stepId: scoped.step?.stepId, ids: stepGroup.map(g => g.id) };
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
logger.debug('[instructions] applied', debugPayload);
|
|
310
|
+
}
|
|
311
|
+
|
|
240
312
|
return this;
|
|
241
313
|
}
|
|
242
314
|
|
|
243
315
|
async addKnowledgeBase(
|
|
244
316
|
agentKnowledgeBase?: Record<string, unknown>,
|
|
245
|
-
|
|
317
|
+
flowKnowledgeBase?: Record<string, unknown>
|
|
246
318
|
): Promise<this> {
|
|
247
319
|
const compute = (): string | null => {
|
|
248
|
-
// Merge agent and
|
|
320
|
+
// Merge agent and flow knowledge bases (flow takes precedence for conflicts)
|
|
249
321
|
const mergedKnowledge = {
|
|
250
322
|
...(agentKnowledgeBase || {}),
|
|
251
|
-
...(
|
|
323
|
+
...(flowKnowledgeBase || {}),
|
|
252
324
|
};
|
|
253
325
|
|
|
254
326
|
// Only add section if there's knowledge data
|
|
@@ -267,53 +339,34 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
|
267
339
|
return Promise.resolve(this);
|
|
268
340
|
}
|
|
269
341
|
|
|
270
|
-
|
|
271
|
-
if (!
|
|
342
|
+
addActiveFlows(flows: Flow<TContext, TData>[]): Promise<this> {
|
|
343
|
+
if (!flows.length) return Promise.resolve(this);
|
|
272
344
|
|
|
273
|
-
const compute =
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
const skipConditions =
|
|
283
|
-
skipIfContextStrings.length > 0
|
|
284
|
-
? `\n\n **Skip when:** ${skipIfContextStrings.join(" OR ")}`
|
|
285
|
-
: "";
|
|
286
|
-
const desc = r.description
|
|
287
|
-
? `\n\n **Description:** ${r.description}`
|
|
345
|
+
const compute = (): string | null => {
|
|
346
|
+
const renderedFlows = flows.map((r, i) => {
|
|
347
|
+
// v2: `when` is string | string[] (AI-evaluated). Extract directly.
|
|
348
|
+
const whenContextStrings: string[] = r.when
|
|
349
|
+
? (Array.isArray(r.when) ? r.when : [r.when])
|
|
350
|
+
: [];
|
|
351
|
+
const conditions =
|
|
352
|
+
whenContextStrings.length > 0
|
|
353
|
+
? `\n\n **Triggered when:** ${whenContextStrings.join(" OR ")}`
|
|
288
354
|
: "";
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
rules.length > 0
|
|
296
|
-
? `\n\n **Rules:**\n ${rules.map((x) => ` - ${x}`).join("\n ")}`
|
|
297
|
-
: "";
|
|
298
|
-
const prohibitionsInfo =
|
|
299
|
-
prohibitions.length > 0
|
|
300
|
-
? `\n\n **Prohibitions:**\n ${prohibitions
|
|
301
|
-
.map((x) => ` - ${x}`)
|
|
302
|
-
.join("\n ")}`
|
|
303
|
-
: "";
|
|
304
|
-
return `### Route ${i + 1}: ${r.title} (ID: ${r.id})${desc}${conditions}${skipConditions}${rulesInfo}${prohibitionsInfo}`;
|
|
305
|
-
})
|
|
306
|
-
);
|
|
307
|
-
return `## Available Routes\n\n${renderedRoutes.join("\n\n")}`;
|
|
355
|
+
const desc = r.description
|
|
356
|
+
? `\n\n **Description:** ${r.description}`
|
|
357
|
+
: "";
|
|
358
|
+
return `### Flow ${i + 1}: ${r.title} (ID: ${r.id})${desc}${conditions}`;
|
|
359
|
+
});
|
|
360
|
+
return `## Available Flows\n\n${renderedFlows.join("\n\n")}`;
|
|
308
361
|
};
|
|
309
362
|
|
|
310
363
|
if (this.cache) {
|
|
311
|
-
this.cache.register("
|
|
364
|
+
this.cache.register("activeFlows", "static", compute);
|
|
312
365
|
} else {
|
|
313
|
-
const result =
|
|
366
|
+
const result = compute();
|
|
314
367
|
if (result) this.parts.push(result);
|
|
315
368
|
}
|
|
316
|
-
return this;
|
|
369
|
+
return Promise.resolve(this);
|
|
317
370
|
}
|
|
318
371
|
|
|
319
372
|
async addDirectives(directives?: string[]): Promise<this> {
|
|
@@ -362,16 +415,32 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
|
362
415
|
return Promise.resolve(this);
|
|
363
416
|
}
|
|
364
417
|
|
|
365
|
-
|
|
418
|
+
/**
|
|
419
|
+
* Build the final prompt string.
|
|
420
|
+
*
|
|
421
|
+
* @param options.transientAppendage - Per-turn sentences from merged
|
|
422
|
+
* PreDirective.appendPrompt arrays (outer-to-inner: agent.onEnter →
|
|
423
|
+
* flow.onEnter → step.onEnter → step.prepare). Appended after all
|
|
424
|
+
* other sections. Fresh every turn, never cached, never persisted.
|
|
425
|
+
* **Validates: Requirements 2.2, 2.8, 2.11, 27.1, 27.2, 27.4**
|
|
426
|
+
*/
|
|
427
|
+
async build(options?: { transientAppendage?: string[] }): Promise<string> {
|
|
428
|
+
let sections: string[];
|
|
429
|
+
|
|
366
430
|
if (this.cache) {
|
|
367
|
-
const
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
.trim();
|
|
372
|
-
return prompt;
|
|
431
|
+
const resolved = await this.cache.resolveAll();
|
|
432
|
+
sections = resolved.filter((s): s is string => s != null && s !== "");
|
|
433
|
+
} else {
|
|
434
|
+
sections = this.parts.filter(Boolean);
|
|
373
435
|
}
|
|
374
|
-
|
|
375
|
-
|
|
436
|
+
|
|
437
|
+
// Append transient per-turn sentences (from PreDirective.appendPrompt).
|
|
438
|
+
// These are never cached — they are a fresh slot built per turn.
|
|
439
|
+
if (options?.transientAppendage && options.transientAppendage.length > 0) {
|
|
440
|
+
const appendageBlock = options.transientAppendage.join("\n");
|
|
441
|
+
sections.push(appendageBlock);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
return sections.join("\n\n").trim();
|
|
376
445
|
}
|
|
377
446
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* PromptSectionCache - Memoizes static prompt sections across turns,
|
|
3
3
|
* recomputing only dynamic sections per-turn.
|
|
4
4
|
*
|
|
5
|
-
* Static sections (agent identity, glossary, knowledge base,
|
|
5
|
+
* Static sections (agent identity, glossary, knowledge base, flow descriptions)
|
|
6
6
|
* are cached after first computation. Dynamic sections (current step context,
|
|
7
7
|
* directives, available tools) are recomputed on every resolveAll() call.
|
|
8
8
|
*/
|