@falai/agent 0.1.0-alpha2
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 +797 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts +47 -0
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/MemoryAdapter.js +202 -0
- package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/MongoAdapter.d.ts +97 -0
- package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/MongoAdapter.js +168 -0
- package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts +169 -0
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/OpenSearchAdapter.js +458 -0
- package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts +71 -0
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js +260 -0
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts +115 -0
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/PrismaAdapter.js +366 -0
- package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/RedisAdapter.d.ts +71 -0
- package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/RedisAdapter.js +231 -0
- package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts +69 -0
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/SQLiteAdapter.js +312 -0
- package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/index.d.ts +17 -0
- package/dist/cjs/src/adapters/index.d.ts.map +1 -0
- package/dist/cjs/src/adapters/index.js +21 -0
- package/dist/cjs/src/adapters/index.js.map +1 -0
- package/dist/cjs/src/constants/index.d.ts +10 -0
- package/dist/cjs/src/constants/index.d.ts.map +1 -0
- package/dist/cjs/src/constants/index.js +13 -0
- package/dist/cjs/src/constants/index.js.map +1 -0
- package/dist/cjs/src/core/Agent.d.ts +232 -0
- package/dist/cjs/src/core/Agent.d.ts.map +1 -0
- package/dist/cjs/src/core/Agent.js +741 -0
- package/dist/cjs/src/core/Agent.js.map +1 -0
- package/dist/cjs/src/core/Events.d.ts +26 -0
- package/dist/cjs/src/core/Events.d.ts.map +1 -0
- package/dist/cjs/src/core/Events.js +144 -0
- package/dist/cjs/src/core/Events.js.map +1 -0
- package/dist/cjs/src/core/PersistenceManager.d.ts +98 -0
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/cjs/src/core/PersistenceManager.js +261 -0
- package/dist/cjs/src/core/PersistenceManager.js.map +1 -0
- package/dist/cjs/src/core/PromptComposer.d.ts +27 -0
- package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -0
- package/dist/cjs/src/core/PromptComposer.js +194 -0
- package/dist/cjs/src/core/PromptComposer.js.map +1 -0
- package/dist/cjs/src/core/ResponseEngine.d.ts +32 -0
- package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponseEngine.js +202 -0
- package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
- package/dist/cjs/src/core/ResponseModal.d.ts +222 -0
- package/dist/cjs/src/core/ResponseModal.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponseModal.js +1588 -0
- package/dist/cjs/src/core/ResponseModal.js.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts +175 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.js +549 -0
- package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
- package/dist/cjs/src/core/Route.d.ts +181 -0
- package/dist/cjs/src/core/Route.d.ts.map +1 -0
- package/dist/cjs/src/core/Route.js +541 -0
- package/dist/cjs/src/core/Route.js.map +1 -0
- package/dist/cjs/src/core/RoutingEngine.d.ts +159 -0
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/src/core/RoutingEngine.js +961 -0
- package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/src/core/SessionManager.d.ts +94 -0
- package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
- package/dist/cjs/src/core/SessionManager.js +239 -0
- package/dist/cjs/src/core/SessionManager.js.map +1 -0
- package/dist/cjs/src/core/Step.d.ts +170 -0
- package/dist/cjs/src/core/Step.d.ts.map +1 -0
- package/dist/cjs/src/core/Step.js +448 -0
- package/dist/cjs/src/core/Step.js.map +1 -0
- package/dist/cjs/src/core/ToolManager.d.ts +234 -0
- package/dist/cjs/src/core/ToolManager.d.ts.map +1 -0
- package/dist/cjs/src/core/ToolManager.js +1117 -0
- package/dist/cjs/src/core/ToolManager.js.map +1 -0
- package/dist/cjs/src/index.d.ts +44 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/src/index.js +88 -0
- package/dist/cjs/src/index.js.map +1 -0
- package/dist/cjs/src/providers/AnthropicProvider.d.ts +43 -0
- package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/cjs/src/providers/AnthropicProvider.js +377 -0
- package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/cjs/src/providers/GeminiProvider.d.ts +58 -0
- package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/cjs/src/providers/GeminiProvider.js +489 -0
- package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
- package/dist/cjs/src/providers/OpenAIProvider.d.ts +52 -0
- package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/cjs/src/providers/OpenAIProvider.js +395 -0
- package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts +56 -0
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/cjs/src/providers/OpenRouterProvider.js +409 -0
- package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/cjs/src/providers/index.d.ts +13 -0
- package/dist/cjs/src/providers/index.d.ts.map +1 -0
- package/dist/cjs/src/providers/index.js +16 -0
- package/dist/cjs/src/providers/index.js.map +1 -0
- package/dist/cjs/src/types/agent.d.ts +181 -0
- package/dist/cjs/src/types/agent.d.ts.map +1 -0
- package/dist/cjs/src/types/agent.js +21 -0
- package/dist/cjs/src/types/agent.js.map +1 -0
- package/dist/cjs/src/types/ai.d.ts +143 -0
- package/dist/cjs/src/types/ai.d.ts.map +1 -0
- package/dist/cjs/src/types/ai.js +6 -0
- package/dist/cjs/src/types/ai.js.map +1 -0
- package/dist/cjs/src/types/history.d.ts +178 -0
- package/dist/cjs/src/types/history.d.ts.map +1 -0
- package/dist/cjs/src/types/history.js +33 -0
- package/dist/cjs/src/types/history.js.map +1 -0
- package/dist/cjs/src/types/index.d.ts +22 -0
- package/dist/cjs/src/types/index.d.ts.map +1 -0
- package/dist/cjs/src/types/index.js +37 -0
- package/dist/cjs/src/types/index.js.map +1 -0
- package/dist/cjs/src/types/persistence.d.ts +209 -0
- package/dist/cjs/src/types/persistence.d.ts.map +1 -0
- package/dist/cjs/src/types/persistence.js +7 -0
- package/dist/cjs/src/types/persistence.js.map +1 -0
- package/dist/cjs/src/types/route.d.ts +238 -0
- package/dist/cjs/src/types/route.d.ts.map +1 -0
- package/dist/cjs/src/types/route.js +6 -0
- package/dist/cjs/src/types/route.js.map +1 -0
- package/dist/cjs/src/types/routing.d.ts +16 -0
- package/dist/cjs/src/types/routing.d.ts.map +1 -0
- package/dist/cjs/src/types/routing.js +3 -0
- package/dist/cjs/src/types/routing.js.map +1 -0
- package/dist/cjs/src/types/schema.d.ts +22 -0
- package/dist/cjs/src/types/schema.d.ts.map +1 -0
- package/dist/cjs/src/types/schema.js +3 -0
- package/dist/cjs/src/types/schema.js.map +1 -0
- package/dist/cjs/src/types/session.d.ts +65 -0
- package/dist/cjs/src/types/session.d.ts.map +1 -0
- package/dist/cjs/src/types/session.js +6 -0
- package/dist/cjs/src/types/session.js.map +1 -0
- package/dist/cjs/src/types/template.d.ts +88 -0
- package/dist/cjs/src/types/template.d.ts.map +1 -0
- package/dist/cjs/src/types/template.js +3 -0
- package/dist/cjs/src/types/template.js.map +1 -0
- package/dist/cjs/src/types/tool.d.ts +130 -0
- package/dist/cjs/src/types/tool.d.ts.map +1 -0
- package/dist/cjs/src/types/tool.js +19 -0
- package/dist/cjs/src/types/tool.js.map +1 -0
- package/dist/cjs/src/utils/clone.d.ts +8 -0
- package/dist/cjs/src/utils/clone.d.ts.map +1 -0
- package/dist/cjs/src/utils/clone.js +32 -0
- package/dist/cjs/src/utils/clone.js.map +1 -0
- package/dist/cjs/src/utils/condition.d.ts +38 -0
- package/dist/cjs/src/utils/condition.d.ts.map +1 -0
- package/dist/cjs/src/utils/condition.js +168 -0
- package/dist/cjs/src/utils/condition.js.map +1 -0
- package/dist/cjs/src/utils/event.d.ts +6 -0
- package/dist/cjs/src/utils/event.d.ts.map +1 -0
- package/dist/cjs/src/utils/event.js +20 -0
- package/dist/cjs/src/utils/event.js.map +1 -0
- package/dist/cjs/src/utils/history.d.ts +60 -0
- package/dist/cjs/src/utils/history.d.ts.map +1 -0
- package/dist/cjs/src/utils/history.js +274 -0
- package/dist/cjs/src/utils/history.js.map +1 -0
- package/dist/cjs/src/utils/id.d.ts +25 -0
- package/dist/cjs/src/utils/id.d.ts.map +1 -0
- package/dist/cjs/src/utils/id.js +70 -0
- package/dist/cjs/src/utils/id.js.map +1 -0
- package/dist/cjs/src/utils/index.d.ts +15 -0
- package/dist/cjs/src/utils/index.d.ts.map +1 -0
- package/dist/cjs/src/utils/index.js +64 -0
- package/dist/cjs/src/utils/index.js.map +1 -0
- package/dist/cjs/src/utils/json.d.ts +16 -0
- package/dist/cjs/src/utils/json.d.ts.map +1 -0
- package/dist/cjs/src/utils/json.js +47 -0
- package/dist/cjs/src/utils/json.js.map +1 -0
- package/dist/cjs/src/utils/logger.d.ts +10 -0
- package/dist/cjs/src/utils/logger.d.ts.map +1 -0
- package/dist/cjs/src/utils/logger.js +23 -0
- package/dist/cjs/src/utils/logger.js.map +1 -0
- package/dist/cjs/src/utils/retry.d.ts +10 -0
- package/dist/cjs/src/utils/retry.d.ts.map +1 -0
- package/dist/cjs/src/utils/retry.js +76 -0
- package/dist/cjs/src/utils/retry.js.map +1 -0
- package/dist/cjs/src/utils/session.d.ts +51 -0
- package/dist/cjs/src/utils/session.d.ts.map +1 -0
- package/dist/cjs/src/utils/session.js +170 -0
- package/dist/cjs/src/utils/session.js.map +1 -0
- package/dist/cjs/src/utils/template.d.ts +155 -0
- package/dist/cjs/src/utils/template.d.ts.map +1 -0
- package/dist/cjs/src/utils/template.js +383 -0
- package/dist/cjs/src/utils/template.js.map +1 -0
- package/dist/src/adapters/MemoryAdapter.d.ts +47 -0
- package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/src/adapters/MemoryAdapter.js +198 -0
- package/dist/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/src/adapters/MongoAdapter.d.ts +97 -0
- package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/src/adapters/MongoAdapter.js +164 -0
- package/dist/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/src/adapters/OpenSearchAdapter.d.ts +169 -0
- package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/src/adapters/OpenSearchAdapter.js +454 -0
- package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/src/adapters/PostgreSQLAdapter.d.ts +71 -0
- package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/src/adapters/PostgreSQLAdapter.js +256 -0
- package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/src/adapters/PrismaAdapter.d.ts +115 -0
- package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/src/adapters/PrismaAdapter.js +362 -0
- package/dist/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/src/adapters/RedisAdapter.d.ts +71 -0
- package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/src/adapters/RedisAdapter.js +227 -0
- package/dist/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/src/adapters/SQLiteAdapter.d.ts +69 -0
- package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/src/adapters/SQLiteAdapter.js +308 -0
- package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/src/adapters/index.d.ts +17 -0
- package/dist/src/adapters/index.d.ts.map +1 -0
- package/dist/src/adapters/index.js +11 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/constants/index.d.ts +10 -0
- package/dist/src/constants/index.d.ts.map +1 -0
- package/dist/src/constants/index.js +10 -0
- package/dist/src/constants/index.js.map +1 -0
- package/dist/src/core/Agent.d.ts +232 -0
- package/dist/src/core/Agent.d.ts.map +1 -0
- package/dist/src/core/Agent.js +737 -0
- package/dist/src/core/Agent.js.map +1 -0
- package/dist/src/core/Events.d.ts +26 -0
- package/dist/src/core/Events.d.ts.map +1 -0
- package/dist/src/core/Events.js +137 -0
- package/dist/src/core/Events.js.map +1 -0
- package/dist/src/core/PersistenceManager.d.ts +98 -0
- package/dist/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/src/core/PersistenceManager.js +257 -0
- package/dist/src/core/PersistenceManager.js.map +1 -0
- package/dist/src/core/PromptComposer.d.ts +27 -0
- package/dist/src/core/PromptComposer.d.ts.map +1 -0
- package/dist/src/core/PromptComposer.js +190 -0
- package/dist/src/core/PromptComposer.js.map +1 -0
- package/dist/src/core/ResponseEngine.d.ts +32 -0
- package/dist/src/core/ResponseEngine.d.ts.map +1 -0
- package/dist/src/core/ResponseEngine.js +198 -0
- package/dist/src/core/ResponseEngine.js.map +1 -0
- package/dist/src/core/ResponseModal.d.ts +222 -0
- package/dist/src/core/ResponseModal.d.ts.map +1 -0
- package/dist/src/core/ResponseModal.js +1583 -0
- package/dist/src/core/ResponseModal.js.map +1 -0
- package/dist/src/core/ResponsePipeline.d.ts +175 -0
- package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/src/core/ResponsePipeline.js +545 -0
- package/dist/src/core/ResponsePipeline.js.map +1 -0
- package/dist/src/core/Route.d.ts +181 -0
- package/dist/src/core/Route.d.ts.map +1 -0
- package/dist/src/core/Route.js +537 -0
- package/dist/src/core/Route.js.map +1 -0
- package/dist/src/core/RoutingEngine.d.ts +159 -0
- package/dist/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/src/core/RoutingEngine.js +957 -0
- package/dist/src/core/RoutingEngine.js.map +1 -0
- package/dist/src/core/SessionManager.d.ts +94 -0
- package/dist/src/core/SessionManager.d.ts.map +1 -0
- package/dist/src/core/SessionManager.js +235 -0
- package/dist/src/core/SessionManager.js.map +1 -0
- package/dist/src/core/Step.d.ts +170 -0
- package/dist/src/core/Step.d.ts.map +1 -0
- package/dist/src/core/Step.js +444 -0
- package/dist/src/core/Step.js.map +1 -0
- package/dist/src/core/ToolManager.d.ts +234 -0
- package/dist/src/core/ToolManager.d.ts.map +1 -0
- package/dist/src/core/ToolManager.js +1111 -0
- package/dist/src/core/ToolManager.js.map +1 -0
- package/dist/src/index.d.ts +44 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +37 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/providers/AnthropicProvider.d.ts +43 -0
- package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/src/providers/AnthropicProvider.js +370 -0
- package/dist/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/src/providers/GeminiProvider.d.ts +58 -0
- package/dist/src/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/src/providers/GeminiProvider.js +485 -0
- package/dist/src/providers/GeminiProvider.js.map +1 -0
- package/dist/src/providers/OpenAIProvider.d.ts +52 -0
- package/dist/src/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/src/providers/OpenAIProvider.js +388 -0
- package/dist/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/src/providers/OpenRouterProvider.d.ts +56 -0
- package/dist/src/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/src/providers/OpenRouterProvider.js +402 -0
- package/dist/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/src/providers/index.d.ts +13 -0
- package/dist/src/providers/index.d.ts.map +1 -0
- package/dist/src/providers/index.js +9 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/src/types/agent.d.ts +181 -0
- package/dist/src/types/agent.d.ts.map +1 -0
- package/dist/src/types/agent.js +18 -0
- package/dist/src/types/agent.js.map +1 -0
- package/dist/src/types/ai.d.ts +143 -0
- package/dist/src/types/ai.d.ts.map +1 -0
- package/dist/src/types/ai.js +5 -0
- package/dist/src/types/ai.js.map +1 -0
- package/dist/src/types/history.d.ts +178 -0
- package/dist/src/types/history.d.ts.map +1 -0
- package/dist/src/types/history.js +30 -0
- package/dist/src/types/history.js.map +1 -0
- package/dist/src/types/index.d.ts +22 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +12 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/persistence.d.ts +209 -0
- package/dist/src/types/persistence.d.ts.map +1 -0
- package/dist/src/types/persistence.js +6 -0
- package/dist/src/types/persistence.js.map +1 -0
- package/dist/src/types/route.d.ts +238 -0
- package/dist/src/types/route.d.ts.map +1 -0
- package/dist/src/types/route.js +5 -0
- package/dist/src/types/route.js.map +1 -0
- package/dist/src/types/routing.d.ts +16 -0
- package/dist/src/types/routing.d.ts.map +1 -0
- package/dist/src/types/routing.js +2 -0
- package/dist/src/types/routing.js.map +1 -0
- package/dist/src/types/schema.d.ts +22 -0
- package/dist/src/types/schema.d.ts.map +1 -0
- package/dist/src/types/schema.js +2 -0
- package/dist/src/types/schema.js.map +1 -0
- package/dist/src/types/session.d.ts +65 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +5 -0
- package/dist/src/types/session.js.map +1 -0
- package/dist/src/types/template.d.ts +88 -0
- package/dist/src/types/template.d.ts.map +1 -0
- package/dist/src/types/template.js +2 -0
- package/dist/src/types/template.js.map +1 -0
- package/dist/src/types/tool.d.ts +130 -0
- package/dist/src/types/tool.d.ts.map +1 -0
- package/dist/src/types/tool.js +16 -0
- package/dist/src/types/tool.js.map +1 -0
- package/dist/src/utils/clone.d.ts +8 -0
- package/dist/src/utils/clone.d.ts.map +1 -0
- package/dist/src/utils/clone.js +29 -0
- package/dist/src/utils/clone.js.map +1 -0
- package/dist/src/utils/condition.d.ts +38 -0
- package/dist/src/utils/condition.d.ts.map +1 -0
- package/dist/src/utils/condition.js +161 -0
- package/dist/src/utils/condition.js.map +1 -0
- package/dist/src/utils/event.d.ts +6 -0
- package/dist/src/utils/event.d.ts.map +1 -0
- package/dist/src/utils/event.js +17 -0
- package/dist/src/utils/event.js.map +1 -0
- package/dist/src/utils/history.d.ts +60 -0
- package/dist/src/utils/history.d.ts.map +1 -0
- package/dist/src/utils/history.js +263 -0
- package/dist/src/utils/history.js.map +1 -0
- package/dist/src/utils/id.d.ts +25 -0
- package/dist/src/utils/id.d.ts.map +1 -0
- package/dist/src/utils/id.js +64 -0
- package/dist/src/utils/id.js.map +1 -0
- package/dist/src/utils/index.d.ts +15 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +23 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/json.d.ts +16 -0
- package/dist/src/utils/json.d.ts.map +1 -0
- package/dist/src/utils/json.js +43 -0
- package/dist/src/utils/json.js.map +1 -0
- package/dist/src/utils/logger.d.ts +10 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +17 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/retry.d.ts +10 -0
- package/dist/src/utils/retry.d.ts.map +1 -0
- package/dist/src/utils/retry.js +71 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/session.d.ts +51 -0
- package/dist/src/utils/session.d.ts.map +1 -0
- package/dist/src/utils/session.js +160 -0
- package/dist/src/utils/session.js.map +1 -0
- package/dist/src/utils/template.d.ts +155 -0
- package/dist/src/utils/template.d.ts.map +1 -0
- package/dist/src/utils/template.js +374 -0
- package/dist/src/utils/template.js.map +1 -0
- package/docs/CONTRIBUTING.md +521 -0
- package/docs/README.md +228 -0
- package/docs/api/README.md +3258 -0
- package/docs/api/overview.md +1134 -0
- package/docs/architecture/data-extraction-flow.md +363 -0
- package/docs/core/agent/README.md +902 -0
- package/docs/core/agent/context-management.md +796 -0
- package/docs/core/agent/session-management.md +641 -0
- package/docs/core/ai-integration/prompt-composition.md +220 -0
- package/docs/core/ai-integration/providers.md +515 -0
- package/docs/core/ai-integration/response-processing.md +287 -0
- package/docs/core/conversation-flows/data-collection.md +623 -0
- package/docs/core/conversation-flows/route-dsl.md +502 -0
- package/docs/core/conversation-flows/routes.md +247 -0
- package/docs/core/conversation-flows/step-transitions.md +595 -0
- package/docs/core/conversation-flows/steps.md +154 -0
- package/docs/core/error-handling.md +638 -0
- package/docs/core/persistence/adapters.md +255 -0
- package/docs/core/persistence/session-storage.md +644 -0
- package/docs/core/routing/intelligent-routing.md +466 -0
- package/docs/core/tools/tool-definition.md +970 -0
- package/docs/core/tools/tool-scoping.md +819 -0
- package/docs/guides/advanced-patterns/publishing.md +186 -0
- package/docs/guides/error-handling-patterns.md +578 -0
- package/docs/guides/getting-started/README.md +696 -0
- package/docs/guides/migration/README.md +72 -0
- package/docs/guides/migration/flexible-routing-conditions.md +375 -0
- package/docs/guides/migration/response-modal-refactor.md +518 -0
- package/examples/advanced-patterns/knowledge-based-agent.ts +735 -0
- package/examples/advanced-patterns/persistent-onboarding.ts +728 -0
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +556 -0
- package/examples/advanced-patterns/streaming-responses.ts +578 -0
- package/examples/ai-providers/anthropic-integration.ts +388 -0
- package/examples/ai-providers/openai-integration.ts +228 -0
- 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 +318 -0
- package/examples/core-concepts/basic-agent.ts +503 -0
- package/examples/core-concepts/modern-streaming-api.ts +309 -0
- package/examples/core-concepts/schema-driven-extraction.ts +332 -0
- package/examples/core-concepts/session-management.ts +494 -0
- package/examples/integrations/database-integration.ts +630 -0
- package/examples/integrations/healthcare-integration.ts +595 -0
- package/examples/integrations/search-integration.ts +530 -0
- package/examples/integrations/server-session-management.ts +307 -0
- package/examples/persistence/custom-adapter.ts +529 -0
- package/examples/persistence/database-persistence.ts +583 -0
- package/examples/persistence/memory-sessions.ts +495 -0
- package/examples/persistence/prisma-schema.example.prisma +74 -0
- package/examples/persistence/redis-persistence.ts +488 -0
- package/examples/tools/basic-tools.ts +765 -0
- package/examples/tools/data-enrichment-tools.ts +593 -0
- package/package.json +125 -0
- package/src/adapters/MemoryAdapter.ts +273 -0
- package/src/adapters/MongoAdapter.ts +304 -0
- package/src/adapters/OpenSearchAdapter.ts +670 -0
- package/src/adapters/PostgreSQLAdapter.ts +428 -0
- package/src/adapters/PrismaAdapter.ts +553 -0
- package/src/adapters/RedisAdapter.ts +377 -0
- package/src/adapters/SQLiteAdapter.ts +459 -0
- package/src/adapters/index.ts +43 -0
- package/src/constants/index.ts +10 -0
- package/src/core/Agent.ts +970 -0
- package/src/core/Events.ts +164 -0
- package/src/core/PersistenceManager.ts +353 -0
- package/src/core/PromptComposer.ts +253 -0
- package/src/core/ResponseEngine.ts +306 -0
- package/src/core/ResponseModal.ts +2050 -0
- package/src/core/ResponsePipeline.ts +864 -0
- package/src/core/Route.ts +677 -0
- package/src/core/RoutingEngine.ts +1396 -0
- package/src/core/SessionManager.ts +297 -0
- package/src/core/Step.ts +593 -0
- package/src/core/ToolManager.ts +1394 -0
- package/src/index.ts +155 -0
- package/src/providers/AnthropicProvider.ts +560 -0
- package/src/providers/GeminiProvider.ts +683 -0
- package/src/providers/OpenAIProvider.ts +602 -0
- package/src/providers/OpenRouterProvider.ts +613 -0
- package/src/providers/index.ts +16 -0
- package/src/types/agent.ts +196 -0
- package/src/types/ai.ts +158 -0
- package/src/types/history.ts +206 -0
- package/src/types/index.ts +119 -0
- package/src/types/persistence.ts +251 -0
- package/src/types/route.ts +272 -0
- package/src/types/routing.ts +18 -0
- package/src/types/schema.ts +23 -0
- package/src/types/session.ts +74 -0
- package/src/types/template.ts +104 -0
- package/src/types/tool.ts +174 -0
- package/src/utils/clone.ts +34 -0
- package/src/utils/condition.ts +190 -0
- package/src/utils/event.ts +16 -0
- package/src/utils/history.ts +306 -0
- package/src/utils/id.ts +73 -0
- package/src/utils/index.ts +69 -0
- package/src/utils/json.ts +46 -0
- package/src/utils/logger.ts +19 -0
- package/src/utils/retry.ts +97 -0
- package/src/utils/session.ts +204 -0
- package/src/utils/template.ts +444 -0
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History normalization utilities
|
|
3
|
+
* Convert simplified history format to internal Event format
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Event, MessageEventData, ToolEventData, StatusEventData } from "../types";
|
|
7
|
+
import { EventKind, MessageRole } from "../types";
|
|
8
|
+
import type { History, HistoryItem, UserHistoryItem, AssistantHistoryItem, ToolHistoryItem } from "../types/history";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Convert a simplified history item to an internal Event
|
|
12
|
+
* @param item - The HistoryItem to convert
|
|
13
|
+
* @returns Event with proper type-safe structure
|
|
14
|
+
* @throws Error if the history item is malformed or has invalid data
|
|
15
|
+
*/
|
|
16
|
+
export function historyItemToEvent(item: HistoryItem): Event<MessageEventData | ToolEventData | StatusEventData> {
|
|
17
|
+
if (!item || typeof item !== 'object') {
|
|
18
|
+
throw new Error('Invalid history item: must be a non-null object');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (!item.role || typeof item.role !== 'string') {
|
|
22
|
+
throw new Error('Invalid history item: role is required and must be a string');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const timestamp = new Date().toISOString();
|
|
26
|
+
|
|
27
|
+
switch (item.role) {
|
|
28
|
+
case "user": {
|
|
29
|
+
const userItem = item;
|
|
30
|
+
if (typeof userItem.content !== 'string') {
|
|
31
|
+
throw new Error('Invalid user history item: content must be a string');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
kind: EventKind.MESSAGE,
|
|
36
|
+
source: MessageRole.USER,
|
|
37
|
+
timestamp,
|
|
38
|
+
data: {
|
|
39
|
+
participant: {
|
|
40
|
+
display_name: userItem.name || "User",
|
|
41
|
+
},
|
|
42
|
+
message: userItem.content,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
case "assistant": {
|
|
47
|
+
const assistantItem = item;
|
|
48
|
+
if (assistantItem.content !== null && typeof assistantItem.content !== 'string') {
|
|
49
|
+
throw new Error('Invalid assistant history item: content must be a string or null');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const event: Event<MessageEventData> = {
|
|
53
|
+
kind: EventKind.MESSAGE,
|
|
54
|
+
source: MessageRole.ASSISTANT,
|
|
55
|
+
timestamp,
|
|
56
|
+
data: {
|
|
57
|
+
participant: {
|
|
58
|
+
display_name: "Assistant",
|
|
59
|
+
},
|
|
60
|
+
message: assistantItem.content || "",
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// If there are tool calls, validate and add them
|
|
65
|
+
if (assistantItem.tool_calls && assistantItem.tool_calls.length > 0) {
|
|
66
|
+
if (!Array.isArray(assistantItem.tool_calls)) {
|
|
67
|
+
throw new Error('Invalid assistant history item: tool_calls must be an array');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
for (const toolCall of assistantItem.tool_calls) {
|
|
71
|
+
if (!toolCall.id || !toolCall.name || typeof toolCall.arguments !== 'object') {
|
|
72
|
+
throw new Error('Invalid tool call: id, name, and arguments are required');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
event.data.toolCalls = assistantItem.tool_calls;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return event;
|
|
80
|
+
}
|
|
81
|
+
case "tool": {
|
|
82
|
+
const toolItem = item;
|
|
83
|
+
if (!toolItem.tool_call_id || typeof toolItem.tool_call_id !== 'string') {
|
|
84
|
+
throw new Error('Invalid tool history item: tool_call_id is required and must be a string');
|
|
85
|
+
}
|
|
86
|
+
if (!toolItem.name || typeof toolItem.name !== 'string') {
|
|
87
|
+
throw new Error('Invalid tool history item: name is required and must be a string');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
kind: EventKind.TOOL,
|
|
92
|
+
source: MessageRole.AGENT,
|
|
93
|
+
timestamp,
|
|
94
|
+
data: {
|
|
95
|
+
tool_calls: [
|
|
96
|
+
{
|
|
97
|
+
tool_id: toolItem.tool_call_id,
|
|
98
|
+
arguments: {}, // Tool results don't have arguments
|
|
99
|
+
result: {
|
|
100
|
+
data: toolItem.content,
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
case "system": {
|
|
108
|
+
const systemItem = item;
|
|
109
|
+
if (typeof systemItem.content !== 'string') {
|
|
110
|
+
throw new Error('Invalid system history item: content must be a string');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
kind: EventKind.MESSAGE,
|
|
115
|
+
source: MessageRole.SYSTEM,
|
|
116
|
+
timestamp,
|
|
117
|
+
data: {
|
|
118
|
+
participant: {
|
|
119
|
+
display_name: "System",
|
|
120
|
+
},
|
|
121
|
+
message: systemItem.content,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
default:
|
|
126
|
+
throw new Error(`Invalid history item role: ${String((item as { role?: unknown }).role)}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Convert an array of HistoryItems to Events
|
|
132
|
+
* @param history - Array of HistoryItems to convert
|
|
133
|
+
* @returns Array of Events with proper type-safe structure
|
|
134
|
+
* @throws Error if any history item is malformed
|
|
135
|
+
*/
|
|
136
|
+
export function historyToEvents(history: History): Event<MessageEventData | ToolEventData | StatusEventData>[] {
|
|
137
|
+
if (!Array.isArray(history)) {
|
|
138
|
+
throw new Error('Invalid history: must be an array');
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return history.map((item, index) => {
|
|
142
|
+
try {
|
|
143
|
+
return historyItemToEvent(item);
|
|
144
|
+
} catch (error) {
|
|
145
|
+
throw new Error(`Error converting history item at index ${index}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Convert an Event back to a HistoryItem
|
|
152
|
+
* @param event - The Event to convert
|
|
153
|
+
* @returns HistoryItem with simplified structure
|
|
154
|
+
* @throws Error if the event is malformed or has invalid data
|
|
155
|
+
*/
|
|
156
|
+
export function eventToHistoryItem(event: Event): HistoryItem {
|
|
157
|
+
if (!event || typeof event !== 'object') {
|
|
158
|
+
throw new Error('Invalid event: must be a non-null object');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (!event.kind || !event.source || !event.data) {
|
|
162
|
+
throw new Error('Invalid event: kind, source, and data are required');
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
switch (event.kind) {
|
|
166
|
+
case EventKind.MESSAGE: {
|
|
167
|
+
const messageData = event.data as MessageEventData;
|
|
168
|
+
if (!messageData.message && messageData.message !== '') {
|
|
169
|
+
throw new Error('Invalid message event: message is required');
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
switch (event.source) {
|
|
173
|
+
case MessageRole.USER: {
|
|
174
|
+
const userItem: UserHistoryItem = {
|
|
175
|
+
role: "user",
|
|
176
|
+
content: messageData.message,
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
if (messageData.participant?.display_name && messageData.participant.display_name !== "User") {
|
|
180
|
+
userItem.name = messageData.participant.display_name;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return userItem;
|
|
184
|
+
}
|
|
185
|
+
case MessageRole.ASSISTANT: {
|
|
186
|
+
const assistantItem: AssistantHistoryItem = {
|
|
187
|
+
role: "assistant",
|
|
188
|
+
content: messageData.message || null,
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
if (messageData.toolCalls && messageData.toolCalls.length > 0) {
|
|
192
|
+
assistantItem.tool_calls = messageData.toolCalls;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return assistantItem;
|
|
196
|
+
}
|
|
197
|
+
case MessageRole.SYSTEM: {
|
|
198
|
+
return {
|
|
199
|
+
role: "system",
|
|
200
|
+
content: messageData.message,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
default:
|
|
204
|
+
throw new Error(`Unsupported message source for conversion: ${event.source}`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
case EventKind.TOOL: {
|
|
208
|
+
const toolData = event.data as ToolEventData;
|
|
209
|
+
if (!toolData.tool_calls || !Array.isArray(toolData.tool_calls) || toolData.tool_calls.length === 0) {
|
|
210
|
+
throw new Error('Invalid tool event: tool_calls array is required and must not be empty');
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const firstToolCall = toolData.tool_calls[0];
|
|
214
|
+
if (!firstToolCall.tool_id) {
|
|
215
|
+
throw new Error('Invalid tool call: tool_id is required');
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const toolItem: ToolHistoryItem = {
|
|
219
|
+
role: "tool",
|
|
220
|
+
tool_call_id: firstToolCall.tool_id,
|
|
221
|
+
name: firstToolCall.tool_id, // Use tool_id as name for simplicity
|
|
222
|
+
content: firstToolCall.result?.data,
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
return toolItem;
|
|
226
|
+
}
|
|
227
|
+
case EventKind.STATUS: {
|
|
228
|
+
// Status events don't have a direct HistoryItem equivalent
|
|
229
|
+
// Convert to system message for compatibility
|
|
230
|
+
const statusData = event.data as StatusEventData;
|
|
231
|
+
return {
|
|
232
|
+
role: "system",
|
|
233
|
+
content: statusData.status || "Status update",
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
default:
|
|
237
|
+
throw new Error(`Unsupported event kind for conversion: ${String(event.kind)}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Convert an array of Events back to HistoryItems
|
|
243
|
+
* @param events - Array of Events to convert
|
|
244
|
+
* @returns Array of HistoryItems with simplified structure
|
|
245
|
+
* @throws Error if any event is malformed
|
|
246
|
+
*/
|
|
247
|
+
export function eventsToHistory(events: Event[]): History {
|
|
248
|
+
if (!Array.isArray(events)) {
|
|
249
|
+
throw new Error('Invalid events: must be an array');
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return events.map((event, index) => {
|
|
253
|
+
try {
|
|
254
|
+
return eventToHistoryItem(event);
|
|
255
|
+
} catch (error) {
|
|
256
|
+
throw new Error(`Error converting event at index ${index}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Normalize a simplified history array to internal Event array
|
|
263
|
+
* @deprecated Use historyToEvents instead
|
|
264
|
+
*/
|
|
265
|
+
export function normalizeHistory(history: History): Event[] {
|
|
266
|
+
return historyToEvents(history);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Helper function to create a user message
|
|
271
|
+
*/
|
|
272
|
+
export function userMessage(content: string, name?: string): HistoryItem {
|
|
273
|
+
return { role: "user", content, name };
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Helper function to create an assistant message
|
|
278
|
+
*/
|
|
279
|
+
export function assistantMessage(
|
|
280
|
+
content: string | null,
|
|
281
|
+
toolCalls?: Array<{
|
|
282
|
+
id: string;
|
|
283
|
+
name: string;
|
|
284
|
+
arguments: Record<string, unknown>;
|
|
285
|
+
}>
|
|
286
|
+
): HistoryItem {
|
|
287
|
+
return { role: "assistant", content, tool_calls: toolCalls };
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Helper function to create a tool message
|
|
292
|
+
*/
|
|
293
|
+
export function toolMessage(
|
|
294
|
+
toolCallId: string,
|
|
295
|
+
name: string,
|
|
296
|
+
content: unknown
|
|
297
|
+
): HistoryItem {
|
|
298
|
+
return { role: "tool", tool_call_id: toolCallId, name, content };
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Helper function to create a system message
|
|
303
|
+
*/
|
|
304
|
+
export function systemMessage(content: string): HistoryItem {
|
|
305
|
+
return { role: "system", content };
|
|
306
|
+
}
|
package/src/utils/id.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ID generation utilities
|
|
3
|
+
* Provides deterministic ID generation to ensure consistency across server restarts
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Generate a deterministic ID from a string by creating a simple hash
|
|
8
|
+
* This ensures the same input always produces the same ID
|
|
9
|
+
*/
|
|
10
|
+
function simpleHash(str: string): string {
|
|
11
|
+
let hash = 0;
|
|
12
|
+
for (let i = 0; i < str.length; i++) {
|
|
13
|
+
const char = str.charCodeAt(i);
|
|
14
|
+
hash = (hash << 5) - hash + char;
|
|
15
|
+
hash = hash & hash; // Convert to 32-bit integer
|
|
16
|
+
}
|
|
17
|
+
return Math.abs(hash).toString(36);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Sanitize a string for use in an ID
|
|
22
|
+
*/
|
|
23
|
+
function sanitize(str: string): string {
|
|
24
|
+
return str.toLowerCase().replace(/[^a-z0-9]+/g, "_");
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Generate a deterministic route ID
|
|
29
|
+
* Format: route_{sanitized_title}_{hash}
|
|
30
|
+
*/
|
|
31
|
+
export function generateRouteId(title: string): string {
|
|
32
|
+
const sanitized = sanitize(title);
|
|
33
|
+
const hash = simpleHash(title);
|
|
34
|
+
return `route_${sanitized}_${hash}`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Generate a deterministic step ID
|
|
39
|
+
* Format: step_{sanitized_description}_{hash} or step_{routeId}_{index}
|
|
40
|
+
*/
|
|
41
|
+
export function generateStepId(
|
|
42
|
+
routeId: string,
|
|
43
|
+
description?: string,
|
|
44
|
+
index?: number
|
|
45
|
+
): string {
|
|
46
|
+
if (description) {
|
|
47
|
+
const sanitized = sanitize(description);
|
|
48
|
+
const hash = simpleHash(`${routeId}_${description}`);
|
|
49
|
+
return `step_${sanitized}_${hash}`;
|
|
50
|
+
}
|
|
51
|
+
// Fallback for steps without descriptions
|
|
52
|
+
const suffix = index !== undefined ? index : simpleHash(routeId);
|
|
53
|
+
return `step_${routeId}_${suffix}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Generate a deterministic tool ID
|
|
58
|
+
* Format: tool_{sanitized_name}_{hash}
|
|
59
|
+
*/
|
|
60
|
+
export function generateToolId(name: string): string {
|
|
61
|
+
const sanitized = sanitize(name);
|
|
62
|
+
const hash = simpleHash(name);
|
|
63
|
+
return `tool_${sanitized}_${hash}`;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Generate a deterministic tool ID for inline tool handlers
|
|
68
|
+
* Format: tool_inline_{stepId}_{hash}
|
|
69
|
+
*/
|
|
70
|
+
export function generateInlineToolId(stepId: string): string {
|
|
71
|
+
const hash = simpleHash(`${stepId}_inline_tool`);
|
|
72
|
+
return `tool_inline_${stepId}_${hash}`;
|
|
73
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions and helpers
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// ID generation
|
|
6
|
+
export {
|
|
7
|
+
generateRouteId,
|
|
8
|
+
generateStepId,
|
|
9
|
+
generateToolId,
|
|
10
|
+
generateInlineToolId,
|
|
11
|
+
} from "./id";
|
|
12
|
+
|
|
13
|
+
// Session management
|
|
14
|
+
export {
|
|
15
|
+
createSession,
|
|
16
|
+
createSessionId,
|
|
17
|
+
enterRoute,
|
|
18
|
+
enterStep,
|
|
19
|
+
mergeCollected,
|
|
20
|
+
sessionStepToData,
|
|
21
|
+
sessionDataToStep,
|
|
22
|
+
} from "./session";
|
|
23
|
+
|
|
24
|
+
// Template rendering
|
|
25
|
+
export {
|
|
26
|
+
render,
|
|
27
|
+
renderMany,
|
|
28
|
+
renderTemplate,
|
|
29
|
+
renderTemplateObject,
|
|
30
|
+
formatKnowledgeBase,
|
|
31
|
+
createTemplateContext,
|
|
32
|
+
} from "./template";
|
|
33
|
+
|
|
34
|
+
// Cloning utilities
|
|
35
|
+
export { cloneDeep } from "./clone";
|
|
36
|
+
|
|
37
|
+
// Event utilities
|
|
38
|
+
export { getLastMessageFromHistory } from "./event";
|
|
39
|
+
|
|
40
|
+
// History utilities
|
|
41
|
+
export {
|
|
42
|
+
normalizeHistory,
|
|
43
|
+
historyItemToEvent,
|
|
44
|
+
historyToEvents,
|
|
45
|
+
eventToHistoryItem,
|
|
46
|
+
eventsToHistory,
|
|
47
|
+
userMessage,
|
|
48
|
+
assistantMessage,
|
|
49
|
+
toolMessage,
|
|
50
|
+
systemMessage,
|
|
51
|
+
} from "./history";
|
|
52
|
+
|
|
53
|
+
// Logging
|
|
54
|
+
export { LoggerLevel, logger } from "./logger";
|
|
55
|
+
|
|
56
|
+
// Retry utilities
|
|
57
|
+
export type { RetryOptions } from "./retry";
|
|
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
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import log from "loglevel";
|
|
2
|
+
|
|
3
|
+
export enum LoggerLevel {
|
|
4
|
+
DEBUG = "debug",
|
|
5
|
+
INFO = "info",
|
|
6
|
+
WARN = "warn",
|
|
7
|
+
ERROR = "error",
|
|
8
|
+
SILENT = "silent",
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Default log level
|
|
13
|
+
*/
|
|
14
|
+
const DEFAULT_LOG_LEVEL = LoggerLevel.SILENT;
|
|
15
|
+
|
|
16
|
+
// Initialize logger
|
|
17
|
+
log.setLevel(DEFAULT_LOG_LEVEL);
|
|
18
|
+
|
|
19
|
+
export const logger = log;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry utility with exponential backoff
|
|
3
|
+
*/
|
|
4
|
+
import {logger} from './logger'
|
|
5
|
+
|
|
6
|
+
export interface RetryOptions<T> {
|
|
7
|
+
operation: () => Promise<T>;
|
|
8
|
+
maxRetries: number;
|
|
9
|
+
delay: (attempt: number) => number;
|
|
10
|
+
onRetry?: (attempt: number, error: unknown) => void;
|
|
11
|
+
onFailure?: (error: unknown) => boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export async function retry<T>(options: RetryOptions<T>): Promise<T> {
|
|
15
|
+
const { operation, maxRetries, delay, onRetry, onFailure } = options;
|
|
16
|
+
|
|
17
|
+
let lastError: unknown;
|
|
18
|
+
|
|
19
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
20
|
+
try {
|
|
21
|
+
return await operation();
|
|
22
|
+
} catch (error: unknown) {
|
|
23
|
+
lastError = error;
|
|
24
|
+
|
|
25
|
+
if (attempt === maxRetries) {
|
|
26
|
+
const shouldRethrow = onFailure ? onFailure(lastError) : true;
|
|
27
|
+
if (shouldRethrow) {
|
|
28
|
+
throw lastError;
|
|
29
|
+
}
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (onRetry) {
|
|
34
|
+
onRetry(attempt, lastError);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const delayMs = delay(attempt);
|
|
38
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/only-throw-error
|
|
43
|
+
throw lastError ?? new Error("Operation failed");
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const withTimeoutAndRetry = async <T>(
|
|
47
|
+
operation: () => Promise<T>,
|
|
48
|
+
timeoutMs: number = 60000,
|
|
49
|
+
maxRetries: number = 3,
|
|
50
|
+
operationName: string = "AI operation"
|
|
51
|
+
): Promise<T> => {
|
|
52
|
+
const createTimeoutOperation = () => async (): Promise<T> => {
|
|
53
|
+
const controller = new AbortController();
|
|
54
|
+
const timeoutId = setTimeout(() => {
|
|
55
|
+
controller.abort();
|
|
56
|
+
}, timeoutMs);
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
const result = await Promise.race([
|
|
60
|
+
operation(),
|
|
61
|
+
new Promise<never>((_, reject) => {
|
|
62
|
+
controller.signal.addEventListener("abort", () => {
|
|
63
|
+
reject(new Error(`Operation timed out after ${timeoutMs}ms`));
|
|
64
|
+
});
|
|
65
|
+
}),
|
|
66
|
+
]);
|
|
67
|
+
|
|
68
|
+
clearTimeout(timeoutId);
|
|
69
|
+
return result;
|
|
70
|
+
} catch (error: unknown) {
|
|
71
|
+
clearTimeout(timeoutId);
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
return retry<T>({
|
|
77
|
+
operation: createTimeoutOperation(),
|
|
78
|
+
maxRetries,
|
|
79
|
+
delay: (attempt: number) => Math.min(1000 * Math.pow(2, attempt), 5000),
|
|
80
|
+
onRetry: (attempt: number, error: unknown) => {
|
|
81
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
82
|
+
logger.error(
|
|
83
|
+
`[${operationName}] Failed attempt ${attempt + 1}:`,
|
|
84
|
+
message
|
|
85
|
+
);
|
|
86
|
+
const delay = Math.min(1000 * Math.pow(2, attempt), 5000);
|
|
87
|
+
logger.debug(`[${operationName}] Retrying in ${delay}ms...`);
|
|
88
|
+
logger.debug(
|
|
89
|
+
`[${operationName}] Attempt ${attempt + 2}/${maxRetries + 1}`
|
|
90
|
+
);
|
|
91
|
+
},
|
|
92
|
+
onFailure: (_error: unknown) => {
|
|
93
|
+
logger.error(`[${operationName}] All ${maxRetries + 1} attempts failed`);
|
|
94
|
+
return true;
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
};
|