@falai/agent 3.4.5 → 4.0.0-alpha.2
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 +41 -34
- package/dist/cjs/core/Agent.d.ts +22 -378
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +104 -1178
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/CompactionEngine.d.ts.map +1 -1
- package/dist/cjs/core/CompactionEngine.js +5 -3
- package/dist/cjs/core/CompactionEngine.js.map +1 -1
- package/dist/cjs/core/FlowSpec.d.ts +136 -0
- package/dist/cjs/core/FlowSpec.d.ts.map +1 -0
- package/dist/cjs/core/FlowSpec.js +522 -0
- package/dist/cjs/core/FlowSpec.js.map +1 -0
- package/dist/cjs/core/Migrate.d.ts +38 -0
- package/dist/cjs/core/Migrate.d.ts.map +1 -0
- package/dist/cjs/core/Migrate.js +270 -0
- package/dist/cjs/core/Migrate.js.map +1 -0
- package/dist/cjs/core/Prompt.d.ts +54 -0
- package/dist/cjs/core/Prompt.d.ts.map +1 -0
- package/dist/cjs/core/Prompt.js +143 -0
- package/dist/cjs/core/Prompt.js.map +1 -0
- package/dist/cjs/core/Runner.d.ts +160 -0
- package/dist/cjs/core/Runner.d.ts.map +1 -0
- package/dist/cjs/core/Runner.js +1131 -0
- package/dist/cjs/core/Runner.js.map +1 -0
- package/dist/cjs/core/Speak.d.ts +37 -0
- package/dist/cjs/core/Speak.d.ts.map +1 -0
- package/dist/cjs/core/Speak.js +364 -0
- package/dist/cjs/core/Speak.js.map +1 -0
- package/dist/cjs/core/Understand.d.ts +28 -0
- package/dist/cjs/core/Understand.d.ts.map +1 -0
- package/dist/cjs/core/Understand.js +353 -0
- package/dist/cjs/core/Understand.js.map +1 -0
- package/dist/cjs/core/contracts.d.ts +122 -0
- package/dist/cjs/core/contracts.d.ts.map +1 -0
- package/dist/cjs/core/contracts.js +11 -0
- package/dist/cjs/core/contracts.js.map +1 -0
- package/dist/cjs/core/falai.d.ts +57 -0
- package/dist/cjs/core/falai.d.ts.map +1 -0
- package/dist/cjs/core/falai.js +43 -0
- package/dist/cjs/core/falai.js.map +1 -0
- package/dist/cjs/core/predicate.d.ts +9 -0
- package/dist/cjs/core/predicate.d.ts.map +1 -0
- package/dist/cjs/core/predicate.js +58 -0
- package/dist/cjs/core/predicate.js.map +1 -0
- package/dist/cjs/index.d.ts +26 -31
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +46 -68
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/persistence/MemoryStore.d.ts +15 -0
- package/dist/cjs/persistence/MemoryStore.d.ts.map +1 -0
- package/dist/cjs/persistence/MemoryStore.js +39 -0
- package/dist/cjs/persistence/MemoryStore.js.map +1 -0
- package/dist/cjs/persistence/MongoStore.d.ts +42 -0
- package/dist/cjs/persistence/MongoStore.d.ts.map +1 -0
- package/dist/cjs/persistence/MongoStore.js +60 -0
- package/dist/cjs/persistence/MongoStore.js.map +1 -0
- package/dist/cjs/persistence/OpenSearchStore.d.ts +86 -0
- package/dist/cjs/persistence/OpenSearchStore.d.ts.map +1 -0
- package/dist/cjs/persistence/OpenSearchStore.js +120 -0
- package/dist/cjs/persistence/OpenSearchStore.js.map +1 -0
- package/dist/cjs/persistence/PostgresStore.d.ts +41 -0
- package/dist/cjs/persistence/PostgresStore.d.ts.map +1 -0
- package/dist/cjs/persistence/PostgresStore.js +58 -0
- package/dist/cjs/persistence/PostgresStore.js.map +1 -0
- package/dist/cjs/persistence/PrismaStore.d.ts +65 -0
- package/dist/cjs/persistence/PrismaStore.d.ts.map +1 -0
- package/dist/cjs/persistence/PrismaStore.js +95 -0
- package/dist/cjs/persistence/PrismaStore.js.map +1 -0
- package/dist/cjs/persistence/RedisStore.d.ts +34 -0
- package/dist/cjs/persistence/RedisStore.d.ts.map +1 -0
- package/dist/cjs/persistence/RedisStore.js +61 -0
- package/dist/cjs/persistence/RedisStore.js.map +1 -0
- package/dist/cjs/persistence/SQLiteStore.d.ts +45 -0
- package/dist/cjs/persistence/SQLiteStore.d.ts.map +1 -0
- package/dist/cjs/persistence/SQLiteStore.js +74 -0
- package/dist/cjs/persistence/SQLiteStore.js.map +1 -0
- package/dist/cjs/persistence/sessionRow.d.ts +14 -0
- package/dist/cjs/persistence/sessionRow.d.ts.map +1 -0
- package/dist/cjs/persistence/sessionRow.js +50 -0
- package/dist/cjs/persistence/sessionRow.js.map +1 -0
- package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
- package/dist/cjs/providers/DeepSeekProvider.js +8 -3
- package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts +4 -3
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +4 -3
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +4 -0
- package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAICompatibleProvider.js +2 -0
- package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.js +2 -4
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
- package/dist/cjs/providers/ProviderAdapter.d.ts +11 -6
- package/dist/cjs/providers/ProviderAdapter.d.ts.map +1 -1
- package/dist/cjs/providers/ProviderAdapter.js +33 -10
- package/dist/cjs/providers/ProviderAdapter.js.map +1 -1
- package/dist/cjs/providers/ZaiProvider.d.ts +6 -4
- package/dist/cjs/providers/ZaiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/ZaiProvider.js +6 -4
- package/dist/cjs/providers/ZaiProvider.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +153 -383
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/agent.js +1 -1
- package/dist/cjs/types/ai.d.ts +32 -1
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/compaction.d.ts +3 -1
- package/dist/cjs/types/compaction.d.ts.map +1 -1
- package/dist/cjs/types/errors.d.ts +9 -12
- package/dist/cjs/types/errors.d.ts.map +1 -1
- package/dist/cjs/types/errors.js +14 -17
- package/dist/cjs/types/errors.js.map +1 -1
- package/dist/cjs/types/flow.d.ts +265 -513
- package/dist/cjs/types/flow.d.ts.map +1 -1
- package/dist/cjs/types/flow.js +7 -1
- package/dist/cjs/types/flow.js.map +1 -1
- package/dist/cjs/types/history.d.ts +7 -18
- package/dist/cjs/types/history.d.ts.map +1 -1
- package/dist/cjs/types/history.js.map +1 -1
- package/dist/cjs/types/index.d.ts +9 -15
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js +4 -14
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/session.d.ts +94 -64
- package/dist/cjs/types/session.d.ts.map +1 -1
- package/dist/cjs/types/session.js +5 -1
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/cjs/types/tool.d.ts +37 -207
- package/dist/cjs/types/tool.d.ts.map +1 -1
- package/dist/cjs/types/tool.js +5 -14
- package/dist/cjs/types/tool.js.map +1 -1
- package/dist/cjs/utils/clock.d.ts +28 -0
- package/dist/cjs/utils/clock.d.ts.map +1 -0
- package/dist/cjs/utils/clock.js +64 -0
- package/dist/cjs/utils/clock.js.map +1 -0
- package/dist/cjs/utils/duration.d.ts +11 -0
- package/dist/cjs/utils/duration.d.ts.map +1 -0
- package/dist/cjs/utils/duration.js +31 -0
- package/dist/cjs/utils/duration.js.map +1 -0
- package/dist/cjs/utils/history.d.ts +4 -1
- package/dist/cjs/utils/history.d.ts.map +1 -1
- package/dist/cjs/utils/history.js +2 -2
- package/dist/cjs/utils/history.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +4 -10
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +14 -61
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/json.d.ts +2 -0
- package/dist/cjs/utils/json.d.ts.map +1 -1
- package/dist/cjs/utils/json.js +5 -0
- package/dist/cjs/utils/json.js.map +1 -1
- package/dist/cjs/utils/outcomes.d.ts +48 -0
- package/dist/cjs/utils/outcomes.d.ts.map +1 -0
- package/dist/cjs/utils/outcomes.js +51 -0
- package/dist/cjs/utils/outcomes.js.map +1 -0
- package/dist/cjs/utils/schema.d.ts +50 -0
- package/dist/cjs/utils/schema.d.ts.map +1 -0
- package/dist/cjs/utils/schema.js +138 -0
- package/dist/cjs/utils/schema.js.map +1 -0
- package/dist/cjs/utils/streamingMessage.d.ts +3 -2
- package/dist/cjs/utils/streamingMessage.d.ts.map +1 -1
- package/dist/cjs/utils/streamingMessage.js +38 -4
- package/dist/cjs/utils/streamingMessage.js.map +1 -1
- package/dist/cjs/utils/template.d.ts +13 -149
- package/dist/cjs/utils/template.d.ts.map +1 -1
- package/dist/cjs/utils/template.js +31 -363
- package/dist/cjs/utils/template.js.map +1 -1
- package/dist/cjs/utils/usage.d.ts +19 -0
- package/dist/cjs/utils/usage.d.ts.map +1 -0
- package/dist/cjs/utils/usage.js +35 -0
- package/dist/cjs/utils/usage.js.map +1 -0
- package/dist/core/Agent.d.ts +22 -378
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +107 -1181
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/CompactionEngine.d.ts.map +1 -1
- package/dist/core/CompactionEngine.js +5 -3
- package/dist/core/CompactionEngine.js.map +1 -1
- package/dist/core/FlowSpec.d.ts +136 -0
- package/dist/core/FlowSpec.d.ts.map +1 -0
- package/dist/core/FlowSpec.js +516 -0
- package/dist/core/FlowSpec.js.map +1 -0
- package/dist/core/Migrate.d.ts +38 -0
- package/dist/core/Migrate.d.ts.map +1 -0
- package/dist/core/Migrate.js +264 -0
- package/dist/core/Migrate.js.map +1 -0
- package/dist/core/Prompt.d.ts +54 -0
- package/dist/core/Prompt.d.ts.map +1 -0
- package/dist/core/Prompt.js +133 -0
- package/dist/core/Prompt.js.map +1 -0
- package/dist/core/Runner.d.ts +160 -0
- package/dist/core/Runner.d.ts.map +1 -0
- package/dist/core/Runner.js +1127 -0
- package/dist/core/Runner.js.map +1 -0
- package/dist/core/Speak.d.ts +37 -0
- package/dist/core/Speak.d.ts.map +1 -0
- package/dist/core/Speak.js +360 -0
- package/dist/core/Speak.js.map +1 -0
- package/dist/core/Understand.d.ts +28 -0
- package/dist/core/Understand.d.ts.map +1 -0
- package/dist/core/Understand.js +349 -0
- package/dist/core/Understand.js.map +1 -0
- package/dist/core/contracts.d.ts +122 -0
- package/dist/core/contracts.d.ts.map +1 -0
- package/dist/core/contracts.js +10 -0
- package/dist/core/contracts.js.map +1 -0
- package/dist/core/falai.d.ts +57 -0
- package/dist/core/falai.d.ts.map +1 -0
- package/dist/core/falai.js +40 -0
- package/dist/core/falai.js.map +1 -0
- package/dist/core/predicate.d.ts +9 -0
- package/dist/core/predicate.d.ts.map +1 -0
- package/dist/core/predicate.js +54 -0
- package/dist/core/predicate.js.map +1 -0
- package/dist/index.d.ts +26 -31
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -24
- package/dist/index.js.map +1 -1
- package/dist/persistence/MemoryStore.d.ts +15 -0
- package/dist/persistence/MemoryStore.d.ts.map +1 -0
- package/dist/persistence/MemoryStore.js +35 -0
- package/dist/persistence/MemoryStore.js.map +1 -0
- package/dist/persistence/MongoStore.d.ts +42 -0
- package/dist/persistence/MongoStore.d.ts.map +1 -0
- package/dist/persistence/MongoStore.js +56 -0
- package/dist/persistence/MongoStore.js.map +1 -0
- package/dist/persistence/OpenSearchStore.d.ts +86 -0
- package/dist/persistence/OpenSearchStore.d.ts.map +1 -0
- package/dist/persistence/OpenSearchStore.js +116 -0
- package/dist/persistence/OpenSearchStore.js.map +1 -0
- package/dist/persistence/PostgresStore.d.ts +41 -0
- package/dist/persistence/PostgresStore.d.ts.map +1 -0
- package/dist/persistence/PostgresStore.js +54 -0
- package/dist/persistence/PostgresStore.js.map +1 -0
- package/dist/persistence/PrismaStore.d.ts +65 -0
- package/dist/persistence/PrismaStore.d.ts.map +1 -0
- package/dist/persistence/PrismaStore.js +91 -0
- package/dist/persistence/PrismaStore.js.map +1 -0
- package/dist/persistence/RedisStore.d.ts +34 -0
- package/dist/persistence/RedisStore.d.ts.map +1 -0
- package/dist/persistence/RedisStore.js +57 -0
- package/dist/persistence/RedisStore.js.map +1 -0
- package/dist/persistence/SQLiteStore.d.ts +45 -0
- package/dist/persistence/SQLiteStore.d.ts.map +1 -0
- package/dist/persistence/SQLiteStore.js +70 -0
- package/dist/persistence/SQLiteStore.js.map +1 -0
- package/dist/persistence/sessionRow.d.ts +14 -0
- package/dist/persistence/sessionRow.d.ts.map +1 -0
- package/dist/persistence/sessionRow.js +45 -0
- package/dist/persistence/sessionRow.js.map +1 -0
- package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
- package/dist/providers/DeepSeekProvider.js +8 -3
- package/dist/providers/DeepSeekProvider.js.map +1 -1
- package/dist/providers/GeminiProvider.d.ts +4 -3
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +4 -3
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/OpenAICompatibleProvider.d.ts +4 -0
- package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
- package/dist/providers/OpenAICompatibleProvider.js +2 -0
- package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/OpenRouterProvider.js +2 -4
- package/dist/providers/OpenRouterProvider.js.map +1 -1
- package/dist/providers/ProviderAdapter.d.ts +11 -6
- package/dist/providers/ProviderAdapter.d.ts.map +1 -1
- package/dist/providers/ProviderAdapter.js +34 -11
- package/dist/providers/ProviderAdapter.js.map +1 -1
- package/dist/providers/ZaiProvider.d.ts +6 -4
- package/dist/providers/ZaiProvider.d.ts.map +1 -1
- package/dist/providers/ZaiProvider.js +6 -4
- package/dist/providers/ZaiProvider.js.map +1 -1
- package/dist/types/agent.d.ts +153 -383
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js +1 -1
- package/dist/types/ai.d.ts +32 -1
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/compaction.d.ts +3 -1
- package/dist/types/compaction.d.ts.map +1 -1
- package/dist/types/errors.d.ts +9 -12
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/errors.js +12 -15
- package/dist/types/errors.js.map +1 -1
- package/dist/types/flow.d.ts +265 -513
- package/dist/types/flow.d.ts.map +1 -1
- package/dist/types/flow.js +7 -1
- package/dist/types/flow.js.map +1 -1
- package/dist/types/history.d.ts +7 -18
- package/dist/types/history.d.ts.map +1 -1
- package/dist/types/history.js.map +1 -1
- package/dist/types/index.d.ts +9 -15
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -7
- package/dist/types/index.js.map +1 -1
- package/dist/types/session.d.ts +94 -64
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/session.js +5 -1
- package/dist/types/session.js.map +1 -1
- package/dist/types/tool.d.ts +37 -207
- package/dist/types/tool.d.ts.map +1 -1
- package/dist/types/tool.js +6 -13
- package/dist/types/tool.js.map +1 -1
- package/dist/utils/clock.d.ts +28 -0
- package/dist/utils/clock.d.ts.map +1 -0
- package/dist/utils/clock.js +59 -0
- package/dist/utils/clock.js.map +1 -0
- package/dist/utils/duration.d.ts +11 -0
- package/dist/utils/duration.d.ts.map +1 -0
- package/dist/utils/duration.js +26 -0
- package/dist/utils/duration.js.map +1 -0
- package/dist/utils/history.d.ts +4 -1
- package/dist/utils/history.d.ts.map +1 -1
- package/dist/utils/history.js +2 -2
- package/dist/utils/history.js.map +1 -1
- package/dist/utils/index.d.ts +4 -10
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -21
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/json.d.ts +2 -0
- package/dist/utils/json.d.ts.map +1 -1
- package/dist/utils/json.js +4 -0
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/outcomes.d.ts +48 -0
- package/dist/utils/outcomes.d.ts.map +1 -0
- package/dist/utils/outcomes.js +48 -0
- package/dist/utils/outcomes.js.map +1 -0
- package/dist/utils/schema.d.ts +50 -0
- package/dist/utils/schema.d.ts.map +1 -0
- package/dist/utils/schema.js +129 -0
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/streamingMessage.d.ts +3 -2
- package/dist/utils/streamingMessage.d.ts.map +1 -1
- package/dist/utils/streamingMessage.js +38 -4
- package/dist/utils/streamingMessage.js.map +1 -1
- package/dist/utils/template.d.ts +13 -149
- package/dist/utils/template.d.ts.map +1 -1
- package/dist/utils/template.js +28 -355
- package/dist/utils/template.js.map +1 -1
- package/dist/utils/usage.d.ts +19 -0
- package/dist/utils/usage.d.ts.map +1 -0
- package/dist/utils/usage.js +31 -0
- package/dist/utils/usage.js.map +1 -0
- package/docs/README.md +37 -19
- package/docs/concepts/architecture.md +117 -239
- package/docs/concepts/collection.md +170 -0
- package/docs/concepts/pipeline.md +132 -378
- package/docs/concepts/runs-and-waits.md +192 -0
- package/docs/guides/actions-and-events.md +276 -0
- package/docs/guides/branching.md +119 -208
- package/docs/guides/compaction.md +63 -158
- package/docs/guides/conditions.md +164 -128
- package/docs/guides/error-handling.md +168 -164
- package/docs/guides/flow-control.md +210 -349
- package/docs/guides/flows-from-json.md +224 -0
- package/docs/guides/instructions.md +125 -161
- package/docs/guides/persistence.md +182 -206
- package/docs/guides/streaming.md +50 -114
- package/docs/guides/testing.md +284 -0
- package/docs/guides/triggers.md +401 -0
- package/docs/migration/README.md +8 -15
- package/docs/migration/v1-to-v2.md +1 -1
- package/docs/migration/v2-3-to-v2-4.md +2 -2
- package/docs/migration/v2-6-to-v2-7.md +4 -4
- package/docs/migration/v3-to-v4.md +452 -0
- package/docs/reference/actions-events-conditions.md +396 -0
- package/docs/reference/agent.md +244 -0
- package/docs/reference/branches.md +75 -203
- package/docs/reference/errors.md +188 -144
- package/docs/reference/fields.md +125 -0
- package/docs/reference/flow-spec.md +248 -0
- package/docs/reference/flow.md +104 -192
- package/docs/reference/instruction.md +83 -137
- package/docs/reference/outcomes.md +273 -0
- package/docs/reference/providers.md +525 -302
- package/docs/reference/session.md +210 -0
- package/docs/reference/step.md +194 -312
- package/docs/reference/stores.md +496 -0
- package/docs/reference/tool.md +162 -231
- package/docs/reference/trigger.md +180 -0
- package/docs/rfc/v4-one-flow.md +477 -0
- package/docs/start/01-install.md +59 -44
- package/docs/start/02-first-agent.md +97 -147
- package/docs/start/03-collect-data.md +78 -183
- package/docs/start/04-add-tools.md +159 -227
- package/docs/start/05-go-to-production.md +167 -164
- package/examples/01-quickstart.ts +26 -16
- package/examples/02-fields.ts +75 -0
- package/examples/03-tools.ts +79 -119
- package/examples/04-instructions.ts +60 -87
- package/examples/05-branches.ts +78 -0
- package/examples/06-triggers-and-waits.ts +148 -0
- package/examples/07-streaming.ts +34 -60
- package/examples/08-store-and-migration.ts +97 -0
- package/examples/09-flows-from-json.ts +107 -0
- package/package.json +9 -6
- package/src/core/Agent.ts +116 -1512
- package/src/core/CompactionEngine.ts +7 -4
- package/src/core/FlowSpec.ts +712 -0
- package/src/core/Migrate.ts +256 -0
- package/src/core/Prompt.ts +156 -0
- package/src/core/Runner.ts +1181 -0
- package/src/core/Speak.ts +451 -0
- package/src/core/Understand.ts +422 -0
- package/src/core/contracts.ts +111 -0
- package/src/core/falai.ts +86 -0
- package/src/core/predicate.ts +56 -0
- package/src/index.ts +119 -147
- package/src/persistence/MemoryStore.ts +37 -0
- package/src/persistence/MongoStore.ts +89 -0
- package/src/persistence/OpenSearchStore.ts +153 -0
- package/src/persistence/PostgresStore.ts +89 -0
- package/src/persistence/PrismaStore.ts +127 -0
- package/src/persistence/RedisStore.ts +90 -0
- package/src/persistence/SQLiteStore.ts +103 -0
- package/src/persistence/sessionRow.ts +45 -0
- package/src/providers/DeepSeekProvider.ts +8 -3
- package/src/providers/GeminiProvider.ts +4 -3
- package/src/providers/OpenAICompatibleProvider.ts +6 -0
- package/src/providers/OpenRouterProvider.ts +2 -4
- package/src/providers/ProviderAdapter.ts +46 -13
- package/src/providers/ZaiProvider.ts +6 -4
- package/src/types/agent.ts +124 -397
- package/src/types/ai.ts +33 -1
- package/src/types/compaction.ts +3 -1
- package/src/types/errors.ts +13 -16
- package/src/types/flow.ts +249 -550
- package/src/types/history.ts +7 -20
- package/src/types/index.ts +87 -139
- package/src/types/session.ts +135 -70
- package/src/types/tool.ts +42 -267
- package/src/utils/clock.ts +70 -0
- package/src/utils/duration.ts +33 -0
- package/src/utils/history.ts +3 -2
- package/src/utils/index.ts +8 -66
- package/src/utils/json.ts +5 -0
- package/src/utils/outcomes.ts +56 -0
- package/src/utils/schema.ts +145 -0
- package/src/utils/streamingMessage.ts +34 -4
- package/src/utils/template.ts +32 -423
- package/src/utils/usage.ts +37 -0
- package/dist/adapters/MemoryAdapter.d.ts +0 -47
- package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/adapters/MemoryAdapter.js +0 -204
- package/dist/adapters/MemoryAdapter.js.map +0 -1
- package/dist/adapters/MongoAdapter.d.ts +0 -97
- package/dist/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/adapters/MongoAdapter.js +0 -196
- package/dist/adapters/MongoAdapter.js.map +0 -1
- package/dist/adapters/OpenSearchAdapter.d.ts +0 -169
- package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/adapters/OpenSearchAdapter.js +0 -471
- package/dist/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts +0 -85
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/adapters/PostgreSQLAdapter.js +0 -308
- package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/adapters/PrismaAdapter.d.ts +0 -115
- package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/adapters/PrismaAdapter.js +0 -406
- package/dist/adapters/PrismaAdapter.js.map +0 -1
- package/dist/adapters/RedisAdapter.d.ts +0 -72
- package/dist/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/adapters/RedisAdapter.js +0 -286
- package/dist/adapters/RedisAdapter.js.map +0 -1
- package/dist/adapters/SQLiteAdapter.d.ts +0 -86
- package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/adapters/SQLiteAdapter.js +0 -337
- package/dist/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/adapters/index.d.ts +0 -17
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -11
- package/dist/adapters/index.js.map +0 -1
- package/dist/adapters/sessionRow.d.ts +0 -22
- package/dist/adapters/sessionRow.d.ts.map +0 -1
- package/dist/adapters/sessionRow.js +0 -48
- package/dist/adapters/sessionRow.js.map +0 -1
- package/dist/cjs/adapters/MemoryAdapter.d.ts +0 -47
- package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/MemoryAdapter.js +0 -208
- package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
- package/dist/cjs/adapters/MongoAdapter.d.ts +0 -97
- package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/MongoAdapter.js +0 -200
- package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts +0 -169
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js +0 -475
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +0 -85
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js +0 -312
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/cjs/adapters/PrismaAdapter.d.ts +0 -115
- package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/PrismaAdapter.js +0 -410
- package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts +0 -72
- package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/RedisAdapter.js +0 -290
- package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts +0 -86
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/SQLiteAdapter.js +0 -341
- package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/cjs/adapters/index.d.ts +0 -17
- package/dist/cjs/adapters/index.d.ts.map +0 -1
- package/dist/cjs/adapters/index.js +0 -21
- package/dist/cjs/adapters/index.js.map +0 -1
- package/dist/cjs/adapters/sessionRow.d.ts +0 -22
- package/dist/cjs/adapters/sessionRow.d.ts.map +0 -1
- package/dist/cjs/adapters/sessionRow.js +0 -52
- package/dist/cjs/adapters/sessionRow.js.map +0 -1
- package/dist/cjs/constants/index.d.ts +0 -1
- package/dist/cjs/constants/index.d.ts.map +0 -1
- package/dist/cjs/constants/index.js +0 -4
- package/dist/cjs/constants/index.js.map +0 -1
- package/dist/cjs/core/AutoChainExecutor.d.ts +0 -97
- package/dist/cjs/core/AutoChainExecutor.d.ts.map +0 -1
- package/dist/cjs/core/AutoChainExecutor.js +0 -288
- package/dist/cjs/core/AutoChainExecutor.js.map +0 -1
- package/dist/cjs/core/BranchEvaluator.d.ts +0 -55
- package/dist/cjs/core/BranchEvaluator.d.ts.map +0 -1
- package/dist/cjs/core/BranchEvaluator.js +0 -125
- package/dist/cjs/core/BranchEvaluator.js.map +0 -1
- package/dist/cjs/core/DirectiveChainTracker.d.ts +0 -49
- package/dist/cjs/core/DirectiveChainTracker.d.ts.map +0 -1
- package/dist/cjs/core/DirectiveChainTracker.js +0 -121
- package/dist/cjs/core/DirectiveChainTracker.js.map +0 -1
- package/dist/cjs/core/Events.d.ts +0 -26
- package/dist/cjs/core/Events.d.ts.map +0 -1
- package/dist/cjs/core/Events.js +0 -144
- package/dist/cjs/core/Events.js.map +0 -1
- package/dist/cjs/core/Flow.d.ts +0 -183
- package/dist/cjs/core/Flow.d.ts.map +0 -1
- package/dist/cjs/core/Flow.js +0 -551
- package/dist/cjs/core/Flow.js.map +0 -1
- package/dist/cjs/core/FlowRouter.d.ts +0 -183
- package/dist/cjs/core/FlowRouter.d.ts.map +0 -1
- package/dist/cjs/core/FlowRouter.js +0 -1047
- package/dist/cjs/core/FlowRouter.js.map +0 -1
- package/dist/cjs/core/PersistenceManager.d.ts +0 -114
- package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
- package/dist/cjs/core/PersistenceManager.js +0 -336
- package/dist/cjs/core/PersistenceManager.js.map +0 -1
- package/dist/cjs/core/PromptComposer.d.ts +0 -47
- package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
- package/dist/cjs/core/PromptComposer.js +0 -397
- package/dist/cjs/core/PromptComposer.js.map +0 -1
- package/dist/cjs/core/PromptSectionCache.d.ts +0 -48
- package/dist/cjs/core/PromptSectionCache.d.ts.map +0 -1
- package/dist/cjs/core/PromptSectionCache.js +0 -108
- package/dist/cjs/core/PromptSectionCache.js.map +0 -1
- package/dist/cjs/core/ResponseEngine.d.ts +0 -43
- package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
- package/dist/cjs/core/ResponseEngine.js +0 -235
- package/dist/cjs/core/ResponseEngine.js.map +0 -1
- package/dist/cjs/core/ResponseGenerationError.d.ts +0 -30
- package/dist/cjs/core/ResponseGenerationError.d.ts.map +0 -1
- package/dist/cjs/core/ResponseGenerationError.js +0 -35
- package/dist/cjs/core/ResponseGenerationError.js.map +0 -1
- package/dist/cjs/core/ResponseModal.d.ts +0 -305
- package/dist/cjs/core/ResponseModal.d.ts.map +0 -1
- package/dist/cjs/core/ResponseModal.js +0 -1414
- package/dist/cjs/core/ResponseModal.js.map +0 -1
- package/dist/cjs/core/ResponsePipeline.d.ts +0 -220
- package/dist/cjs/core/ResponsePipeline.d.ts.map +0 -1
- package/dist/cjs/core/ResponsePipeline.js +0 -1040
- package/dist/cjs/core/ResponsePipeline.js.map +0 -1
- package/dist/cjs/core/SessionFinalizer.d.ts +0 -34
- package/dist/cjs/core/SessionFinalizer.d.ts.map +0 -1
- package/dist/cjs/core/SessionFinalizer.js +0 -88
- package/dist/cjs/core/SessionFinalizer.js.map +0 -1
- package/dist/cjs/core/SessionManager.d.ts +0 -112
- package/dist/cjs/core/SessionManager.d.ts.map +0 -1
- package/dist/cjs/core/SessionManager.js +0 -308
- package/dist/cjs/core/SessionManager.js.map +0 -1
- package/dist/cjs/core/SignalCoordinator.d.ts +0 -103
- package/dist/cjs/core/SignalCoordinator.d.ts.map +0 -1
- package/dist/cjs/core/SignalCoordinator.js +0 -207
- package/dist/cjs/core/SignalCoordinator.js.map +0 -1
- package/dist/cjs/core/SignalEvaluator.d.ts +0 -86
- package/dist/cjs/core/SignalEvaluator.d.ts.map +0 -1
- package/dist/cjs/core/SignalEvaluator.js +0 -319
- package/dist/cjs/core/SignalEvaluator.js.map +0 -1
- package/dist/cjs/core/SignalProcessor.d.ts +0 -152
- package/dist/cjs/core/SignalProcessor.d.ts.map +0 -1
- package/dist/cjs/core/SignalProcessor.js +0 -505
- package/dist/cjs/core/SignalProcessor.js.map +0 -1
- package/dist/cjs/core/Step.d.ts +0 -184
- package/dist/cjs/core/Step.d.ts.map +0 -1
- package/dist/cjs/core/Step.js +0 -599
- package/dist/cjs/core/Step.js.map +0 -1
- package/dist/cjs/core/StepLifecycle.d.ts +0 -43
- package/dist/cjs/core/StepLifecycle.d.ts.map +0 -1
- package/dist/cjs/core/StepLifecycle.js +0 -180
- package/dist/cjs/core/StepLifecycle.js.map +0 -1
- package/dist/cjs/core/StreamingToolExecutor.d.ts +0 -142
- package/dist/cjs/core/StreamingToolExecutor.d.ts.map +0 -1
- package/dist/cjs/core/StreamingToolExecutor.js +0 -490
- package/dist/cjs/core/StreamingToolExecutor.js.map +0 -1
- package/dist/cjs/core/ToolLoopExecutor.d.ts +0 -133
- package/dist/cjs/core/ToolLoopExecutor.d.ts.map +0 -1
- package/dist/cjs/core/ToolLoopExecutor.js +0 -568
- package/dist/cjs/core/ToolLoopExecutor.js.map +0 -1
- package/dist/cjs/core/ToolManager.d.ts +0 -250
- package/dist/cjs/core/ToolManager.d.ts.map +0 -1
- package/dist/cjs/core/ToolManager.js +0 -1104
- package/dist/cjs/core/ToolManager.js.map +0 -1
- package/dist/cjs/core/createAgent.d.ts +0 -35
- package/dist/cjs/core/createAgent.d.ts.map +0 -1
- package/dist/cjs/core/createAgent.js +0 -39
- package/dist/cjs/core/createAgent.js.map +0 -1
- package/dist/cjs/core/flow-namespace.d.ts +0 -64
- package/dist/cjs/core/flow-namespace.d.ts.map +0 -1
- package/dist/cjs/core/flow-namespace.js +0 -182
- package/dist/cjs/core/flow-namespace.js.map +0 -1
- package/dist/cjs/core/toolGates.d.ts +0 -24
- package/dist/cjs/core/toolGates.d.ts.map +0 -1
- package/dist/cjs/core/toolGates.js +0 -52
- package/dist/cjs/core/toolGates.js.map +0 -1
- package/dist/cjs/types/persistence.d.ts +0 -254
- package/dist/cjs/types/persistence.d.ts.map +0 -1
- package/dist/cjs/types/persistence.js +0 -7
- package/dist/cjs/types/persistence.js.map +0 -1
- package/dist/cjs/types/prompt-cache.d.ts +0 -15
- package/dist/cjs/types/prompt-cache.d.ts.map +0 -1
- package/dist/cjs/types/prompt-cache.js +0 -6
- package/dist/cjs/types/prompt-cache.js.map +0 -1
- package/dist/cjs/types/signals.d.ts +0 -263
- package/dist/cjs/types/signals.d.ts.map +0 -1
- package/dist/cjs/types/signals.js +0 -11
- package/dist/cjs/types/signals.js.map +0 -1
- package/dist/cjs/types/template.d.ts +0 -84
- package/dist/cjs/types/template.d.ts.map +0 -1
- package/dist/cjs/types/template.js +0 -3
- package/dist/cjs/types/template.js.map +0 -1
- package/dist/cjs/utils/condition.d.ts +0 -63
- package/dist/cjs/utils/condition.d.ts.map +0 -1
- package/dist/cjs/utils/condition.js +0 -239
- package/dist/cjs/utils/condition.js.map +0 -1
- package/dist/cjs/utils/event.d.ts +0 -6
- package/dist/cjs/utils/event.d.ts.map +0 -1
- package/dist/cjs/utils/event.js +0 -20
- package/dist/cjs/utils/event.js.map +0 -1
- package/dist/cjs/utils/id.d.ts +0 -33
- package/dist/cjs/utils/id.d.ts.map +0 -1
- package/dist/cjs/utils/id.js +0 -84
- package/dist/cjs/utils/id.js.map +0 -1
- package/dist/cjs/utils/serialize.d.ts +0 -36
- package/dist/cjs/utils/serialize.d.ts.map +0 -1
- package/dist/cjs/utils/serialize.js +0 -77
- package/dist/cjs/utils/serialize.js.map +0 -1
- package/dist/cjs/utils/session.d.ts +0 -124
- package/dist/cjs/utils/session.d.ts.map +0 -1
- package/dist/cjs/utils/session.js +0 -396
- package/dist/cjs/utils/session.js.map +0 -1
- package/dist/constants/index.d.ts +0 -2
- package/dist/constants/index.d.ts.map +0 -1
- package/dist/constants/index.js +0 -4
- package/dist/constants/index.js.map +0 -1
- package/dist/core/AutoChainExecutor.d.ts +0 -97
- package/dist/core/AutoChainExecutor.d.ts.map +0 -1
- package/dist/core/AutoChainExecutor.js +0 -284
- package/dist/core/AutoChainExecutor.js.map +0 -1
- package/dist/core/BranchEvaluator.d.ts +0 -55
- package/dist/core/BranchEvaluator.d.ts.map +0 -1
- package/dist/core/BranchEvaluator.js +0 -121
- package/dist/core/BranchEvaluator.js.map +0 -1
- package/dist/core/DirectiveChainTracker.d.ts +0 -49
- package/dist/core/DirectiveChainTracker.d.ts.map +0 -1
- package/dist/core/DirectiveChainTracker.js +0 -117
- package/dist/core/DirectiveChainTracker.js.map +0 -1
- package/dist/core/Events.d.ts +0 -26
- package/dist/core/Events.d.ts.map +0 -1
- package/dist/core/Events.js +0 -137
- package/dist/core/Events.js.map +0 -1
- package/dist/core/Flow.d.ts +0 -183
- package/dist/core/Flow.d.ts.map +0 -1
- package/dist/core/Flow.js +0 -547
- package/dist/core/Flow.js.map +0 -1
- package/dist/core/FlowRouter.d.ts +0 -183
- package/dist/core/FlowRouter.d.ts.map +0 -1
- package/dist/core/FlowRouter.js +0 -1043
- package/dist/core/FlowRouter.js.map +0 -1
- package/dist/core/PersistenceManager.d.ts +0 -114
- package/dist/core/PersistenceManager.d.ts.map +0 -1
- package/dist/core/PersistenceManager.js +0 -332
- package/dist/core/PersistenceManager.js.map +0 -1
- package/dist/core/PromptComposer.d.ts +0 -47
- package/dist/core/PromptComposer.d.ts.map +0 -1
- package/dist/core/PromptComposer.js +0 -393
- package/dist/core/PromptComposer.js.map +0 -1
- package/dist/core/PromptSectionCache.d.ts +0 -48
- package/dist/core/PromptSectionCache.d.ts.map +0 -1
- package/dist/core/PromptSectionCache.js +0 -104
- package/dist/core/PromptSectionCache.js.map +0 -1
- package/dist/core/ResponseEngine.d.ts +0 -43
- package/dist/core/ResponseEngine.d.ts.map +0 -1
- package/dist/core/ResponseEngine.js +0 -231
- package/dist/core/ResponseEngine.js.map +0 -1
- package/dist/core/ResponseGenerationError.d.ts +0 -30
- package/dist/core/ResponseGenerationError.d.ts.map +0 -1
- package/dist/core/ResponseGenerationError.js +0 -31
- package/dist/core/ResponseGenerationError.js.map +0 -1
- package/dist/core/ResponseModal.d.ts +0 -305
- package/dist/core/ResponseModal.d.ts.map +0 -1
- package/dist/core/ResponseModal.js +0 -1410
- package/dist/core/ResponseModal.js.map +0 -1
- package/dist/core/ResponsePipeline.d.ts +0 -220
- package/dist/core/ResponsePipeline.d.ts.map +0 -1
- package/dist/core/ResponsePipeline.js +0 -1035
- package/dist/core/ResponsePipeline.js.map +0 -1
- package/dist/core/SessionFinalizer.d.ts +0 -34
- package/dist/core/SessionFinalizer.d.ts.map +0 -1
- package/dist/core/SessionFinalizer.js +0 -84
- package/dist/core/SessionFinalizer.js.map +0 -1
- package/dist/core/SessionManager.d.ts +0 -112
- package/dist/core/SessionManager.d.ts.map +0 -1
- package/dist/core/SessionManager.js +0 -301
- package/dist/core/SessionManager.js.map +0 -1
- package/dist/core/SignalCoordinator.d.ts +0 -103
- package/dist/core/SignalCoordinator.d.ts.map +0 -1
- package/dist/core/SignalCoordinator.js +0 -203
- package/dist/core/SignalCoordinator.js.map +0 -1
- package/dist/core/SignalEvaluator.d.ts +0 -86
- package/dist/core/SignalEvaluator.d.ts.map +0 -1
- package/dist/core/SignalEvaluator.js +0 -312
- package/dist/core/SignalEvaluator.js.map +0 -1
- package/dist/core/SignalProcessor.d.ts +0 -152
- package/dist/core/SignalProcessor.d.ts.map +0 -1
- package/dist/core/SignalProcessor.js +0 -498
- package/dist/core/SignalProcessor.js.map +0 -1
- package/dist/core/Step.d.ts +0 -184
- package/dist/core/Step.d.ts.map +0 -1
- package/dist/core/Step.js +0 -594
- package/dist/core/Step.js.map +0 -1
- package/dist/core/StepLifecycle.d.ts +0 -43
- package/dist/core/StepLifecycle.d.ts.map +0 -1
- package/dist/core/StepLifecycle.js +0 -176
- package/dist/core/StepLifecycle.js.map +0 -1
- package/dist/core/StreamingToolExecutor.d.ts +0 -142
- package/dist/core/StreamingToolExecutor.d.ts.map +0 -1
- package/dist/core/StreamingToolExecutor.js +0 -483
- package/dist/core/StreamingToolExecutor.js.map +0 -1
- package/dist/core/ToolLoopExecutor.d.ts +0 -133
- package/dist/core/ToolLoopExecutor.d.ts.map +0 -1
- package/dist/core/ToolLoopExecutor.js +0 -564
- package/dist/core/ToolLoopExecutor.js.map +0 -1
- package/dist/core/ToolManager.d.ts +0 -250
- package/dist/core/ToolManager.d.ts.map +0 -1
- package/dist/core/ToolManager.js +0 -1098
- package/dist/core/ToolManager.js.map +0 -1
- package/dist/core/createAgent.d.ts +0 -35
- package/dist/core/createAgent.d.ts.map +0 -1
- package/dist/core/createAgent.js +0 -36
- package/dist/core/createAgent.js.map +0 -1
- package/dist/core/flow-namespace.d.ts +0 -64
- package/dist/core/flow-namespace.d.ts.map +0 -1
- package/dist/core/flow-namespace.js +0 -179
- package/dist/core/flow-namespace.js.map +0 -1
- package/dist/core/toolGates.d.ts +0 -24
- package/dist/core/toolGates.d.ts.map +0 -1
- package/dist/core/toolGates.js +0 -49
- package/dist/core/toolGates.js.map +0 -1
- package/dist/types/persistence.d.ts +0 -254
- package/dist/types/persistence.d.ts.map +0 -1
- package/dist/types/persistence.js +0 -6
- package/dist/types/persistence.js.map +0 -1
- package/dist/types/prompt-cache.d.ts +0 -15
- package/dist/types/prompt-cache.d.ts.map +0 -1
- package/dist/types/prompt-cache.js +0 -5
- package/dist/types/prompt-cache.js.map +0 -1
- package/dist/types/signals.d.ts +0 -263
- package/dist/types/signals.d.ts.map +0 -1
- package/dist/types/signals.js +0 -10
- package/dist/types/signals.js.map +0 -1
- package/dist/types/template.d.ts +0 -84
- package/dist/types/template.d.ts.map +0 -1
- package/dist/types/template.js +0 -2
- package/dist/types/template.js.map +0 -1
- package/dist/utils/condition.d.ts +0 -63
- package/dist/utils/condition.d.ts.map +0 -1
- package/dist/utils/condition.js +0 -230
- package/dist/utils/condition.js.map +0 -1
- package/dist/utils/event.d.ts +0 -6
- package/dist/utils/event.d.ts.map +0 -1
- package/dist/utils/event.js +0 -17
- package/dist/utils/event.js.map +0 -1
- package/dist/utils/id.d.ts +0 -33
- package/dist/utils/id.d.ts.map +0 -1
- package/dist/utils/id.js +0 -77
- package/dist/utils/id.js.map +0 -1
- package/dist/utils/serialize.d.ts +0 -36
- package/dist/utils/serialize.d.ts.map +0 -1
- package/dist/utils/serialize.js +0 -72
- package/dist/utils/serialize.js.map +0 -1
- package/dist/utils/session.d.ts +0 -124
- package/dist/utils/session.d.ts.map +0 -1
- package/dist/utils/session.js +0 -379
- package/dist/utils/session.js.map +0 -1
- package/docs/concepts/directives.md +0 -369
- package/docs/reference/adapters.md +0 -543
- package/docs/reference/create-agent.md +0 -216
- package/docs/reference/directive.md +0 -242
- package/docs/reference/signals.md +0 -368
- package/examples/02-data-extraction.ts +0 -90
- package/examples/05-branching.ts +0 -140
- package/examples/06-flow-control.ts +0 -103
- package/examples/08-persistence.ts +0 -98
- package/examples/09-signals.ts +0 -144
- package/src/adapters/MemoryAdapter.ts +0 -281
- package/src/adapters/MongoAdapter.ts +0 -341
- package/src/adapters/OpenSearchAdapter.ts +0 -693
- package/src/adapters/PostgreSQLAdapter.ts +0 -487
- package/src/adapters/PrismaAdapter.ts +0 -617
- package/src/adapters/RedisAdapter.ts +0 -439
- package/src/adapters/SQLiteAdapter.ts +0 -496
- package/src/adapters/index.ts +0 -43
- package/src/adapters/sessionRow.ts +0 -57
- package/src/constants/index.ts +0 -2
- package/src/core/AutoChainExecutor.ts +0 -397
- package/src/core/BranchEvaluator.ts +0 -161
- package/src/core/DirectiveChainTracker.ts +0 -144
- package/src/core/Events.ts +0 -164
- package/src/core/Flow.ts +0 -665
- package/src/core/FlowRouter.ts +0 -1540
- package/src/core/PersistenceManager.ts +0 -446
- package/src/core/PromptComposer.ts +0 -448
- package/src/core/PromptSectionCache.ts +0 -125
- package/src/core/ResponseEngine.ts +0 -338
- package/src/core/ResponseGenerationError.ts +0 -53
- package/src/core/ResponseModal.ts +0 -1902
- package/src/core/ResponsePipeline.ts +0 -1404
- package/src/core/SessionFinalizer.ts +0 -108
- package/src/core/SessionManager.ts +0 -372
- package/src/core/SignalCoordinator.ts +0 -263
- package/src/core/SignalEvaluator.ts +0 -404
- package/src/core/SignalProcessor.ts +0 -663
- package/src/core/Step.ts +0 -782
- package/src/core/StepLifecycle.ts +0 -242
- package/src/core/StreamingToolExecutor.ts +0 -609
- package/src/core/ToolLoopExecutor.ts +0 -749
- package/src/core/ToolManager.ts +0 -1379
- package/src/core/createAgent.ts +0 -40
- package/src/core/flow-namespace.ts +0 -227
- package/src/core/toolGates.ts +0 -72
- package/src/types/persistence.ts +0 -303
- package/src/types/prompt-cache.ts +0 -17
- package/src/types/signals.ts +0 -338
- package/src/types/template.ts +0 -98
- package/src/utils/condition.ts +0 -296
- package/src/utils/event.ts +0 -16
- package/src/utils/id.ts +0 -91
- package/src/utils/serialize.ts +0 -86
- package/src/utils/session.ts +0 -501
|
@@ -1,263 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SignalCoordinator owns the signal pre/post phase orchestration for a turn:
|
|
3
|
-
*
|
|
4
|
-
* - `runPrePhase()` / `runPostPhase()` — delegation to the SignalProcessor,
|
|
5
|
-
* returning a stable empty shape when no processor is configured.
|
|
6
|
-
* - `applyPositionDirective()` — applies a pre-phase directive's position
|
|
7
|
-
* field (goTo, goToStep, complete, abort, reset) as the turn's routing
|
|
8
|
-
* decision, discarding the router's result.
|
|
9
|
-
* - `applyPostPhase()` — runs the post phase and applies its directive to
|
|
10
|
-
* the turn result in one step: session updates, pendingDirective for
|
|
11
|
-
* position fields (no mid-turn re-entry per D6), and the reply override
|
|
12
|
-
* of the user-visible message.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import type { Directive, Event, SessionState } from "../types/index.js";
|
|
16
|
-
import type { SignalFiring } from "../types/signals.js";
|
|
17
|
-
import type { SignalProcessor } from "./SignalProcessor.js";
|
|
18
|
-
import type { Flow } from "./Flow.js";
|
|
19
|
-
import type { Step } from "./Step.js";
|
|
20
|
-
import { hasDirectivePositionField } from "./ResponsePipeline.js";
|
|
21
|
-
import { enterFlow, enterStep, mergeCollected, logger } from "../utils/index.js";
|
|
22
|
-
|
|
23
|
-
/** Result of a signal phase run (pre or post). */
|
|
24
|
-
export interface SignalPhaseResult<TContext = unknown, TData = unknown> {
|
|
25
|
-
firings: SignalFiring<TContext, TData>[];
|
|
26
|
-
updatedSession: SessionState<TData>;
|
|
27
|
-
mergedDirective: Directive<TContext, TData> | undefined;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export class SignalCoordinator<TContext = unknown, TData = unknown> {
|
|
31
|
-
constructor(
|
|
32
|
-
private readonly deps: {
|
|
33
|
-
getFlows: () => Flow<TContext, TData>[];
|
|
34
|
-
signalProcessor?: SignalProcessor<TContext, TData>;
|
|
35
|
-
}
|
|
36
|
-
) { }
|
|
37
|
-
|
|
38
|
-
/** Whether a signal processor is configured (zero-cost path when absent). */
|
|
39
|
-
get enabled(): boolean {
|
|
40
|
-
return this.deps.signalProcessor !== undefined;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* PRE-SIGNAL PHASE — Evaluates pre/both signals in parallel with routing.
|
|
45
|
-
*
|
|
46
|
-
* Delegates to `signalProcessor.runPreSignalPhase(...)` when configured.
|
|
47
|
-
* When no signal processor is present (zero-cost path), returns a stable
|
|
48
|
-
* empty shape so callers don't need to branch.
|
|
49
|
-
*
|
|
50
|
-
* @requirements 2.1, 2.3, 8.6, 13.3
|
|
51
|
-
*/
|
|
52
|
-
async runPrePhase(
|
|
53
|
-
session: SessionState<TData>,
|
|
54
|
-
context: TContext,
|
|
55
|
-
history: Event[],
|
|
56
|
-
): Promise<SignalPhaseResult<TContext, TData>> {
|
|
57
|
-
if (!this.deps.signalProcessor) {
|
|
58
|
-
return { firings: [], updatedSession: session, mergedDirective: undefined };
|
|
59
|
-
}
|
|
60
|
-
const result = await this.deps.signalProcessor.runPreSignalPhase({ session, history, context });
|
|
61
|
-
return {
|
|
62
|
-
firings: result.firings,
|
|
63
|
-
updatedSession: result.updatedSession,
|
|
64
|
-
mergedDirective: result.mergedDirective,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* POST-SIGNAL PHASE — Evaluates post/both signals after finalize/onComplete.
|
|
70
|
-
*
|
|
71
|
-
* Delegates to `signalProcessor.runPostSignalPhase(...)` when configured.
|
|
72
|
-
* When no signal processor is present, returns a stable empty shape.
|
|
73
|
-
*
|
|
74
|
-
* Post-phase signals see the complete turn result: assistant message in history,
|
|
75
|
-
* collected data, tool results. Position directives from this phase set
|
|
76
|
-
* `session.pendingDirective` (no mid-turn re-entry per D6 decision).
|
|
77
|
-
*
|
|
78
|
-
* Pre-LLM-only fields (`appendPrompt`, `injectTools`, `halt`) are already
|
|
79
|
-
* dropped inside `runPostSignalPhase` per Phase 4.5 — this seam does NOT
|
|
80
|
-
* re-introduce them.
|
|
81
|
-
*
|
|
82
|
-
* @requirements 9.1, 9.2, 9.3, 9.4
|
|
83
|
-
*/
|
|
84
|
-
async runPostPhase(
|
|
85
|
-
session: SessionState<TData>,
|
|
86
|
-
context: TContext,
|
|
87
|
-
history: Event[],
|
|
88
|
-
): Promise<SignalPhaseResult<TContext, TData>> {
|
|
89
|
-
if (!this.deps.signalProcessor) {
|
|
90
|
-
return { firings: [], updatedSession: session, mergedDirective: undefined };
|
|
91
|
-
}
|
|
92
|
-
const result = await this.deps.signalProcessor.runPostSignalPhase({ session, history, context });
|
|
93
|
-
return {
|
|
94
|
-
firings: result.firings,
|
|
95
|
-
updatedSession: result.updatedSession,
|
|
96
|
-
mergedDirective: result.mergedDirective,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Run the post phase and apply its merged directive to the turn result:
|
|
102
|
-
* session updates from the phase, `pendingDirective` for position fields
|
|
103
|
-
* (Requirement 9.3, no mid-turn re-entry per D6), and the reply override
|
|
104
|
-
* of the user-visible message (undefined means "leave it unchanged"; an
|
|
105
|
-
* empty string is an explicit replacement).
|
|
106
|
-
*
|
|
107
|
-
* @requirements 9.1, 9.2, 9.3, 9.4
|
|
108
|
-
*/
|
|
109
|
-
async applyPostPhase(params: {
|
|
110
|
-
session: SessionState<TData>;
|
|
111
|
-
context: TContext;
|
|
112
|
-
historyEvents: Event[];
|
|
113
|
-
message: string;
|
|
114
|
-
}): Promise<{
|
|
115
|
-
session: SessionState<TData>;
|
|
116
|
-
message: string;
|
|
117
|
-
firings: SignalFiring<TContext, TData>[];
|
|
118
|
-
/** True when the directive's `reply` replaced the message. */
|
|
119
|
-
replyOverridden: boolean;
|
|
120
|
-
}> {
|
|
121
|
-
const postResult = await this.runPostPhase(
|
|
122
|
-
params.session, params.context, params.historyEvents,
|
|
123
|
-
);
|
|
124
|
-
let session = postResult.updatedSession;
|
|
125
|
-
|
|
126
|
-
// Requirement 9.3: Post-phase position directive sets session.pendingDirective
|
|
127
|
-
if (postResult.mergedDirective && hasDirectivePositionField(postResult.mergedDirective)) {
|
|
128
|
-
session = { ...session, pendingDirective: postResult.mergedDirective };
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const replyOverridden = postResult.mergedDirective?.reply !== undefined;
|
|
132
|
-
const message = replyOverridden
|
|
133
|
-
? postResult.mergedDirective!.reply!
|
|
134
|
-
: params.message;
|
|
135
|
-
|
|
136
|
-
return { session, message, firings: postResult.firings, replyOverridden };
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Apply a signal's position directive (goTo, goToStep, complete, abort, reset).
|
|
141
|
-
* Discards routing result and uses the signal's position decision.
|
|
142
|
-
*
|
|
143
|
-
* @requirements 8.3
|
|
144
|
-
*/
|
|
145
|
-
applyPositionDirective(
|
|
146
|
-
signalResult: {
|
|
147
|
-
firings: SignalFiring<TContext, TData>[];
|
|
148
|
-
updatedSession: SessionState<TData>;
|
|
149
|
-
mergedDirective: Directive<TContext, TData> | undefined;
|
|
150
|
-
},
|
|
151
|
-
): {
|
|
152
|
-
selectedFlow?: Flow<TContext, TData>;
|
|
153
|
-
selectedStep?: Step<TContext, TData>;
|
|
154
|
-
responseDirectives?: string[];
|
|
155
|
-
session: SessionState<TData>;
|
|
156
|
-
isFlowComplete: boolean;
|
|
157
|
-
signalFirings?: SignalFiring<TContext, TData>[];
|
|
158
|
-
signalPreDirective?: Directive<TContext, TData>;
|
|
159
|
-
signalHalted?: boolean;
|
|
160
|
-
signalHaltReply?: string;
|
|
161
|
-
} {
|
|
162
|
-
const directive = signalResult.mergedDirective!;
|
|
163
|
-
let session = signalResult.updatedSession;
|
|
164
|
-
const flows = this.deps.getFlows();
|
|
165
|
-
let selectedFlow: Flow<TContext, TData> | undefined;
|
|
166
|
-
let selectedStep: Step<TContext, TData> | undefined;
|
|
167
|
-
let isFlowComplete = false;
|
|
168
|
-
|
|
169
|
-
// Apply data updates if present alongside position
|
|
170
|
-
if (directive.dataUpdate) {
|
|
171
|
-
session = mergeCollected(session, directive.dataUpdate);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
if (directive.goTo) {
|
|
175
|
-
const flowTarget = typeof directive.goTo === 'string'
|
|
176
|
-
? directive.goTo
|
|
177
|
-
: directive.goTo.flow ?? directive.goTo.step;
|
|
178
|
-
|
|
179
|
-
if (flowTarget) {
|
|
180
|
-
const targetFlow = flows.find(f => f.id === flowTarget || f.title === flowTarget);
|
|
181
|
-
if (targetFlow) {
|
|
182
|
-
session = enterFlow(session, targetFlow.id, targetFlow.title);
|
|
183
|
-
selectedFlow = targetFlow;
|
|
184
|
-
|
|
185
|
-
if (typeof directive.goTo === 'object' && directive.goTo.step) {
|
|
186
|
-
const targetStep = targetFlow.getStep(directive.goTo.step);
|
|
187
|
-
if (targetStep) {
|
|
188
|
-
session = enterStep(session, targetStep.id, targetStep.description);
|
|
189
|
-
selectedStep = targetStep;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
} else {
|
|
193
|
-
logger.warn(`[Signals] Pre-phase goTo target not found: "${flowTarget}". Falling back to no flow.`);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
} else if (directive.goToStep) {
|
|
197
|
-
const stepTarget = typeof directive.goToStep === 'string'
|
|
198
|
-
? directive.goToStep
|
|
199
|
-
: directive.goToStep.step;
|
|
200
|
-
const flowTarget = typeof directive.goToStep === 'object'
|
|
201
|
-
? directive.goToStep.flow
|
|
202
|
-
: undefined;
|
|
203
|
-
|
|
204
|
-
if (flowTarget) {
|
|
205
|
-
const targetFlow = flows.find(f => f.id === flowTarget || f.title === flowTarget);
|
|
206
|
-
if (targetFlow) {
|
|
207
|
-
session = enterFlow(session, targetFlow.id, targetFlow.title);
|
|
208
|
-
selectedFlow = targetFlow;
|
|
209
|
-
const targetStep = targetFlow.getStep(stepTarget);
|
|
210
|
-
if (targetStep) {
|
|
211
|
-
session = enterStep(session, targetStep.id, targetStep.description);
|
|
212
|
-
selectedStep = targetStep;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
} else if (session.currentFlow) {
|
|
216
|
-
const currentFlow = flows.find(f => f.id === session.currentFlow?.id);
|
|
217
|
-
if (currentFlow) {
|
|
218
|
-
selectedFlow = currentFlow;
|
|
219
|
-
const targetStep = currentFlow.getStep(stepTarget);
|
|
220
|
-
if (targetStep) {
|
|
221
|
-
session = enterStep(session, targetStep.id, targetStep.description);
|
|
222
|
-
selectedStep = targetStep;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
} else if (directive.complete) {
|
|
227
|
-
isFlowComplete = true;
|
|
228
|
-
} else if (directive.abort) {
|
|
229
|
-
// Abort — no flow, session cleared or marked
|
|
230
|
-
isFlowComplete = true;
|
|
231
|
-
} else if (directive.reset) {
|
|
232
|
-
if (session.currentFlow) {
|
|
233
|
-
const currentFlow = flows.find(f => f.id === session.currentFlow?.id);
|
|
234
|
-
if (currentFlow) {
|
|
235
|
-
selectedFlow = currentFlow;
|
|
236
|
-
const resetStep = typeof directive.reset === 'object' && directive.reset.step
|
|
237
|
-
? directive.reset.step
|
|
238
|
-
: undefined;
|
|
239
|
-
if (resetStep) {
|
|
240
|
-
const targetStep = currentFlow.getStep(resetStep);
|
|
241
|
-
if (targetStep) {
|
|
242
|
-
session = enterStep(session, targetStep.id, targetStep.description);
|
|
243
|
-
selectedStep = targetStep;
|
|
244
|
-
}
|
|
245
|
-
} else {
|
|
246
|
-
const initialStep = currentFlow.initialStep;
|
|
247
|
-
session = enterStep(session, initialStep.id, initialStep.description);
|
|
248
|
-
selectedStep = initialStep;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
return {
|
|
255
|
-
selectedFlow,
|
|
256
|
-
selectedStep,
|
|
257
|
-
session,
|
|
258
|
-
isFlowComplete,
|
|
259
|
-
signalFirings: signalResult.firings,
|
|
260
|
-
signalPreDirective: signalResult.mergedDirective || undefined,
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
}
|
|
@@ -1,404 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SignalEvaluator — Batched AI classifier + extraction for signals.
|
|
3
|
-
*
|
|
4
|
-
* Handles:
|
|
5
|
-
* - `evaluateIf`: code-first predicate evaluation (AND semantics, short-circuit)
|
|
6
|
-
* - `evaluateSignals`: single batched provider call for detection + extraction
|
|
7
|
-
* - `buildSignalClassifierPrompt` / `buildMergedSchema`: prompt & schema construction
|
|
8
|
-
*
|
|
9
|
-
* @module SignalEvaluator
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import type { AiProvider } from "../types/ai.js";
|
|
13
|
-
import type { Event } from "../types/history.js";
|
|
14
|
-
import type { SessionState } from "../types/session.js";
|
|
15
|
-
import type {
|
|
16
|
-
Signal,
|
|
17
|
-
SignalPredicate,
|
|
18
|
-
SignalPredicateContext,
|
|
19
|
-
} from "../types/signals.js";
|
|
20
|
-
import { eventsToHistory, logger } from "../utils/index.js";
|
|
21
|
-
import { splitWhenConditions, evaluateIfPredicates } from "../utils/condition.js";
|
|
22
|
-
|
|
23
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
24
|
-
// Types
|
|
25
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
26
|
-
|
|
27
|
-
export interface SignalEvaluationResult {
|
|
28
|
-
matched: boolean;
|
|
29
|
-
reason?: string;
|
|
30
|
-
extracted?: unknown;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface EvaluateSignalsParams<TContext = unknown, TData = unknown> {
|
|
34
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
35
|
-
signals: Signal<TContext, TData, any>[];
|
|
36
|
-
session: SessionState<TData>;
|
|
37
|
-
history: Event[];
|
|
38
|
-
context: TContext;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
42
|
-
// Prompt builder (exported for testing)
|
|
43
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Builds the classifier prompt for a batch of signals.
|
|
47
|
-
*
|
|
48
|
-
* Splits `when` entries with the shared ConditionWhen parser:
|
|
49
|
-
* - Positive entries → "TRIGGER WHEN (ANY matches)"
|
|
50
|
-
* - `!` entries → prefix stripped, "DO NOT TRIGGER WHEN (ANY inhibits)"
|
|
51
|
-
*
|
|
52
|
-
* Extraction schemas render under "WHEN MATCHED, EXTRACT".
|
|
53
|
-
* Unconditional + extract signals render under "ALWAYS EXTRACT".
|
|
54
|
-
*/
|
|
55
|
-
export function buildSignalClassifierPrompt<TContext = unknown, TData = unknown>(
|
|
56
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
57
|
-
signals: Signal<TContext, TData, any>[],
|
|
58
|
-
history: Event[],
|
|
59
|
-
_context: TContext,
|
|
60
|
-
): string {
|
|
61
|
-
const header = [
|
|
62
|
-
"You are evaluating signals for this conversation.",
|
|
63
|
-
"",
|
|
64
|
-
"For each signal, decide whether it matched based on the most recent user message AND the conversation context. Be conservative: only mark a signal matched when there is CLEAR, EXPLICIT evidence.",
|
|
65
|
-
"Positive TRIGGER WHEN entries are alternatives: ANY one positive entry can trigger the signal. DO NOT TRIGGER WHEN entries are exclusions: ANY one exclusion inhibits the signal.",
|
|
66
|
-
].join("\n");
|
|
67
|
-
|
|
68
|
-
const signalBlocks: string[] = [];
|
|
69
|
-
|
|
70
|
-
for (const signal of signals) {
|
|
71
|
-
const id = signal.id ?? "unknown";
|
|
72
|
-
const title = signal.title ?? id;
|
|
73
|
-
const lines: string[] = [];
|
|
74
|
-
|
|
75
|
-
// Header
|
|
76
|
-
lines.push(`- SIGNAL "${id}" | "${title}"`);
|
|
77
|
-
|
|
78
|
-
// Description
|
|
79
|
-
if (signal.description) {
|
|
80
|
-
lines.push(` DESCRIPTION: ${signal.description}`);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Split when entries
|
|
84
|
-
const whenConditions = splitWhenConditions(signal.when);
|
|
85
|
-
const positiveEntries = whenConditions.positive;
|
|
86
|
-
const negativeEntries = whenConditions.negative;
|
|
87
|
-
|
|
88
|
-
const isUnconditional = positiveEntries.length === 0 && negativeEntries.length === 0;
|
|
89
|
-
|
|
90
|
-
if (isUnconditional && signal.extract) {
|
|
91
|
-
// Unconditional + extract → ALWAYS EXTRACT
|
|
92
|
-
lines.push(` ALWAYS EXTRACT`);
|
|
93
|
-
} else if (positiveEntries.length > 0) {
|
|
94
|
-
lines.push(` TRIGGER WHEN (ANY matches):`);
|
|
95
|
-
for (const entry of positiveEntries) {
|
|
96
|
-
lines.push(` • ${entry}`);
|
|
97
|
-
}
|
|
98
|
-
} else if (negativeEntries.length > 0) {
|
|
99
|
-
lines.push(` TRIGGER WHEN: no positive condition; trigger unless an exclusion matches.`);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (negativeEntries.length > 0) {
|
|
103
|
-
lines.push(` DO NOT TRIGGER WHEN (ANY inhibits):`);
|
|
104
|
-
for (const entry of negativeEntries) {
|
|
105
|
-
lines.push(` • ${entry}`);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Extraction schema
|
|
110
|
-
if (signal.extract) {
|
|
111
|
-
lines.push(` WHEN MATCHED, EXTRACT:`);
|
|
112
|
-
const schemaLines = renderExtractionSchema(signal.extract);
|
|
113
|
-
for (const line of schemaLines) {
|
|
114
|
-
lines.push(` • ${line}`);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
signalBlocks.push(lines.join("\n"));
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Render conversation history
|
|
122
|
-
const historySection = renderHistoryForClassifier(history);
|
|
123
|
-
|
|
124
|
-
const outputInstructions = [
|
|
125
|
-
"# OUTPUT",
|
|
126
|
-
"For each signal, return:",
|
|
127
|
-
" { id, matched, reason (required when matched=true) }",
|
|
128
|
-
" + extracted fields (when signal defines extraction and matched=true)",
|
|
129
|
-
].join("\n");
|
|
130
|
-
|
|
131
|
-
return [
|
|
132
|
-
header,
|
|
133
|
-
"",
|
|
134
|
-
"# SIGNALS",
|
|
135
|
-
"",
|
|
136
|
-
signalBlocks.join("\n\n"),
|
|
137
|
-
"",
|
|
138
|
-
historySection,
|
|
139
|
-
"",
|
|
140
|
-
outputInstructions,
|
|
141
|
-
].join("\n");
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
145
|
-
// Schema builder (exported for testing)
|
|
146
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Builds the merged JSON schema for the classifier response.
|
|
150
|
-
*
|
|
151
|
-
* Shape: `{ signals: [{ id, matched, reason?, extracted? }, ...] }`
|
|
152
|
-
* where `extracted` is only present for signals with `extract` set.
|
|
153
|
-
*/
|
|
154
|
-
export function buildMergedSchema<TContext = unknown, TData = unknown>(
|
|
155
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
156
|
-
signals: Signal<TContext, TData, any>[],
|
|
157
|
-
): Record<string, unknown> {
|
|
158
|
-
const signalEntrySchemas = signals.map(signal => {
|
|
159
|
-
const entry: Record<string, unknown> = {
|
|
160
|
-
type: "object",
|
|
161
|
-
properties: {
|
|
162
|
-
id: { type: "string", description: "Signal identifier" },
|
|
163
|
-
matched: { type: "boolean", description: "Whether the signal matched" },
|
|
164
|
-
reason: { type: "string", description: "Reason for the match (required when matched=true)" },
|
|
165
|
-
},
|
|
166
|
-
required: ["id", "matched"],
|
|
167
|
-
additionalProperties: false,
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
// Add extracted field only when signal has extract schema
|
|
171
|
-
if (signal.extract) {
|
|
172
|
-
(entry.properties as Record<string, unknown>).extracted = signal.extract;
|
|
173
|
-
entry.additionalProperties = false;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
return entry;
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
return {
|
|
180
|
-
type: "object",
|
|
181
|
-
properties: {
|
|
182
|
-
signals: {
|
|
183
|
-
type: "array",
|
|
184
|
-
items: {
|
|
185
|
-
anyOf: signalEntrySchemas,
|
|
186
|
-
},
|
|
187
|
-
description: "Evaluation results for each signal",
|
|
188
|
-
},
|
|
189
|
-
},
|
|
190
|
-
required: ["signals"],
|
|
191
|
-
additionalProperties: false,
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
196
|
-
// SignalEvaluator class
|
|
197
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
198
|
-
|
|
199
|
-
export class SignalEvaluator<TContext = unknown, TData = unknown> {
|
|
200
|
-
constructor(private readonly provider: AiProvider) { }
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Code-first predicate evaluation with AND semantics and short-circuit.
|
|
204
|
-
*
|
|
205
|
-
* Normalizes predicates to an array. Awaits each; returns false on first
|
|
206
|
-
* falsy result. Catches throws/rejections, logs at ERROR with predicate
|
|
207
|
-
* index, and returns false (signal treated as non-match).
|
|
208
|
-
*/
|
|
209
|
-
async evaluateIf(
|
|
210
|
-
predicates: SignalPredicate<TContext, TData> | SignalPredicate<TContext, TData>[],
|
|
211
|
-
ctx: SignalPredicateContext<TContext, TData>,
|
|
212
|
-
): Promise<boolean> {
|
|
213
|
-
return evaluateIfPredicates<SignalPredicateContext<TContext, TData>>(
|
|
214
|
-
predicates, ctx, "Signals"
|
|
215
|
-
);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Batched AI classifier + extraction call (Algorithm 3).
|
|
220
|
-
*
|
|
221
|
-
* Builds the classifier prompt and merged schema, makes a single provider
|
|
222
|
-
* call, and parses the response into an id → result map. Any signal absent
|
|
223
|
-
* from the response defaults to `{ matched: false }`. Provider errors are
|
|
224
|
-
* caught and logged; all signals default to non-match.
|
|
225
|
-
*/
|
|
226
|
-
async evaluateSignals(
|
|
227
|
-
params: EvaluateSignalsParams<TContext, TData>,
|
|
228
|
-
): Promise<Record<string, SignalEvaluationResult>> {
|
|
229
|
-
const { signals, history, context } = params;
|
|
230
|
-
|
|
231
|
-
// Build prompt and schema
|
|
232
|
-
const prompt = buildSignalClassifierPrompt(signals, history, context);
|
|
233
|
-
const jsonSchema = buildMergedSchema(signals);
|
|
234
|
-
|
|
235
|
-
try {
|
|
236
|
-
const response = await this.provider.generateMessage<TContext, { signals: Array<{ id: string; matched: boolean; reason?: string; extracted?: unknown }> }>({
|
|
237
|
-
prompt,
|
|
238
|
-
history: eventsToHistory(history),
|
|
239
|
-
context,
|
|
240
|
-
parameters: {
|
|
241
|
-
jsonSchema,
|
|
242
|
-
schemaName: "signal_evaluation",
|
|
243
|
-
},
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
// Parse response into id → result map
|
|
247
|
-
const results: Record<string, SignalEvaluationResult> = {};
|
|
248
|
-
const entries = response.structured?.signals ?? [];
|
|
249
|
-
|
|
250
|
-
for (const entry of entries) {
|
|
251
|
-
results[entry.id] = {
|
|
252
|
-
matched: entry.matched,
|
|
253
|
-
reason: entry.matched ? entry.reason : undefined,
|
|
254
|
-
extracted: entry.matched ? entry.extracted : undefined,
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// Defensive defaults: any signal absent from the response → matched: false
|
|
259
|
-
for (const signal of signals) {
|
|
260
|
-
const id = signal.id ?? "unknown";
|
|
261
|
-
if (!results[id]) {
|
|
262
|
-
results[id] = { matched: false };
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
return results;
|
|
267
|
-
} catch (error) {
|
|
268
|
-
logger.error(
|
|
269
|
-
`[Signals] Classifier call failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
270
|
-
);
|
|
271
|
-
|
|
272
|
-
// On provider error, all signals default to non-match
|
|
273
|
-
const results: Record<string, SignalEvaluationResult> = {};
|
|
274
|
-
for (const signal of signals) {
|
|
275
|
-
const id = signal.id ?? "unknown";
|
|
276
|
-
results[id] = { matched: false };
|
|
277
|
-
}
|
|
278
|
-
return results;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Parallel batched evaluation. Splits signals into batches of `batchSize`,
|
|
284
|
-
* evaluates each batch via `evaluateSignals` in parallel using `Promise.all`,
|
|
285
|
-
* and merges all result maps into a single record.
|
|
286
|
-
*
|
|
287
|
-
* No key collisions because signal ids are unique within a phase.
|
|
288
|
-
*/
|
|
289
|
-
async evaluateSignalsBatched(params: {
|
|
290
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
291
|
-
signals: Signal<TContext, TData, any>[];
|
|
292
|
-
batchSize?: number;
|
|
293
|
-
session: SessionState<TData>;
|
|
294
|
-
history: Event[];
|
|
295
|
-
context: TContext;
|
|
296
|
-
}): Promise<Record<string, SignalEvaluationResult>> {
|
|
297
|
-
const { signals, batchSize = 10, session, history, context } = params;
|
|
298
|
-
|
|
299
|
-
if (signals.length === 0) return {};
|
|
300
|
-
|
|
301
|
-
const batches = splitIntoBatches(signals, batchSize);
|
|
302
|
-
|
|
303
|
-
const batchResults = await Promise.all(
|
|
304
|
-
batches.map(batch =>
|
|
305
|
-
this.evaluateSignals({ signals: batch, session, history, context }),
|
|
306
|
-
),
|
|
307
|
-
);
|
|
308
|
-
|
|
309
|
-
// Merge all batch result maps into a single record
|
|
310
|
-
const merged: Record<string, SignalEvaluationResult> = {};
|
|
311
|
-
for (const result of batchResults) {
|
|
312
|
-
Object.assign(merged, result);
|
|
313
|
-
}
|
|
314
|
-
return merged;
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
319
|
-
// Batch helper (exported for testing)
|
|
320
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
321
|
-
|
|
322
|
-
/**
|
|
323
|
-
* Splits an array into fixed-size chunks.
|
|
324
|
-
*
|
|
325
|
-
* Returns an array of sub-arrays, each of at most `batchSize` elements.
|
|
326
|
-
* The last chunk may be shorter. Returns an empty array when `items` is empty.
|
|
327
|
-
*/
|
|
328
|
-
export function splitIntoBatches<T>(items: T[], batchSize: number): T[][] {
|
|
329
|
-
if (items.length === 0) return [];
|
|
330
|
-
|
|
331
|
-
const batches: T[][] = [];
|
|
332
|
-
for (let i = 0; i < items.length; i += batchSize) {
|
|
333
|
-
batches.push(items.slice(i, i + batchSize));
|
|
334
|
-
}
|
|
335
|
-
return batches;
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
339
|
-
// Internal helpers
|
|
340
|
-
// ──────────────────────────────────────────────────────────────────────────────
|
|
341
|
-
|
|
342
|
-
/**
|
|
343
|
-
* Render extraction schema properties as human-readable lines for the prompt.
|
|
344
|
-
* Lists each property's name, type, and constraints (enum, min/max, format).
|
|
345
|
-
*/
|
|
346
|
-
function renderExtractionSchema(schema: Record<string, unknown>): string[] {
|
|
347
|
-
const lines: string[] = [];
|
|
348
|
-
const properties = schema.properties as Record<string, Record<string, unknown>> | undefined;
|
|
349
|
-
|
|
350
|
-
if (!properties) return lines;
|
|
351
|
-
|
|
352
|
-
for (const [name, fieldSchema] of Object.entries(properties)) {
|
|
353
|
-
if (!fieldSchema || typeof fieldSchema !== "object") continue;
|
|
354
|
-
|
|
355
|
-
const type = (fieldSchema.type as string) ?? "unknown";
|
|
356
|
-
let line = `${name} (${type})`;
|
|
357
|
-
|
|
358
|
-
// Add constraints
|
|
359
|
-
const constraints: string[] = [];
|
|
360
|
-
|
|
361
|
-
if (fieldSchema.enum && Array.isArray(fieldSchema.enum)) {
|
|
362
|
-
constraints.push((fieldSchema.enum as string[]).join("|"));
|
|
363
|
-
}
|
|
364
|
-
if (fieldSchema.minimum !== undefined || fieldSchema.maximum !== undefined) {
|
|
365
|
-
const min = fieldSchema.minimum !== undefined ? `${fieldSchema.minimum as number}` : "";
|
|
366
|
-
const max = fieldSchema.maximum !== undefined ? `${fieldSchema.maximum as number}` : "";
|
|
367
|
-
constraints.push(`${min}-${max}`);
|
|
368
|
-
}
|
|
369
|
-
if (fieldSchema.format) {
|
|
370
|
-
constraints.push(fieldSchema.format as string);
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
if (constraints.length > 0) {
|
|
374
|
-
line += `, ${constraints.join(", ")}`;
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
// Add description
|
|
378
|
-
if (fieldSchema.description) {
|
|
379
|
-
line += `: ${fieldSchema.description as string}`;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
lines.push(line);
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
return lines;
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
/**
|
|
389
|
-
* Render conversation history into a simple text block for the classifier prompt.
|
|
390
|
-
*/
|
|
391
|
-
function renderHistoryForClassifier(history: Event[]): string {
|
|
392
|
-
if (history.length === 0) return "# CONVERSATION HISTORY\n(empty)";
|
|
393
|
-
|
|
394
|
-
const lines: string[] = ["# CONVERSATION HISTORY"];
|
|
395
|
-
for (const event of history) {
|
|
396
|
-
const source = event.source ?? "unknown";
|
|
397
|
-
const data = event.data as { message?: string } | undefined;
|
|
398
|
-
const message = data?.message ?? "";
|
|
399
|
-
if (message) {
|
|
400
|
-
lines.push(`${source}: ${message}`);
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
return lines.join("\n");
|
|
404
|
-
}
|