chat-flow-ardymalihi 1.0.2 → 3.0.0
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 +2 -0
- package/dist/adapters/intent/IntentMatcher.d.ts +16 -0
- package/dist/adapters/intent/IntentMatcher.d.ts.map +1 -1
- package/dist/adapters/intent/IntentMatcher.js +93 -15
- package/dist/adapters/intent/IntentMatcher.js.map +1 -1
- package/dist/adapters/intent/IntentService.d.ts +4 -5
- package/dist/adapters/intent/IntentService.d.ts.map +1 -1
- package/dist/adapters/intent/IntentService.js +15 -9
- package/dist/adapters/intent/IntentService.js.map +1 -1
- package/dist/adapters/intent/MockIntentService.d.ts +7 -0
- package/dist/adapters/intent/MockIntentService.d.ts.map +1 -0
- package/dist/adapters/intent/MockIntentService.js +36 -0
- package/dist/adapters/intent/MockIntentService.js.map +1 -0
- package/dist/adapters/llm/OllamaLLMAdapter.d.ts +9 -0
- package/dist/adapters/llm/OllamaLLMAdapter.d.ts.map +1 -0
- package/dist/adapters/llm/OllamaLLMAdapter.js +74 -0
- package/dist/adapters/llm/OllamaLLMAdapter.js.map +1 -0
- package/dist/adapters/logger/ConsoleLogger.d.ts +12 -0
- package/dist/adapters/logger/ConsoleLogger.d.ts.map +1 -0
- package/dist/adapters/logger/ConsoleLogger.js +37 -0
- package/dist/adapters/logger/ConsoleLogger.js.map +1 -0
- package/dist/adapters/repository/InMemoryRepository.d.ts +35 -4
- package/dist/adapters/repository/InMemoryRepository.d.ts.map +1 -1
- package/dist/adapters/repository/InMemoryRepository.js +204 -10
- package/dist/adapters/repository/InMemoryRepository.js.map +1 -1
- package/dist/adapters/repository/RedisRepository.d.ts +52 -5
- package/dist/adapters/repository/RedisRepository.d.ts.map +1 -1
- package/dist/adapters/repository/RedisRepository.js +525 -26
- package/dist/adapters/repository/RedisRepository.js.map +1 -1
- package/dist/adapters/storage/RedisAudioStorageAdapter.d.ts +33 -0
- package/dist/adapters/storage/RedisAudioStorageAdapter.d.ts.map +1 -0
- package/dist/adapters/storage/RedisAudioStorageAdapter.js +121 -0
- package/dist/adapters/storage/RedisAudioStorageAdapter.js.map +1 -0
- package/dist/adapters/storage/RedisBufferStorageAdapter.d.ts +14 -0
- package/dist/adapters/storage/RedisBufferStorageAdapter.d.ts.map +1 -0
- package/dist/adapters/storage/RedisBufferStorageAdapter.js +94 -0
- package/dist/adapters/storage/RedisBufferStorageAdapter.js.map +1 -0
- package/dist/adapters/voice/ElevenLabsVoiceAdapter.d.ts +29 -0
- package/dist/adapters/voice/ElevenLabsVoiceAdapter.d.ts.map +1 -0
- package/dist/adapters/voice/ElevenLabsVoiceAdapter.js +75 -0
- package/dist/adapters/voice/ElevenLabsVoiceAdapter.js.map +1 -0
- package/dist/adapters/voice/GeminiMultimodalLiveAdapter.d.ts +77 -0
- package/dist/adapters/voice/GeminiMultimodalLiveAdapter.d.ts.map +1 -0
- package/dist/adapters/voice/GeminiMultimodalLiveAdapter.js +187 -0
- package/dist/adapters/voice/GeminiMultimodalLiveAdapter.js.map +1 -0
- package/dist/adapters/voice/GeminiVoiceAdapter.d.ts +36 -0
- package/dist/adapters/voice/GeminiVoiceAdapter.d.ts.map +1 -0
- package/dist/adapters/voice/GeminiVoiceAdapter.js +134 -0
- package/dist/adapters/voice/GeminiVoiceAdapter.js.map +1 -0
- package/dist/adapters/voice/GoogleTTSAdapter.d.ts +61 -0
- package/dist/adapters/voice/GoogleTTSAdapter.d.ts.map +1 -0
- package/dist/adapters/voice/GoogleTTSAdapter.js +165 -0
- package/dist/adapters/voice/GoogleTTSAdapter.js.map +1 -0
- package/dist/adapters/voice/GoogleVoiceAdapter.d.ts +33 -0
- package/dist/adapters/voice/GoogleVoiceAdapter.d.ts.map +1 -0
- package/dist/adapters/voice/GoogleVoiceAdapter.js +155 -0
- package/dist/adapters/voice/GoogleVoiceAdapter.js.map +1 -0
- package/dist/adapters/voice/HybridVoiceAdapter.d.ts +54 -0
- package/dist/adapters/voice/HybridVoiceAdapter.d.ts.map +1 -0
- package/dist/adapters/voice/HybridVoiceAdapter.js +102 -0
- package/dist/adapters/voice/HybridVoiceAdapter.js.map +1 -0
- package/dist/adapters/voice/LanguageVoiceMapper.d.ts +60 -0
- package/dist/adapters/voice/LanguageVoiceMapper.d.ts.map +1 -0
- package/dist/adapters/voice/LanguageVoiceMapper.js +130 -0
- package/dist/adapters/voice/LanguageVoiceMapper.js.map +1 -0
- package/dist/adapters/voice/VertexVoiceAdapter.d.ts +32 -0
- package/dist/adapters/voice/VertexVoiceAdapter.d.ts.map +1 -0
- package/dist/adapters/voice/VertexVoiceAdapter.js +179 -0
- package/dist/adapters/voice/VertexVoiceAdapter.js.map +1 -0
- package/dist/adapters/webhook/WebhookService.d.ts +47 -0
- package/dist/adapters/webhook/WebhookService.d.ts.map +1 -0
- package/dist/adapters/webhook/WebhookService.js +265 -0
- package/dist/adapters/webhook/WebhookService.js.map +1 -0
- package/dist/adapters/workflow/MockWorkflowAdapter.d.ts.map +1 -1
- package/dist/adapters/workflow/MockWorkflowAdapter.js +12 -1
- package/dist/adapters/workflow/MockWorkflowAdapter.js.map +1 -1
- package/dist/adapters/workflow/WorkflowAdapter.d.ts +55 -0
- package/dist/adapters/workflow/WorkflowAdapter.d.ts.map +1 -0
- package/dist/adapters/workflow/WorkflowAdapter.js +242 -0
- package/dist/adapters/workflow/WorkflowAdapter.js.map +1 -0
- package/dist/adapters/workflow/actions/getSupportHoursAction.d.ts +10 -0
- package/dist/adapters/workflow/actions/getSupportHoursAction.d.ts.map +1 -0
- package/dist/adapters/workflow/actions/getSupportHoursAction.js +33 -0
- package/dist/adapters/workflow/actions/getSupportHoursAction.js.map +1 -0
- package/dist/adapters/workflow/actions/index.d.ts +6 -0
- package/dist/adapters/workflow/actions/index.d.ts.map +1 -0
- package/dist/adapters/workflow/actions/index.js +22 -0
- package/dist/adapters/workflow/actions/index.js.map +1 -0
- package/dist/adapters/workflow/actions/pushOutputResultAction.d.ts +11 -0
- package/dist/adapters/workflow/actions/pushOutputResultAction.d.ts.map +1 -0
- package/dist/adapters/workflow/actions/pushOutputResultAction.js +31 -0
- package/dist/adapters/workflow/actions/pushOutputResultAction.js.map +1 -0
- package/dist/adapters/workflow/actions/setWorkflowMessageAction.d.ts +12 -0
- package/dist/adapters/workflow/actions/setWorkflowMessageAction.d.ts.map +1 -0
- package/dist/adapters/workflow/actions/setWorkflowMessageAction.js +32 -0
- package/dist/adapters/workflow/actions/setWorkflowMessageAction.js.map +1 -0
- package/dist/adapters/workflow/engine/constants.d.ts +3 -0
- package/dist/adapters/workflow/engine/constants.d.ts.map +1 -0
- package/dist/adapters/workflow/engine/constants.js +6 -0
- package/dist/adapters/workflow/engine/constants.js.map +1 -0
- package/dist/adapters/workflow/engine/engine.d.ts +32 -0
- package/dist/adapters/workflow/engine/engine.d.ts.map +1 -0
- package/dist/adapters/workflow/engine/engine.js +623 -0
- package/dist/adapters/workflow/engine/engine.js.map +1 -0
- package/dist/adapters/workflow/engine/event-registry.d.ts +12 -0
- package/dist/adapters/workflow/engine/event-registry.d.ts.map +1 -0
- package/dist/adapters/workflow/engine/event-registry.js +33 -0
- package/dist/adapters/workflow/engine/event-registry.js.map +1 -0
- package/dist/adapters/workflow/engine/interpolator.d.ts +11 -0
- package/dist/adapters/workflow/engine/interpolator.d.ts.map +1 -0
- package/dist/adapters/workflow/engine/interpolator.js +93 -0
- package/dist/adapters/workflow/engine/interpolator.js.map +1 -0
- package/dist/adapters/workflow/engine/registry.d.ts +12 -0
- package/dist/adapters/workflow/engine/registry.d.ts.map +1 -0
- package/dist/adapters/workflow/engine/registry.js +39 -0
- package/dist/adapters/workflow/engine/registry.js.map +1 -0
- package/dist/adapters/workflow/engine/template-registry.d.ts +60 -0
- package/dist/adapters/workflow/engine/template-registry.d.ts.map +1 -0
- package/dist/adapters/workflow/engine/template-registry.js +92 -0
- package/dist/adapters/workflow/engine/template-registry.js.map +1 -0
- package/dist/adapters/workflow/engine/types.d.ts +182 -0
- package/dist/adapters/workflow/engine/types.d.ts.map +1 -0
- package/dist/adapters/workflow/engine/types.js +3 -0
- package/dist/adapters/workflow/engine/types.js.map +1 -0
- package/dist/adapters/workflow/engine/utils/format-utils.d.ts +43 -0
- package/dist/adapters/workflow/engine/utils/format-utils.d.ts.map +1 -0
- package/dist/adapters/workflow/engine/utils/format-utils.js +137 -0
- package/dist/adapters/workflow/engine/utils/format-utils.js.map +1 -0
- package/dist/adapters/workflow/engine/utils/layout-calculator.d.ts +7 -0
- package/dist/adapters/workflow/engine/utils/layout-calculator.d.ts.map +1 -0
- package/dist/adapters/workflow/engine/utils/layout-calculator.js +87 -0
- package/dist/adapters/workflow/engine/utils/layout-calculator.js.map +1 -0
- package/dist/adapters/workflow/engine/utils/slugify.d.ts +2 -0
- package/dist/adapters/workflow/engine/utils/slugify.d.ts.map +1 -0
- package/dist/adapters/workflow/engine/utils/slugify.js +41 -0
- package/dist/adapters/workflow/engine/utils/slugify.js.map +1 -0
- package/dist/adapters/workflow/engine/validator.d.ts +9 -0
- package/dist/adapters/workflow/engine/validator.d.ts.map +1 -0
- package/dist/adapters/workflow/engine/validator.js +425 -0
- package/dist/adapters/workflow/engine/validator.js.map +1 -0
- package/dist/config/ChatFlowConfig.d.ts +7 -0
- package/dist/config/ChatFlowConfig.d.ts.map +1 -1
- package/dist/config/ChatFlowConfig.js +5 -0
- package/dist/config/ChatFlowConfig.js.map +1 -1
- package/dist/core/entities/ConversationSession.d.ts +36 -1
- package/dist/core/entities/ConversationSession.d.ts.map +1 -1
- package/dist/core/entities/ConversationSession.js +78 -1
- package/dist/core/entities/ConversationSession.js.map +1 -1
- package/dist/core/entities/Message.d.ts +5 -2
- package/dist/core/entities/Message.d.ts.map +1 -1
- package/dist/core/entities/Message.js +2 -0
- package/dist/core/entities/Message.js.map +1 -1
- package/dist/core/utils/AudioStreamBuffer.d.ts +33 -0
- package/dist/core/utils/AudioStreamBuffer.d.ts.map +1 -0
- package/dist/core/utils/AudioStreamBuffer.js +55 -0
- package/dist/core/utils/AudioStreamBuffer.js.map +1 -0
- package/dist/core/utils/AudioUtils.d.ts +41 -0
- package/dist/core/utils/AudioUtils.d.ts.map +1 -0
- package/dist/core/utils/AudioUtils.js +188 -0
- package/dist/core/utils/AudioUtils.js.map +1 -0
- package/dist/core/utils/LanguageDetector.d.ts +52 -0
- package/dist/core/utils/LanguageDetector.d.ts.map +1 -0
- package/dist/core/utils/LanguageDetector.js +173 -0
- package/dist/core/utils/LanguageDetector.js.map +1 -0
- package/dist/core/utils/WavUtils.d.ts +14 -0
- package/dist/core/utils/WavUtils.d.ts.map +1 -0
- package/dist/core/utils/WavUtils.js +37 -0
- package/dist/core/utils/WavUtils.js.map +1 -0
- package/dist/demo/cli-demo.js +10 -6
- package/dist/demo/cli-demo.js.map +1 -1
- package/dist/demo/console-chat.js +10 -6
- package/dist/demo/console-chat.js.map +1 -1
- package/dist/demo/interactive-voice-chat.d.ts +2 -0
- package/dist/demo/interactive-voice-chat.d.ts.map +1 -0
- package/dist/demo/interactive-voice-chat.js +180 -0
- package/dist/demo/interactive-voice-chat.js.map +1 -0
- package/dist/demo/voice-demo.d.ts +2 -0
- package/dist/demo/voice-demo.d.ts.map +1 -0
- package/dist/demo/voice-demo.js +188 -0
- package/dist/demo/voice-demo.js.map +1 -0
- package/dist/index.d.ts +9 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -8
- package/dist/index.js.map +1 -1
- package/dist/intent/IntentService.d.ts.map +1 -1
- package/dist/intent/IntentService.js +13 -7
- package/dist/intent/IntentService.js.map +1 -1
- package/dist/intent/MockIntentService.d.ts +2 -1
- package/dist/intent/MockIntentService.d.ts.map +1 -1
- package/dist/intent/MockIntentService.js +9 -3
- package/dist/intent/MockIntentService.js.map +1 -1
- package/dist/interfaces.d.ts +551 -6
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js +19 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/orchestrator/Orchestrator.d.ts +48 -4
- package/dist/orchestrator/Orchestrator.d.ts.map +1 -1
- package/dist/orchestrator/Orchestrator.js +650 -33
- package/dist/orchestrator/Orchestrator.js.map +1 -1
- package/dist/scripts/seed-collaborative-intents.d.ts +2 -0
- package/dist/scripts/seed-collaborative-intents.d.ts.map +1 -0
- package/dist/scripts/seed-collaborative-intents.js +90 -0
- package/dist/scripts/seed-collaborative-intents.js.map +1 -0
- package/dist/scripts/test-isolated-config.d.ts +2 -0
- package/dist/scripts/test-isolated-config.d.ts.map +1 -0
- package/dist/scripts/test-isolated-config.js +80 -0
- package/dist/scripts/test-isolated-config.js.map +1 -0
- package/dist/scripts/verify_redis_intents.js +4 -2
- package/dist/scripts/verify_redis_intents.js.map +1 -1
- package/dist/server/ChatFlowWebSocketServer.d.ts +46 -0
- package/dist/server/ChatFlowWebSocketServer.d.ts.map +1 -0
- package/dist/server/ChatFlowWebSocketServer.js +344 -0
- package/dist/server/ChatFlowWebSocketServer.js.map +1 -0
- package/dist/server/realtime-voice-server.d.ts +2 -0
- package/dist/server/realtime-voice-server.d.ts.map +1 -0
- package/dist/server/realtime-voice-server.js +627 -0
- package/dist/server/realtime-voice-server.js.map +1 -0
- package/dist/src/adapters/intent/IntentMatcher.d.ts +41 -0
- package/dist/src/adapters/intent/IntentMatcher.d.ts.map +1 -0
- package/dist/src/adapters/intent/IntentMatcher.js +167 -0
- package/dist/src/adapters/intent/IntentMatcher.js.map +1 -0
- package/dist/src/adapters/intent/IntentService.d.ts +26 -0
- package/dist/src/adapters/intent/IntentService.d.ts.map +1 -0
- package/dist/src/adapters/intent/IntentService.js +65 -0
- package/dist/src/adapters/intent/IntentService.js.map +1 -0
- package/dist/src/adapters/intent/MockIntentService.d.ts +7 -0
- package/dist/src/adapters/intent/MockIntentService.d.ts.map +1 -0
- package/dist/src/adapters/intent/MockIntentService.js +36 -0
- package/dist/src/adapters/intent/MockIntentService.js.map +1 -0
- package/dist/src/adapters/llm/GeminiLLMAdapter.d.ts +10 -0
- package/dist/src/adapters/llm/GeminiLLMAdapter.d.ts.map +1 -0
- package/dist/src/adapters/llm/GeminiLLMAdapter.js +102 -0
- package/dist/src/adapters/llm/GeminiLLMAdapter.js.map +1 -0
- package/dist/src/adapters/llm/MockLLMAdapter.d.ts +5 -0
- package/dist/src/adapters/llm/MockLLMAdapter.d.ts.map +1 -0
- package/dist/src/adapters/llm/MockLLMAdapter.js +31 -0
- package/dist/src/adapters/llm/MockLLMAdapter.js.map +1 -0
- package/dist/src/adapters/llm/OllamaLLMAdapter.d.ts +9 -0
- package/dist/src/adapters/llm/OllamaLLMAdapter.d.ts.map +1 -0
- package/dist/src/adapters/llm/OllamaLLMAdapter.js +74 -0
- package/dist/src/adapters/llm/OllamaLLMAdapter.js.map +1 -0
- package/dist/src/adapters/logger/ConsoleLogger.d.ts +12 -0
- package/dist/src/adapters/logger/ConsoleLogger.d.ts.map +1 -0
- package/dist/src/adapters/logger/ConsoleLogger.js +37 -0
- package/dist/src/adapters/logger/ConsoleLogger.js.map +1 -0
- package/dist/src/adapters/repository/InMemoryRepository.d.ts +57 -0
- package/dist/src/adapters/repository/InMemoryRepository.d.ts.map +1 -0
- package/dist/src/adapters/repository/InMemoryRepository.js +269 -0
- package/dist/src/adapters/repository/InMemoryRepository.js.map +1 -0
- package/dist/src/adapters/repository/RedisRepository.d.ts +72 -0
- package/dist/src/adapters/repository/RedisRepository.d.ts.map +1 -0
- package/dist/src/adapters/repository/RedisRepository.js +700 -0
- package/dist/src/adapters/repository/RedisRepository.js.map +1 -0
- package/dist/src/adapters/repository/SupabaseRepository.d.ts +60 -0
- package/dist/src/adapters/repository/SupabaseRepository.d.ts.map +1 -0
- package/dist/src/adapters/repository/SupabaseRepository.js +774 -0
- package/dist/src/adapters/repository/SupabaseRepository.js.map +1 -0
- package/dist/src/adapters/storage/RedisAudioStorageAdapter.d.ts +33 -0
- package/dist/src/adapters/storage/RedisAudioStorageAdapter.d.ts.map +1 -0
- package/dist/src/adapters/storage/RedisAudioStorageAdapter.js +121 -0
- package/dist/src/adapters/storage/RedisAudioStorageAdapter.js.map +1 -0
- package/dist/src/adapters/voice/GoogleVoiceAdapter.d.ts +33 -0
- package/dist/src/adapters/voice/GoogleVoiceAdapter.d.ts.map +1 -0
- package/dist/src/adapters/voice/GoogleVoiceAdapter.js +155 -0
- package/dist/src/adapters/voice/GoogleVoiceAdapter.js.map +1 -0
- package/dist/src/adapters/voice/LanguageVoiceMapper.d.ts +60 -0
- package/dist/src/adapters/voice/LanguageVoiceMapper.d.ts.map +1 -0
- package/dist/src/adapters/voice/LanguageVoiceMapper.js +130 -0
- package/dist/src/adapters/voice/LanguageVoiceMapper.js.map +1 -0
- package/dist/src/adapters/voice/VertexVoiceAdapter.d.ts +32 -0
- package/dist/src/adapters/voice/VertexVoiceAdapter.d.ts.map +1 -0
- package/dist/src/adapters/voice/VertexVoiceAdapter.js +179 -0
- package/dist/src/adapters/voice/VertexVoiceAdapter.js.map +1 -0
- package/dist/src/adapters/webhook/WebhookService.d.ts +47 -0
- package/dist/src/adapters/webhook/WebhookService.d.ts.map +1 -0
- package/dist/src/adapters/webhook/WebhookService.js +265 -0
- package/dist/src/adapters/webhook/WebhookService.js.map +1 -0
- package/dist/src/adapters/workflow/MockWorkflowAdapter.d.ts +5 -0
- package/dist/src/adapters/workflow/MockWorkflowAdapter.d.ts.map +1 -0
- package/dist/src/adapters/workflow/MockWorkflowAdapter.js +173 -0
- package/dist/src/adapters/workflow/MockWorkflowAdapter.js.map +1 -0
- package/dist/src/adapters/workflow/WorkflowAdapter.d.ts +55 -0
- package/dist/src/adapters/workflow/WorkflowAdapter.d.ts.map +1 -0
- package/dist/src/adapters/workflow/WorkflowAdapter.js +203 -0
- package/dist/src/adapters/workflow/WorkflowAdapter.js.map +1 -0
- package/dist/src/adapters/workflow/actions/index.d.ts +6 -0
- package/dist/src/adapters/workflow/actions/index.d.ts.map +1 -0
- package/dist/src/adapters/workflow/actions/index.js +22 -0
- package/dist/src/adapters/workflow/actions/index.js.map +1 -0
- package/dist/src/adapters/workflow/actions/pushOutputResultAction.d.ts +11 -0
- package/dist/src/adapters/workflow/actions/pushOutputResultAction.d.ts.map +1 -0
- package/dist/src/adapters/workflow/actions/pushOutputResultAction.js +31 -0
- package/dist/src/adapters/workflow/actions/pushOutputResultAction.js.map +1 -0
- package/dist/src/adapters/workflow/engine/constants.d.ts +3 -0
- package/dist/src/adapters/workflow/engine/constants.d.ts.map +1 -0
- package/dist/src/adapters/workflow/engine/constants.js +6 -0
- package/dist/src/adapters/workflow/engine/constants.js.map +1 -0
- package/dist/src/adapters/workflow/engine/engine.d.ts +32 -0
- package/dist/src/adapters/workflow/engine/engine.d.ts.map +1 -0
- package/dist/src/adapters/workflow/engine/engine.js +622 -0
- package/dist/src/adapters/workflow/engine/engine.js.map +1 -0
- package/dist/src/adapters/workflow/engine/event-registry.d.ts +12 -0
- package/dist/src/adapters/workflow/engine/event-registry.d.ts.map +1 -0
- package/dist/src/adapters/workflow/engine/event-registry.js +33 -0
- package/dist/src/adapters/workflow/engine/event-registry.js.map +1 -0
- package/dist/src/adapters/workflow/engine/interpolator.d.ts +11 -0
- package/dist/src/adapters/workflow/engine/interpolator.d.ts.map +1 -0
- package/dist/src/adapters/workflow/engine/interpolator.js +93 -0
- package/dist/src/adapters/workflow/engine/interpolator.js.map +1 -0
- package/dist/src/adapters/workflow/engine/registry.d.ts +12 -0
- package/dist/src/adapters/workflow/engine/registry.d.ts.map +1 -0
- package/dist/src/adapters/workflow/engine/registry.js +39 -0
- package/dist/src/adapters/workflow/engine/registry.js.map +1 -0
- package/dist/src/adapters/workflow/engine/template-registry.d.ts +60 -0
- package/dist/src/adapters/workflow/engine/template-registry.d.ts.map +1 -0
- package/dist/src/adapters/workflow/engine/template-registry.js +92 -0
- package/dist/src/adapters/workflow/engine/template-registry.js.map +1 -0
- package/dist/src/adapters/workflow/engine/utils/format-utils.d.ts +43 -0
- package/dist/src/adapters/workflow/engine/utils/format-utils.d.ts.map +1 -0
- package/dist/src/adapters/workflow/engine/utils/format-utils.js +137 -0
- package/dist/src/adapters/workflow/engine/utils/format-utils.js.map +1 -0
- package/dist/src/adapters/workflow/engine/utils/layout-calculator.d.ts +7 -0
- package/dist/src/adapters/workflow/engine/utils/layout-calculator.d.ts.map +1 -0
- package/dist/src/adapters/workflow/engine/utils/layout-calculator.js +87 -0
- package/dist/src/adapters/workflow/engine/utils/layout-calculator.js.map +1 -0
- package/dist/src/adapters/workflow/engine/utils/slugify.d.ts +2 -0
- package/dist/src/adapters/workflow/engine/utils/slugify.d.ts.map +1 -0
- package/dist/src/adapters/workflow/engine/utils/slugify.js +41 -0
- package/dist/src/adapters/workflow/engine/utils/slugify.js.map +1 -0
- package/dist/src/adapters/workflow/engine/validator.d.ts +9 -0
- package/dist/src/adapters/workflow/engine/validator.d.ts.map +1 -0
- package/dist/src/adapters/workflow/engine/validator.js +425 -0
- package/dist/src/adapters/workflow/engine/validator.js.map +1 -0
- package/dist/src/api/router.d.ts +3 -0
- package/dist/src/api/router.d.ts.map +1 -0
- package/dist/src/api/router.js +27 -0
- package/dist/src/api/router.js.map +1 -0
- package/dist/src/api/routes/configs.d.ts +3 -0
- package/dist/src/api/routes/configs.d.ts.map +1 -0
- package/dist/src/api/routes/configs.js +110 -0
- package/dist/src/api/routes/configs.js.map +1 -0
- package/dist/src/api/routes/executions.d.ts +3 -0
- package/dist/src/api/routes/executions.d.ts.map +1 -0
- package/dist/src/api/routes/executions.js +77 -0
- package/dist/src/api/routes/executions.js.map +1 -0
- package/dist/src/api/routes/intents.d.ts +3 -0
- package/dist/src/api/routes/intents.d.ts.map +1 -0
- package/dist/src/api/routes/intents.js +128 -0
- package/dist/src/api/routes/intents.js.map +1 -0
- package/dist/src/api/routes/sessions.d.ts +3 -0
- package/dist/src/api/routes/sessions.d.ts.map +1 -0
- package/dist/src/api/routes/sessions.js +105 -0
- package/dist/src/api/routes/sessions.js.map +1 -0
- package/dist/src/api/routes/tenants.d.ts +3 -0
- package/dist/src/api/routes/tenants.d.ts.map +1 -0
- package/dist/src/api/routes/tenants.js +109 -0
- package/dist/src/api/routes/tenants.js.map +1 -0
- package/dist/src/api/routes/users.d.ts +3 -0
- package/dist/src/api/routes/users.d.ts.map +1 -0
- package/dist/src/api/routes/users.js +51 -0
- package/dist/src/api/routes/users.js.map +1 -0
- package/dist/src/api/routes/workflows.d.ts +3 -0
- package/dist/src/api/routes/workflows.d.ts.map +1 -0
- package/dist/src/api/routes/workflows.js +132 -0
- package/dist/src/api/routes/workflows.js.map +1 -0
- package/dist/src/config/ChatFlowConfig.d.ts +66 -0
- package/dist/src/config/ChatFlowConfig.d.ts.map +1 -0
- package/dist/src/config/ChatFlowConfig.js +54 -0
- package/dist/src/config/ChatFlowConfig.js.map +1 -0
- package/dist/src/config/index.d.ts +2 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +7 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/config/swagger.d.ts +2 -0
- package/dist/src/config/swagger.d.ts.map +1 -0
- package/dist/src/config/swagger.js +136 -0
- package/dist/src/config/swagger.js.map +1 -0
- package/dist/src/core/entities/ConversationSession.d.ts +58 -0
- package/dist/src/core/entities/ConversationSession.d.ts.map +1 -0
- package/dist/src/core/entities/ConversationSession.js +160 -0
- package/dist/src/core/entities/ConversationSession.js.map +1 -0
- package/dist/src/core/entities/Message.d.ts +14 -0
- package/dist/src/core/entities/Message.d.ts.map +1 -0
- package/dist/src/core/entities/Message.js +32 -0
- package/dist/src/core/entities/Message.js.map +1 -0
- package/dist/src/core/errors/ChatFlowError.d.ts +71 -0
- package/dist/src/core/errors/ChatFlowError.d.ts.map +1 -0
- package/dist/src/core/errors/ChatFlowError.js +108 -0
- package/dist/src/core/errors/ChatFlowError.js.map +1 -0
- package/dist/src/core/errors/index.d.ts +2 -0
- package/dist/src/core/errors/index.d.ts.map +1 -0
- package/dist/src/core/errors/index.js +15 -0
- package/dist/src/core/errors/index.js.map +1 -0
- package/dist/src/core/utils/AudioUtils.d.ts +41 -0
- package/dist/src/core/utils/AudioUtils.d.ts.map +1 -0
- package/dist/src/core/utils/AudioUtils.js +188 -0
- package/dist/src/core/utils/AudioUtils.js.map +1 -0
- package/dist/src/core/utils/LanguageDetector.d.ts +52 -0
- package/dist/src/core/utils/LanguageDetector.d.ts.map +1 -0
- package/dist/src/core/utils/LanguageDetector.js +173 -0
- package/dist/src/core/utils/LanguageDetector.js.map +1 -0
- package/dist/src/demo/cli-demo.d.ts +2 -0
- package/dist/src/demo/cli-demo.d.ts.map +1 -0
- package/dist/src/demo/cli-demo.js +146 -0
- package/dist/src/demo/cli-demo.js.map +1 -0
- package/dist/src/demo/console-chat.d.ts +2 -0
- package/dist/src/demo/console-chat.d.ts.map +1 -0
- package/dist/src/demo/console-chat.js +148 -0
- package/dist/src/demo/console-chat.js.map +1 -0
- package/dist/src/index.d.ts +27 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +78 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/interfaces.d.ts +663 -0
- package/dist/src/interfaces.d.ts.map +1 -0
- package/dist/src/interfaces.js +36 -0
- package/dist/src/interfaces.js.map +1 -0
- package/dist/src/orchestrator/Orchestrator.d.ts +62 -0
- package/dist/src/orchestrator/Orchestrator.d.ts.map +1 -0
- package/dist/src/orchestrator/Orchestrator.js +697 -0
- package/dist/src/orchestrator/Orchestrator.js.map +1 -0
- package/dist/src/scripts/debug-redis.d.ts +2 -0
- package/dist/src/scripts/debug-redis.d.ts.map +1 -0
- package/dist/src/scripts/debug-redis.js +55 -0
- package/dist/src/scripts/debug-redis.js.map +1 -0
- package/dist/src/scripts/seed-collaborative-intents.d.ts +2 -0
- package/dist/src/scripts/seed-collaborative-intents.d.ts.map +1 -0
- package/dist/src/scripts/seed-collaborative-intents.js +90 -0
- package/dist/src/scripts/seed-collaborative-intents.js.map +1 -0
- package/dist/src/scripts/test-isolated-config.d.ts +2 -0
- package/dist/src/scripts/test-isolated-config.d.ts.map +1 -0
- package/dist/src/scripts/test-isolated-config.js +80 -0
- package/dist/src/scripts/test-isolated-config.js.map +1 -0
- package/dist/src/scripts/verify_memory_intents.d.ts +2 -0
- package/dist/src/scripts/verify_memory_intents.d.ts.map +1 -0
- package/dist/src/scripts/verify_memory_intents.js +45 -0
- package/dist/src/scripts/verify_memory_intents.js.map +1 -0
- package/dist/src/scripts/verify_redis_intents.d.ts +2 -0
- package/dist/src/scripts/verify_redis_intents.d.ts.map +1 -0
- package/dist/src/scripts/verify_redis_intents.js +52 -0
- package/dist/src/scripts/verify_redis_intents.js.map +1 -0
- package/dist/src/server/ChatFlowWebSocketServer.d.ts +42 -0
- package/dist/src/server/ChatFlowWebSocketServer.d.ts.map +1 -0
- package/dist/src/server/ChatFlowWebSocketServer.js +355 -0
- package/dist/src/server/ChatFlowWebSocketServer.js.map +1 -0
- package/dist/src/utils/crypto.d.ts +7 -0
- package/dist/src/utils/crypto.d.ts.map +1 -0
- package/dist/src/utils/crypto.js +35 -0
- package/dist/src/utils/crypto.js.map +1 -0
- package/dist/src/utils/encryption-helpers.d.ts +14 -0
- package/dist/src/utils/encryption-helpers.d.ts.map +1 -0
- package/dist/src/utils/encryption-helpers.js +49 -0
- package/dist/src/utils/encryption-helpers.js.map +1 -0
- package/dist/utils/crypto.d.ts +7 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +35 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/encryption-helpers.d.ts +14 -0
- package/dist/utils/encryption-helpers.d.ts.map +1 -0
- package/dist/utils/encryption-helpers.js +49 -0
- package/dist/utils/encryption-helpers.js.map +1 -0
- package/dist/web/seed-demo-data.d.ts +2 -0
- package/dist/web/seed-demo-data.d.ts.map +1 -0
- package/dist/web/seed-demo-data.js +267 -0
- package/dist/web/seed-demo-data.js.map +1 -0
- package/dist/web/web-server.d.ts +2 -0
- package/dist/web/web-server.d.ts.map +1 -0
- package/dist/web/web-server.js +165 -0
- package/dist/web/web-server.js.map +1 -0
- package/package.json +32 -3
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import Redis from 'ioredis';
|
|
2
|
+
import { IAudioStorage, AudioFormatMetadata } from '../../interfaces';
|
|
3
|
+
/**
|
|
4
|
+
* Redis Audio Storage Adapter
|
|
5
|
+
* Stores audio recordings in Redis with automatic format conversion
|
|
6
|
+
* All audio is normalized to LINEAR16 PCM (16kHz, mono, 16-bit) during storage
|
|
7
|
+
* Final playback generates a proper WAV file with headers
|
|
8
|
+
*/
|
|
9
|
+
export declare class RedisAudioStorageAdapter implements IAudioStorage {
|
|
10
|
+
private redis;
|
|
11
|
+
private storageRoot;
|
|
12
|
+
private baseUrl;
|
|
13
|
+
constructor(redisClient: Redis, storageRoot?: string, baseUrl?: string);
|
|
14
|
+
private getRedisKey;
|
|
15
|
+
initializeSession(sessionId: string, metadata: any): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Append audio chunk with automatic format conversion to PCM
|
|
18
|
+
*/
|
|
19
|
+
appendAudio(sessionId: string, audioData: Buffer, formatMetadata?: AudioFormatMetadata): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Finalize session and return audio URL
|
|
22
|
+
*/
|
|
23
|
+
finalizeSession(sessionId: string): Promise<string>;
|
|
24
|
+
/**
|
|
25
|
+
* Get audio URL for a session
|
|
26
|
+
*/
|
|
27
|
+
getAudioUrl(sessionId: string): Promise<string | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Get session audio as a complete WAV file
|
|
30
|
+
*/
|
|
31
|
+
getSessionAudio(sessionId: string): Promise<Buffer | null>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=RedisAudioStorageAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisAudioStorageAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/storage/RedisAudioStorageAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,SAAS,CAAC;AAG5B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGtE;;;;;GAKG;AACH,qBAAa,wBAAyB,YAAW,aAAa;IAC1D,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;gBAEZ,WAAW,EAAE,KAAK,EAAE,WAAW,GAAE,MAA6B,EAAE,OAAO,GAAE,MAAsB;IAW3G,OAAO,CAAC,WAAW;IAIb,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxE;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5G;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBzD;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAS5D;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAenE"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.RedisAudioStorageAdapter = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const AudioUtils_1 = require("../../core/utils/AudioUtils");
|
|
40
|
+
/**
|
|
41
|
+
* Redis Audio Storage Adapter
|
|
42
|
+
* Stores audio recordings in Redis with automatic format conversion
|
|
43
|
+
* All audio is normalized to LINEAR16 PCM (16kHz, mono, 16-bit) during storage
|
|
44
|
+
* Final playback generates a proper WAV file with headers
|
|
45
|
+
*/
|
|
46
|
+
class RedisAudioStorageAdapter {
|
|
47
|
+
constructor(redisClient, storageRoot = 'storage/recordings', baseUrl = '/recordings') {
|
|
48
|
+
this.redis = redisClient;
|
|
49
|
+
this.storageRoot = path.resolve(storageRoot);
|
|
50
|
+
this.baseUrl = baseUrl;
|
|
51
|
+
// Ensure storage directory exists (for potential future disk caching)
|
|
52
|
+
if (!fs.existsSync(this.storageRoot)) {
|
|
53
|
+
fs.mkdirSync(this.storageRoot, { recursive: true });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
getRedisKey(sessionId) {
|
|
57
|
+
return `session:${sessionId}:audio`;
|
|
58
|
+
}
|
|
59
|
+
async initializeSession(sessionId, metadata) {
|
|
60
|
+
// Clear any existing audio for this session
|
|
61
|
+
await this.redis.del(this.getRedisKey(sessionId));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Append audio chunk with automatic format conversion to PCM
|
|
65
|
+
*/
|
|
66
|
+
async appendAudio(sessionId, audioData, formatMetadata) {
|
|
67
|
+
try {
|
|
68
|
+
// Convert to target PCM format using AudioUtils
|
|
69
|
+
const pcmData = await (0, AudioUtils_1.convertToTargetFormat)(audioData, formatMetadata);
|
|
70
|
+
// Store as base64 in Redis
|
|
71
|
+
await this.redis.rpush(this.getRedisKey(sessionId), pcmData.toString('base64'));
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error('[RedisAudioStorageAdapter] Error appending audio:', error);
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Finalize session and return audio URL
|
|
80
|
+
*/
|
|
81
|
+
async finalizeSession(sessionId) {
|
|
82
|
+
const key = this.getRedisKey(sessionId);
|
|
83
|
+
const exists = await this.redis.exists(key);
|
|
84
|
+
if (!exists) {
|
|
85
|
+
console.warn(`[RedisAudioStorageAdapter] No audio found for session ${sessionId}`);
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
// Set TTL (24 hours)
|
|
89
|
+
await this.redis.expire(key, 86400);
|
|
90
|
+
// Return URL for playback
|
|
91
|
+
return `${this.baseUrl}/${sessionId}.wav`;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get audio URL for a session
|
|
95
|
+
*/
|
|
96
|
+
async getAudioUrl(sessionId) {
|
|
97
|
+
const key = this.getRedisKey(sessionId);
|
|
98
|
+
const exists = await this.redis.exists(key);
|
|
99
|
+
if (exists) {
|
|
100
|
+
return `${this.baseUrl}/${sessionId}.wav`;
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get session audio as a complete WAV file
|
|
106
|
+
*/
|
|
107
|
+
async getSessionAudio(sessionId) {
|
|
108
|
+
const key = this.getRedisKey(sessionId);
|
|
109
|
+
const chunksBase64 = await this.redis.lrange(key, 0, -1);
|
|
110
|
+
if (!chunksBase64 || chunksBase64.length === 0) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
// Decode all PCM chunks
|
|
114
|
+
const pcmChunks = chunksBase64.map(chunk => Buffer.from(chunk, 'base64'));
|
|
115
|
+
const concatenatedPCM = Buffer.concat(pcmChunks);
|
|
116
|
+
// Wrap in WAV format using AudioUtils
|
|
117
|
+
return (0, AudioUtils_1.wrapPCMInWAV)(concatenatedPCM);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.RedisAudioStorageAdapter = RedisAudioStorageAdapter;
|
|
121
|
+
//# sourceMappingURL=RedisAudioStorageAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisAudioStorageAdapter.js","sourceRoot":"","sources":["../../../src/adapters/storage/RedisAudioStorageAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { IStorage } from '../../interfaces';
|
|
2
|
+
import Redis from 'ioredis';
|
|
3
|
+
export declare class RedisBufferStorageAdapter implements IStorage {
|
|
4
|
+
private redis;
|
|
5
|
+
private storageRoot;
|
|
6
|
+
private baseUrl;
|
|
7
|
+
constructor(redisClient: Redis, storageRoot?: string, baseUrl?: string);
|
|
8
|
+
private getRedisKey;
|
|
9
|
+
initializeSession(sessionId: string, metadata: any): Promise<void>;
|
|
10
|
+
appendAudio(sessionId: string, audioData: Buffer): Promise<void>;
|
|
11
|
+
finalizeSession(sessionId: string): Promise<string>;
|
|
12
|
+
getAudioUrl(sessionId: string): Promise<string | null>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=RedisBufferStorageAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisBufferStorageAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/storage/RedisBufferStorageAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,MAAM,SAAS,CAAC;AAI5B,qBAAa,yBAA0B,YAAW,QAAQ;IACtD,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;gBAEZ,WAAW,EAAE,KAAK,EAAE,WAAW,GAAE,MAA6B,EAAE,OAAO,GAAE,MAA2C;IAWhI,OAAO,CAAC,WAAW;IAIb,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA8BnD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAQ/D"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.RedisBufferStorageAdapter = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
class RedisBufferStorageAdapter {
|
|
40
|
+
constructor(redisClient, storageRoot = 'storage/recordings', baseUrl = 'http://localhost:8080/recordings') {
|
|
41
|
+
this.redis = redisClient;
|
|
42
|
+
this.storageRoot = path.resolve(storageRoot);
|
|
43
|
+
this.baseUrl = baseUrl;
|
|
44
|
+
// Ensure storage directory exists
|
|
45
|
+
if (!fs.existsSync(this.storageRoot)) {
|
|
46
|
+
fs.mkdirSync(this.storageRoot, { recursive: true });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
getRedisKey(sessionId) {
|
|
50
|
+
return `session:${sessionId}:audio`;
|
|
51
|
+
}
|
|
52
|
+
async initializeSession(sessionId, metadata) {
|
|
53
|
+
// Optional: Store metadata in Redis if needed, or simply clear any existing list
|
|
54
|
+
await this.redis.del(this.getRedisKey(sessionId));
|
|
55
|
+
}
|
|
56
|
+
async appendAudio(sessionId, audioData) {
|
|
57
|
+
// Redis stores binary as Buffer if configured, but ioredis default is strings.
|
|
58
|
+
// We need to encode to base64 or ensure binary mode.
|
|
59
|
+
// For safety and compatibility, we'll store as base64 strings in the list.
|
|
60
|
+
await this.redis.rpush(this.getRedisKey(sessionId), audioData.toString('base64'));
|
|
61
|
+
}
|
|
62
|
+
async finalizeSession(sessionId) {
|
|
63
|
+
const key = this.getRedisKey(sessionId);
|
|
64
|
+
// 1. Retrieve all chunks
|
|
65
|
+
const chunksBase64 = await this.redis.lrange(key, 0, -1);
|
|
66
|
+
if (!chunksBase64 || chunksBase64.length === 0) {
|
|
67
|
+
console.warn(`[Storage] No audio chunks found for session ${sessionId}`);
|
|
68
|
+
return '';
|
|
69
|
+
}
|
|
70
|
+
// 2. Decode and Concatenate
|
|
71
|
+
const buffers = chunksBase64.map(chunk => Buffer.from(chunk, 'base64'));
|
|
72
|
+
const finalBuffer = Buffer.concat(buffers);
|
|
73
|
+
// 3. Write to Disk (Simulating Bucket Upload)
|
|
74
|
+
const filename = `${sessionId}.wav`; // Assuming linear PCM / WAV chunks (even if headers are partial, concatenation of raw PCM is cleaner, but let's assume we are just saving the raw accumulation for now)
|
|
75
|
+
const filePath = path.join(this.storageRoot, filename);
|
|
76
|
+
await fs.promises.writeFile(filePath, finalBuffer);
|
|
77
|
+
console.log(`[Storage] Saved ${finalBuffer.length} bytes to ${filePath}`);
|
|
78
|
+
// 4. Cleanup Redis
|
|
79
|
+
await this.redis.del(key);
|
|
80
|
+
// Optional: expire generic session keys if needed
|
|
81
|
+
// 5. Return URL
|
|
82
|
+
return `${this.baseUrl}/${filename}`;
|
|
83
|
+
}
|
|
84
|
+
async getAudioUrl(sessionId) {
|
|
85
|
+
const filename = `${sessionId}.wav`;
|
|
86
|
+
const filePath = path.join(this.storageRoot, filename);
|
|
87
|
+
if (fs.existsSync(filePath)) {
|
|
88
|
+
return `${this.baseUrl}/${filename}`;
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.RedisBufferStorageAdapter = RedisBufferStorageAdapter;
|
|
94
|
+
//# sourceMappingURL=RedisBufferStorageAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisBufferStorageAdapter.js","sourceRoot":"","sources":["../../../src/adapters/storage/RedisBufferStorageAdapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,uCAAyB;AACzB,2CAA6B;AAE7B,MAAa,yBAAyB;IAKlC,YAAY,WAAkB,EAAE,cAAsB,oBAAoB,EAAE,UAAkB,kCAAkC;QAC5H,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,kCAAkC;QAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACnC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,SAAiB;QACjC,OAAO,WAAW,SAAS,QAAQ,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,SAAiB,EAAE,QAAa;QACpD,iFAAiF;QACjF,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,SAAiB;QAClD,+EAA+E;QAC/E,qDAAqD;QACrD,2EAA2E;QAC3E,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAiB;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAExC,yBAAyB;QACzB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEzD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,+CAA+C,SAAS,EAAE,CAAC,CAAC;YACzE,OAAO,EAAE,CAAC;QACd,CAAC;QAED,4BAA4B;QAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QACxE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE3C,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,GAAG,SAAS,MAAM,CAAC,CAAC,wKAAwK;QAC7M,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAEvD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,mBAAmB,WAAW,CAAC,MAAM,aAAa,QAAQ,EAAE,CAAC,CAAC;QAE1E,mBAAmB;QACnB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,kDAAkD;QAElD,gBAAgB;QAChB,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB;QAC/B,MAAM,QAAQ,GAAG,GAAG,SAAS,MAAM,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACvD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAtED,8DAsEC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { IVoiceAdapter, VoiceConfig, AudioFormatMetadata } from '../../interfaces';
|
|
2
|
+
/**
|
|
3
|
+
* ElevenLabs Voice Adapter
|
|
4
|
+
* Implements TTS using ElevenLabs API (free tier: 10,000 chars/month)
|
|
5
|
+
* Note: This adapter only implements TTS. Use GeminiVoiceAdapter for STT.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ElevenLabsVoiceAdapter implements IVoiceAdapter {
|
|
8
|
+
private apiKey;
|
|
9
|
+
private voiceConfig?;
|
|
10
|
+
constructor(apiKey: string, voiceConfig?: VoiceConfig);
|
|
11
|
+
/**
|
|
12
|
+
* Speech-to-text not supported by ElevenLabs
|
|
13
|
+
* Use GeminiVoiceAdapter or another provider for STT
|
|
14
|
+
*/
|
|
15
|
+
speechToText(audioBase64: string, config?: VoiceConfig['stt']): Promise<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Convert text to speech using ElevenLabs API
|
|
18
|
+
* @param text Text to convert to speech
|
|
19
|
+
* @param config Optional TTS configuration
|
|
20
|
+
* @returns Audio data as Uint8Array (WAV format)
|
|
21
|
+
*/
|
|
22
|
+
textToSpeech(text: string, config?: VoiceConfig['tts']): Promise<Uint8Array>;
|
|
23
|
+
/**
|
|
24
|
+
* Declare the audio format produced by ElevenLabs TTS
|
|
25
|
+
* Used by IAudioStorage for format conversion
|
|
26
|
+
*/
|
|
27
|
+
getTTSOutputFormat(): AudioFormatMetadata;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=ElevenLabsVoiceAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElevenLabsVoiceAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/voice/ElevenLabsVoiceAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEnF;;;;GAIG;AACH,qBAAa,sBAAuB,YAAW,aAAa;IACxD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAC,CAAc;gBAEtB,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW;IAKrD;;;OAGG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrF;;;;;OAKG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAwClF;;;OAGG;IACH,kBAAkB,IAAI,mBAAmB;CAQ5C"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ElevenLabsVoiceAdapter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* ElevenLabs Voice Adapter
|
|
6
|
+
* Implements TTS using ElevenLabs API (free tier: 10,000 chars/month)
|
|
7
|
+
* Note: This adapter only implements TTS. Use GeminiVoiceAdapter for STT.
|
|
8
|
+
*/
|
|
9
|
+
class ElevenLabsVoiceAdapter {
|
|
10
|
+
constructor(apiKey, voiceConfig) {
|
|
11
|
+
this.apiKey = apiKey;
|
|
12
|
+
this.voiceConfig = voiceConfig;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Speech-to-text not supported by ElevenLabs
|
|
16
|
+
* Use GeminiVoiceAdapter or another provider for STT
|
|
17
|
+
*/
|
|
18
|
+
async speechToText(audioBase64, config) {
|
|
19
|
+
throw new Error('ElevenLabs does not support speech-to-text. Use GeminiVoiceAdapter or another provider for STT.');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Convert text to speech using ElevenLabs API
|
|
23
|
+
* @param text Text to convert to speech
|
|
24
|
+
* @param config Optional TTS configuration
|
|
25
|
+
* @returns Audio data as Uint8Array (WAV format)
|
|
26
|
+
*/
|
|
27
|
+
async textToSpeech(text, config) {
|
|
28
|
+
const ttsConfig = config || this.voiceConfig?.tts;
|
|
29
|
+
// Default to Rachel voice (female, multilingual, free tier compatible)
|
|
30
|
+
const voiceId = ttsConfig?.voice || '21m00Tcm4TlvDq8ikWAM';
|
|
31
|
+
try {
|
|
32
|
+
const response = await fetch(`https://api.elevenlabs.io/v1/text-to-speech/${voiceId}`, {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: {
|
|
35
|
+
'Accept': 'audio/wav', // Changed from audio/mpeg to audio/wav for better compatibility
|
|
36
|
+
'Content-Type': 'application/json',
|
|
37
|
+
'xi-api-key': this.apiKey
|
|
38
|
+
},
|
|
39
|
+
body: JSON.stringify({
|
|
40
|
+
text,
|
|
41
|
+
model_id: 'eleven_turbo_v2_5', // Free tier compatible model
|
|
42
|
+
voice_settings: {
|
|
43
|
+
stability: 0.5,
|
|
44
|
+
similarity_boost: 0.5
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
const errorText = await response.text();
|
|
50
|
+
throw new Error(`ElevenLabs TTS API Error: ${response.status} - ${errorText}`);
|
|
51
|
+
}
|
|
52
|
+
// ElevenLabs returns audio directly as binary
|
|
53
|
+
const audioBuffer = await response.arrayBuffer();
|
|
54
|
+
return new Uint8Array(audioBuffer);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error('Text-to-Speech Error:', error);
|
|
58
|
+
throw new Error(`TTS failed: ${error.message}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Declare the audio format produced by ElevenLabs TTS
|
|
63
|
+
* Used by IAudioStorage for format conversion
|
|
64
|
+
*/
|
|
65
|
+
getTTSOutputFormat() {
|
|
66
|
+
return {
|
|
67
|
+
format: 'wav', // Changed from 'mp3' to 'wav'
|
|
68
|
+
sampleRate: 44100, // ElevenLabs WAV output is 44.1kHz
|
|
69
|
+
channels: 1,
|
|
70
|
+
bitDepth: 16
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.ElevenLabsVoiceAdapter = ElevenLabsVoiceAdapter;
|
|
75
|
+
//# sourceMappingURL=ElevenLabsVoiceAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElevenLabsVoiceAdapter.js","sourceRoot":"","sources":["../../../src/adapters/voice/ElevenLabsVoiceAdapter.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACH,MAAa,sBAAsB;IAI/B,YAAY,MAAc,EAAE,WAAyB;QACjD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,WAAmB,EAAE,MAA2B;QAC/D,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAC;IACvH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,MAA2B;QACxD,MAAM,SAAS,GAAG,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;QAClD,uEAAuE;QACvE,MAAM,OAAO,GAAG,SAAS,EAAE,KAAK,IAAI,sBAAsB,CAAC;QAE3D,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CACxB,+CAA+C,OAAO,EAAE,EACxD;gBACI,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACL,QAAQ,EAAE,WAAW,EAAG,gEAAgE;oBACxF,cAAc,EAAE,kBAAkB;oBAClC,YAAY,EAAE,IAAI,CAAC,MAAM;iBAC5B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACjB,IAAI;oBACJ,QAAQ,EAAE,mBAAmB,EAAE,6BAA6B;oBAC5D,cAAc,EAAE;wBACZ,SAAS,EAAE,GAAG;wBACd,gBAAgB,EAAE,GAAG;qBACxB;iBACJ,CAAC;aACL,CACJ,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;YACnF,CAAC;YAED,8CAA8C;YAC9C,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;YACjD,OAAO,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,kBAAkB;QACd,OAAO;YACH,MAAM,EAAE,KAAK,EAAO,8BAA8B;YAClD,UAAU,EAAE,KAAK,EAAG,mCAAmC;YACvD,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;SACf,CAAC;IACN,CAAC;CACJ;AA3ED,wDA2EC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { IVoiceAdapter, VoiceConfig, AudioFormatMetadata } from '../../interfaces';
|
|
2
|
+
/**
|
|
3
|
+
* Gemini Multimodal Live Adapter
|
|
4
|
+
*
|
|
5
|
+
* Real-time voice adapter using Gemini's Multimodal Live API.
|
|
6
|
+
* Provides bidirectional streaming for STT + LLM + TTS in a single connection.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Real-time speech-to-text
|
|
10
|
+
* - Streaming LLM responses
|
|
11
|
+
* - Real-time text-to-speech
|
|
12
|
+
* - Low latency (<500ms)
|
|
13
|
+
* - Interruption handling
|
|
14
|
+
*
|
|
15
|
+
* Cost: ~$0.006/minute (all-inclusive)
|
|
16
|
+
*
|
|
17
|
+
* Note: This adapter is designed for WebSocket-based real-time streaming.
|
|
18
|
+
* For batch/turn-based conversations, use GeminiVoiceAdapter instead.
|
|
19
|
+
*/
|
|
20
|
+
export declare class GeminiMultimodalLiveAdapter implements IVoiceAdapter {
|
|
21
|
+
private apiKey;
|
|
22
|
+
private voiceConfig?;
|
|
23
|
+
private ws?;
|
|
24
|
+
private isConnected;
|
|
25
|
+
constructor(apiKey: string, voiceConfig?: VoiceConfig);
|
|
26
|
+
/**
|
|
27
|
+
* Connect to Gemini Multimodal Live API
|
|
28
|
+
* Returns a WebSocket connection for bidirectional streaming
|
|
29
|
+
*/
|
|
30
|
+
connect(): Promise<WebSocket>;
|
|
31
|
+
/**
|
|
32
|
+
* Send configuration to Gemini
|
|
33
|
+
*/
|
|
34
|
+
private sendConfig;
|
|
35
|
+
/**
|
|
36
|
+
* Send audio chunk to Gemini for processing
|
|
37
|
+
* @param audioBase64 Base64-encoded audio data
|
|
38
|
+
*/
|
|
39
|
+
sendAudio(audioBase64: string): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Register callback for receiving responses from Gemini
|
|
42
|
+
* @param callback Function to handle responses (text + audio)
|
|
43
|
+
*/
|
|
44
|
+
onResponse(callback: (response: {
|
|
45
|
+
text?: string;
|
|
46
|
+
audio?: Uint8Array;
|
|
47
|
+
isFinal: boolean;
|
|
48
|
+
}) => void): void;
|
|
49
|
+
/**
|
|
50
|
+
* Disconnect from Gemini
|
|
51
|
+
*/
|
|
52
|
+
disconnect(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Speech-to-text (not used in real-time mode)
|
|
55
|
+
* Use sendAudio() and onResponse() instead for real-time streaming
|
|
56
|
+
*/
|
|
57
|
+
speechToText(audioBase64: string, config?: VoiceConfig['stt']): Promise<string>;
|
|
58
|
+
/**
|
|
59
|
+
* Text-to-speech (not used in real-time mode)
|
|
60
|
+
* Use sendAudio() and onResponse() instead for real-time streaming
|
|
61
|
+
*/
|
|
62
|
+
textToSpeech(text: string, config?: VoiceConfig['tts']): Promise<Uint8Array>;
|
|
63
|
+
/**
|
|
64
|
+
* Get TTS output format metadata
|
|
65
|
+
* This adapter outputs PCM audio at 24kHz mono
|
|
66
|
+
*/
|
|
67
|
+
getTTSOutputFormat(): AudioFormatMetadata;
|
|
68
|
+
/**
|
|
69
|
+
* Check if connected to Gemini
|
|
70
|
+
*/
|
|
71
|
+
isConnectedToGemini(): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Get the underlying WebSocket connection
|
|
74
|
+
*/
|
|
75
|
+
getWebSocket(): WebSocket | undefined;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=GeminiMultimodalLiveAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeminiMultimodalLiveAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/voice/GeminiMultimodalLiveAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEnF;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,2BAA4B,YAAW,aAAa;IAC7D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,EAAE,CAAC,CAAY;IACvB,OAAO,CAAC,WAAW,CAAkB;gBAEzB,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW;IAKrD;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;IAkCnC;;OAEG;IACH,OAAO,CAAC,UAAU;IAwBlB;;;OAGG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBnD;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;QAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,UAAU,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;KACpB,KAAK,IAAI,GAAG,IAAI;IAuCjB;;OAEG;IACH,UAAU,IAAI,IAAI;IAQlB;;;OAGG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAOrF;;;OAGG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAOlF;;;OAGG;IACH,kBAAkB,IAAI,mBAAmB;IASzC;;OAEG;IACH,mBAAmB,IAAI,OAAO;IAI9B;;OAEG;IACH,YAAY,IAAI,SAAS,GAAG,SAAS;CAGxC"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeminiMultimodalLiveAdapter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Gemini Multimodal Live Adapter
|
|
6
|
+
*
|
|
7
|
+
* Real-time voice adapter using Gemini's Multimodal Live API.
|
|
8
|
+
* Provides bidirectional streaming for STT + LLM + TTS in a single connection.
|
|
9
|
+
*
|
|
10
|
+
* Features:
|
|
11
|
+
* - Real-time speech-to-text
|
|
12
|
+
* - Streaming LLM responses
|
|
13
|
+
* - Real-time text-to-speech
|
|
14
|
+
* - Low latency (<500ms)
|
|
15
|
+
* - Interruption handling
|
|
16
|
+
*
|
|
17
|
+
* Cost: ~$0.006/minute (all-inclusive)
|
|
18
|
+
*
|
|
19
|
+
* Note: This adapter is designed for WebSocket-based real-time streaming.
|
|
20
|
+
* For batch/turn-based conversations, use GeminiVoiceAdapter instead.
|
|
21
|
+
*/
|
|
22
|
+
class GeminiMultimodalLiveAdapter {
|
|
23
|
+
constructor(apiKey, voiceConfig) {
|
|
24
|
+
this.isConnected = false;
|
|
25
|
+
this.apiKey = apiKey;
|
|
26
|
+
this.voiceConfig = voiceConfig;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Connect to Gemini Multimodal Live API
|
|
30
|
+
* Returns a WebSocket connection for bidirectional streaming
|
|
31
|
+
*/
|
|
32
|
+
async connect() {
|
|
33
|
+
if (this.ws && this.isConnected) {
|
|
34
|
+
return this.ws;
|
|
35
|
+
}
|
|
36
|
+
// Gemini Multimodal Live WebSocket endpoint
|
|
37
|
+
const wsUrl = `wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1alpha.GenerativeService.BidiGenerateContent?key=${this.apiKey}`;
|
|
38
|
+
return new Promise((resolve, reject) => {
|
|
39
|
+
this.ws = new WebSocket(wsUrl);
|
|
40
|
+
this.ws.onopen = () => {
|
|
41
|
+
console.log('[GeminiMultimodalLive] Connected to Gemini');
|
|
42
|
+
this.isConnected = true;
|
|
43
|
+
// Send initial configuration
|
|
44
|
+
this.sendConfig();
|
|
45
|
+
resolve(this.ws);
|
|
46
|
+
};
|
|
47
|
+
this.ws.onerror = (error) => {
|
|
48
|
+
console.error('[GeminiMultimodalLive] Connection error:', error);
|
|
49
|
+
this.isConnected = false;
|
|
50
|
+
reject(error);
|
|
51
|
+
};
|
|
52
|
+
this.ws.onclose = () => {
|
|
53
|
+
console.log('[GeminiMultimodalLive] Connection closed');
|
|
54
|
+
this.isConnected = false;
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Send configuration to Gemini
|
|
60
|
+
*/
|
|
61
|
+
sendConfig() {
|
|
62
|
+
if (!this.ws || !this.isConnected) {
|
|
63
|
+
throw new Error('Not connected to Gemini');
|
|
64
|
+
}
|
|
65
|
+
const config = {
|
|
66
|
+
setup: {
|
|
67
|
+
model: 'models/gemini-2.0-flash-exp',
|
|
68
|
+
generationConfig: {
|
|
69
|
+
responseModalities: ['AUDIO'],
|
|
70
|
+
speechConfig: {
|
|
71
|
+
voiceConfig: {
|
|
72
|
+
prebuiltVoiceConfig: {
|
|
73
|
+
voiceName: this.voiceConfig?.tts?.voice || 'Puck'
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
this.ws.send(JSON.stringify(config));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Send audio chunk to Gemini for processing
|
|
84
|
+
* @param audioBase64 Base64-encoded audio data
|
|
85
|
+
*/
|
|
86
|
+
async sendAudio(audioBase64) {
|
|
87
|
+
if (!this.ws || !this.isConnected) {
|
|
88
|
+
throw new Error('Not connected to Gemini');
|
|
89
|
+
}
|
|
90
|
+
const message = {
|
|
91
|
+
realtimeInput: {
|
|
92
|
+
mediaChunks: [{
|
|
93
|
+
data: audioBase64,
|
|
94
|
+
mimeType: 'audio/pcm'
|
|
95
|
+
}]
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
this.ws.send(JSON.stringify(message));
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Register callback for receiving responses from Gemini
|
|
102
|
+
* @param callback Function to handle responses (text + audio)
|
|
103
|
+
*/
|
|
104
|
+
onResponse(callback) {
|
|
105
|
+
if (!this.ws) {
|
|
106
|
+
throw new Error('Not connected to Gemini');
|
|
107
|
+
}
|
|
108
|
+
this.ws.onmessage = (event) => {
|
|
109
|
+
try {
|
|
110
|
+
const data = JSON.parse(event.data);
|
|
111
|
+
if (data.serverContent?.modelTurn?.parts) {
|
|
112
|
+
const parts = data.serverContent.modelTurn.parts;
|
|
113
|
+
for (const part of parts) {
|
|
114
|
+
const response = {
|
|
115
|
+
isFinal: data.serverContent.turnComplete || false
|
|
116
|
+
};
|
|
117
|
+
// Extract text
|
|
118
|
+
if (part.text) {
|
|
119
|
+
response.text = part.text;
|
|
120
|
+
}
|
|
121
|
+
// Extract audio
|
|
122
|
+
if (part.inlineData?.data) {
|
|
123
|
+
const audioBase64 = part.inlineData.data;
|
|
124
|
+
response.audio = Uint8Array.from(Buffer.from(audioBase64, 'base64'));
|
|
125
|
+
}
|
|
126
|
+
callback(response);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.error('[GeminiMultimodalLive] Error parsing response:', error);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Disconnect from Gemini
|
|
137
|
+
*/
|
|
138
|
+
disconnect() {
|
|
139
|
+
if (this.ws) {
|
|
140
|
+
this.ws.close();
|
|
141
|
+
this.ws = undefined;
|
|
142
|
+
this.isConnected = false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Speech-to-text (not used in real-time mode)
|
|
147
|
+
* Use sendAudio() and onResponse() instead for real-time streaming
|
|
148
|
+
*/
|
|
149
|
+
async speechToText(audioBase64, config) {
|
|
150
|
+
throw new Error('speechToText() is not supported in real-time mode. ' +
|
|
151
|
+
'Use connect() + sendAudio() + onResponse() for streaming.');
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Text-to-speech (not used in real-time mode)
|
|
155
|
+
* Use sendAudio() and onResponse() instead for real-time streaming
|
|
156
|
+
*/
|
|
157
|
+
async textToSpeech(text, config) {
|
|
158
|
+
throw new Error('textToSpeech() is not supported in real-time mode. ' +
|
|
159
|
+
'Use connect() + sendAudio() + onResponse() for streaming.');
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get TTS output format metadata
|
|
163
|
+
* This adapter outputs PCM audio at 24kHz mono
|
|
164
|
+
*/
|
|
165
|
+
getTTSOutputFormat() {
|
|
166
|
+
return {
|
|
167
|
+
format: 'pcm',
|
|
168
|
+
sampleRate: 24000,
|
|
169
|
+
channels: 1,
|
|
170
|
+
bitDepth: 16
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Check if connected to Gemini
|
|
175
|
+
*/
|
|
176
|
+
isConnectedToGemini() {
|
|
177
|
+
return this.isConnected;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get the underlying WebSocket connection
|
|
181
|
+
*/
|
|
182
|
+
getWebSocket() {
|
|
183
|
+
return this.ws;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
exports.GeminiMultimodalLiveAdapter = GeminiMultimodalLiveAdapter;
|
|
187
|
+
//# sourceMappingURL=GeminiMultimodalLiveAdapter.js.map
|