@falai/agent 0.9.2 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +281 -42
- package/dist/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/adapters/MemoryAdapter.js.map +1 -0
- package/dist/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/adapters/MongoAdapter.js.map +1 -0
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/{src/adapters → adapters}/PrismaAdapter.js +3 -2
- package/dist/adapters/PrismaAdapter.js.map +1 -0
- package/dist/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/{src/adapters → adapters}/RedisAdapter.js +3 -3
- package/dist/adapters/RedisAdapter.js.map +1 -0
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -0
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -0
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/{src → cjs}/adapters/PrismaAdapter.d.ts.map +1 -1
- package/dist/cjs/{src/adapters → adapters}/PrismaAdapter.js +3 -2
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/{src/adapters → adapters}/RedisAdapter.js +2 -2
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -0
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/cjs/adapters/index.js.map +1 -0
- package/dist/cjs/constants/index.js.map +1 -0
- package/dist/cjs/{src/core → core}/Agent.d.ts +16 -1
- package/dist/cjs/core/Agent.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/Agent.js +63 -2
- package/dist/cjs/core/Agent.js.map +1 -0
- package/dist/cjs/core/BatchExecutor.d.ts +353 -0
- package/dist/cjs/core/BatchExecutor.d.ts.map +1 -0
- package/dist/cjs/core/BatchExecutor.js +850 -0
- package/dist/cjs/core/BatchExecutor.js.map +1 -0
- package/dist/cjs/core/BatchPromptBuilder.d.ts +86 -0
- package/dist/cjs/core/BatchPromptBuilder.d.ts.map +1 -0
- package/dist/cjs/core/BatchPromptBuilder.js +217 -0
- package/dist/cjs/core/BatchPromptBuilder.js.map +1 -0
- package/dist/cjs/core/Events.js.map +1 -0
- package/dist/cjs/core/PersistenceManager.js.map +1 -0
- package/dist/{src → cjs}/core/PromptComposer.d.ts +1 -1
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/PromptComposer.js +44 -7
- package/dist/cjs/core/PromptComposer.js.map +1 -0
- package/dist/{src → cjs}/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +211 -0
- package/dist/cjs/core/ResponseEngine.js.map +1 -0
- package/dist/{src → cjs}/core/ResponseModal.d.ts +45 -0
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/ResponseModal.js +752 -74
- package/dist/cjs/core/ResponseModal.js.map +1 -0
- package/dist/{src → cjs}/core/ResponsePipeline.d.ts +2 -2
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/ResponsePipeline.js +13 -6
- package/dist/cjs/core/ResponsePipeline.js.map +1 -0
- package/dist/{src → cjs}/core/Route.d.ts +34 -5
- package/dist/cjs/core/Route.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/Route.js +196 -19
- package/dist/cjs/core/Route.js.map +1 -0
- package/dist/cjs/{src/core → core}/RoutingEngine.d.ts +30 -5
- package/dist/cjs/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/RoutingEngine.js +330 -80
- package/dist/cjs/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/core/SessionManager.js.map +1 -0
- package/dist/{src → cjs}/core/Step.d.ts +31 -10
- package/dist/cjs/core/Step.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/Step.js +105 -10
- package/dist/cjs/core/Step.js.map +1 -0
- package/dist/cjs/core/ToolManager.js.map +1 -0
- package/dist/{src → cjs}/index.d.ts +4 -1
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/{src/index.js → index.js} +12 -1
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/{src/providers → providers}/AnthropicProvider.js +18 -18
- package/dist/cjs/providers/AnthropicProvider.js.map +1 -0
- package/dist/{src → cjs}/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/{src/providers → providers}/GeminiProvider.js +123 -51
- package/dist/cjs/providers/GeminiProvider.js.map +1 -0
- package/dist/cjs/{src/providers → providers}/OpenAIProvider.js +19 -19
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -0
- package/dist/cjs/{src/providers → providers}/OpenRouterProvider.js +19 -19
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -0
- package/dist/cjs/providers/index.js.map +1 -0
- package/dist/cjs/{src/types → types}/agent.d.ts +15 -3
- package/dist/cjs/types/agent.d.ts.map +1 -0
- package/dist/cjs/types/agent.js.map +1 -0
- package/dist/{src → cjs}/types/ai.js.map +1 -1
- package/dist/cjs/types/history.js.map +1 -0
- package/dist/cjs/{src/types → types}/index.d.ts +2 -1
- package/dist/{src → cjs}/types/index.d.ts.map +1 -1
- package/dist/cjs/{src/types → types}/index.js +6 -1
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/persistence.js.map +1 -0
- package/dist/cjs/{src/types → types}/route.d.ts +111 -12
- package/dist/cjs/types/route.d.ts.map +1 -0
- package/dist/cjs/{src/types → types}/route.js.map +1 -1
- package/dist/cjs/types/session.js.map +1 -0
- package/dist/cjs/types/template.d.ts +88 -0
- package/dist/cjs/types/template.d.ts.map +1 -0
- package/dist/cjs/types/tool.js.map +1 -0
- package/dist/cjs/utils/clone.js.map +1 -0
- package/dist/cjs/utils/condition.d.ts +38 -0
- package/dist/cjs/utils/condition.d.ts.map +1 -0
- package/dist/cjs/utils/condition.js +168 -0
- package/dist/cjs/utils/condition.js.map +1 -0
- package/dist/cjs/utils/event.js.map +1 -0
- package/dist/cjs/utils/history.js.map +1 -0
- package/dist/cjs/utils/id.js.map +1 -0
- package/dist/cjs/{src/utils → utils}/index.d.ts +3 -1
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/{src/utils → utils}/index.js +12 -1
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/json.d.ts +16 -0
- package/dist/cjs/utils/json.d.ts.map +1 -0
- package/dist/cjs/utils/json.js +47 -0
- package/dist/cjs/utils/json.js.map +1 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/{src → cjs}/utils/retry.d.ts +0 -3
- package/dist/cjs/utils/retry.d.ts.map +1 -0
- package/dist/cjs/{src/utils → utils}/retry.js +8 -7
- package/dist/cjs/utils/retry.js.map +1 -0
- package/dist/cjs/utils/session.js.map +1 -0
- package/dist/{src → cjs}/utils/template.d.ts +48 -0
- package/dist/cjs/utils/template.d.ts.map +1 -0
- package/dist/cjs/{src/utils → utils}/template.js +100 -0
- package/dist/cjs/utils/template.js.map +1 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/{src/core → core}/Agent.d.ts +16 -1
- package/dist/core/Agent.d.ts.map +1 -0
- package/dist/{src/core → core}/Agent.js +64 -3
- package/dist/core/Agent.js.map +1 -0
- package/dist/core/BatchExecutor.d.ts +353 -0
- package/dist/core/BatchExecutor.d.ts.map +1 -0
- package/dist/core/BatchExecutor.js +845 -0
- package/dist/core/BatchExecutor.js.map +1 -0
- package/dist/core/BatchPromptBuilder.d.ts +86 -0
- package/dist/core/BatchPromptBuilder.d.ts.map +1 -0
- package/dist/core/BatchPromptBuilder.js +213 -0
- package/dist/core/BatchPromptBuilder.js.map +1 -0
- package/dist/core/Events.d.ts.map +1 -0
- package/dist/core/Events.js.map +1 -0
- package/dist/core/PersistenceManager.d.ts.map +1 -0
- package/dist/core/PersistenceManager.js.map +1 -0
- package/dist/{cjs/src/core → core}/PromptComposer.d.ts +1 -1
- package/dist/core/PromptComposer.d.ts.map +1 -0
- package/dist/{src/core → core}/PromptComposer.js +45 -8
- package/dist/core/PromptComposer.js.map +1 -0
- package/dist/core/ResponseEngine.d.ts.map +1 -0
- package/dist/core/ResponseEngine.js +207 -0
- package/dist/core/ResponseEngine.js.map +1 -0
- package/dist/{cjs/src/core → core}/ResponseModal.d.ts +45 -0
- package/dist/core/ResponseModal.d.ts.map +1 -0
- package/dist/{src/core → core}/ResponseModal.js +752 -74
- package/dist/core/ResponseModal.js.map +1 -0
- package/dist/{cjs/src/core → core}/ResponsePipeline.d.ts +2 -2
- package/dist/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/{src/core → core}/ResponsePipeline.js +13 -6
- package/dist/core/ResponsePipeline.js.map +1 -0
- package/dist/{cjs/src/core → core}/Route.d.ts +34 -5
- package/dist/core/Route.d.ts.map +1 -0
- package/dist/{src/core → core}/Route.js +195 -18
- package/dist/core/Route.js.map +1 -0
- package/dist/{src/core → core}/RoutingEngine.d.ts +30 -5
- package/dist/core/RoutingEngine.d.ts.map +1 -0
- package/dist/{src/core → core}/RoutingEngine.js +310 -60
- package/dist/core/RoutingEngine.js.map +1 -0
- package/dist/core/SessionManager.d.ts.map +1 -0
- package/dist/core/SessionManager.js.map +1 -0
- package/dist/{cjs/src/core → core}/Step.d.ts +31 -10
- package/dist/core/Step.d.ts.map +1 -0
- package/dist/{src/core → core}/Step.js +104 -9
- package/dist/core/Step.js.map +1 -0
- package/dist/core/ToolManager.d.ts.map +1 -0
- package/dist/core/ToolManager.js.map +1 -0
- package/dist/{cjs/src/index.d.ts → index.d.ts} +4 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/{src/index.js → index.js} +3 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/AnthropicProvider.js +17 -17
- package/dist/providers/AnthropicProvider.js.map +1 -0
- package/dist/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/GeminiProvider.js +123 -51
- package/dist/providers/GeminiProvider.js.map +1 -0
- package/dist/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/OpenAIProvider.js +18 -18
- package/dist/providers/OpenAIProvider.js.map +1 -0
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/OpenRouterProvider.js +18 -18
- package/dist/providers/OpenRouterProvider.js.map +1 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/{src/types → types}/agent.d.ts +15 -3
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/ai.d.ts.map +1 -0
- package/dist/types/ai.js.map +1 -0
- package/dist/types/history.d.ts.map +1 -0
- package/dist/types/history.js.map +1 -0
- package/dist/{src/types → types}/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -0
- package/dist/{src/types → types}/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/persistence.d.ts.map +1 -0
- package/dist/types/persistence.js.map +1 -0
- package/dist/{src/types → types}/route.d.ts +111 -12
- package/dist/types/route.d.ts.map +1 -0
- package/dist/{src/types → types}/route.js.map +1 -1
- package/dist/types/routing.d.ts.map +1 -0
- package/dist/{cjs/src/types → types}/routing.js.map +1 -1
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/{cjs/src/types → types}/schema.js.map +1 -1
- package/dist/types/session.d.ts.map +1 -0
- package/dist/{src/types → types}/session.js.map +1 -1
- package/dist/types/template.d.ts +88 -0
- package/dist/types/template.d.ts.map +1 -0
- package/dist/{cjs/src/types → types}/template.js.map +1 -1
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/utils/clone.d.ts.map +1 -0
- package/dist/utils/clone.js.map +1 -0
- package/dist/utils/condition.d.ts +38 -0
- package/dist/utils/condition.d.ts.map +1 -0
- package/dist/utils/condition.js +161 -0
- package/dist/utils/condition.js.map +1 -0
- package/dist/utils/event.d.ts.map +1 -0
- package/dist/utils/event.js.map +1 -0
- package/dist/utils/history.d.ts.map +1 -0
- package/dist/utils/history.js.map +1 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/{src/utils → utils}/index.d.ts +3 -1
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/{src/utils → utils}/index.js +5 -1
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json.d.ts +16 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +43 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/{cjs/src/utils → utils}/retry.d.ts +0 -3
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/{src/utils → utils}/retry.js +5 -4
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/session.d.ts.map +1 -0
- package/dist/utils/session.js.map +1 -0
- package/dist/{cjs/src/utils → utils}/template.d.ts +48 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/{src/utils → utils}/template.js +98 -0
- package/dist/utils/template.js.map +1 -0
- package/docs/README.md +1 -0
- package/docs/api/README.md +237 -12
- package/docs/api/overview.md +206 -3
- package/docs/architecture/data-extraction-flow.md +363 -0
- package/docs/architecture/multi-step-execution.md +243 -0
- package/docs/core/agent/README.md +156 -5
- package/docs/core/agent/rules-and-prohibitions.md +113 -0
- package/docs/core/agent/session-management.md +1 -1
- package/docs/core/ai-integration/prompt-composition.md +135 -0
- package/docs/core/ai-integration/response-processing.md +146 -0
- package/docs/core/conversation-flows/data-collection.md +143 -0
- package/docs/core/conversation-flows/routes.md +2 -2
- package/docs/core/conversation-flows/step-transitions.md +132 -0
- package/docs/core/conversation-flows/steps.md +112 -0
- package/docs/core/error-handling.md +193 -0
- package/docs/core/routing/intelligent-routing.md +118 -0
- package/docs/guides/getting-started/README.md +284 -3
- package/docs/guides/migration/README.md +27 -0
- package/docs/guides/migration/flexible-routing-conditions.md +375 -0
- package/docs/guides/migration/multi-step-execution.md +373 -0
- package/examples/advanced-patterns/knowledge-based-agent.ts +101 -24
- package/examples/advanced-patterns/persistent-onboarding.ts +40 -5
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +82 -12
- package/examples/advanced-patterns/streaming-responses.ts +2 -2
- package/examples/ai-providers/anthropic-integration.ts +4 -4
- package/examples/ai-providers/openai-integration.ts +1 -1
- package/examples/condition-patterns/function-only-conditions.ts +365 -0
- package/examples/condition-patterns/mixed-array-conditions.ts +477 -0
- package/examples/condition-patterns/route-skipif-patterns.ts +468 -0
- package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
- package/examples/condition-patterns/string-only-conditions.ts +296 -0
- package/examples/conversation-flows/completion-transitions.ts +48 -7
- package/examples/core-concepts/basic-agent.ts +54 -33
- package/examples/core-concepts/schema-driven-extraction.ts +33 -9
- package/examples/core-concepts/session-management.ts +51 -16
- package/examples/integrations/database-integration.ts +6 -6
- package/examples/integrations/healthcare-integration.ts +10 -10
- package/examples/integrations/search-integration.ts +8 -8
- package/examples/integrations/server-session-management.ts +8 -8
- package/examples/persistence/database-persistence.ts +15 -15
- package/examples/persistence/memory-sessions.ts +3 -3
- package/examples/persistence/redis-persistence.ts +7 -9
- package/examples/tools/data-enrichment-tools.ts +4 -4
- package/package.json +6 -4
- package/src/adapters/PrismaAdapter.ts +3 -2
- package/src/adapters/RedisAdapter.ts +3 -3
- package/src/core/Agent.ts +78 -2
- package/src/core/BatchExecutor.ts +1166 -0
- package/src/core/BatchPromptBuilder.ts +293 -0
- package/src/core/PromptComposer.ts +53 -16
- package/src/core/ResponseEngine.ts +168 -29
- package/src/core/ResponseModal.ts +954 -74
- package/src/core/ResponsePipeline.ts +17 -9
- package/src/core/Route.ts +223 -22
- package/src/core/RoutingEngine.ts +426 -83
- package/src/core/Step.ts +144 -16
- package/src/index.ts +19 -0
- package/src/providers/AnthropicProvider.ts +17 -17
- package/src/providers/GeminiProvider.ts +129 -60
- package/src/providers/OpenAIProvider.ts +18 -18
- package/src/providers/OpenRouterProvider.ts +18 -18
- package/src/types/agent.ts +15 -3
- package/src/types/index.ts +12 -1
- package/src/types/route.ts +131 -12
- package/src/types/template.ts +70 -2
- package/src/utils/condition.ts +190 -0
- package/src/utils/index.ts +12 -0
- package/src/utils/json.ts +46 -0
- package/src/utils/retry.ts +5 -4
- package/src/utils/template.ts +109 -0
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/MemoryAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/MongoAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/PrismaAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/RedisAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/index.d.ts.map +0 -1
- package/dist/cjs/src/adapters/index.js.map +0 -1
- package/dist/cjs/src/constants/index.d.ts.map +0 -1
- package/dist/cjs/src/constants/index.js.map +0 -1
- package/dist/cjs/src/core/Agent.d.ts.map +0 -1
- package/dist/cjs/src/core/Agent.js.map +0 -1
- package/dist/cjs/src/core/Events.d.ts.map +0 -1
- package/dist/cjs/src/core/Events.js.map +0 -1
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +0 -1
- package/dist/cjs/src/core/PersistenceManager.js.map +0 -1
- package/dist/cjs/src/core/PromptComposer.d.ts.map +0 -1
- package/dist/cjs/src/core/PromptComposer.js.map +0 -1
- package/dist/cjs/src/core/ResponseEngine.d.ts.map +0 -1
- package/dist/cjs/src/core/ResponseEngine.js +0 -84
- package/dist/cjs/src/core/ResponseEngine.js.map +0 -1
- package/dist/cjs/src/core/ResponseModal.d.ts.map +0 -1
- package/dist/cjs/src/core/ResponseModal.js.map +0 -1
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +0 -1
- package/dist/cjs/src/core/ResponsePipeline.js.map +0 -1
- package/dist/cjs/src/core/Route.d.ts.map +0 -1
- package/dist/cjs/src/core/Route.js.map +0 -1
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/src/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/src/core/SessionManager.d.ts.map +0 -1
- package/dist/cjs/src/core/SessionManager.js.map +0 -1
- package/dist/cjs/src/core/Step.d.ts.map +0 -1
- package/dist/cjs/src/core/Step.js.map +0 -1
- package/dist/cjs/src/core/ToolManager.d.ts.map +0 -1
- package/dist/cjs/src/core/ToolManager.js.map +0 -1
- package/dist/cjs/src/index.d.ts.map +0 -1
- package/dist/cjs/src/index.js.map +0 -1
- package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/AnthropicProvider.js.map +0 -1
- package/dist/cjs/src/providers/GeminiProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/GeminiProvider.js.map +0 -1
- package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/OpenAIProvider.js.map +0 -1
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/OpenRouterProvider.js.map +0 -1
- package/dist/cjs/src/providers/index.d.ts.map +0 -1
- package/dist/cjs/src/providers/index.js.map +0 -1
- package/dist/cjs/src/types/agent.d.ts.map +0 -1
- package/dist/cjs/src/types/agent.js.map +0 -1
- package/dist/cjs/src/types/ai.d.ts.map +0 -1
- package/dist/cjs/src/types/ai.js.map +0 -1
- package/dist/cjs/src/types/history.d.ts.map +0 -1
- package/dist/cjs/src/types/history.js.map +0 -1
- package/dist/cjs/src/types/index.d.ts.map +0 -1
- package/dist/cjs/src/types/index.js.map +0 -1
- package/dist/cjs/src/types/persistence.d.ts.map +0 -1
- package/dist/cjs/src/types/persistence.js.map +0 -1
- package/dist/cjs/src/types/route.d.ts.map +0 -1
- package/dist/cjs/src/types/routing.d.ts.map +0 -1
- package/dist/cjs/src/types/schema.d.ts.map +0 -1
- package/dist/cjs/src/types/session.d.ts.map +0 -1
- package/dist/cjs/src/types/session.js.map +0 -1
- package/dist/cjs/src/types/template.d.ts +0 -30
- package/dist/cjs/src/types/template.d.ts.map +0 -1
- package/dist/cjs/src/types/tool.d.ts.map +0 -1
- package/dist/cjs/src/types/tool.js.map +0 -1
- package/dist/cjs/src/utils/clone.d.ts.map +0 -1
- package/dist/cjs/src/utils/clone.js.map +0 -1
- package/dist/cjs/src/utils/event.d.ts.map +0 -1
- package/dist/cjs/src/utils/event.js.map +0 -1
- package/dist/cjs/src/utils/history.d.ts.map +0 -1
- package/dist/cjs/src/utils/history.js.map +0 -1
- package/dist/cjs/src/utils/id.d.ts.map +0 -1
- package/dist/cjs/src/utils/id.js.map +0 -1
- package/dist/cjs/src/utils/index.d.ts.map +0 -1
- package/dist/cjs/src/utils/index.js.map +0 -1
- package/dist/cjs/src/utils/logger.d.ts.map +0 -1
- package/dist/cjs/src/utils/logger.js.map +0 -1
- package/dist/cjs/src/utils/retry.d.ts.map +0 -1
- package/dist/cjs/src/utils/retry.js.map +0 -1
- package/dist/cjs/src/utils/session.d.ts.map +0 -1
- package/dist/cjs/src/utils/session.js.map +0 -1
- package/dist/cjs/src/utils/template.d.ts.map +0 -1
- package/dist/cjs/src/utils/template.js.map +0 -1
- package/dist/src/adapters/MemoryAdapter.js.map +0 -1
- package/dist/src/adapters/MongoAdapter.js.map +0 -1
- package/dist/src/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/src/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/src/adapters/PrismaAdapter.js.map +0 -1
- package/dist/src/adapters/RedisAdapter.js.map +0 -1
- package/dist/src/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/src/adapters/index.js.map +0 -1
- package/dist/src/constants/index.js.map +0 -1
- package/dist/src/core/Agent.d.ts.map +0 -1
- package/dist/src/core/Agent.js.map +0 -1
- package/dist/src/core/Events.js.map +0 -1
- package/dist/src/core/PersistenceManager.js.map +0 -1
- package/dist/src/core/PromptComposer.d.ts.map +0 -1
- package/dist/src/core/PromptComposer.js.map +0 -1
- package/dist/src/core/ResponseEngine.js +0 -80
- package/dist/src/core/ResponseEngine.js.map +0 -1
- package/dist/src/core/ResponseModal.d.ts.map +0 -1
- package/dist/src/core/ResponseModal.js.map +0 -1
- package/dist/src/core/ResponsePipeline.d.ts.map +0 -1
- package/dist/src/core/ResponsePipeline.js.map +0 -1
- package/dist/src/core/Route.d.ts.map +0 -1
- package/dist/src/core/Route.js.map +0 -1
- package/dist/src/core/RoutingEngine.d.ts.map +0 -1
- package/dist/src/core/RoutingEngine.js.map +0 -1
- package/dist/src/core/SessionManager.js.map +0 -1
- package/dist/src/core/Step.d.ts.map +0 -1
- package/dist/src/core/Step.js.map +0 -1
- package/dist/src/core/ToolManager.js.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/providers/AnthropicProvider.js.map +0 -1
- package/dist/src/providers/GeminiProvider.js.map +0 -1
- package/dist/src/providers/OpenAIProvider.js.map +0 -1
- package/dist/src/providers/OpenRouterProvider.js.map +0 -1
- package/dist/src/providers/index.js.map +0 -1
- package/dist/src/types/agent.d.ts.map +0 -1
- package/dist/src/types/agent.js.map +0 -1
- package/dist/src/types/history.js.map +0 -1
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/types/persistence.js.map +0 -1
- package/dist/src/types/route.d.ts.map +0 -1
- package/dist/src/types/template.d.ts +0 -30
- package/dist/src/types/template.d.ts.map +0 -1
- package/dist/src/types/tool.js.map +0 -1
- package/dist/src/utils/clone.js.map +0 -1
- package/dist/src/utils/event.js.map +0 -1
- package/dist/src/utils/history.js.map +0 -1
- package/dist/src/utils/id.js.map +0 -1
- package/dist/src/utils/index.d.ts.map +0 -1
- package/dist/src/utils/index.js.map +0 -1
- package/dist/src/utils/logger.js.map +0 -1
- package/dist/src/utils/retry.d.ts.map +0 -1
- package/dist/src/utils/retry.js.map +0 -1
- package/dist/src/utils/session.js.map +0 -1
- package/dist/src/utils/template.d.ts.map +0 -1
- package/dist/src/utils/template.js.map +0 -1
- /package/dist/{cjs/src/adapters → adapters}/MemoryAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/MemoryAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/MongoAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/MongoAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/OpenSearchAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/PostgreSQLAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/PrismaAdapter.d.ts +0 -0
- /package/dist/{cjs/src/adapters → adapters}/RedisAdapter.d.ts +0 -0
- /package/dist/{cjs/src/adapters → adapters}/SQLiteAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/index.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/index.js +0 -0
- /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/MemoryAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/MongoAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/PrismaAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts.map +0 -0
- /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/index.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/index.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/index.js +0 -0
- /package/dist/cjs/{src/constants → constants}/index.d.ts +0 -0
- /package/dist/{src → cjs}/constants/index.d.ts.map +0 -0
- /package/dist/cjs/{src/constants → constants}/index.js +0 -0
- /package/dist/cjs/{src/core → core}/Events.d.ts +0 -0
- /package/dist/{src → cjs}/core/Events.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/Events.js +0 -0
- /package/dist/cjs/{src/core → core}/PersistenceManager.d.ts +0 -0
- /package/dist/{src → cjs}/core/PersistenceManager.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/PersistenceManager.js +0 -0
- /package/dist/cjs/{src/core → core}/ResponseEngine.d.ts +0 -0
- /package/dist/cjs/{src/core → core}/SessionManager.d.ts +0 -0
- /package/dist/{src → cjs}/core/SessionManager.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/SessionManager.js +0 -0
- /package/dist/cjs/{src/core → core}/ToolManager.d.ts +0 -0
- /package/dist/{src → cjs}/core/ToolManager.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/ToolManager.js +0 -0
- /package/dist/cjs/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
- /package/dist/{src → cjs}/providers/AnthropicProvider.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/GeminiProvider.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
- /package/dist/{src → cjs}/providers/OpenAIProvider.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
- /package/dist/{src → cjs}/providers/OpenRouterProvider.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/index.d.ts +0 -0
- /package/dist/{src → cjs}/providers/index.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/index.js +0 -0
- /package/dist/cjs/{src/types → types}/agent.js +0 -0
- /package/dist/cjs/{src/types → types}/ai.d.ts +0 -0
- /package/dist/{src → cjs}/types/ai.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/ai.js +0 -0
- /package/dist/cjs/{src/types → types}/history.d.ts +0 -0
- /package/dist/{src → cjs}/types/history.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/history.js +0 -0
- /package/dist/cjs/{src/types → types}/persistence.d.ts +0 -0
- /package/dist/{src → cjs}/types/persistence.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/persistence.js +0 -0
- /package/dist/cjs/{src/types → types}/route.js +0 -0
- /package/dist/cjs/{src/types → types}/routing.d.ts +0 -0
- /package/dist/{src → cjs}/types/routing.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/routing.js +0 -0
- /package/dist/{src → cjs}/types/routing.js.map +0 -0
- /package/dist/cjs/{src/types → types}/schema.d.ts +0 -0
- /package/dist/{src → cjs}/types/schema.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/schema.js +0 -0
- /package/dist/{src → cjs}/types/schema.js.map +0 -0
- /package/dist/cjs/{src/types → types}/session.d.ts +0 -0
- /package/dist/{src → cjs}/types/session.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/session.js +0 -0
- /package/dist/cjs/{src/types → types}/template.js +0 -0
- /package/dist/{src → cjs}/types/template.js.map +0 -0
- /package/dist/cjs/{src/types → types}/tool.d.ts +0 -0
- /package/dist/{src → cjs}/types/tool.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/tool.js +0 -0
- /package/dist/cjs/{src/utils → utils}/clone.d.ts +0 -0
- /package/dist/{src → cjs}/utils/clone.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/clone.js +0 -0
- /package/dist/cjs/{src/utils → utils}/event.d.ts +0 -0
- /package/dist/{src → cjs}/utils/event.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/event.js +0 -0
- /package/dist/cjs/{src/utils → utils}/history.d.ts +0 -0
- /package/dist/{src → cjs}/utils/history.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/history.js +0 -0
- /package/dist/cjs/{src/utils → utils}/id.d.ts +0 -0
- /package/dist/{src → cjs}/utils/id.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/id.js +0 -0
- /package/dist/cjs/{src/utils → utils}/logger.d.ts +0 -0
- /package/dist/{src → cjs}/utils/logger.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/logger.js +0 -0
- /package/dist/cjs/{src/utils → utils}/session.d.ts +0 -0
- /package/dist/{src → cjs}/utils/session.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/session.js +0 -0
- /package/dist/{src/constants → constants}/index.d.ts +0 -0
- /package/dist/{src/constants → constants}/index.js +0 -0
- /package/dist/{src/core → core}/Events.d.ts +0 -0
- /package/dist/{src/core → core}/Events.js +0 -0
- /package/dist/{src/core → core}/PersistenceManager.d.ts +0 -0
- /package/dist/{src/core → core}/PersistenceManager.js +0 -0
- /package/dist/{src/core → core}/ResponseEngine.d.ts +0 -0
- /package/dist/{src/core → core}/SessionManager.d.ts +0 -0
- /package/dist/{src/core → core}/SessionManager.js +0 -0
- /package/dist/{src/core → core}/ToolManager.d.ts +0 -0
- /package/dist/{src/core → core}/ToolManager.js +0 -0
- /package/dist/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/GeminiProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/index.d.ts +0 -0
- /package/dist/{src/providers → providers}/index.js +0 -0
- /package/dist/{src/types → types}/agent.js +0 -0
- /package/dist/{src/types → types}/ai.d.ts +0 -0
- /package/dist/{src/types → types}/ai.js +0 -0
- /package/dist/{src/types → types}/history.d.ts +0 -0
- /package/dist/{src/types → types}/history.js +0 -0
- /package/dist/{src/types → types}/persistence.d.ts +0 -0
- /package/dist/{src/types → types}/persistence.js +0 -0
- /package/dist/{src/types → types}/route.js +0 -0
- /package/dist/{src/types → types}/routing.d.ts +0 -0
- /package/dist/{src/types → types}/routing.js +0 -0
- /package/dist/{src/types → types}/schema.d.ts +0 -0
- /package/dist/{src/types → types}/schema.js +0 -0
- /package/dist/{src/types → types}/session.d.ts +0 -0
- /package/dist/{src/types → types}/session.js +0 -0
- /package/dist/{src/types → types}/template.js +0 -0
- /package/dist/{src/types → types}/tool.d.ts +0 -0
- /package/dist/{src/types → types}/tool.js +0 -0
- /package/dist/{src/utils → utils}/clone.d.ts +0 -0
- /package/dist/{src/utils → utils}/clone.js +0 -0
- /package/dist/{src/utils → utils}/event.d.ts +0 -0
- /package/dist/{src/utils → utils}/event.js +0 -0
- /package/dist/{src/utils → utils}/history.d.ts +0 -0
- /package/dist/{src/utils → utils}/history.js +0 -0
- /package/dist/{src/utils → utils}/id.d.ts +0 -0
- /package/dist/{src/utils → utils}/id.js +0 -0
- /package/dist/{src/utils → utils}/logger.d.ts +0 -0
- /package/dist/{src/utils → utils}/logger.js +0 -0
- /package/dist/{src/utils → utils}/session.d.ts +0 -0
- /package/dist/{src/utils → utils}/session.js +0 -0
package/src/types/agent.ts
CHANGED
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
import type { AgentStructuredResponse, AiProvider } from "./ai";
|
|
6
6
|
import type { Tool } from "./tool";
|
|
7
|
-
import type { RouteOptions } from "./route";
|
|
7
|
+
import type { RouteOptions, StepRef, StoppedReason } from "./route";
|
|
8
8
|
import type { PersistenceConfig } from "./persistence";
|
|
9
9
|
import type { SessionState } from "./session";
|
|
10
10
|
import type { StructuredSchema } from "./schema";
|
|
11
|
-
import { Template } from "./template";
|
|
11
|
+
import { Template, ConditionTemplate } from "./template";
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Composition mode determines how the agent processes and structures responses
|
|
@@ -106,6 +106,10 @@ export interface AgentOptions<TContext = unknown, TData = unknown> {
|
|
|
106
106
|
persistence?: PersistenceConfig<TData>;
|
|
107
107
|
/** Knowledge base containing any JSON structure the AI should know */
|
|
108
108
|
knowledgeBase?: Record<string, unknown>;
|
|
109
|
+
/** Absolute rules the agent must follow across all routes */
|
|
110
|
+
rules?: Template<TContext, TData>[];
|
|
111
|
+
/** Absolute prohibitions the agent must never do across all routes */
|
|
112
|
+
prohibitions?: Template<TContext, TData>[];
|
|
109
113
|
/** Agent-level data schema defining the complete data structure for collection */
|
|
110
114
|
schema?: StructuredSchema;
|
|
111
115
|
/** Initial data to pre-populate when creating the agent */
|
|
@@ -131,7 +135,7 @@ export interface Guideline<TContext = unknown, TData = unknown> {
|
|
|
131
135
|
/** Unique identifier */
|
|
132
136
|
id?: string;
|
|
133
137
|
/** Condition that triggers this guideline (optional for always-active guidelines) */
|
|
134
|
-
condition?:
|
|
138
|
+
condition?: ConditionTemplate<TContext, TData>;
|
|
135
139
|
/** Action the agent should take when the condition is met */
|
|
136
140
|
action: Template<TContext, TData>;
|
|
137
141
|
/** Whether this guideline is currently enabled */
|
|
@@ -157,6 +161,10 @@ export interface AgentResponse<TData = Record<string, unknown>> {
|
|
|
157
161
|
session?: SessionState<TData>;
|
|
158
162
|
toolCalls?: Array<{ toolName: string; arguments: Record<string, unknown> }>;
|
|
159
163
|
isRouteComplete?: boolean;
|
|
164
|
+
/** Steps executed in this response (for multi-step execution) */
|
|
165
|
+
executedSteps?: StepRef[];
|
|
166
|
+
/** Why execution stopped (for multi-step execution) */
|
|
167
|
+
stoppedReason?: StoppedReason;
|
|
160
168
|
}
|
|
161
169
|
|
|
162
170
|
export interface AgentResponseStreamChunk<TData = Record<string, unknown>> {
|
|
@@ -166,6 +174,10 @@ export interface AgentResponseStreamChunk<TData = Record<string, unknown>> {
|
|
|
166
174
|
session?: SessionState<TData>;
|
|
167
175
|
toolCalls?: Array<{ toolName: string; arguments: Record<string, unknown> }>;
|
|
168
176
|
isRouteComplete?: boolean;
|
|
177
|
+
/** Steps executed in this response (for multi-step execution) */
|
|
178
|
+
executedSteps?: StepRef[];
|
|
179
|
+
/** Why execution stopped (for multi-step execution) */
|
|
180
|
+
stoppedReason?: StoppedReason;
|
|
169
181
|
metadata?: {
|
|
170
182
|
model?: string;
|
|
171
183
|
tokensUsed?: number;
|
package/src/types/index.ts
CHANGED
|
@@ -105,4 +105,15 @@ export type {
|
|
|
105
105
|
export * from "./persistence";
|
|
106
106
|
|
|
107
107
|
// Template types
|
|
108
|
-
export type {
|
|
108
|
+
export type {
|
|
109
|
+
Template,
|
|
110
|
+
TemplateContext,
|
|
111
|
+
ConditionTemplate,
|
|
112
|
+
ConditionEvaluationResult
|
|
113
|
+
} from "./template";
|
|
114
|
+
export {
|
|
115
|
+
ConditionEvaluator,
|
|
116
|
+
createConditionEvaluator,
|
|
117
|
+
extractAIContextStrings,
|
|
118
|
+
hasProgrammaticConditions
|
|
119
|
+
} from "../utils/condition";
|
package/src/types/route.ts
CHANGED
|
@@ -4,7 +4,79 @@
|
|
|
4
4
|
|
|
5
5
|
import type { Tool } from "./tool";
|
|
6
6
|
import type { StructuredSchema } from "./schema";
|
|
7
|
-
import {
|
|
7
|
+
import type { Guideline, Term } from "./agent";
|
|
8
|
+
import { Template, ConditionTemplate } from "./template";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Reason why batch execution stopped
|
|
12
|
+
* Used to indicate the stopping condition for multi-step execution
|
|
13
|
+
*/
|
|
14
|
+
export type StoppedReason =
|
|
15
|
+
| 'needs_input' // Step requires uncollected data
|
|
16
|
+
| 'end_route' // Reached END_ROUTE
|
|
17
|
+
| 'route_complete' // All Steps processed
|
|
18
|
+
| 'prepare_error' // Error in prepare hook
|
|
19
|
+
| 'llm_error' // Error during LLM call
|
|
20
|
+
| 'validation_error' // Error validating collected data
|
|
21
|
+
| 'finalize_error'; // Error in finalize hook (non-fatal, logged)
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Event types for batch execution observability
|
|
25
|
+
*/
|
|
26
|
+
export type BatchExecutionEventType =
|
|
27
|
+
| 'batch_start'
|
|
28
|
+
| 'step_included'
|
|
29
|
+
| 'step_skipped'
|
|
30
|
+
| 'batch_stop'
|
|
31
|
+
| 'batch_complete';
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Event emitted during batch execution for debugging and observability
|
|
35
|
+
*
|
|
36
|
+
* **Validates: Requirements 11.3**
|
|
37
|
+
*/
|
|
38
|
+
export interface BatchExecutionEvent {
|
|
39
|
+
/** Type of batch execution event */
|
|
40
|
+
type: BatchExecutionEventType;
|
|
41
|
+
/** Timestamp when the event occurred */
|
|
42
|
+
timestamp: Date;
|
|
43
|
+
/** Event-specific details */
|
|
44
|
+
details: {
|
|
45
|
+
/** Step ID related to this event (for step_included, step_skipped) */
|
|
46
|
+
stepId?: string;
|
|
47
|
+
/** Reason for the event (e.g., why step was skipped or batch stopped) */
|
|
48
|
+
reason?: string;
|
|
49
|
+
/** Current batch size (for batch_start, batch_complete) */
|
|
50
|
+
batchSize?: number;
|
|
51
|
+
/** Stopped reason (for batch_stop, batch_complete) */
|
|
52
|
+
stoppedReason?: StoppedReason;
|
|
53
|
+
/** Phase timing information (for batch_complete) */
|
|
54
|
+
timing?: BatchExecutionTiming;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Timing information for batch execution phases
|
|
60
|
+
*/
|
|
61
|
+
export interface BatchExecutionTiming {
|
|
62
|
+
/** Total batch execution time in milliseconds */
|
|
63
|
+
totalMs: number;
|
|
64
|
+
/** Time spent in batch determination phase */
|
|
65
|
+
determinationMs?: number;
|
|
66
|
+
/** Time spent executing prepare hooks */
|
|
67
|
+
prepareHooksMs?: number;
|
|
68
|
+
/** Time spent in LLM call */
|
|
69
|
+
llmCallMs?: number;
|
|
70
|
+
/** Time spent collecting data */
|
|
71
|
+
dataCollectionMs?: number;
|
|
72
|
+
/** Time spent executing finalize hooks */
|
|
73
|
+
finalizeHooksMs?: number;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Callback type for batch execution event listeners
|
|
78
|
+
*/
|
|
79
|
+
export type BatchExecutionEventListener = (event: BatchExecutionEvent) => void;
|
|
8
80
|
|
|
9
81
|
/**
|
|
10
82
|
* Reference to a route
|
|
@@ -25,9 +97,52 @@ export interface StepRef {
|
|
|
25
97
|
}
|
|
26
98
|
|
|
27
99
|
/**
|
|
28
|
-
*
|
|
100
|
+
* Result of batch determination - which steps can execute together
|
|
101
|
+
* @template TContext - Type of context data
|
|
102
|
+
* @template TData - Type of collected data
|
|
29
103
|
*/
|
|
30
|
-
|
|
104
|
+
export interface BatchResult<TContext = unknown, TData = unknown> {
|
|
105
|
+
/** Steps included in this batch */
|
|
106
|
+
steps: StepOptions<TContext, TData>[];
|
|
107
|
+
/** Why the batch stopped */
|
|
108
|
+
stoppedReason: StoppedReason;
|
|
109
|
+
/** The Step that caused the stop (if applicable) */
|
|
110
|
+
stoppedAtStep?: StepOptions<TContext, TData>;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Error details for batch execution failures
|
|
115
|
+
*/
|
|
116
|
+
export interface BatchExecutionError {
|
|
117
|
+
/** Type of error that occurred */
|
|
118
|
+
type: 'pre_extraction' | 'skipif_evaluation' | 'prepare_hook' |
|
|
119
|
+
'llm_call' | 'data_validation' | 'finalize_hook';
|
|
120
|
+
/** Error message */
|
|
121
|
+
message: string;
|
|
122
|
+
/** Step where error occurred (if applicable) */
|
|
123
|
+
stepId?: string;
|
|
124
|
+
/** Additional error details */
|
|
125
|
+
details?: unknown;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Result of executing a batch of steps
|
|
130
|
+
* @template TData - Type of collected data
|
|
131
|
+
*/
|
|
132
|
+
export interface BatchExecutionResult<TData = unknown> {
|
|
133
|
+
/** The generated message */
|
|
134
|
+
message: string;
|
|
135
|
+
/** Updated session state */
|
|
136
|
+
session: import('./session').SessionState<TData>;
|
|
137
|
+
/** Steps that were executed */
|
|
138
|
+
executedSteps: StepRef[];
|
|
139
|
+
/** Why execution stopped */
|
|
140
|
+
stoppedReason: StoppedReason;
|
|
141
|
+
/** Collected data from the batch */
|
|
142
|
+
collectedData?: Partial<TData>;
|
|
143
|
+
/** Any errors that occurred */
|
|
144
|
+
error?: BatchExecutionError;
|
|
145
|
+
}
|
|
31
146
|
|
|
32
147
|
/**
|
|
33
148
|
* Route lifecycle hooks for managing route-specific data and behavior
|
|
@@ -98,13 +213,15 @@ export interface RouteOptions<TContext = unknown, TData = unknown> {
|
|
|
98
213
|
/** Optional personality prompt defining the agent's communication style for this route */
|
|
99
214
|
personality?: Template<TContext, TData>;
|
|
100
215
|
/** Conditions that activate this route */
|
|
101
|
-
|
|
216
|
+
when?: ConditionTemplate<TContext, TData>;
|
|
217
|
+
/** Conditions that prevent this route from being considered */
|
|
218
|
+
skipIf?: ConditionTemplate<TContext, TData>;
|
|
102
219
|
/** Initial guidelines for this route */
|
|
103
|
-
guidelines?: Guideline<TContext>[];
|
|
220
|
+
guidelines?: Guideline<TContext, TData>[];
|
|
104
221
|
/** Initial terms for the route's domain glossary */
|
|
105
222
|
terms?: Term<TContext>[];
|
|
106
223
|
/** Tools available in this route */
|
|
107
|
-
tools?: Tool<TContext, TData>[];
|
|
224
|
+
tools?: (string | Tool<TContext, TData>)[];
|
|
108
225
|
/** Absolute rules the agent must follow in this route */
|
|
109
226
|
rules?: Template<TContext, TData>[];
|
|
110
227
|
/** Absolute prohibitions the agent must never do in this route */
|
|
@@ -216,12 +333,11 @@ export interface StepOptions<TContext = unknown, TData = unknown> {
|
|
|
216
333
|
*/
|
|
217
334
|
collect?: (keyof TData)[];
|
|
218
335
|
/**
|
|
219
|
-
*
|
|
220
|
-
* If
|
|
221
|
-
*
|
|
222
|
-
* @returns true if step should be skipped, false otherwise
|
|
336
|
+
* Condition to determine if this step should be skipped
|
|
337
|
+
* If evaluates to true, the step will be bypassed
|
|
338
|
+
* Supports strings (AI context), functions (programmatic), and arrays
|
|
223
339
|
*/
|
|
224
|
-
skipIf?:
|
|
340
|
+
skipIf?: ConditionTemplate<TContext, TData>;
|
|
225
341
|
/**
|
|
226
342
|
* Required data fields that must be present before entering this step
|
|
227
343
|
* If any required field is missing, step cannot be entered
|
|
@@ -231,8 +347,11 @@ export interface StepOptions<TContext = unknown, TData = unknown> {
|
|
|
231
347
|
/**
|
|
232
348
|
* Optional condition for this transition
|
|
233
349
|
* Description of when this transition should be taken
|
|
350
|
+
* Supports strings (AI context), functions (programmatic), and arrays
|
|
234
351
|
*/
|
|
235
|
-
when?:
|
|
352
|
+
when?: ConditionTemplate<TContext, TData>;
|
|
353
|
+
/** Initial guidelines for this step */
|
|
354
|
+
guidelines?: Guideline<TContext, TData>[];
|
|
236
355
|
}
|
|
237
356
|
|
|
238
357
|
/**
|
package/src/types/template.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SessionState } from "./session";
|
|
2
|
-
import type { Event } from "./history";
|
|
2
|
+
import type { Event, MessageRole } from "./history";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Context object passed to template functions for dynamic rendering.
|
|
@@ -24,7 +24,46 @@ export interface TemplateContext<TContext = unknown, TData = unknown> {
|
|
|
24
24
|
* The data collected in the current route.
|
|
25
25
|
* A convenience alias for `session.data`.
|
|
26
26
|
*/
|
|
27
|
-
data
|
|
27
|
+
data: Partial<TData>;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Helper methods for working with history and context.
|
|
31
|
+
*/
|
|
32
|
+
helpers: {
|
|
33
|
+
/**
|
|
34
|
+
* Get the last message from history, optionally filtered by role.
|
|
35
|
+
* @param role - Optional role to filter by (user, assistant, etc.)
|
|
36
|
+
* @returns The message content or undefined if not found
|
|
37
|
+
*/
|
|
38
|
+
getLastMessage(role?: MessageRole): string | undefined;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Get the last user message from history.
|
|
42
|
+
* @returns The user message content or undefined if not found
|
|
43
|
+
*/
|
|
44
|
+
getLastUserMessage(): string | undefined;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Get the last assistant message from history.
|
|
48
|
+
* @returns The assistant message content or undefined if not found
|
|
49
|
+
*/
|
|
50
|
+
getLastAssistantMessage(): string | undefined;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Get all messages from history, optionally filtered by role.
|
|
54
|
+
* @param role - Optional role to filter by
|
|
55
|
+
* @returns Array of message contents
|
|
56
|
+
*/
|
|
57
|
+
getMessages(role?: MessageRole): string[];
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Check if the last message contains any of the given keywords.
|
|
61
|
+
* @param keywords - Keywords to search for
|
|
62
|
+
* @param caseSensitive - Whether to perform case-sensitive search (default: false)
|
|
63
|
+
* @returns True if any keyword is found
|
|
64
|
+
*/
|
|
65
|
+
lastMessageContains(keywords: string | string[], caseSensitive?: boolean): boolean;
|
|
66
|
+
};
|
|
28
67
|
}
|
|
29
68
|
|
|
30
69
|
/**
|
|
@@ -34,3 +73,32 @@ export interface TemplateContext<TContext = unknown, TData = unknown> {
|
|
|
34
73
|
export type Template<TContext = unknown, TData = unknown> =
|
|
35
74
|
| string
|
|
36
75
|
| ((params: TemplateContext<TContext, TData>) => string | Promise<string>);
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Represents a condition that can be used for routing decisions.
|
|
79
|
+
* Supports strings (AI context only), boolean functions (programmatic evaluation),
|
|
80
|
+
* and arrays of either for complex condition logic.
|
|
81
|
+
*/
|
|
82
|
+
export type ConditionTemplate<TContext = unknown, TData = unknown> =
|
|
83
|
+
| string // AI context only - not evaluated programmatically
|
|
84
|
+
| ((params: TemplateContext<TContext, TData>) => boolean | Promise<boolean>) // Programmatic evaluation
|
|
85
|
+
| ConditionTemplate<TContext, TData>[]; // Array of either
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Result of condition evaluation containing both programmatic results
|
|
89
|
+
* and AI context strings.
|
|
90
|
+
*/
|
|
91
|
+
export interface ConditionEvaluationResult {
|
|
92
|
+
/** Result of function evaluations only */
|
|
93
|
+
programmaticResult: boolean;
|
|
94
|
+
/** String values for AI context */
|
|
95
|
+
aiContextStrings: string[];
|
|
96
|
+
/** Whether any functions were evaluated */
|
|
97
|
+
hasProgrammaticConditions: boolean;
|
|
98
|
+
/** Detailed evaluation information for debugging */
|
|
99
|
+
evaluationDetails?: {
|
|
100
|
+
condition: string;
|
|
101
|
+
result?: boolean; // Only present for functions
|
|
102
|
+
type: 'string' | 'function' | 'array';
|
|
103
|
+
}[];
|
|
104
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import type { TemplateContext, ConditionTemplate, ConditionEvaluationResult } from "../types/template";
|
|
2
|
+
import { createTemplateContext } from "./template";
|
|
3
|
+
import { logger } from './logger'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Utility class for evaluating ConditionTemplate instances.
|
|
7
|
+
* Handles mixed string/function conditions and separates programmatic
|
|
8
|
+
* evaluation from AI context collection.
|
|
9
|
+
*/
|
|
10
|
+
export class ConditionEvaluator<TContext = unknown, TData = unknown> {
|
|
11
|
+
constructor(private templateContext: TemplateContext<TContext, TData>) {}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Evaluates a condition template and returns both programmatic results
|
|
15
|
+
* and AI context strings.
|
|
16
|
+
*
|
|
17
|
+
* @param condition The condition to evaluate
|
|
18
|
+
* @param logic Logic to apply for arrays ('AND' for when conditions, 'OR' for skipIf)
|
|
19
|
+
* @returns Evaluation result with programmatic result and AI context
|
|
20
|
+
*/
|
|
21
|
+
async evaluateCondition(
|
|
22
|
+
condition: ConditionTemplate<TContext, TData>,
|
|
23
|
+
logic: 'AND' | 'OR' = 'AND'
|
|
24
|
+
): Promise<ConditionEvaluationResult> {
|
|
25
|
+
const result: ConditionEvaluationResult = {
|
|
26
|
+
programmaticResult: logic === 'AND' ? true : false,
|
|
27
|
+
aiContextStrings: [],
|
|
28
|
+
hasProgrammaticConditions: false,
|
|
29
|
+
evaluationDetails: []
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
if (!condition) {
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Handle array conditions
|
|
37
|
+
if (Array.isArray(condition)) {
|
|
38
|
+
return this.evaluateArrayCondition(condition, logic);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Handle string conditions (AI context only)
|
|
42
|
+
if (typeof condition === 'string') {
|
|
43
|
+
result.aiContextStrings.push(condition);
|
|
44
|
+
result.evaluationDetails?.push({
|
|
45
|
+
condition: condition,
|
|
46
|
+
type: 'string'
|
|
47
|
+
});
|
|
48
|
+
// For string conditions, programmatic result depends on logic:
|
|
49
|
+
// AND logic: true (doesn't affect result)
|
|
50
|
+
// OR logic: false (doesn't trigger skip)
|
|
51
|
+
result.programmaticResult = logic === 'AND' ? true : false;
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Handle function conditions (programmatic evaluation)
|
|
56
|
+
if (typeof condition === 'function') {
|
|
57
|
+
result.hasProgrammaticConditions = true;
|
|
58
|
+
try {
|
|
59
|
+
const functionResult = await condition(this.templateContext);
|
|
60
|
+
result.programmaticResult = Boolean(functionResult);
|
|
61
|
+
result.evaluationDetails?.push({
|
|
62
|
+
condition: condition.toString(),
|
|
63
|
+
result: result.programmaticResult,
|
|
64
|
+
type: 'function'
|
|
65
|
+
});
|
|
66
|
+
} catch (error) {
|
|
67
|
+
// Log error and default to false for safety
|
|
68
|
+
logger.warn('Condition function evaluation failed:', error);
|
|
69
|
+
result.programmaticResult = false;
|
|
70
|
+
result.evaluationDetails?.push({
|
|
71
|
+
condition: condition.toString(),
|
|
72
|
+
result: false,
|
|
73
|
+
type: 'function'
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Fallback for unexpected types
|
|
80
|
+
logger.warn('Unexpected condition type:', typeof condition);
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Evaluates an array of conditions with the specified logic.
|
|
86
|
+
*/
|
|
87
|
+
private async evaluateArrayCondition(
|
|
88
|
+
conditions: ConditionTemplate<TContext, TData>[],
|
|
89
|
+
logic: 'AND' | 'OR'
|
|
90
|
+
): Promise<ConditionEvaluationResult> {
|
|
91
|
+
const result: ConditionEvaluationResult = {
|
|
92
|
+
programmaticResult: logic === 'AND' ? true : false,
|
|
93
|
+
aiContextStrings: [],
|
|
94
|
+
hasProgrammaticConditions: false,
|
|
95
|
+
evaluationDetails: [{
|
|
96
|
+
condition: `Array[${conditions.length}]`,
|
|
97
|
+
type: 'array'
|
|
98
|
+
}]
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const functionResults: boolean[] = [];
|
|
102
|
+
|
|
103
|
+
for (const condition of conditions) {
|
|
104
|
+
const conditionResult = await this.evaluateCondition(condition, logic);
|
|
105
|
+
|
|
106
|
+
// Collect AI context strings
|
|
107
|
+
result.aiContextStrings.push(...conditionResult.aiContextStrings);
|
|
108
|
+
|
|
109
|
+
// Track if we have programmatic conditions
|
|
110
|
+
if (conditionResult.hasProgrammaticConditions) {
|
|
111
|
+
result.hasProgrammaticConditions = true;
|
|
112
|
+
functionResults.push(conditionResult.programmaticResult);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Merge evaluation details
|
|
116
|
+
if (conditionResult.evaluationDetails) {
|
|
117
|
+
result.evaluationDetails?.push(...conditionResult.evaluationDetails);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Apply logic to function results only
|
|
122
|
+
if (functionResults.length > 0) {
|
|
123
|
+
if (logic === 'AND') {
|
|
124
|
+
result.programmaticResult = functionResults.every(r => r);
|
|
125
|
+
} else { // OR
|
|
126
|
+
result.programmaticResult = functionResults.some(r => r);
|
|
127
|
+
}
|
|
128
|
+
} else {
|
|
129
|
+
// No programmatic conditions, result depends on logic:
|
|
130
|
+
// AND: true (no functions to fail)
|
|
131
|
+
// OR: false (no functions to succeed)
|
|
132
|
+
result.programmaticResult = logic === 'AND' ? true : false;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Utility function to create a ConditionEvaluator instance.
|
|
141
|
+
* Ensures the template context has helpers included.
|
|
142
|
+
*/
|
|
143
|
+
export function createConditionEvaluator<TContext = unknown, TData = unknown>(
|
|
144
|
+
templateContext: Omit<Partial<TemplateContext<TContext, TData>>, 'helpers'>
|
|
145
|
+
): ConditionEvaluator<TContext, TData> {
|
|
146
|
+
const contextWithHelpers = createTemplateContext(templateContext);
|
|
147
|
+
return new ConditionEvaluator(contextWithHelpers);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Utility function to extract AI context strings from a condition without evaluation.
|
|
152
|
+
* Useful for collecting context strings for prompt generation.
|
|
153
|
+
*/
|
|
154
|
+
export function extractAIContextStrings<TContext = unknown, TData = unknown>(
|
|
155
|
+
condition: ConditionTemplate<TContext, TData>
|
|
156
|
+
): string[] {
|
|
157
|
+
const contextStrings: string[] = [];
|
|
158
|
+
|
|
159
|
+
if (!condition) {
|
|
160
|
+
return contextStrings;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (Array.isArray(condition)) {
|
|
164
|
+
for (const subCondition of condition) {
|
|
165
|
+
contextStrings.push(...extractAIContextStrings(subCondition));
|
|
166
|
+
}
|
|
167
|
+
} else if (typeof condition === 'string') {
|
|
168
|
+
contextStrings.push(condition);
|
|
169
|
+
}
|
|
170
|
+
// Functions don't contribute to AI context
|
|
171
|
+
|
|
172
|
+
return contextStrings;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Utility function to check if a condition has any programmatic components.
|
|
177
|
+
*/
|
|
178
|
+
export function hasProgrammaticConditions<TContext = unknown, TData = unknown>(
|
|
179
|
+
condition: ConditionTemplate<TContext, TData>
|
|
180
|
+
): boolean {
|
|
181
|
+
if (!condition) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (Array.isArray(condition)) {
|
|
186
|
+
return condition.some(subCondition => hasProgrammaticConditions(subCondition));
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return typeof condition === 'function';
|
|
190
|
+
}
|
package/src/utils/index.ts
CHANGED
|
@@ -28,6 +28,7 @@ export {
|
|
|
28
28
|
renderTemplate,
|
|
29
29
|
renderTemplateObject,
|
|
30
30
|
formatKnowledgeBase,
|
|
31
|
+
createTemplateContext,
|
|
31
32
|
} from "./template";
|
|
32
33
|
|
|
33
34
|
// Cloning utilities
|
|
@@ -55,3 +56,14 @@ export { LoggerLevel, logger } from "./logger";
|
|
|
55
56
|
// Retry utilities
|
|
56
57
|
export type { RetryOptions } from "./retry";
|
|
57
58
|
export { retry, withTimeoutAndRetry } from "./retry";
|
|
59
|
+
|
|
60
|
+
// Condition utilities
|
|
61
|
+
export {
|
|
62
|
+
ConditionEvaluator,
|
|
63
|
+
createConditionEvaluator,
|
|
64
|
+
extractAIContextStrings,
|
|
65
|
+
hasProgrammaticConditions,
|
|
66
|
+
} from "./condition";
|
|
67
|
+
|
|
68
|
+
// JSON utilities
|
|
69
|
+
export { parseJSONResponse, tryParseJSONResponse } from "./json";
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON parsing utilities
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Clean and parse JSON response that might be wrapped in markdown code blocks
|
|
7
|
+
* Handles cases like:
|
|
8
|
+
* - ```json\n{...}\n```
|
|
9
|
+
* - ```\n{...}\n```
|
|
10
|
+
* - Plain JSON: {...}
|
|
11
|
+
*/
|
|
12
|
+
export function parseJSONResponse(text: string): unknown {
|
|
13
|
+
if (!text || typeof text !== 'string') {
|
|
14
|
+
throw new Error('Invalid JSON response: empty or non-string input');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Trim whitespace
|
|
18
|
+
let cleaned = text.trim();
|
|
19
|
+
|
|
20
|
+
// Remove markdown code block markers
|
|
21
|
+
// Match: ```json or ``` at start, and ``` at end
|
|
22
|
+
const codeBlockRegex = /^```(?:json)?\s*\n?([\s\S]*?)\n?```$/;
|
|
23
|
+
const match = cleaned.match(codeBlockRegex);
|
|
24
|
+
|
|
25
|
+
if (match) {
|
|
26
|
+
cleaned = match[1].trim();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Try to parse the cleaned JSON
|
|
30
|
+
try {
|
|
31
|
+
return JSON.parse(cleaned);
|
|
32
|
+
} catch (error) {
|
|
33
|
+
throw new Error(`Failed to parse JSON response: ${error instanceof Error ? error.message : String(error)}\nContent: ${cleaned.substring(0, 200)}...`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Safely parse JSON response, returning undefined on failure
|
|
39
|
+
*/
|
|
40
|
+
export function tryParseJSONResponse(text: string): unknown {
|
|
41
|
+
try {
|
|
42
|
+
return parseJSONResponse(text);
|
|
43
|
+
} catch {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
package/src/utils/retry.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Retry utility with exponential backoff
|
|
3
3
|
*/
|
|
4
|
+
import {logger} from './logger'
|
|
4
5
|
|
|
5
6
|
export interface RetryOptions<T> {
|
|
6
7
|
operation: () => Promise<T>;
|
|
@@ -78,18 +79,18 @@ export const withTimeoutAndRetry = async <T>(
|
|
|
78
79
|
delay: (attempt: number) => Math.min(1000 * Math.pow(2, attempt), 5000),
|
|
79
80
|
onRetry: (attempt: number, error: unknown) => {
|
|
80
81
|
const message = error instanceof Error ? error.message : String(error);
|
|
81
|
-
|
|
82
|
+
logger.error(
|
|
82
83
|
`[${operationName}] Failed attempt ${attempt + 1}:`,
|
|
83
84
|
message
|
|
84
85
|
);
|
|
85
86
|
const delay = Math.min(1000 * Math.pow(2, attempt), 5000);
|
|
86
|
-
|
|
87
|
-
|
|
87
|
+
logger.debug(`[${operationName}] Retrying in ${delay}ms...`);
|
|
88
|
+
logger.debug(
|
|
88
89
|
`[${operationName}] Attempt ${attempt + 2}/${maxRetries + 1}`
|
|
89
90
|
);
|
|
90
91
|
},
|
|
91
92
|
onFailure: (_error: unknown) => {
|
|
92
|
-
|
|
93
|
+
logger.error(`[${operationName}] All ${maxRetries + 1} attempts failed`);
|
|
93
94
|
return true;
|
|
94
95
|
},
|
|
95
96
|
});
|