@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,451 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Speak: the one call that phrases the reply (design §4.6).
|
|
3
|
+
*
|
|
4
|
+
* Runner decides who speaks and what is still pending; this module owns the
|
|
5
|
+
* prompt, the envelope, the provider call(s) and the parsing. The envelope is
|
|
6
|
+
* `{ message, ...pending fields }`, every property required and nullable, so
|
|
7
|
+
* the model answers and harvests in one call. Tools run in rounds: each round
|
|
8
|
+
* the model may call tools, their results go back as history, and the model
|
|
9
|
+
* is asked again; after `maxToolLoops` rounds it is asked once more without
|
|
10
|
+
* tools so a message always comes back.
|
|
11
|
+
*
|
|
12
|
+
* Speak never throws for a provider failure and never writes session data:
|
|
13
|
+
* a failed or empty round returns `{ deferred }` for Runner to re-park, and
|
|
14
|
+
* field values come back raw for Runner to validate.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { ProviderError, classify, type ErrorKind } from "@providerkit/core";
|
|
18
|
+
|
|
19
|
+
import type { GenerateMessageInput, TokenUsage } from "../types/ai.js";
|
|
20
|
+
import type { AgentOptions } from "../types/agent.js";
|
|
21
|
+
import type { FieldDefs } from "../types/flow.js";
|
|
22
|
+
import type { History } from "../types/history.js";
|
|
23
|
+
import type { StructuredSchema } from "../types/schema.js";
|
|
24
|
+
import type { StepOutcomeCode } from "../types/session.js";
|
|
25
|
+
import type { Tool, ToolCtx, ToolResult } from "../types/tool.js";
|
|
26
|
+
import { assistantMessage, toolMessage, userMessage } from "../utils/history.js";
|
|
27
|
+
import { extractEmbeddedJSONObject, isRecord, tryParseJSONResponse } from "../utils/json.js";
|
|
28
|
+
import { logger } from "../utils/logger.js";
|
|
29
|
+
import { isKnown, toWireSchema } from "../utils/schema.js";
|
|
30
|
+
import { StreamingMessageDecoder } from "../utils/streamingMessage.js";
|
|
31
|
+
import { render, type TemplateScope } from "../utils/template.js";
|
|
32
|
+
import { addUsage, readUsage } from "../utils/usage.js";
|
|
33
|
+
import type { Deferral, SpeakOutcome, SpeakRequest, SpeakStreamChunk } from "./contracts.js";
|
|
34
|
+
import {
|
|
35
|
+
describeField,
|
|
36
|
+
factsSection,
|
|
37
|
+
instructionsSection,
|
|
38
|
+
joinSections,
|
|
39
|
+
pendingSection,
|
|
40
|
+
stablePrefix,
|
|
41
|
+
} from "./Prompt.js";
|
|
42
|
+
|
|
43
|
+
const DEFAULT_MAX_TOOL_LOOPS = 5;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Every provider failure used to arrive here as one word, and Runner re-parked
|
|
47
|
+
* the step on a 1m/5m/15m ladder that never ended. So a spent balance, a wrong
|
|
48
|
+
* key or a prompt past the context window re-ran understand AND speak every
|
|
49
|
+
* fifteen minutes forever, and the customer was never answered. The kind says
|
|
50
|
+
* which of those it is; `RETRY_KINDS` says which are worth waking for at all.
|
|
51
|
+
*/
|
|
52
|
+
const DEFER_CODE = {
|
|
53
|
+
aborted: "provider-unavailable",
|
|
54
|
+
timeout: "provider-unavailable",
|
|
55
|
+
network: "provider-unavailable",
|
|
56
|
+
overload: "provider-unavailable",
|
|
57
|
+
rate: "provider-unavailable",
|
|
58
|
+
unknown: "provider-unavailable",
|
|
59
|
+
quota: "provider-quota",
|
|
60
|
+
entitlement: "provider-auth",
|
|
61
|
+
auth: "provider-auth",
|
|
62
|
+
model: "provider-invalid",
|
|
63
|
+
invalid: "provider-invalid",
|
|
64
|
+
content: "provider-invalid",
|
|
65
|
+
context: "provider-context",
|
|
66
|
+
} as const satisfies Record<ErrorKind, StepOutcomeCode>;
|
|
67
|
+
|
|
68
|
+
/** Kinds a later wake can fix on its own. Everything else needs a human. */
|
|
69
|
+
const RETRY_KINDS: ReadonlySet<ErrorKind> = new Set<ErrorKind>(["timeout", "network", "overload", "rate", "unknown"]);
|
|
70
|
+
|
|
71
|
+
/** The provider said nothing usable, which is not an error object. Always worth one more try. */
|
|
72
|
+
const UNAVAILABLE: Deferral = { code: "provider-unavailable", retryable: true };
|
|
73
|
+
|
|
74
|
+
/** What kind of wall this was, and whether waiting at it helps. */
|
|
75
|
+
function deferralOf(error: unknown): Deferral {
|
|
76
|
+
const kind = classify(error);
|
|
77
|
+
const reset = error instanceof ProviderError ? error.resetAtMs : undefined;
|
|
78
|
+
// A usage window that says when it reopens is worth exactly one wake, then.
|
|
79
|
+
// Without that number, waiting is guessing, and the ladder guesses in minutes
|
|
80
|
+
// at a limit measured in hours.
|
|
81
|
+
const retryable = RETRY_KINDS.has(kind) || (kind === "quota" && reset !== undefined);
|
|
82
|
+
return { code: DEFER_CODE[kind], retryable, ...(reset !== undefined ? { resetAtMs: reset } : {}) };
|
|
83
|
+
}
|
|
84
|
+
/** Gemini rejects any other envelope property name. */
|
|
85
|
+
const WIRE_NAME = /^[a-zA-Z0-9_-]+$/;
|
|
86
|
+
|
|
87
|
+
const GUIDELINE_HEADING = "## Guideline for your reply (adapt to the conversation)";
|
|
88
|
+
const DEFAULT_GUIDELINE =
|
|
89
|
+
"Collect what is still missing below, in the flow of the conversation, one or two things per message.";
|
|
90
|
+
const TOOLS_SECTION =
|
|
91
|
+
"## Tools\nCall the tools provided when you need to look something up or act before answering. Once you have what you need, answer the customer.";
|
|
92
|
+
const FINAL_SECTION =
|
|
93
|
+
"## Wrap up\nAnswer the customer now, using the tool results in the conversation. Do not call any tools.";
|
|
94
|
+
const SPEAK_FIRST =
|
|
95
|
+
"## Situation\nThere is no new message from the customer. You speak first: open naturally, do not answer a question nobody asked.";
|
|
96
|
+
|
|
97
|
+
interface ToolCall {
|
|
98
|
+
toolName: string;
|
|
99
|
+
arguments: Record<string, unknown>;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** What one provider round produced, before parsing. */
|
|
103
|
+
interface Reply {
|
|
104
|
+
message: string;
|
|
105
|
+
structured: unknown;
|
|
106
|
+
usage?: TokenUsage;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** The model's own record of how it reached a tool round, replayed on the next. */
|
|
110
|
+
type Thought = { reasoning?: string; reasoningDetails?: unknown[] };
|
|
111
|
+
|
|
112
|
+
/** What one tool call sends back to the model, plus the data it wrote. */
|
|
113
|
+
interface CallResult<D> {
|
|
114
|
+
content: string;
|
|
115
|
+
data?: Partial<D>;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** The wire schema plus the slug → property-name table (aliased when a slug is not a legal name). */
|
|
119
|
+
interface Envelope {
|
|
120
|
+
schema: StructuredSchema;
|
|
121
|
+
wire: Map<string, string>;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export class Speak<C = unknown, D = unknown> {
|
|
125
|
+
constructor(private readonly options: AgentOptions<C, D>) {}
|
|
126
|
+
|
|
127
|
+
async run(req: SpeakRequest<C, D>): Promise<SpeakOutcome> {
|
|
128
|
+
const rounds = this.rounds(req, false);
|
|
129
|
+
let next = await rounds.next();
|
|
130
|
+
while (!next.done) next = await rounds.next();
|
|
131
|
+
return next.value;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** `run`, yielding the message text as it arrives; ends with `{ done, outcome }`. */
|
|
135
|
+
async *stream(req: SpeakRequest<C, D>): AsyncIterable<SpeakStreamChunk> {
|
|
136
|
+
const rounds = this.rounds(req, true);
|
|
137
|
+
let next = await rounds.next();
|
|
138
|
+
while (!next.done) {
|
|
139
|
+
yield { delta: next.value };
|
|
140
|
+
next = await rounds.next();
|
|
141
|
+
}
|
|
142
|
+
yield { done: true, outcome: next.value };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** The round loop shared by both entry points: yields deltas, returns the outcome. */
|
|
146
|
+
private async *rounds(req: SpeakRequest<C, D>, streaming: boolean): AsyncGenerator<string, SpeakOutcome> {
|
|
147
|
+
const talk = req.talk;
|
|
148
|
+
const envelope = buildEnvelope(this.options.fields, "idle" in talk ? [] : talk.pending);
|
|
149
|
+
const { system, turn: prompt } = buildPrompt(this.options, req, envelope);
|
|
150
|
+
const maxLoops = this.options.maxToolLoops ?? DEFAULT_MAX_TOOL_LOOPS;
|
|
151
|
+
const tools = maxLoops > 0 ? req.tools : [];
|
|
152
|
+
const wireTools = tools.map((t) => ({ id: t.id, name: t.id, description: t.description, parameters: t.parameters }));
|
|
153
|
+
|
|
154
|
+
let history: History = req.history;
|
|
155
|
+
const fields: Record<string, unknown> = {};
|
|
156
|
+
const data: Record<string, unknown> = {};
|
|
157
|
+
const toolCalls: ToolCall[] = [];
|
|
158
|
+
let llmCalls = 0;
|
|
159
|
+
let usage: TokenUsage | undefined;
|
|
160
|
+
let message = "";
|
|
161
|
+
|
|
162
|
+
for (let round = 0; ; round++) {
|
|
163
|
+
const offerTools = wireTools.length > 0 && round < maxLoops;
|
|
164
|
+
const input: GenerateMessageInput<C> = {
|
|
165
|
+
prompt: joinSections(prompt, offerTools ? TOOLS_SECTION : round > 0 ? FINAL_SECTION : null),
|
|
166
|
+
...(system ? { system } : {}),
|
|
167
|
+
history,
|
|
168
|
+
context: req.context,
|
|
169
|
+
tools: offerTools ? wireTools : undefined,
|
|
170
|
+
parameters: { jsonSchema: envelope.schema, schemaName: "speak" },
|
|
171
|
+
};
|
|
172
|
+
llmCalls++;
|
|
173
|
+
let reply: Reply;
|
|
174
|
+
try {
|
|
175
|
+
// ponytail: every round streams as it arrives, so a preamble the model
|
|
176
|
+
// writes beside a tool call ("deixa eu ver") reaches the stream but not
|
|
177
|
+
// `spoken.message`. Ceiling: joined deltas exceed the final message on
|
|
178
|
+
// such a round. Upgrade: hold deltas until the provider says no tool call
|
|
179
|
+
// is coming, once providers report that before the end of the stream.
|
|
180
|
+
reply = yield* this.call(input, streaming);
|
|
181
|
+
} catch (error) {
|
|
182
|
+
const deferred = deferralOf(error);
|
|
183
|
+
logger.warn(`[Speak] provider failed on call ${llmCalls} (${deferred.code}): ${describeError(error)}`);
|
|
184
|
+
// A round that threw still bills the rounds before it.
|
|
185
|
+
return { deferred, llmCalls, ...(usage ? { usage } : {}) };
|
|
186
|
+
}
|
|
187
|
+
usage = addUsage(usage, reply.usage);
|
|
188
|
+
|
|
189
|
+
const read = readReply(reply, envelope);
|
|
190
|
+
message = read.message;
|
|
191
|
+
Object.assign(fields, read.fields);
|
|
192
|
+
if (!offerTools || read.toolCalls.length === 0) break;
|
|
193
|
+
|
|
194
|
+
const ctx: ToolCtx<C, D> = {
|
|
195
|
+
context: req.context,
|
|
196
|
+
data: Object.assign({}, req.data, data),
|
|
197
|
+
history,
|
|
198
|
+
run: "idle" in talk ? undefined : talk.run,
|
|
199
|
+
now: req.now,
|
|
200
|
+
};
|
|
201
|
+
const executed = await this.executeRound(read.toolCalls, tools, ctx, round, read.message, read.thought);
|
|
202
|
+
// A tool call answers a question, and Gemini enforces that literally:
|
|
203
|
+
// `400 "function call turn comes immediately after a user turn or after a
|
|
204
|
+
// function response turn"`. On a first turn the host has no history yet,
|
|
205
|
+
// so the call would open the conversation. The customer's own text is the
|
|
206
|
+
// turn it answers; on a wake, where nobody spoke, the prompt stands in.
|
|
207
|
+
if (round === 0 && history.at(-1)?.role !== "user") {
|
|
208
|
+
history = [...history, userMessage(req.input.text ?? prompt)];
|
|
209
|
+
}
|
|
210
|
+
history = [...history, ...executed.items];
|
|
211
|
+
Object.assign(data, executed.data);
|
|
212
|
+
toolCalls.push(...read.toolCalls);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (!message.trim()) {
|
|
216
|
+
logger.warn(`[Speak] the model returned no message after ${llmCalls} call(s); deferring.`);
|
|
217
|
+
return { deferred: UNAVAILABLE, llmCalls, ...(usage ? { usage } : {}) };
|
|
218
|
+
}
|
|
219
|
+
return { spoken: { message, fields, data, toolCalls, llmCalls, ...(usage ? { usage } : {}) } };
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/** One provider call. Streaming yields clean message deltas; both paths return the same shape. */
|
|
223
|
+
private async *call(input: GenerateMessageInput<C>, streaming: boolean): AsyncGenerator<string, Reply> {
|
|
224
|
+
if (!streaming) {
|
|
225
|
+
const out = await this.options.provider.generateMessage<C, unknown>(input);
|
|
226
|
+
return { message: out.message, structured: out.structured, usage: readUsage(out.metadata) };
|
|
227
|
+
}
|
|
228
|
+
const decoder = new StreamingMessageDecoder();
|
|
229
|
+
let message = "";
|
|
230
|
+
let structured: unknown;
|
|
231
|
+
// The counts ride on the terminal chunk, so the last one that carries any wins.
|
|
232
|
+
let usage: TokenUsage | undefined;
|
|
233
|
+
for await (const chunk of this.options.provider.generateMessageStream<C, unknown>(input)) {
|
|
234
|
+
const clean = decoder.push(chunk.accumulated);
|
|
235
|
+
if (clean.delta) yield clean.delta;
|
|
236
|
+
message = clean.message;
|
|
237
|
+
if (chunk.structured !== undefined) structured = chunk.structured;
|
|
238
|
+
usage = readUsage(chunk.metadata) ?? usage;
|
|
239
|
+
}
|
|
240
|
+
return { message, structured, usage };
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Run one round of tool calls and turn them into history items. Consecutive
|
|
245
|
+
* concurrency-safe calls run together; anything else runs alone, in order.
|
|
246
|
+
* Data patches merge in call order whatever the completion order.
|
|
247
|
+
*/
|
|
248
|
+
private async executeRound(
|
|
249
|
+
calls: ToolCall[],
|
|
250
|
+
tools: Tool<C, D>[],
|
|
251
|
+
ctx: ToolCtx<C, D>,
|
|
252
|
+
round: number,
|
|
253
|
+
preamble: string,
|
|
254
|
+
thought: Thought,
|
|
255
|
+
): Promise<{ items: History; data: Record<string, unknown> }> {
|
|
256
|
+
const safe = (call: ToolCall): boolean => {
|
|
257
|
+
const tool = tools.find((t) => t.id === call.toolName);
|
|
258
|
+
if (!tool || tool.isDestructive?.(call.arguments)) return false;
|
|
259
|
+
return tool.isConcurrencySafe?.(call.arguments) ?? tool.isReadOnly?.(call.arguments) ?? false;
|
|
260
|
+
};
|
|
261
|
+
const results: CallResult<D>[] = [];
|
|
262
|
+
for (let i = 0; i < calls.length; ) {
|
|
263
|
+
let j = i + 1;
|
|
264
|
+
if (safe(calls[i])) while (j < calls.length && safe(calls[j])) j++;
|
|
265
|
+
results.push(...(await Promise.all(calls.slice(i, j).map((call) => this.executeCall(call, tools, ctx)))));
|
|
266
|
+
i = j;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const ids = calls.map((_, i) => `call-${round}-${i}`);
|
|
270
|
+
const items: History = [
|
|
271
|
+
assistantMessage(
|
|
272
|
+
preamble || null,
|
|
273
|
+
calls.map((call, i) => ({ id: ids[i], name: call.toolName, arguments: call.arguments })),
|
|
274
|
+
thought,
|
|
275
|
+
),
|
|
276
|
+
...calls.map((call, i) => toolMessage(ids[i], call.toolName, results[i].content)),
|
|
277
|
+
];
|
|
278
|
+
const data: Record<string, unknown> = {};
|
|
279
|
+
for (const result of results) if (isRecord(result.data)) Object.assign(data, result.data);
|
|
280
|
+
return { items, data };
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/** One tool call through its gates and handler. Never throws: the model sees `{ error }`. */
|
|
284
|
+
private async executeCall(call: ToolCall, tools: Tool<C, D>[], ctx: ToolCtx<C, D>): Promise<CallResult<D>> {
|
|
285
|
+
const tool = tools.find((t) => t.id === call.toolName);
|
|
286
|
+
if (!tool) return { content: failure(`Tool "${call.toolName}" is not available.`) };
|
|
287
|
+
try {
|
|
288
|
+
const validation = await tool.validateInput?.(call.arguments, ctx);
|
|
289
|
+
if (validation && !validation.valid) {
|
|
290
|
+
return {
|
|
291
|
+
content: failure(`Validation failed: ${validation.error ?? "invalid input"}`, {
|
|
292
|
+
correctedInput: validation.correctedInput,
|
|
293
|
+
}),
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
const permission = await tool.checkPermissions?.(call.arguments, ctx);
|
|
297
|
+
if (permission && !permission.allowed) {
|
|
298
|
+
return { content: failure(`Permission denied: ${permission.reason ?? "not allowed"}`) };
|
|
299
|
+
}
|
|
300
|
+
const result: ToolResult<D> = (await tool.handler(call.arguments, ctx)) ?? {};
|
|
301
|
+
return { content: serialize(result.value, tool.maxResultSizeChars), data: result.data };
|
|
302
|
+
} catch (error) {
|
|
303
|
+
logger.warn(`[Speak] tool "${call.toolName}" threw: ${describeError(error)}`);
|
|
304
|
+
return { content: failure(describeError(error)) };
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// ── Prompt ──────────────────────────────────────────────────────────────
|
|
310
|
+
|
|
311
|
+
function buildPrompt<C, D>(
|
|
312
|
+
options: AgentOptions<C, D>,
|
|
313
|
+
req: SpeakRequest<C, D>,
|
|
314
|
+
envelope: Envelope,
|
|
315
|
+
): { system: string | null; turn: string } {
|
|
316
|
+
const talk = req.talk;
|
|
317
|
+
const scope: TemplateScope = { data: req.data, context: req.context, input: "idle" in talk ? undefined : talk.run.input };
|
|
318
|
+
const guideline = (text: string) => `${GUIDELINE_HEADING}\n${render(text, scope)}`;
|
|
319
|
+
const body =
|
|
320
|
+
"idle" in talk
|
|
321
|
+
? [guideline(talk.idle.prompt)]
|
|
322
|
+
: [
|
|
323
|
+
`## Flow\n${talk.flow.name}${talk.flow.description ? `: ${talk.flow.description}` : ""}`,
|
|
324
|
+
guideline(talk.step.prompt ?? DEFAULT_GUIDELINE),
|
|
325
|
+
pendingSection(talk.pending, options.fields, talk.step.ask ?? {}, scope),
|
|
326
|
+
// `Partial<D>` is a mapped type; the guard is how it reaches an index-signature parameter without a cast.
|
|
327
|
+
factsSection(options.fields, isRecord(req.data) ? req.data : {}),
|
|
328
|
+
];
|
|
329
|
+
const { system, inline } = stablePrefix(options, scope);
|
|
330
|
+
return {
|
|
331
|
+
system,
|
|
332
|
+
turn: joinSections(
|
|
333
|
+
inline,
|
|
334
|
+
...body,
|
|
335
|
+
instructionsSection([{ caption: "[Always]", items: req.instructions }], scope),
|
|
336
|
+
inputSection(req.input),
|
|
337
|
+
formatSection(envelope, options.fields),
|
|
338
|
+
),
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/** The customer's latest text, quoted. Without one, on anything but a message, the assistant opens the exchange. */
|
|
343
|
+
function inputSection(input: SpeakRequest["input"]): string | null {
|
|
344
|
+
const text = input.text?.trim();
|
|
345
|
+
if (text) return `## Customer's latest message\n"${text}"`;
|
|
346
|
+
return input.kind === "message" ? null : SPEAK_FIRST;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/** The envelope restated in words, for providers that follow the schema by prompt only. */
|
|
350
|
+
function formatSection(envelope: Envelope, fields: FieldDefs): string {
|
|
351
|
+
const lines = [
|
|
352
|
+
"## Response format",
|
|
353
|
+
"Answer with one JSON object and nothing else: no text before or after it, no code fences.",
|
|
354
|
+
'- "message": what you say to the customer, as natural text. Never put field names, keys or raw values in it.',
|
|
355
|
+
];
|
|
356
|
+
for (const [slug, name] of envelope.wire) {
|
|
357
|
+
lines.push(
|
|
358
|
+
`- "${name}": ${describeField(slug, fields[slug] ?? { type: "string" })}. The value the customer gave, or null when they did not give one.`,
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
if (envelope.wire.size > 0) {
|
|
362
|
+
lines.push(
|
|
363
|
+
"",
|
|
364
|
+
"Rules for the field properties:",
|
|
365
|
+
"- Fill a property only with what the customer actually said, in this message or earlier. Never guess or invent a value.",
|
|
366
|
+
"- People often give several details at once: take every one that matches a property.",
|
|
367
|
+
"- A property the customer did not answer stays null; never put a question or a placeholder in it.",
|
|
368
|
+
"- Property names must match exactly as written above.",
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
return lines.join("\n");
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// ── Envelope ────────────────────────────────────────────────────────────
|
|
375
|
+
|
|
376
|
+
function buildEnvelope(fields: FieldDefs, pending: string[]): Envelope {
|
|
377
|
+
const wire = new Map<string, string>();
|
|
378
|
+
const defs: FieldDefs = { message: { type: "string" } };
|
|
379
|
+
pending.forEach((slug, i) => {
|
|
380
|
+
// ponytail: a slug spelled like the reply key or with characters Gemini rejects
|
|
381
|
+
// rides under an alias; the table maps it back. Ceiling: a real slug named
|
|
382
|
+
// `field_N` could collide with an alias. Upgrade: bump the alias until free.
|
|
383
|
+
const name = WIRE_NAME.test(slug) && slug !== "message" ? slug : `field_${i}`;
|
|
384
|
+
wire.set(slug, name);
|
|
385
|
+
defs[name] = fields[slug] ?? { type: "string" };
|
|
386
|
+
});
|
|
387
|
+
return { schema: toWireSchema(defs, { nullable: true }), wire };
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* Read one round's envelope, tolerating what a prompt-only provider does:
|
|
392
|
+
* missing keys, nulls, stray text around the object, arguments as a string.
|
|
393
|
+
*/
|
|
394
|
+
function readReply(
|
|
395
|
+
reply: Reply,
|
|
396
|
+
envelope: Envelope,
|
|
397
|
+
): { message: string; fields: Record<string, unknown>; toolCalls: ToolCall[]; thought: Thought } {
|
|
398
|
+
const parsed = isRecord(reply.structured) ? reply.structured : extractEmbeddedJSONObject(reply.message);
|
|
399
|
+
const message = parsed ? (typeof parsed.message === "string" ? parsed.message : "") : reply.message;
|
|
400
|
+
const fields: Record<string, unknown> = {};
|
|
401
|
+
for (const [slug, name] of envelope.wire) {
|
|
402
|
+
const value = parsed?.[name];
|
|
403
|
+
if (isKnown(value)) fields[slug] = value;
|
|
404
|
+
}
|
|
405
|
+
return { message, fields, toolCalls: parseToolCalls(parsed?.toolCalls), thought: readThought(parsed) };
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/** What the model thought before it called a tool, if the provider sent it. */
|
|
409
|
+
function readThought(parsed: Record<string, unknown> | undefined): Thought {
|
|
410
|
+
return {
|
|
411
|
+
...(typeof parsed?.reasoning === "string" && parsed.reasoning ? { reasoning: parsed.reasoning } : {}),
|
|
412
|
+
...(Array.isArray(parsed?.reasoningDetails) ? { reasoningDetails: parsed.reasoningDetails } : {}),
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
function parseToolCalls(value: unknown): ToolCall[] {
|
|
417
|
+
if (!Array.isArray(value)) return [];
|
|
418
|
+
const calls: ToolCall[] = [];
|
|
419
|
+
for (const item of value) {
|
|
420
|
+
if (!isRecord(item) || typeof item.toolName !== "string") continue;
|
|
421
|
+
const raw = typeof item.arguments === "string" ? tryParseJSONResponse(item.arguments) : item.arguments;
|
|
422
|
+
calls.push({ toolName: item.toolName, arguments: isRecord(raw) ? raw : {} });
|
|
423
|
+
}
|
|
424
|
+
return calls;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// ── Tool results ────────────────────────────────────────────────────────
|
|
428
|
+
|
|
429
|
+
function failure(error: string, extra: Record<string, unknown> = {}): string {
|
|
430
|
+
return JSON.stringify({ error, ...extra });
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/** A tool's value as the model reads it, cut at `max` characters with a notice. */
|
|
434
|
+
function serialize(value: unknown, max?: number): string {
|
|
435
|
+
let text: string;
|
|
436
|
+
if (value === undefined) text = '{"ok":true}';
|
|
437
|
+
else if (typeof value === "string") text = value;
|
|
438
|
+
else {
|
|
439
|
+
try {
|
|
440
|
+
text = JSON.stringify(value) ?? '{"ok":true}';
|
|
441
|
+
} catch {
|
|
442
|
+
text = "[result could not be serialized]";
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
if (max === undefined || max <= 0 || text.length <= max) return text;
|
|
446
|
+
return `${text.slice(0, max)}\n[truncated: ${text.length} chars total, showing the first ${max}]`;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
function describeError(error: unknown): string {
|
|
450
|
+
return error instanceof Error ? error.message : String(error);
|
|
451
|
+
}
|