@falai/agent 3.4.5 → 4.0.0-alpha.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 +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 +1 -1
- 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/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 +1 -1
- 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/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 +36 -8
- 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
|
@@ -0,0 +1,712 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FlowSpec: a Flow as JSON, and the checks that make a stored flow safe to run.
|
|
3
|
+
*
|
|
4
|
+
* Stored flows, flows an editor saves and flows an LLM generates are all
|
|
5
|
+
* FlowSpecs: the same object as `Flow` with a flat step that carries a `kind`
|
|
6
|
+
* and predicates only in their JSON form (`ConditionSpec`). No functions
|
|
7
|
+
* anywhere, so it survives `JSON.stringify`.
|
|
8
|
+
*
|
|
9
|
+
* Kind rule: a talk step is `collect` whenever it has a `collect` list, with
|
|
10
|
+
* or without a `prompt` beside it; it is `prompt` when it has a guideline
|
|
11
|
+
* alone. A wait with a duration is `wait`; a wait on an event is `waitEvent`.
|
|
12
|
+
*
|
|
13
|
+
* `fromSpec` treats `null` as absent for every optional value, because the
|
|
14
|
+
* generation schema (`flowSpecSchema`) says null where the type says optional.
|
|
15
|
+
* `toSpec` never writes null, so `toSpec(fromSpec(spec))` is the spec with its
|
|
16
|
+
* nulls dropped, and the identity on a spec that had none.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { AgentOptions } from "../types/agent.js";
|
|
20
|
+
import { FlowConfigurationError } from "../types/errors.js";
|
|
21
|
+
import type {
|
|
22
|
+
Branch,
|
|
23
|
+
ConditionSpec,
|
|
24
|
+
DoStep,
|
|
25
|
+
Duration,
|
|
26
|
+
FieldDefs,
|
|
27
|
+
Flow,
|
|
28
|
+
InferData,
|
|
29
|
+
Instruction,
|
|
30
|
+
Next,
|
|
31
|
+
ParamDef,
|
|
32
|
+
ParamDefs,
|
|
33
|
+
Pred,
|
|
34
|
+
Repeat,
|
|
35
|
+
SayStep,
|
|
36
|
+
ScalarDef,
|
|
37
|
+
Step,
|
|
38
|
+
StepBase,
|
|
39
|
+
Template,
|
|
40
|
+
Trigger,
|
|
41
|
+
WaitEventStep,
|
|
42
|
+
WaitStep,
|
|
43
|
+
} from "../types/flow.js";
|
|
44
|
+
import type { StructuredSchema } from "../types/schema.js";
|
|
45
|
+
import { isDuration } from "../utils/duration.js";
|
|
46
|
+
import { toWireSchema } from "../utils/schema.js";
|
|
47
|
+
|
|
48
|
+
// ── The JSON form ───────────────────────────────────────────────────────
|
|
49
|
+
|
|
50
|
+
/** The collected-data type of a toolkit without bound fields: slugs are plain strings. */
|
|
51
|
+
type LooseData = InferData<FieldDefs>;
|
|
52
|
+
|
|
53
|
+
export type StepKind = "prompt" | "collect" | "say" | "do" | "wait" | "waitEvent" | "if";
|
|
54
|
+
|
|
55
|
+
export type BranchSpec = { then: Next<LooseData> } & ({ when: string } | { if: ConditionSpec<LooseData> });
|
|
56
|
+
|
|
57
|
+
export type InstructionSpec = Omit<Instruction, "if"> & { if?: ConditionSpec<LooseData> };
|
|
58
|
+
|
|
59
|
+
/** A trigger with its `if` in JSON form. Same shape as `Trigger` otherwise. */
|
|
60
|
+
export type TriggerSpec = { repeat?: Repeat } & (
|
|
61
|
+
| { message: string[]; if?: ConditionSpec<LooseData> }
|
|
62
|
+
| { mention: string[]; extract?: ParamDefs; if?: ConditionSpec<LooseData> }
|
|
63
|
+
| { silence: Duration; if?: ConditionSpec<LooseData>; businessHours?: boolean }
|
|
64
|
+
| { event: string; if?: ConditionSpec<LooseData>; after?: Duration; businessHours?: boolean }
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
interface TalkSpecExtras {
|
|
68
|
+
ask?: Partial<Record<string, string>>;
|
|
69
|
+
maxAsks?: number;
|
|
70
|
+
branches?: BranchSpec[];
|
|
71
|
+
tools?: string[];
|
|
72
|
+
instructions?: InstructionSpec[];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** A flat step: `kind` plus the kind's own properties. */
|
|
76
|
+
export type StepSpec = StepBase<LooseData> &
|
|
77
|
+
(
|
|
78
|
+
| ({ kind: "prompt"; prompt: Template; collect?: undefined } & TalkSpecExtras)
|
|
79
|
+
| ({ kind: "collect"; collect: string[]; prompt?: Template } & TalkSpecExtras)
|
|
80
|
+
| ({ kind: "say" } & SayStep)
|
|
81
|
+
| ({ kind: "do" } & DoStep<LooseData>)
|
|
82
|
+
| { kind: "wait"; wait: Duration; businessHours?: boolean; else?: Next<LooseData>; branches?: BranchSpec[] }
|
|
83
|
+
| ({ kind: "waitEvent" } & WaitEventStep<LooseData>)
|
|
84
|
+
| { kind: "if"; if: ConditionSpec<LooseData>; else?: Next<LooseData> }
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
export interface FlowSpec {
|
|
88
|
+
id: string;
|
|
89
|
+
name: string;
|
|
90
|
+
description?: string;
|
|
91
|
+
on?: TriggerSpec[];
|
|
92
|
+
anchor?: string;
|
|
93
|
+
while?: ConditionSpec<LooseData>;
|
|
94
|
+
clearOnStart?: string[];
|
|
95
|
+
steps: StepSpec[];
|
|
96
|
+
onEnd?: "end" | "stay" | "reset";
|
|
97
|
+
instructions?: InstructionSpec[];
|
|
98
|
+
tools?: string[];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** What a flow's names resolve against: the agent's fields, actions, events, conditions and tools. */
|
|
102
|
+
export type Registries = Pick<AgentOptions, "fields" | "actions" | "events" | "conditions" | "tools">;
|
|
103
|
+
|
|
104
|
+
// ── fromSpec / toSpec ───────────────────────────────────────────────────
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* A spec as a typed flow. The slugs and names inside a spec are strings from
|
|
108
|
+
* storage, so the result is typed by claim: `validateFlow` (which the agent
|
|
109
|
+
* runs on every flow it is built with) is what makes the claim true. The
|
|
110
|
+
* bound toolkit's `f.fromSpec(spec)` fills `C` and `D` in.
|
|
111
|
+
*/
|
|
112
|
+
export function fromSpec<C = unknown, D = LooseData>(spec: FlowSpec): Flow<C, D> {
|
|
113
|
+
const clean = stripNulls(spec);
|
|
114
|
+
if (!Array.isArray(clean.steps)) {
|
|
115
|
+
throw problem(`flow "${clean.id}"`, "has no steps list", "Write steps as a list, even an empty one.");
|
|
116
|
+
}
|
|
117
|
+
const { steps, ...rest } = clean;
|
|
118
|
+
const flow: Flow<unknown, LooseData> = { ...rest, steps: steps.map(fromStepSpec) };
|
|
119
|
+
return flow as Flow<C, D>;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function fromStepSpec(step: StepSpec): Step<unknown, LooseData> {
|
|
123
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- `kind` is the one property the Flow form drops
|
|
124
|
+
const { kind, ...body } = step;
|
|
125
|
+
return body;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Throws `FlowConfigurationError` when the flow carries a function predicate: it cannot be stored. */
|
|
129
|
+
export function toSpec<C, D extends LooseData>(flow: Flow<C, D>): FlowSpec {
|
|
130
|
+
const at = (where: string) => `flow "${flow.id}", ${where}`;
|
|
131
|
+
return compact<FlowSpec>({
|
|
132
|
+
id: flow.id,
|
|
133
|
+
name: flow.name,
|
|
134
|
+
description: flow.description,
|
|
135
|
+
on: flow.on?.map((trigger, i) => triggerToSpec(trigger, at(`trigger #${i + 1}`))),
|
|
136
|
+
anchor: flow.anchor,
|
|
137
|
+
while: jsonPred(flow.while, at("while")),
|
|
138
|
+
clearOnStart: flow.clearOnStart,
|
|
139
|
+
steps: flow.steps.map((step) => stepToSpec(step, at(`step "${step.id}"`))),
|
|
140
|
+
onEnd: flow.onEnd,
|
|
141
|
+
instructions: flow.instructions?.map((ins, i) => instructionToSpec(ins, at(`instructions[${i}]`))),
|
|
142
|
+
tools: flow.tools,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function triggerToSpec<C, D extends LooseData>(trigger: Trigger<C, D>, at: string): TriggerSpec {
|
|
147
|
+
return compact<TriggerSpec>({ ...trigger, if: jsonPred(trigger.if, `${at} if`) });
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function instructionToSpec<C, D extends LooseData>(ins: Instruction<C, D>, at: string): InstructionSpec {
|
|
151
|
+
return compact<InstructionSpec>({ ...ins, if: jsonPred(ins.if, `${at}.if`) });
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function branchesToSpec<C, D extends LooseData>(branches: Branch<C, D>[] | undefined, at: string): BranchSpec[] | undefined {
|
|
155
|
+
return branches?.map((branch, i) =>
|
|
156
|
+
"if" in branch ? { ...branch, if: jsonPredRequired(branch.if, `${at} branches[${i}].if`) } : branch,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function stepToSpec<C, D extends LooseData>(step: Step<C, D>, at: string): StepSpec {
|
|
161
|
+
const base = { id: step.id, label: step.label, then: step.then, ui: step.ui };
|
|
162
|
+
if ("say" in step) {
|
|
163
|
+
return compact<StepSpec>({ ...base, kind: "say", say: step.say, media: step.media, once: step.once });
|
|
164
|
+
}
|
|
165
|
+
if ("do" in step) {
|
|
166
|
+
return compact<StepSpec>({ ...base, kind: "do", do: step.do, with: step.with, onFail: step.onFail });
|
|
167
|
+
}
|
|
168
|
+
if ("wait" in step) {
|
|
169
|
+
return isTimedWait(step)
|
|
170
|
+
? compact<StepSpec>({
|
|
171
|
+
...base,
|
|
172
|
+
kind: "wait",
|
|
173
|
+
wait: step.wait,
|
|
174
|
+
businessHours: step.businessHours,
|
|
175
|
+
else: step.else,
|
|
176
|
+
branches: branchesToSpec(step.branches, at),
|
|
177
|
+
})
|
|
178
|
+
: compact<StepSpec>({ ...base, kind: "waitEvent", wait: step.wait, else: step.else });
|
|
179
|
+
}
|
|
180
|
+
if ("if" in step) {
|
|
181
|
+
return compact<StepSpec>({ ...base, kind: "if", if: jsonPredRequired(step.if, `${at} if`), else: step.else });
|
|
182
|
+
}
|
|
183
|
+
const talk = {
|
|
184
|
+
ask: step.ask,
|
|
185
|
+
maxAsks: step.maxAsks,
|
|
186
|
+
branches: branchesToSpec(step.branches, at),
|
|
187
|
+
tools: step.tools,
|
|
188
|
+
instructions: step.instructions?.map((ins, i) => instructionToSpec(ins, `${at} instructions[${i}]`)),
|
|
189
|
+
};
|
|
190
|
+
if (step.collect !== undefined) {
|
|
191
|
+
return compact<StepSpec>({ ...base, kind: "collect", collect: step.collect, prompt: step.prompt, ...talk });
|
|
192
|
+
}
|
|
193
|
+
if (step.prompt === undefined) {
|
|
194
|
+
throw problem(at, "has neither prompt nor collect", "A talk step needs a guideline, fields to collect, or both.");
|
|
195
|
+
}
|
|
196
|
+
return compact<StepSpec>({ ...base, kind: "prompt", prompt: step.prompt, ...talk });
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** `typeof step.wait` alone does not narrow the union for tsc; this does. */
|
|
200
|
+
function isTimedWait<C, D>(
|
|
201
|
+
step: StepBase<D> & (WaitStep<C, D> | WaitEventStep<D>),
|
|
202
|
+
): step is StepBase<D> & WaitStep<C, D> {
|
|
203
|
+
return typeof step.wait === "string";
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function jsonPred<C, D extends LooseData>(pred: Pred<C, D> | undefined, at: string): ConditionSpec<LooseData> | undefined {
|
|
207
|
+
return pred === undefined ? undefined : jsonPredRequired(pred, at);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function jsonPredRequired<C, D extends LooseData>(pred: Pred<C, D>, at: string): ConditionSpec<LooseData> {
|
|
211
|
+
if (typeof pred === "function") {
|
|
212
|
+
throw problem(
|
|
213
|
+
at,
|
|
214
|
+
"is a function, which cannot be stored as JSON",
|
|
215
|
+
"Write it as a condition ({ equals }, { known }, { silenced } or a named condition) to store this flow.",
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
return pred;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// ── validateFlow ────────────────────────────────────────────────────────
|
|
222
|
+
|
|
223
|
+
/** A read-only view that a typed Flow and a spec-derived Flow both fit; the validator only reads. */
|
|
224
|
+
// A typed flow's ConditionSpec<D> and a spec's JSON both read as a name → argument map here.
|
|
225
|
+
type LoosePred = ((ctx: never) => boolean) | Record<string, unknown>;
|
|
226
|
+
interface LooseBranch {
|
|
227
|
+
then: Next<LooseData>;
|
|
228
|
+
when?: string;
|
|
229
|
+
if?: LoosePred;
|
|
230
|
+
}
|
|
231
|
+
interface LooseInstruction {
|
|
232
|
+
if?: LoosePred;
|
|
233
|
+
}
|
|
234
|
+
interface LooseTrigger {
|
|
235
|
+
repeat?: Repeat;
|
|
236
|
+
event?: string;
|
|
237
|
+
silence?: Duration;
|
|
238
|
+
after?: Duration;
|
|
239
|
+
if?: LoosePred;
|
|
240
|
+
}
|
|
241
|
+
interface LooseStep {
|
|
242
|
+
id: string;
|
|
243
|
+
then?: Next<LooseData>;
|
|
244
|
+
else?: Next<LooseData>;
|
|
245
|
+
onFail?: Next<LooseData>;
|
|
246
|
+
prompt?: Template;
|
|
247
|
+
collect?: string[];
|
|
248
|
+
ask?: Partial<Record<string, string>>;
|
|
249
|
+
branches?: LooseBranch[];
|
|
250
|
+
instructions?: LooseInstruction[];
|
|
251
|
+
do?: string;
|
|
252
|
+
with?: Record<string, unknown>;
|
|
253
|
+
wait?: Duration | { event: string; upTo?: Duration };
|
|
254
|
+
if?: LoosePred;
|
|
255
|
+
tools?: string[];
|
|
256
|
+
}
|
|
257
|
+
interface LooseFlow {
|
|
258
|
+
id: string;
|
|
259
|
+
on?: LooseTrigger[];
|
|
260
|
+
while?: LoosePred;
|
|
261
|
+
clearOnStart?: string[];
|
|
262
|
+
steps: LooseStep[];
|
|
263
|
+
instructions?: LooseInstruction[];
|
|
264
|
+
tools?: string[];
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const BUILT_IN_CONDITIONS = ["equals", "known", "silenced"];
|
|
268
|
+
|
|
269
|
+
const DURATION_HINT = 'Write a number and a unit: "30s", "5m", "24h" or "3d".';
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Check a flow, typed or as a spec, against the agent's registries. Throws
|
|
273
|
+
* `FlowConfigurationError` on the first problem that would break at runtime;
|
|
274
|
+
* returns warnings for what runs but probably not as intended.
|
|
275
|
+
*/
|
|
276
|
+
export function validateFlow<C = unknown, D = LooseData>(
|
|
277
|
+
input: Flow<C, D> | FlowSpec,
|
|
278
|
+
registries: Registries,
|
|
279
|
+
): { warnings: string[] } {
|
|
280
|
+
// Nulls mean "not set" in a spec; a typed flow has none, so one pass serves both forms.
|
|
281
|
+
const flow: LooseFlow = stripNulls(input);
|
|
282
|
+
const { fields, actions = {}, events = {}, conditions = {}, tools = [] } = registries;
|
|
283
|
+
const toolIds = new Set(tools.map((tool) => tool.id));
|
|
284
|
+
const warnings: string[] = [];
|
|
285
|
+
|
|
286
|
+
if (typeof flow.id !== "string" || flow.id === "") {
|
|
287
|
+
throw problem("flow", "has no id", "Give the flow a short unique id.");
|
|
288
|
+
}
|
|
289
|
+
const flowAt = `flow "${flow.id}"`;
|
|
290
|
+
if (!Array.isArray(flow.steps)) {
|
|
291
|
+
throw problem(flowAt, "has no steps list", "Write steps as a list, even an empty one.");
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const index = new Map<string, number>();
|
|
295
|
+
flow.steps.forEach((step, i) => {
|
|
296
|
+
if (typeof step.id !== "string" || step.id === "") {
|
|
297
|
+
throw problem(`${flowAt}, step #${i + 1}`, "has no id", "Give every step a unique id.");
|
|
298
|
+
}
|
|
299
|
+
if (step.id === "end") {
|
|
300
|
+
throw problem(`${flowAt}, step "end"`, 'uses the reserved id "end"', '"end" ends the run; pick another id.');
|
|
301
|
+
}
|
|
302
|
+
if (index.has(step.id)) {
|
|
303
|
+
throw problem(`${flowAt}, step "${step.id}"`, "duplicates an earlier step id", "Give each step its own id.");
|
|
304
|
+
}
|
|
305
|
+
index.set(step.id, i);
|
|
306
|
+
});
|
|
307
|
+
if (flow.on?.length && flow.steps.length === 0) {
|
|
308
|
+
throw problem(flowAt, "has triggers but no steps", "Add at least one step or remove `on`.");
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const slug = (name: string, at: string, where: string): void => {
|
|
312
|
+
if (!own(fields, name)) {
|
|
313
|
+
throw problem(at, `unknown field "${name}" in ${where}`, "Add it to the agent's fields or fix the slug.");
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
const toolNames = (names: string[] | undefined, at: string): void => {
|
|
318
|
+
for (const name of names ?? []) {
|
|
319
|
+
if (!toolIds.has(name)) throw problem(at, `unknown tool "${name}"`, "Register it in the agent's tools or fix the name.");
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
const pred = (value: LoosePred | undefined, at: string, where: string): void => {
|
|
324
|
+
if (value === undefined || typeof value === "function") return;
|
|
325
|
+
for (const [name, arg] of Object.entries(value)) {
|
|
326
|
+
if (name === "equals") {
|
|
327
|
+
if (arg === null || typeof arg !== "object" || Array.isArray(arg)) {
|
|
328
|
+
throw problem(at, `${where}.equals is not an object`, "Write equals as { field: value }.");
|
|
329
|
+
}
|
|
330
|
+
for (const [field, given] of Object.entries(arg)) {
|
|
331
|
+
slug(field, at, `${where}.equals`);
|
|
332
|
+
const def = fields[field];
|
|
333
|
+
if (!matches(def, given)) {
|
|
334
|
+
throw problem(
|
|
335
|
+
at,
|
|
336
|
+
`${where}.equals gives "${field}" a ${describe(given)}, but the field is a ${def.type}`,
|
|
337
|
+
`Write a ${def.type}; values are not coerced.`,
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
} else if (name === "known") {
|
|
342
|
+
if (!Array.isArray(arg)) throw problem(at, `${where}.known is not a list`, "Write known as [field, ...].");
|
|
343
|
+
for (const field of arg) slug(String(field), at, `${where}.known`);
|
|
344
|
+
} else if (name === "silenced") {
|
|
345
|
+
if (typeof arg !== "boolean") throw problem(at, `${where}.silenced is not a boolean`, "Write true or false.");
|
|
346
|
+
} else if (!own(conditions, name)) {
|
|
347
|
+
throw problem(
|
|
348
|
+
at,
|
|
349
|
+
`unknown condition "${name}" in ${where}`,
|
|
350
|
+
`Register it in conditions or use ${BUILT_IN_CONDITIONS.join(", ")}.`,
|
|
351
|
+
);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
const duration = (value: string | undefined, at: string, where: string): void => {
|
|
357
|
+
if (value !== undefined && !isDuration(value)) {
|
|
358
|
+
throw problem(at, `${where} has duration "${value}", which does not parse`, DURATION_HINT);
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
/** The step index a `Next` lands on; `'end'` and `{ flow }` land nowhere. */
|
|
363
|
+
const target = (next: Next<LooseData>, at: string, where: string): number | undefined => {
|
|
364
|
+
if (typeof next === "string") {
|
|
365
|
+
if (next === "end") return undefined;
|
|
366
|
+
const to = index.get(next);
|
|
367
|
+
if (to === undefined) {
|
|
368
|
+
throw problem(at, `${where} points at step "${next}", which does not exist`, 'Use an existing step id or "end".');
|
|
369
|
+
}
|
|
370
|
+
return to;
|
|
371
|
+
}
|
|
372
|
+
if ("flow" in next) return undefined;
|
|
373
|
+
const to = index.get(next.step);
|
|
374
|
+
if (to === undefined) {
|
|
375
|
+
throw problem(at, `${where} points at step "${next.step}", which does not exist`, 'Use an existing step id or "end".');
|
|
376
|
+
}
|
|
377
|
+
for (const field of next.clear ?? []) slug(field, at, `${where}.clear`);
|
|
378
|
+
return to;
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
/** `target`, warning when the edge goes backward without clearing anything. */
|
|
382
|
+
const edge = (from: number, next: Next<LooseData> | undefined, at: string, where: string): number | undefined => {
|
|
383
|
+
if (next === undefined) return undefined;
|
|
384
|
+
const to = target(next, at, where);
|
|
385
|
+
const clears = typeof next !== "string" && "clear" in next && (next.clear?.length ?? 0) > 0;
|
|
386
|
+
if (to !== undefined && to <= from && !clears) {
|
|
387
|
+
warnings.push(
|
|
388
|
+
`${at}: ${where} jumps back to "${flow.steps[to].id}" without clear; the fields collected since stay known ` +
|
|
389
|
+
"and those steps skip. Add clear: [...] to re-ask them.",
|
|
390
|
+
);
|
|
391
|
+
}
|
|
392
|
+
return to;
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
const checkWith = (at: string, name: string, params: ParamDefs, given: Record<string, unknown> = {}): void => {
|
|
396
|
+
for (const [param, def] of Object.entries(params)) {
|
|
397
|
+
const value = given[param];
|
|
398
|
+
if (value === undefined) {
|
|
399
|
+
if (!def.optional) throw problem(at, `action "${name}" needs parameter "${param}"`, "Add it to `with`.");
|
|
400
|
+
continue;
|
|
401
|
+
}
|
|
402
|
+
if (!matchesParam(def, value)) {
|
|
403
|
+
throw problem(
|
|
404
|
+
at,
|
|
405
|
+
`parameter "${param}" of action "${name}" must be ${describeDef(def)}, got ${describe(value)}`,
|
|
406
|
+
"Values are not coerced; write the right type.",
|
|
407
|
+
);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
for (const param of Object.keys(given)) {
|
|
411
|
+
if (!own(params, param)) {
|
|
412
|
+
throw problem(at, `action "${name}" has no parameter "${param}"`, "Remove it or fix the name.");
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
for (const field of flow.clearOnStart ?? []) slug(field, flowAt, "clearOnStart");
|
|
418
|
+
pred(flow.while, flowAt, "while");
|
|
419
|
+
toolNames(flow.tools, flowAt);
|
|
420
|
+
flow.instructions?.forEach((ins, i) => pred(ins.if, flowAt, `instructions[${i}].if`));
|
|
421
|
+
|
|
422
|
+
flow.on?.forEach((trigger, i) => {
|
|
423
|
+
const at = `${flowAt}, trigger #${i + 1}`;
|
|
424
|
+
if (trigger.event !== undefined && !own(events, trigger.event)) {
|
|
425
|
+
throw problem(at, `unknown event "${trigger.event}"`, "Register it in events or fix the name.");
|
|
426
|
+
}
|
|
427
|
+
duration(trigger.silence, at, "silence");
|
|
428
|
+
duration(trigger.after, at, "after");
|
|
429
|
+
if (typeof trigger.repeat === "object") duration(trigger.repeat.cooldown, at, "repeat.cooldown");
|
|
430
|
+
pred(trigger.if, at, "if");
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
flow.steps.forEach((step, i) => {
|
|
434
|
+
const at = `${flowAt}, step "${step.id}"`;
|
|
435
|
+
const thenTo = edge(i, step.then, at, "then");
|
|
436
|
+
edge(i, step.else, at, "else");
|
|
437
|
+
|
|
438
|
+
if (step.collect !== undefined || step.prompt !== undefined) {
|
|
439
|
+
for (const field of step.collect ?? []) slug(field, at, "collect");
|
|
440
|
+
for (const field of Object.keys(step.ask ?? {})) slug(field, at, "ask");
|
|
441
|
+
const fields_ = step.collect ?? [];
|
|
442
|
+
if (step.prompt === undefined && fields_.length > 0 && fields_.every((f) => !step.ask?.[f] && !fields[f].ask)) {
|
|
443
|
+
warnings.push(
|
|
444
|
+
`${at}: collects ${fields_.map((f) => `"${f}"`).join(", ")} with no prompt and no ask; the AI has nothing ` +
|
|
445
|
+
"to go on. Add a prompt or an ask per field.",
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
step.branches?.forEach((branch, j) => {
|
|
450
|
+
const where = `branches[${j}]`;
|
|
451
|
+
if (branch.when === undefined && branch.if === undefined) {
|
|
452
|
+
throw problem(at, `${where} has neither when nor if`, "Give the branch an AI condition (when) or a code one (if).");
|
|
453
|
+
}
|
|
454
|
+
pred(branch.if, at, `${where}.if`);
|
|
455
|
+
edge(i, branch.then, at, `${where}.then`);
|
|
456
|
+
});
|
|
457
|
+
step.instructions?.forEach((ins, j) => pred(ins.if, at, `instructions[${j}].if`));
|
|
458
|
+
toolNames(step.tools, at);
|
|
459
|
+
|
|
460
|
+
if (step.do !== undefined) {
|
|
461
|
+
if (!own(actions, step.do)) {
|
|
462
|
+
throw problem(at, `unknown action "${step.do}"`, "Register it in actions or fix the name.");
|
|
463
|
+
}
|
|
464
|
+
checkWith(at, step.do, actions[step.do].parameters, step.with);
|
|
465
|
+
edge(i, step.onFail, at, "onFail");
|
|
466
|
+
}
|
|
467
|
+
if (typeof step.wait === "string") {
|
|
468
|
+
duration(step.wait, at, "wait");
|
|
469
|
+
} else if (step.wait !== undefined) {
|
|
470
|
+
if (!own(events, step.wait.event)) {
|
|
471
|
+
throw problem(at, `unknown event "${step.wait.event}" in wait`, "Register it in events or fix the name.");
|
|
472
|
+
}
|
|
473
|
+
duration(step.wait.upTo, at, "wait.upTo");
|
|
474
|
+
}
|
|
475
|
+
if (step.if !== undefined) {
|
|
476
|
+
pred(step.if, at, "if");
|
|
477
|
+
if (thenTo !== undefined && thenTo <= i && step.else === undefined) {
|
|
478
|
+
throw problem(
|
|
479
|
+
at,
|
|
480
|
+
`"if" jumps back to "${flow.steps[thenTo].id}" with no else`,
|
|
481
|
+
"Add else so the false branch has somewhere to go.",
|
|
482
|
+
);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
return { warnings };
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
function matchesParam(def: ParamDef, value: unknown): boolean {
|
|
491
|
+
if (def.type === "array") return Array.isArray(value) && value.every((item) => matches(def.items, item));
|
|
492
|
+
return matches(def, value);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/** Strict: a string is not a number here. Enum membership is checked unless the string is a template. */
|
|
496
|
+
function matches(def: ScalarDef, value: unknown): boolean {
|
|
497
|
+
if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") return false;
|
|
498
|
+
const typeOk =
|
|
499
|
+
def.type === "string"
|
|
500
|
+
? typeof value === "string"
|
|
501
|
+
: def.type === "boolean"
|
|
502
|
+
? typeof value === "boolean"
|
|
503
|
+
: typeof value === "number" && (def.type === "number" ? Number.isFinite(value) : Number.isInteger(value));
|
|
504
|
+
if (!typeOk) return false;
|
|
505
|
+
if (!def.enum || (typeof value === "string" && value.includes("{{"))) return true;
|
|
506
|
+
return typeof value !== "boolean" && def.enum.includes(value);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
function describe(value: unknown): string {
|
|
510
|
+
return Array.isArray(value) ? "list" : value === null ? "null" : typeof value;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
function describeDef(def: ParamDef): string {
|
|
514
|
+
return def.type === "array" ? `a list of ${def.items.type}` : `a ${def.type}`;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// ── flowSpecSchema ──────────────────────────────────────────────────────
|
|
518
|
+
|
|
519
|
+
const STRING: StructuredSchema = { type: "string" };
|
|
520
|
+
const NUMBER: StructuredSchema = { type: "number" };
|
|
521
|
+
const INTEGER: StructuredSchema = { type: "integer" };
|
|
522
|
+
const BOOLEAN: StructuredSchema = { type: "boolean" };
|
|
523
|
+
const NULL: StructuredSchema = { type: "null" };
|
|
524
|
+
|
|
525
|
+
/**
|
|
526
|
+
* FlowSpec's JSON schema with this workspace's actions (each with its
|
|
527
|
+
* parameter schema), events, conditions and field slugs as enums. Every
|
|
528
|
+
* object is closed and every property required, null standing for "not set",
|
|
529
|
+
* so Gemini accepts it as a response schema. Steps are an `anyOf` (the union
|
|
530
|
+
* keyword both Gemini and OpenAI strict schemas accept; `oneOf` is not)
|
|
531
|
+
* discriminated by `kind`, one `do` variant per action.
|
|
532
|
+
*
|
|
533
|
+
* Left out on purpose, because a model should not write them: `ui`, `tools`,
|
|
534
|
+
* step-level `instructions` and `ask`, a mention trigger's `extract`, and the
|
|
535
|
+
* `input` of `{ flow }`. A variant whose registry is empty is left out too
|
|
536
|
+
* (no actions: no `do` step). Condition arguments are typed loosely (string,
|
|
537
|
+
* number, boolean or list of strings) because conditions carry no argument
|
|
538
|
+
* schema yet.
|
|
539
|
+
*/
|
|
540
|
+
export function flowSpecSchema(registries: Registries): StructuredSchema {
|
|
541
|
+
const { fields, actions = {}, events = {}, conditions = {} } = registries;
|
|
542
|
+
const slugs = Object.keys(fields);
|
|
543
|
+
const eventNames = Object.keys(events);
|
|
544
|
+
|
|
545
|
+
const slugList = slugs.length ? list(enumOf(slugs)) : undefined;
|
|
546
|
+
const duration = { type: "string", description: "A number and a unit: 30s, 5m, 24h, 3d" };
|
|
547
|
+
const condition = closed({
|
|
548
|
+
equals: slugs.length
|
|
549
|
+
? orNull({ ...toWireSchema(fields, { nullable: true }), description: "Fields that must hold these values" })
|
|
550
|
+
: undefined,
|
|
551
|
+
known: slugList && orNull({ ...slugList, description: "Fields that must be known" }),
|
|
552
|
+
silenced: orNull({ ...BOOLEAN, description: "Whether the host gate is closed" }),
|
|
553
|
+
...Object.fromEntries(
|
|
554
|
+
Object.keys(conditions).map((name) => [
|
|
555
|
+
name,
|
|
556
|
+
union([STRING, NUMBER, BOOLEAN, list(STRING)], { nullable: true, description: `Argument for condition "${name}"` }),
|
|
557
|
+
]),
|
|
558
|
+
),
|
|
559
|
+
});
|
|
560
|
+
const nextBranches = [
|
|
561
|
+
{ type: "string", description: 'A step id, or "end"' },
|
|
562
|
+
closed({ step: STRING, clear: slugList && orNull({ ...slugList, description: "Fields to forget before jumping" }) }),
|
|
563
|
+
closed({ flow: { type: "string", description: "Another flow to start; this run ends" } }),
|
|
564
|
+
];
|
|
565
|
+
const next = union(nextBranches);
|
|
566
|
+
const nextOrNull = union(nextBranches, { nullable: true });
|
|
567
|
+
const repeat = union(
|
|
568
|
+
[enumOf(["once", "always"]), closed({ cooldown: duration })],
|
|
569
|
+
{ nullable: true, description: "How often a run may start: once per session or anchor, always, or after a cooldown" },
|
|
570
|
+
);
|
|
571
|
+
const triggerBase = { if: orNull(condition), repeat };
|
|
572
|
+
const trigger = union([
|
|
573
|
+
closed({ message: list(STRING, "What the lead asks for, one phrase each; [] = catch-all"), ...triggerBase }),
|
|
574
|
+
closed({ mention: list(STRING, "What the lead mentions, one phrase each"), ...triggerBase }),
|
|
575
|
+
closed({ silence: { ...duration, description: "How long the lead has been quiet" }, businessHours: orNull(BOOLEAN), ...triggerBase }),
|
|
576
|
+
eventNames.length
|
|
577
|
+
? closed({ event: enumOf(eventNames), after: orNull(duration), businessHours: orNull(BOOLEAN), ...triggerBase })
|
|
578
|
+
: undefined,
|
|
579
|
+
]);
|
|
580
|
+
const branches = orNull(
|
|
581
|
+
list(union([closed({ when: STRING, then: next }), closed({ if: condition, then: next })]), "Exits judged while the step asks"),
|
|
582
|
+
);
|
|
583
|
+
const stepBase = { id: STRING, label: orNull(STRING), then: nextOrNull };
|
|
584
|
+
const step = union([
|
|
585
|
+
closed({ ...stepBase, kind: enumOf(["prompt"]), prompt: { type: "string", description: "Guideline for the AI's next message" }, branches }),
|
|
586
|
+
slugList &&
|
|
587
|
+
closed({
|
|
588
|
+
...stepBase,
|
|
589
|
+
kind: enumOf(["collect"]),
|
|
590
|
+
collect: { ...slugList, description: "Fields the AI asks for until they are known" },
|
|
591
|
+
prompt: orNull(STRING),
|
|
592
|
+
maxAsks: orNull({ ...INTEGER, description: "Times a field may be asked before it is skipped; default 3" }),
|
|
593
|
+
branches,
|
|
594
|
+
}),
|
|
595
|
+
closed({ ...stepBase, kind: enumOf(["say"]), say: { type: "string", description: "Sent verbatim" }, media: orNull(closed({ slug: STRING })), once: orNull(BOOLEAN) }),
|
|
596
|
+
...Object.entries(actions).map(([name, action]) =>
|
|
597
|
+
closed({
|
|
598
|
+
...stepBase,
|
|
599
|
+
kind: enumOf(["do"]),
|
|
600
|
+
do: enumOf([name]),
|
|
601
|
+
with: Object.keys(action.parameters).length ? paramsSchema(action.parameters) : undefined,
|
|
602
|
+
onFail: nextOrNull,
|
|
603
|
+
}),
|
|
604
|
+
),
|
|
605
|
+
closed({
|
|
606
|
+
...stepBase,
|
|
607
|
+
kind: enumOf(["wait"]),
|
|
608
|
+
wait: { ...duration, description: "Park this long; then = time passed, else = the lead replied" },
|
|
609
|
+
businessHours: orNull(BOOLEAN),
|
|
610
|
+
else: nextOrNull,
|
|
611
|
+
branches,
|
|
612
|
+
}),
|
|
613
|
+
eventNames.length
|
|
614
|
+
? closed({
|
|
615
|
+
...stepBase,
|
|
616
|
+
kind: enumOf(["waitEvent"]),
|
|
617
|
+
wait: closed({ event: enumOf(eventNames), upTo: orNull({ ...duration, description: "Give up after this long; default 30d" }) }),
|
|
618
|
+
else: nextOrNull,
|
|
619
|
+
})
|
|
620
|
+
: undefined,
|
|
621
|
+
closed({ ...stepBase, kind: enumOf(["if"]), if: condition, else: nextOrNull }),
|
|
622
|
+
]);
|
|
623
|
+
const instruction = closed({
|
|
624
|
+
kind: orNull(enumOf(["must", "never", "should"])),
|
|
625
|
+
when: orNull(list(STRING, "When the rule applies, judged by the AI")),
|
|
626
|
+
if: orNull(condition),
|
|
627
|
+
prompt: STRING,
|
|
628
|
+
});
|
|
629
|
+
|
|
630
|
+
return closed({
|
|
631
|
+
id: { type: "string", description: "Short slug, unique in the workspace" },
|
|
632
|
+
name: STRING,
|
|
633
|
+
description: orNull({ type: "string", description: "When this flow should be used; the AI reads it when routing" }),
|
|
634
|
+
on: orNull(list(trigger, "What starts a run; null = started by hand")),
|
|
635
|
+
anchor: orNull({ type: "string", description: "'session' (default) or a host anchor such as 'lead'" }),
|
|
636
|
+
while: orNull({ ...condition, description: "The run ends when this stops holding" }),
|
|
637
|
+
clearOnStart: slugList && orNull({ ...slugList, description: "Fields to forget when a run starts" }),
|
|
638
|
+
steps: list(step, "In order; a run moves to the next step unless `then` says otherwise"),
|
|
639
|
+
onEnd: orNull(enumOf(["end", "stay", "reset"], "After the last step: end the run, stay on it, or reset to the first")),
|
|
640
|
+
instructions: orNull(list(instruction, "Rules that apply only inside this flow")),
|
|
641
|
+
});
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* An action's `with`: required parameters stay non-null so the model cannot
|
|
646
|
+
* skip them; optional ones are listed as required-but-nullable, the envelope
|
|
647
|
+
* style, so the object stays closed and fully required.
|
|
648
|
+
*/
|
|
649
|
+
function paramsSchema(params: ParamDefs): StructuredSchema {
|
|
650
|
+
const wire = toWireSchema(params);
|
|
651
|
+
const properties = wire.properties ?? {};
|
|
652
|
+
for (const [name, def] of Object.entries(params)) {
|
|
653
|
+
if (def.optional) properties[name] = orNull(properties[name]);
|
|
654
|
+
}
|
|
655
|
+
return { ...wire, properties, required: Object.keys(params) };
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
function enumOf(values: readonly string[], description?: string): StructuredSchema {
|
|
659
|
+
return compact({ type: "string", enum: [...values], description });
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
function list(items: StructuredSchema, description?: string): StructuredSchema {
|
|
663
|
+
return compact({ type: "array", items, description });
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/** A closed object requiring every property it lists; `undefined` entries are left out. */
|
|
667
|
+
function closed(properties: Record<string, StructuredSchema | undefined>): StructuredSchema {
|
|
668
|
+
const present: Record<string, StructuredSchema> = {};
|
|
669
|
+
for (const [name, schema] of Object.entries(properties)) if (schema) present[name] = schema;
|
|
670
|
+
return { type: "object", properties: present, required: Object.keys(present), additionalProperties: false };
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
function union(
|
|
674
|
+
branches: Array<StructuredSchema | undefined>,
|
|
675
|
+
options: { nullable?: boolean; description?: string } = {},
|
|
676
|
+
): StructuredSchema {
|
|
677
|
+
const anyOf = branches.filter((branch): branch is StructuredSchema => branch !== undefined);
|
|
678
|
+
return compact({ anyOf: options.nullable ? [...anyOf, NULL] : anyOf, description: options.description });
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/** The same schema, also accepting null. Single-typed schemas only; unions take `{ nullable: true }`. */
|
|
682
|
+
function orNull(schema: StructuredSchema): StructuredSchema {
|
|
683
|
+
return typeof schema.type === "string" ? { ...schema, type: [schema.type, "null"] } : { anyOf: [schema, NULL] };
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
// ── Shared helpers ──────────────────────────────────────────────────────
|
|
687
|
+
|
|
688
|
+
function problem(at: string, what: string, fix: string): FlowConfigurationError {
|
|
689
|
+
return new FlowConfigurationError(`[FlowConfigurationError] ${at}: ${what}. ${fix}`);
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
function own(record: object, key: string): boolean {
|
|
693
|
+
return Object.prototype.hasOwnProperty.call(record, key);
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
/** Drop `undefined` values so a spec carries only what was written. */
|
|
697
|
+
function compact<T extends object>(value: T): T {
|
|
698
|
+
return Object.fromEntries(Object.entries(value).filter(([, v]) => v !== undefined)) as T;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
/** `null` means "not set" on the way in from JSON; drop it everywhere. */
|
|
702
|
+
function stripNulls<T>(value: T): T {
|
|
703
|
+
if (Array.isArray(value)) return value.map((item: unknown) => stripNulls(item)) as T;
|
|
704
|
+
if (value !== null && typeof value === "object") {
|
|
705
|
+
return Object.fromEntries(
|
|
706
|
+
Object.entries(value)
|
|
707
|
+
.filter(([, v]) => v !== null)
|
|
708
|
+
.map(([k, v]) => [k, stripNulls(v)]),
|
|
709
|
+
) as T;
|
|
710
|
+
}
|
|
711
|
+
return value;
|
|
712
|
+
}
|