chat-flow-ardymalihi 3.0.0 ā 3.0.2
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/package.json +1 -1
- package/dist/adapters/db/InMemorySessionRepository.js +0 -15
- package/dist/adapters/db/RedisSessionRepository.js +0 -41
- package/dist/adapters/intent/IntentMatcher.d.ts +0 -41
- package/dist/adapters/intent/IntentMatcher.d.ts.map +0 -1
- package/dist/adapters/intent/IntentMatcher.js +0 -167
- package/dist/adapters/intent/IntentMatcher.js.map +0 -1
- package/dist/adapters/intent/IntentService.d.ts +0 -26
- package/dist/adapters/intent/IntentService.d.ts.map +0 -1
- package/dist/adapters/intent/IntentService.js +0 -65
- package/dist/adapters/intent/IntentService.js.map +0 -1
- package/dist/adapters/intent/MockIntentAdapter.js +0 -29
- package/dist/adapters/intent/MockIntentService.d.ts +0 -7
- package/dist/adapters/intent/MockIntentService.d.ts.map +0 -1
- package/dist/adapters/intent/MockIntentService.js +0 -36
- package/dist/adapters/intent/MockIntentService.js.map +0 -1
- package/dist/adapters/llm/GeminiLLMAdapter.d.ts +0 -10
- package/dist/adapters/llm/GeminiLLMAdapter.d.ts.map +0 -1
- package/dist/adapters/llm/GeminiLLMAdapter.js +0 -102
- package/dist/adapters/llm/GeminiLLMAdapter.js.map +0 -1
- package/dist/adapters/llm/MockLLMAdapter.d.ts +0 -5
- package/dist/adapters/llm/MockLLMAdapter.d.ts.map +0 -1
- package/dist/adapters/llm/MockLLMAdapter.js +0 -31
- package/dist/adapters/llm/MockLLMAdapter.js.map +0 -1
- package/dist/adapters/llm/OllamaLLMAdapter.d.ts +0 -9
- package/dist/adapters/llm/OllamaLLMAdapter.d.ts.map +0 -1
- package/dist/adapters/llm/OllamaLLMAdapter.js +0 -74
- package/dist/adapters/llm/OllamaLLMAdapter.js.map +0 -1
- package/dist/adapters/logger/ConsoleLogger.d.ts +0 -12
- package/dist/adapters/logger/ConsoleLogger.d.ts.map +0 -1
- package/dist/adapters/logger/ConsoleLogger.js +0 -37
- package/dist/adapters/logger/ConsoleLogger.js.map +0 -1
- package/dist/adapters/memory/InMemorySessionRepository.js +0 -15
- package/dist/adapters/redis/RedisSessionRepository.js +0 -41
- package/dist/adapters/repository/InMemoryRepository.d.ts +0 -46
- package/dist/adapters/repository/InMemoryRepository.d.ts.map +0 -1
- package/dist/adapters/repository/InMemoryRepository.js +0 -235
- package/dist/adapters/repository/InMemoryRepository.js.map +0 -1
- package/dist/adapters/repository/IntentRepository.d.ts +0 -15
- package/dist/adapters/repository/IntentRepository.d.ts.map +0 -1
- package/dist/adapters/repository/IntentRepository.js +0 -28
- package/dist/adapters/repository/IntentRepository.js.map +0 -1
- package/dist/adapters/repository/RedisRepository.d.ts +0 -63
- package/dist/adapters/repository/RedisRepository.d.ts.map +0 -1
- package/dist/adapters/repository/RedisRepository.js +0 -586
- package/dist/adapters/repository/RedisRepository.js.map +0 -1
- package/dist/adapters/storage/RedisAudioStorageAdapter.d.ts +0 -33
- package/dist/adapters/storage/RedisAudioStorageAdapter.d.ts.map +0 -1
- package/dist/adapters/storage/RedisAudioStorageAdapter.js +0 -121
- package/dist/adapters/storage/RedisAudioStorageAdapter.js.map +0 -1
- package/dist/adapters/storage/RedisBufferStorageAdapter.d.ts +0 -14
- package/dist/adapters/storage/RedisBufferStorageAdapter.d.ts.map +0 -1
- package/dist/adapters/storage/RedisBufferStorageAdapter.js +0 -94
- package/dist/adapters/storage/RedisBufferStorageAdapter.js.map +0 -1
- package/dist/adapters/voice/ElevenLabsVoiceAdapter.d.ts +0 -29
- package/dist/adapters/voice/ElevenLabsVoiceAdapter.d.ts.map +0 -1
- package/dist/adapters/voice/ElevenLabsVoiceAdapter.js +0 -75
- package/dist/adapters/voice/ElevenLabsVoiceAdapter.js.map +0 -1
- package/dist/adapters/voice/GeminiMultimodalLiveAdapter.d.ts +0 -77
- package/dist/adapters/voice/GeminiMultimodalLiveAdapter.d.ts.map +0 -1
- package/dist/adapters/voice/GeminiMultimodalLiveAdapter.js +0 -187
- package/dist/adapters/voice/GeminiMultimodalLiveAdapter.js.map +0 -1
- package/dist/adapters/voice/GeminiVoiceAdapter.d.ts +0 -36
- package/dist/adapters/voice/GeminiVoiceAdapter.d.ts.map +0 -1
- package/dist/adapters/voice/GeminiVoiceAdapter.js +0 -134
- package/dist/adapters/voice/GeminiVoiceAdapter.js.map +0 -1
- package/dist/adapters/voice/GoogleTTSAdapter.d.ts +0 -61
- package/dist/adapters/voice/GoogleTTSAdapter.d.ts.map +0 -1
- package/dist/adapters/voice/GoogleTTSAdapter.js +0 -165
- package/dist/adapters/voice/GoogleTTSAdapter.js.map +0 -1
- package/dist/adapters/voice/GoogleVoiceAdapter.d.ts +0 -33
- package/dist/adapters/voice/GoogleVoiceAdapter.d.ts.map +0 -1
- package/dist/adapters/voice/GoogleVoiceAdapter.js +0 -155
- package/dist/adapters/voice/GoogleVoiceAdapter.js.map +0 -1
- package/dist/adapters/voice/HybridVoiceAdapter.d.ts +0 -54
- package/dist/adapters/voice/HybridVoiceAdapter.d.ts.map +0 -1
- package/dist/adapters/voice/HybridVoiceAdapter.js +0 -102
- package/dist/adapters/voice/HybridVoiceAdapter.js.map +0 -1
- package/dist/adapters/voice/LanguageVoiceMapper.d.ts +0 -60
- package/dist/adapters/voice/LanguageVoiceMapper.d.ts.map +0 -1
- package/dist/adapters/voice/LanguageVoiceMapper.js +0 -130
- package/dist/adapters/voice/LanguageVoiceMapper.js.map +0 -1
- package/dist/adapters/voice/VertexVoiceAdapter.d.ts +0 -32
- package/dist/adapters/voice/VertexVoiceAdapter.d.ts.map +0 -1
- package/dist/adapters/voice/VertexVoiceAdapter.js +0 -179
- package/dist/adapters/voice/VertexVoiceAdapter.js.map +0 -1
- package/dist/adapters/webhook/WebhookService.d.ts +0 -47
- package/dist/adapters/webhook/WebhookService.d.ts.map +0 -1
- package/dist/adapters/webhook/WebhookService.js +0 -265
- package/dist/adapters/webhook/WebhookService.js.map +0 -1
- package/dist/adapters/workflow/MockWorkflowAdapter.d.ts +0 -5
- package/dist/adapters/workflow/MockWorkflowAdapter.d.ts.map +0 -1
- package/dist/adapters/workflow/MockWorkflowAdapter.js +0 -173
- package/dist/adapters/workflow/MockWorkflowAdapter.js.map +0 -1
- package/dist/adapters/workflow/WorkflowAdapter.d.ts +0 -55
- package/dist/adapters/workflow/WorkflowAdapter.d.ts.map +0 -1
- package/dist/adapters/workflow/WorkflowAdapter.js +0 -242
- package/dist/adapters/workflow/WorkflowAdapter.js.map +0 -1
- package/dist/adapters/workflow/actions/getSupportHoursAction.d.ts +0 -10
- package/dist/adapters/workflow/actions/getSupportHoursAction.d.ts.map +0 -1
- package/dist/adapters/workflow/actions/getSupportHoursAction.js +0 -33
- package/dist/adapters/workflow/actions/getSupportHoursAction.js.map +0 -1
- package/dist/adapters/workflow/actions/index.d.ts +0 -6
- package/dist/adapters/workflow/actions/index.d.ts.map +0 -1
- package/dist/adapters/workflow/actions/index.js +0 -22
- package/dist/adapters/workflow/actions/index.js.map +0 -1
- package/dist/adapters/workflow/actions/pushOutputResultAction.d.ts +0 -11
- package/dist/adapters/workflow/actions/pushOutputResultAction.d.ts.map +0 -1
- package/dist/adapters/workflow/actions/pushOutputResultAction.js +0 -31
- package/dist/adapters/workflow/actions/pushOutputResultAction.js.map +0 -1
- package/dist/adapters/workflow/actions/setWorkflowMessageAction.d.ts +0 -12
- package/dist/adapters/workflow/actions/setWorkflowMessageAction.d.ts.map +0 -1
- package/dist/adapters/workflow/actions/setWorkflowMessageAction.js +0 -32
- package/dist/adapters/workflow/actions/setWorkflowMessageAction.js.map +0 -1
- package/dist/adapters/workflow/engine/constants.d.ts +0 -3
- package/dist/adapters/workflow/engine/constants.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/constants.js +0 -6
- package/dist/adapters/workflow/engine/constants.js.map +0 -1
- package/dist/adapters/workflow/engine/engine.d.ts +0 -32
- package/dist/adapters/workflow/engine/engine.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/engine.js +0 -623
- package/dist/adapters/workflow/engine/engine.js.map +0 -1
- package/dist/adapters/workflow/engine/event-registry.d.ts +0 -12
- package/dist/adapters/workflow/engine/event-registry.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/event-registry.js +0 -33
- package/dist/adapters/workflow/engine/event-registry.js.map +0 -1
- package/dist/adapters/workflow/engine/interpolator.d.ts +0 -11
- package/dist/adapters/workflow/engine/interpolator.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/interpolator.js +0 -93
- package/dist/adapters/workflow/engine/interpolator.js.map +0 -1
- package/dist/adapters/workflow/engine/registry.d.ts +0 -12
- package/dist/adapters/workflow/engine/registry.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/registry.js +0 -39
- package/dist/adapters/workflow/engine/registry.js.map +0 -1
- package/dist/adapters/workflow/engine/template-registry.d.ts +0 -60
- package/dist/adapters/workflow/engine/template-registry.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/template-registry.js +0 -92
- package/dist/adapters/workflow/engine/template-registry.js.map +0 -1
- package/dist/adapters/workflow/engine/types.d.ts +0 -182
- package/dist/adapters/workflow/engine/types.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/types.js +0 -3
- package/dist/adapters/workflow/engine/types.js.map +0 -1
- package/dist/adapters/workflow/engine/utils/format-utils.d.ts +0 -43
- package/dist/adapters/workflow/engine/utils/format-utils.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/utils/format-utils.js +0 -137
- package/dist/adapters/workflow/engine/utils/format-utils.js.map +0 -1
- package/dist/adapters/workflow/engine/utils/layout-calculator.d.ts +0 -7
- package/dist/adapters/workflow/engine/utils/layout-calculator.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/utils/layout-calculator.js +0 -87
- package/dist/adapters/workflow/engine/utils/layout-calculator.js.map +0 -1
- package/dist/adapters/workflow/engine/utils/slugify.d.ts +0 -2
- package/dist/adapters/workflow/engine/utils/slugify.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/utils/slugify.js +0 -41
- package/dist/adapters/workflow/engine/utils/slugify.js.map +0 -1
- package/dist/adapters/workflow/engine/validator.d.ts +0 -9
- package/dist/adapters/workflow/engine/validator.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/validator.js +0 -425
- package/dist/adapters/workflow/engine/validator.js.map +0 -1
- package/dist/application/ConversationSession.d.ts +0 -23
- package/dist/application/ConversationSession.d.ts.map +0 -1
- package/dist/application/ConversationSession.js +0 -83
- package/dist/application/ConversationSession.js.map +0 -1
- package/dist/application/Message.d.ts +0 -11
- package/dist/application/Message.d.ts.map +0 -1
- package/dist/application/Message.js +0 -30
- package/dist/application/Message.js.map +0 -1
- package/dist/application/Orchestrator.d.ts +0 -18
- package/dist/application/Orchestrator.d.ts.map +0 -1
- package/dist/application/Orchestrator.js +0 -80
- package/dist/application/Orchestrator.js.map +0 -1
- package/dist/application/SessionState.js +0 -2
- package/dist/application/usecases/CreateSession.js +0 -20
- package/dist/application/usecases/HandleUserMessage.js +0 -69
- package/dist/config/ChatFlowConfig.d.ts +0 -66
- package/dist/config/ChatFlowConfig.d.ts.map +0 -1
- package/dist/config/ChatFlowConfig.js +0 -54
- package/dist/config/ChatFlowConfig.js.map +0 -1
- package/dist/config/index.d.ts +0 -2
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -7
- package/dist/config/index.js.map +0 -1
- package/dist/core/entities/ConversationSession.d.ts +0 -58
- package/dist/core/entities/ConversationSession.d.ts.map +0 -1
- package/dist/core/entities/ConversationSession.js +0 -160
- package/dist/core/entities/ConversationSession.js.map +0 -1
- package/dist/core/entities/Message.d.ts +0 -14
- package/dist/core/entities/Message.d.ts.map +0 -1
- package/dist/core/entities/Message.js +0 -32
- package/dist/core/entities/Message.js.map +0 -1
- package/dist/core/errors/ChatFlowError.d.ts +0 -71
- package/dist/core/errors/ChatFlowError.d.ts.map +0 -1
- package/dist/core/errors/ChatFlowError.js +0 -108
- package/dist/core/errors/ChatFlowError.js.map +0 -1
- package/dist/core/errors/index.d.ts +0 -2
- package/dist/core/errors/index.d.ts.map +0 -1
- package/dist/core/errors/index.js +0 -15
- package/dist/core/errors/index.js.map +0 -1
- package/dist/core/utils/AudioStreamBuffer.d.ts +0 -33
- package/dist/core/utils/AudioStreamBuffer.d.ts.map +0 -1
- package/dist/core/utils/AudioStreamBuffer.js +0 -55
- package/dist/core/utils/AudioStreamBuffer.js.map +0 -1
- package/dist/core/utils/AudioUtils.d.ts +0 -41
- package/dist/core/utils/AudioUtils.d.ts.map +0 -1
- package/dist/core/utils/AudioUtils.js +0 -188
- package/dist/core/utils/AudioUtils.js.map +0 -1
- package/dist/core/utils/LanguageDetector.d.ts +0 -52
- package/dist/core/utils/LanguageDetector.d.ts.map +0 -1
- package/dist/core/utils/LanguageDetector.js +0 -173
- package/dist/core/utils/LanguageDetector.js.map +0 -1
- package/dist/core/utils/WavUtils.d.ts +0 -14
- package/dist/core/utils/WavUtils.d.ts.map +0 -1
- package/dist/core/utils/WavUtils.js +0 -37
- package/dist/core/utils/WavUtils.js.map +0 -1
- package/dist/db/InMemoryRepository.d.ts +0 -15
- package/dist/db/InMemoryRepository.d.ts.map +0 -1
- package/dist/db/InMemoryRepository.js +0 -41
- package/dist/db/InMemoryRepository.js.map +0 -1
- package/dist/db/RedisRepository.d.ts +0 -16
- package/dist/db/RedisRepository.d.ts.map +0 -1
- package/dist/db/RedisRepository.js +0 -87
- package/dist/db/RedisRepository.js.map +0 -1
- package/dist/demo/cli-demo.d.ts +0 -2
- package/dist/demo/cli-demo.d.ts.map +0 -1
- package/dist/demo/cli-demo.js +0 -146
- package/dist/demo/cli-demo.js.map +0 -1
- package/dist/demo/console-chat.d.ts +0 -2
- package/dist/demo/console-chat.d.ts.map +0 -1
- package/dist/demo/console-chat.js +0 -148
- package/dist/demo/console-chat.js.map +0 -1
- package/dist/demo/interactive-voice-chat.d.ts +0 -2
- package/dist/demo/interactive-voice-chat.d.ts.map +0 -1
- package/dist/demo/interactive-voice-chat.js +0 -180
- package/dist/demo/interactive-voice-chat.js.map +0 -1
- package/dist/demo/voice-demo.d.ts +0 -2
- package/dist/demo/voice-demo.d.ts.map +0 -1
- package/dist/demo/voice-demo.js +0 -188
- package/dist/demo/voice-demo.js.map +0 -1
- package/dist/domain/conversation/ConversationSession.js +0 -82
- package/dist/domain/conversation/Message.js +0 -33
- package/dist/domain/conversation/SessionState.js +0 -10
- package/dist/index.d.ts +0 -26
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -76
- package/dist/index.js.map +0 -1
- package/dist/intent/IntentService.d.ts +0 -17
- package/dist/intent/IntentService.d.ts.map +0 -1
- package/dist/intent/IntentService.js +0 -57
- package/dist/intent/IntentService.js.map +0 -1
- package/dist/intent/MockIntentService.d.ts +0 -7
- package/dist/intent/MockIntentService.d.ts.map +0 -1
- package/dist/intent/MockIntentService.js +0 -36
- package/dist/intent/MockIntentService.js.map +0 -1
- package/dist/interfaces.d.ts +0 -653
- package/dist/interfaces.d.ts.map +0 -1
- package/dist/interfaces.js +0 -36
- package/dist/interfaces.js.map +0 -1
- package/dist/llm/GeminiLLMAdapter.d.ts +0 -10
- package/dist/llm/GeminiLLMAdapter.d.ts.map +0 -1
- package/dist/llm/GeminiLLMAdapter.js +0 -102
- package/dist/llm/GeminiLLMAdapter.js.map +0 -1
- package/dist/llm/MockLLMAdapter.d.ts +0 -5
- package/dist/llm/MockLLMAdapter.d.ts.map +0 -1
- package/dist/llm/MockLLMAdapter.js +0 -31
- package/dist/llm/MockLLMAdapter.js.map +0 -1
- package/dist/orchestrator/Orchestrator.d.ts +0 -62
- package/dist/orchestrator/Orchestrator.d.ts.map +0 -1
- package/dist/orchestrator/Orchestrator.js +0 -697
- package/dist/orchestrator/Orchestrator.js.map +0 -1
- package/dist/ports/IIntentRepository.d.ts +0 -27
- package/dist/ports/IIntentRepository.d.ts.map +0 -1
- package/dist/ports/IIntentRepository.js +0 -3
- package/dist/ports/IIntentRepository.js.map +0 -1
- package/dist/ports/IntentPort.js +0 -2
- package/dist/ports/LLMPort.js +0 -2
- package/dist/ports/SessionRepository.js +0 -2
- package/dist/ports/WorkflowPort.js +0 -2
- package/dist/scripts/debug-redis.d.ts +0 -2
- package/dist/scripts/debug-redis.d.ts.map +0 -1
- package/dist/scripts/debug-redis.js +0 -55
- package/dist/scripts/debug-redis.js.map +0 -1
- package/dist/scripts/seed-collaborative-intents.d.ts +0 -2
- package/dist/scripts/seed-collaborative-intents.d.ts.map +0 -1
- package/dist/scripts/seed-collaborative-intents.js +0 -90
- package/dist/scripts/seed-collaborative-intents.js.map +0 -1
- package/dist/scripts/test-isolated-config.d.ts +0 -2
- package/dist/scripts/test-isolated-config.d.ts.map +0 -1
- package/dist/scripts/test-isolated-config.js +0 -80
- package/dist/scripts/test-isolated-config.js.map +0 -1
- package/dist/scripts/verify_memory_intents.d.ts +0 -2
- package/dist/scripts/verify_memory_intents.d.ts.map +0 -1
- package/dist/scripts/verify_memory_intents.js +0 -45
- package/dist/scripts/verify_memory_intents.js.map +0 -1
- package/dist/scripts/verify_redis_intents.d.ts +0 -2
- package/dist/scripts/verify_redis_intents.d.ts.map +0 -1
- package/dist/scripts/verify_redis_intents.js +0 -52
- package/dist/scripts/verify_redis_intents.js.map +0 -1
- package/dist/server/ChatFlowWebSocketServer.d.ts +0 -46
- package/dist/server/ChatFlowWebSocketServer.d.ts.map +0 -1
- package/dist/server/ChatFlowWebSocketServer.js +0 -344
- package/dist/server/ChatFlowWebSocketServer.js.map +0 -1
- package/dist/server/realtime-voice-server.d.ts +0 -2
- package/dist/server/realtime-voice-server.d.ts.map +0 -1
- package/dist/server/realtime-voice-server.js +0 -627
- package/dist/server/realtime-voice-server.js.map +0 -1
- package/dist/src/api/routes/tenants.d.ts +0 -3
- package/dist/src/api/routes/tenants.d.ts.map +0 -1
- package/dist/src/api/routes/tenants.js +0 -109
- package/dist/src/api/routes/tenants.js.map +0 -1
- package/dist/utils/crypto.d.ts +0 -7
- package/dist/utils/crypto.d.ts.map +0 -1
- package/dist/utils/crypto.js +0 -35
- package/dist/utils/crypto.js.map +0 -1
- package/dist/utils/encryption-helpers.d.ts +0 -14
- package/dist/utils/encryption-helpers.d.ts.map +0 -1
- package/dist/utils/encryption-helpers.js +0 -49
- package/dist/utils/encryption-helpers.js.map +0 -1
- package/dist/verify_memory_intents.js +0 -44
- package/dist/verify_redis_intents.js +0 -49
- package/dist/workflow/MockWorkflowAdapter.d.ts +0 -5
- package/dist/workflow/MockWorkflowAdapter.d.ts.map +0 -1
- package/dist/workflow/MockWorkflowAdapter.js +0 -162
- package/dist/workflow/MockWorkflowAdapter.js.map +0 -1
|
@@ -1,627 +0,0 @@
|
|
|
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
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
const dotenv = __importStar(require("dotenv"));
|
|
40
|
-
const http = __importStar(require("http"));
|
|
41
|
-
const fs = __importStar(require("fs"));
|
|
42
|
-
const path = __importStar(require("path"));
|
|
43
|
-
const ws_1 = require("ws");
|
|
44
|
-
const Orchestrator_1 = require("../orchestrator/Orchestrator");
|
|
45
|
-
const GeminiLLMAdapter_1 = require("../adapters/llm/GeminiLLMAdapter");
|
|
46
|
-
const RedisRepository_1 = require("../adapters/repository/RedisRepository");
|
|
47
|
-
const IntentService_1 = require("../adapters/intent/IntentService");
|
|
48
|
-
const IntentMatcher_1 = require("../adapters/intent/IntentMatcher");
|
|
49
|
-
const MockWorkflowAdapter_1 = require("../adapters/workflow/MockWorkflowAdapter");
|
|
50
|
-
const WebhookService_1 = require("../adapters/webhook/WebhookService");
|
|
51
|
-
const RedisAudioStorageAdapter_1 = require("../adapters/storage/RedisAudioStorageAdapter");
|
|
52
|
-
const ioredis_1 = __importDefault(require("ioredis"));
|
|
53
|
-
const GoogleVoiceAdapter_1 = require("../adapters/voice/GoogleVoiceAdapter");
|
|
54
|
-
dotenv.config();
|
|
55
|
-
const flightUIConfig = {
|
|
56
|
-
"companyLogoUrl": "/default-logo.png",
|
|
57
|
-
"theme": "dark",
|
|
58
|
-
"collapsible": true,
|
|
59
|
-
"autoExpanded": false,
|
|
60
|
-
"showStatus": false,
|
|
61
|
-
"title": "Flight Assistant",
|
|
62
|
-
"subtitle": "Check flight status (e.g. Flight 123)",
|
|
63
|
-
"sessionMode": "voice",
|
|
64
|
-
"position": "bottom-right",
|
|
65
|
-
"layoutMode": "default",
|
|
66
|
-
"borderRadius": "small",
|
|
67
|
-
"boxShadow": "soft",
|
|
68
|
-
"transparency": "low"
|
|
69
|
-
};
|
|
70
|
-
const sessions = new Map();
|
|
71
|
-
// Check API keys
|
|
72
|
-
const geminiApiKey = process.env.GOOGLE_AI_API_KEY;
|
|
73
|
-
if (!geminiApiKey) {
|
|
74
|
-
console.error('ā Missing GOOGLE_AI_API_KEY in .env file');
|
|
75
|
-
process.exit(1);
|
|
76
|
-
}
|
|
77
|
-
// Data Persistence (Redis)
|
|
78
|
-
// Data Persistence (Redis)
|
|
79
|
-
const redisClient = new ioredis_1.default(process.env.REDIS_URL || 'redis://localhost:6379');
|
|
80
|
-
const repository = new RedisRepository_1.RedisRepository(redisClient);
|
|
81
|
-
const PORT = 8080;
|
|
82
|
-
// const BASE_URL = process.env.BASE_URL || `http://localhost:${PORT}`; // Removed per user request for relative paths
|
|
83
|
-
const voiceStorage = new RedisAudioStorageAdapter_1.RedisAudioStorageAdapter(redisClient);
|
|
84
|
-
// --- Demo: Upsert Tenant & Config ---
|
|
85
|
-
const DEMO_TENANT_ID = 'demo-tenant-001';
|
|
86
|
-
const DEMO_CONFIG_ID_SUPPORT = 'config-voice-assistant';
|
|
87
|
-
const DEMO_CONFIG_ID_FLIGHT = 'config-flight-assistant';
|
|
88
|
-
async function initializeDemoTenant() {
|
|
89
|
-
console.log('š§ Initializing Demo Tenant...');
|
|
90
|
-
// 1. Upsert Tenant
|
|
91
|
-
const tenant = {
|
|
92
|
-
id: DEMO_TENANT_ID,
|
|
93
|
-
name: 'Demo Voice Company',
|
|
94
|
-
apiKey: 'demo-key-123',
|
|
95
|
-
allowedOrigins: ['http://localhost:8080', 'http://127.0.0.1:8080'], // Whitelist localhost for demo
|
|
96
|
-
metadata: { plan: 'enterprise' }
|
|
97
|
-
};
|
|
98
|
-
await repository.saveTenant(tenant);
|
|
99
|
-
console.log(` - Tenant '${tenant.name}' ready.`);
|
|
100
|
-
// 2. Upsert Config 1: Support
|
|
101
|
-
const configSupport = {
|
|
102
|
-
id: DEMO_CONFIG_ID_SUPPORT,
|
|
103
|
-
tenantId: DEMO_TENANT_ID,
|
|
104
|
-
systemPrompt: `You are a helpful customer support assistant for a callback service.
|
|
105
|
-
You can check support hours and pricing.
|
|
106
|
-
Keep responses concise and conversational.
|
|
107
|
-
Do not be verbose.
|
|
108
|
-
If asked about the company, say you are a demo bot.`,
|
|
109
|
-
allowedIntents: ['CHECK_SUPPORT_HOURS', 'CHECK_PRICING'],
|
|
110
|
-
voiceConfig: {
|
|
111
|
-
silenceThresholdMs: 2000,
|
|
112
|
-
smartMode: true,
|
|
113
|
-
interruptionMode: 'voice_barge_in'
|
|
114
|
-
},
|
|
115
|
-
uiConfig: {
|
|
116
|
-
width: '350px',
|
|
117
|
-
theme: 'light',
|
|
118
|
-
primaryColor: '#667eea', // Default Blue
|
|
119
|
-
layoutMode: 'default',
|
|
120
|
-
borderRadius: 'small',
|
|
121
|
-
boxShadow: 'soft',
|
|
122
|
-
sessionMode: 'text',
|
|
123
|
-
position: 'bottom-right',
|
|
124
|
-
collapsible: true, // Enable collapse/expand
|
|
125
|
-
autoExpanded: false, // Start collapsed by default
|
|
126
|
-
companyLogoUrl: '/default-logo.png', // Valid local logo
|
|
127
|
-
showStatus: false, // Default to hidden status badge
|
|
128
|
-
title: "Customer Support",
|
|
129
|
-
subtitle: "Ask about support hours & policies"
|
|
130
|
-
},
|
|
131
|
-
blacklistedWords: ['meow', 'bark', 'woof'], // Configurable blacklist
|
|
132
|
-
exitPhrases: ['Ų®ŲÆŲ§ŲŲ§ŁŲø', 'ŲØŲ§Ū', 'پاŪŲ§Ł', 'پاŪŲ§Ł Ų¬ŁŲ³Ł', 'Ų®ŲÆŲ§ŁŚÆŁŲÆŲ§Ų±'], // Farsi exit phrases
|
|
133
|
-
multiLingualMode: false, // Enable automatic language detection
|
|
134
|
-
defaultLanguage: 'en', // Fallback language
|
|
135
|
-
supportedLanguages: ['fa', 'ar', 'en'], // Preferred languages (Persian first for ambiguous cases like "Salam")
|
|
136
|
-
webhook: {
|
|
137
|
-
url: 'http://localhost:8080/webhook-test',
|
|
138
|
-
events: [
|
|
139
|
-
'conversation.session.started',
|
|
140
|
-
'conversation.session.ended',
|
|
141
|
-
'conversation.message.user',
|
|
142
|
-
'conversation.message.bot',
|
|
143
|
-
'conversation.intent.detected',
|
|
144
|
-
'conversation.intent.failed',
|
|
145
|
-
'conversation.workflow.executed',
|
|
146
|
-
'conversation.workflow.failed',
|
|
147
|
-
'conversation.error.occurred'
|
|
148
|
-
] // using as any[] to avoid strict enum checking in this demo setup if needed, or better import ConversationWebhookEvent
|
|
149
|
-
}
|
|
150
|
-
};
|
|
151
|
-
await repository.saveConversationConfig(configSupport);
|
|
152
|
-
console.log(` - Config '${configSupport.id}' ready (Support).`);
|
|
153
|
-
// 3. Upsert Config 2: Flight Assistant (New)
|
|
154
|
-
const configFlight = {
|
|
155
|
-
id: DEMO_CONFIG_ID_FLIGHT,
|
|
156
|
-
tenantId: DEMO_TENANT_ID,
|
|
157
|
-
systemPrompt: `You are a Flight Assistant.
|
|
158
|
-
You help users check flight status.
|
|
159
|
-
Keep responses very short and professional.`,
|
|
160
|
-
allowedIntents: ['CHECK_FLIGHT_STATUS'],
|
|
161
|
-
voiceConfig: {
|
|
162
|
-
silenceThresholdMs: 1000, // Faster turn-taking
|
|
163
|
-
smartMode: true
|
|
164
|
-
},
|
|
165
|
-
uiConfig: flightUIConfig,
|
|
166
|
-
exitPhrases: ['Ų®ŲÆŲ§ŲŲ§ŁŲø', 'ŲØŲ§Ū', 'پاŪŲ§Ł', 'پاŪŲ§Ł Ų¬ŁŲ³Ł', 'Ų®ŲÆŲ§ŁŚÆŁŲÆŲ§Ų±'], // Farsi exit phrases
|
|
167
|
-
multiLingualMode: false, // Enable automatic language detection
|
|
168
|
-
defaultLanguage: 'en' // Fallback language
|
|
169
|
-
};
|
|
170
|
-
await repository.saveConversationConfig(configFlight);
|
|
171
|
-
console.log(` - Config '${configFlight.id}' ready (Flight).`);
|
|
172
|
-
// 3. Upsert Tenant Intent
|
|
173
|
-
const supportIntent = {
|
|
174
|
-
tenantId: DEMO_TENANT_ID,
|
|
175
|
-
name: 'CHECK_SUPPORT_HOURS',
|
|
176
|
-
description: 'Check support hours, opening times, or availability of the support team',
|
|
177
|
-
required_fields: [],
|
|
178
|
-
processingMessages: ['Let me check our schedule...', 'Checking support hours for you...', 'One moment please...']
|
|
179
|
-
};
|
|
180
|
-
await repository.saveIntent(supportIntent);
|
|
181
|
-
const flightIntent = {
|
|
182
|
-
tenantId: DEMO_TENANT_ID,
|
|
183
|
-
name: 'CHECK_FLIGHT_STATUS',
|
|
184
|
-
description: 'Check status of a flight',
|
|
185
|
-
required_fields: [{ name: 'flightNumber', type: 'string' }]
|
|
186
|
-
};
|
|
187
|
-
await repository.saveIntent(flightIntent);
|
|
188
|
-
const pricingIntent = {
|
|
189
|
-
tenantId: DEMO_TENANT_ID,
|
|
190
|
-
name: 'CHECK_PRICING',
|
|
191
|
-
description: 'Check pricing for services, subscriptions, or plans',
|
|
192
|
-
required_fields: []
|
|
193
|
-
};
|
|
194
|
-
await repository.saveIntent(pricingIntent);
|
|
195
|
-
const smallTalkIntent = {
|
|
196
|
-
tenantId: DEMO_TENANT_ID,
|
|
197
|
-
name: 'SMALL_TALK',
|
|
198
|
-
description: 'Casual conversation, greetings, asking about identity',
|
|
199
|
-
required_fields: [],
|
|
200
|
-
skipWorkflow: true
|
|
201
|
-
};
|
|
202
|
-
await repository.saveIntent(smallTalkIntent);
|
|
203
|
-
console.log(` - Intents ready.`);
|
|
204
|
-
}
|
|
205
|
-
// Call initialization
|
|
206
|
-
initializeDemoTenant().catch(err => console.error('Failed to init tenant:', err));
|
|
207
|
-
// Create HTTP server to serve the client HTML and Widget JS
|
|
208
|
-
const httpServer = http.createServer(async (req, res) => {
|
|
209
|
-
if (req.url === '/' || req.url === '/index.html') {
|
|
210
|
-
const htmlPath = path.join(__dirname, '../demo/realtime-voice-client.html');
|
|
211
|
-
fs.readFile(htmlPath, 'utf8', (err, data) => {
|
|
212
|
-
if (err) {
|
|
213
|
-
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
|
214
|
-
res.end('Error loading client');
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
218
|
-
res.end(data);
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
else if (req.url === '/widget-builder.html') {
|
|
222
|
-
const htmlPath = path.join(__dirname, '../demo/widget-builder.html');
|
|
223
|
-
fs.readFile(htmlPath, 'utf8', (err, data) => {
|
|
224
|
-
if (err) {
|
|
225
|
-
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
|
226
|
-
res.end('Error loading builder');
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
230
|
-
res.end(data);
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
else if (req.url === '/chat-flow-widget.js') {
|
|
234
|
-
const jsPath = path.join(__dirname, '../demo/chat-flow-widget.js');
|
|
235
|
-
fs.readFile(jsPath, 'utf8', (err, data) => {
|
|
236
|
-
if (err) {
|
|
237
|
-
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
|
238
|
-
res.end('Error loading widget script');
|
|
239
|
-
return;
|
|
240
|
-
}
|
|
241
|
-
res.writeHead(200, { 'Content-Type': 'application/javascript' });
|
|
242
|
-
res.end(data);
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
else if (req.url === '/default-logo.png') {
|
|
246
|
-
const logoPath = path.join(__dirname, '../demo/default-logo.png');
|
|
247
|
-
fs.readFile(logoPath, (err, data) => {
|
|
248
|
-
if (err) {
|
|
249
|
-
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
250
|
-
res.end('Logo not found');
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
res.writeHead(200, { 'Content-Type': 'image/png' });
|
|
254
|
-
res.end(data);
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
else if (req.url === '/webhook-test' && req.method === 'POST') {
|
|
258
|
-
let body = '';
|
|
259
|
-
req.on('data', chunk => {
|
|
260
|
-
body += chunk.toString();
|
|
261
|
-
});
|
|
262
|
-
req.on('end', () => {
|
|
263
|
-
console.log(`---------------- START ---------------------------`);
|
|
264
|
-
console.log('\nš„ [Webhook] Payload:');
|
|
265
|
-
try {
|
|
266
|
-
const payload = JSON.parse(body);
|
|
267
|
-
console.log(JSON.stringify(payload, null, 2));
|
|
268
|
-
const eventType = req.headers['x-webhook-event'] || payload.eventType || 'unknown';
|
|
269
|
-
console.log(`ā
Event Processed: ${eventType}\n`);
|
|
270
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
271
|
-
res.end(JSON.stringify({ status: 'received', event: eventType }));
|
|
272
|
-
}
|
|
273
|
-
catch (e) {
|
|
274
|
-
console.error('ā Failed to parse webhook payload:', e);
|
|
275
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
276
|
-
res.end(JSON.stringify({ error: 'Invalid JSON' }));
|
|
277
|
-
}
|
|
278
|
-
finally {
|
|
279
|
-
console.log(`---------------- END ---------------------------`);
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
else if (req.url?.startsWith('/recordings/')) {
|
|
284
|
-
// Serve recording files from Redis (via Storage Adapter)
|
|
285
|
-
const filename = req.url.split('/recordings/')[1];
|
|
286
|
-
if (!filename) {
|
|
287
|
-
res.writeHead(400, { 'Content-Type': 'text/plain' });
|
|
288
|
-
res.end('Filename required');
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
const sessionId = filename.replace('.wav', '');
|
|
292
|
-
// Basic path traversal protection (though less critical with memory lookup)
|
|
293
|
-
if (filename.includes('..')) {
|
|
294
|
-
res.writeHead(403, { 'Content-Type': 'text/plain' });
|
|
295
|
-
res.end('Forbidden');
|
|
296
|
-
return;
|
|
297
|
-
}
|
|
298
|
-
try {
|
|
299
|
-
// Retrieve directly from storage adapter (Orchestrator is for active sessions)
|
|
300
|
-
const audioBuffer = await voiceStorage.getSessionAudio(sessionId);
|
|
301
|
-
if (!audioBuffer) {
|
|
302
|
-
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
303
|
-
res.end('Recording not found');
|
|
304
|
-
return;
|
|
305
|
-
}
|
|
306
|
-
res.writeHead(200, { 'Content-Type': 'audio/wav' });
|
|
307
|
-
res.end(audioBuffer);
|
|
308
|
-
}
|
|
309
|
-
catch (error) {
|
|
310
|
-
console.error('[Server] Error serving recording:', error);
|
|
311
|
-
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
|
312
|
-
res.end('Internal Server Error');
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
316
|
-
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
317
|
-
res.end('Not found');
|
|
318
|
-
}
|
|
319
|
-
});
|
|
320
|
-
// Create WebSocket server
|
|
321
|
-
const wss = new ws_1.WebSocketServer({ server: httpServer });
|
|
322
|
-
// Start server
|
|
323
|
-
// PORT is defined above
|
|
324
|
-
httpServer.listen(PORT, () => {
|
|
325
|
-
console.log('šļø Real-Time Voice Server');
|
|
326
|
-
console.log('='.repeat(60));
|
|
327
|
-
console.log(`ā
HTTP server listening on http://localhost:${PORT}`);
|
|
328
|
-
console.log(`ā
WebSocket server listening on ws://localhost:${PORT}`);
|
|
329
|
-
console.log('š” Open http://localhost:8080 in your browser\n');
|
|
330
|
-
});
|
|
331
|
-
wss.on('connection', async (clientWs, req) => {
|
|
332
|
-
const sessionId = `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
333
|
-
console.log(`\nš New client connected: ${sessionId}`);
|
|
334
|
-
// Parse query params to allow client to select config
|
|
335
|
-
const url = new URL(req.url || '', `http://${req.headers.host}`);
|
|
336
|
-
const configId = url.searchParams.get('config') || url.searchParams.get('configId');
|
|
337
|
-
const tenantIdParam = url.searchParams.get('tenantId');
|
|
338
|
-
// Defaults
|
|
339
|
-
const selectedConfigId = configId || DEMO_CONFIG_ID_SUPPORT;
|
|
340
|
-
const targetTenantId = tenantIdParam || DEMO_TENANT_ID;
|
|
341
|
-
// --- SECURITY CHECKS ---
|
|
342
|
-
const origin = req.headers.origin || '';
|
|
343
|
-
// 1. Validate Tenant Existence (Fast Fail)
|
|
344
|
-
const tenant = await repository.findTenantById(targetTenantId);
|
|
345
|
-
if (!tenant) {
|
|
346
|
-
console.error(`ā Connection failed: Tenant '${targetTenantId}' not found.`);
|
|
347
|
-
clientWs.close(1008, 'Invalid Tenant');
|
|
348
|
-
return;
|
|
349
|
-
}
|
|
350
|
-
// 2. Validate Origin (Domain Whitelisting)
|
|
351
|
-
const allowed = tenant.allowedOrigins || [];
|
|
352
|
-
const isAllowed = allowed.some(domain => origin === domain || origin.startsWith(domain));
|
|
353
|
-
if (!isAllowed) {
|
|
354
|
-
console.error(`ā Connection blocked: Origin '${origin}' not allowed for tenant '${tenant.name}'.`);
|
|
355
|
-
clientWs.close(1008, 'Origin Not Allowed');
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
|
-
console.log(`ā
Connection verified for '${tenant.name}' from '${origin}'`); // Logs verified connection
|
|
359
|
-
try {
|
|
360
|
-
// ... (existing adapter setup) ...
|
|
361
|
-
const llm = new GeminiLLMAdapter_1.GeminiLLMAdapter(geminiApiKey);
|
|
362
|
-
const voiceAdapter = new GoogleVoiceAdapter_1.GoogleVoiceAdapter(geminiApiKey);
|
|
363
|
-
const intentMatcher = new IntentMatcher_1.IntentMatcher(llm);
|
|
364
|
-
const intentService = new IntentService_1.IntentService(repository, intentMatcher);
|
|
365
|
-
const workflowAdapter = new MockWorkflowAdapter_1.MockWorkflowAdapter();
|
|
366
|
-
const webhookService = new WebhookService_1.WebhookService();
|
|
367
|
-
const orchestrator = new Orchestrator_1.Orchestrator(repository, llm, intentService, workflowAdapter, webhookService, voiceAdapter, voiceStorage);
|
|
368
|
-
// Fetch config FIRST to determine mode
|
|
369
|
-
const config = await repository.findConversationConfig(targetTenantId, selectedConfigId);
|
|
370
|
-
// Determine Session Mode
|
|
371
|
-
// Priority: 1. URL Param, 2. Config Default, 3. 'VOICE' fallback
|
|
372
|
-
const modeParam = new URL(req.url, `http://${req.headers.host}`).searchParams.get('mode');
|
|
373
|
-
// Type assertion for safety
|
|
374
|
-
const sessionMode = (modeParam?.toUpperCase() === 'TEXT') ? 'TEXT' : (config?.uiConfig?.sessionMode?.toUpperCase() === 'TEXT' ? 'TEXT' : 'VOICE');
|
|
375
|
-
// Create session with determined mode
|
|
376
|
-
await orchestrator.createSession(sessionId, sessionMode, 'You are a helpful assistant.', // Default prompt (will be overridden by config if found)
|
|
377
|
-
targetTenantId, selectedConfigId);
|
|
378
|
-
const voiceSettings = config?.voiceConfig || { silenceThresholdMs: 1500, smartMode: true };
|
|
379
|
-
// Ensure UI config reflects the ACTUAL session mode (which might differ from DB default)
|
|
380
|
-
// This prevents the client from reverting to the DB default if a URL param was used.
|
|
381
|
-
const uiSettings = {
|
|
382
|
-
...config?.uiConfig,
|
|
383
|
-
sessionMode: (sessionMode === 'TEXT' ? 'text' : 'voice')
|
|
384
|
-
};
|
|
385
|
-
const session = {
|
|
386
|
-
id: sessionId,
|
|
387
|
-
ws: clientWs,
|
|
388
|
-
orchestrator,
|
|
389
|
-
voiceAdapter,
|
|
390
|
-
createdAt: new Date(),
|
|
391
|
-
tenantId: targetTenantId
|
|
392
|
-
};
|
|
393
|
-
sessions.set(sessionId, session);
|
|
394
|
-
console.log(`ā
${sessionMode} session ready: ${sessionId}`);
|
|
395
|
-
// Send ready message to client with settings
|
|
396
|
-
clientWs.send(JSON.stringify({
|
|
397
|
-
type: 'ready',
|
|
398
|
-
sessionId: sessionId,
|
|
399
|
-
mode: sessionMode, // Inform client of mode
|
|
400
|
-
message: `${sessionMode === 'TEXT' ? 'Chat' : 'Voice'} assistant ready!`,
|
|
401
|
-
config: {
|
|
402
|
-
silenceThreshold: voiceSettings.silenceThresholdMs || 1500,
|
|
403
|
-
smartMode: voiceSettings.smartMode !== false, // Default true
|
|
404
|
-
interruptionMode: voiceSettings.interruptionMode || 'off', // Default off
|
|
405
|
-
ui: uiSettings // Send UI config
|
|
406
|
-
}
|
|
407
|
-
}));
|
|
408
|
-
// Handle incoming messages from client
|
|
409
|
-
clientWs.on('message', async (data) => {
|
|
410
|
-
const msgStr = data.toString();
|
|
411
|
-
try {
|
|
412
|
-
let message;
|
|
413
|
-
try {
|
|
414
|
-
message = JSON.parse(msgStr);
|
|
415
|
-
if (message.type === 'audio') {
|
|
416
|
-
console.log(`[Server] RX: Audio Data (${msgStr.length} chars)`);
|
|
417
|
-
}
|
|
418
|
-
else {
|
|
419
|
-
console.log(`[Server] RX: ${msgStr}`);
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
catch (e) {
|
|
423
|
-
// Not JSON
|
|
424
|
-
console.log(`[Server] RX: Binary/Non-JSON Data (${data.length} bytes)`);
|
|
425
|
-
}
|
|
426
|
-
if (!message)
|
|
427
|
-
return; // Stop if parse failed
|
|
428
|
-
// Handle TEXT input
|
|
429
|
-
if (message.type === 'text') {
|
|
430
|
-
// Reject text input in VOICE mode
|
|
431
|
-
if (sessionMode === 'VOICE') {
|
|
432
|
-
console.error(`ā Text input rejected: Session ${sessionId} is in VOICE mode`);
|
|
433
|
-
clientWs.send(JSON.stringify({
|
|
434
|
-
type: 'error',
|
|
435
|
-
message: 'This session is configured for voice input only'
|
|
436
|
-
}));
|
|
437
|
-
return;
|
|
438
|
-
}
|
|
439
|
-
const text = message.data;
|
|
440
|
-
console.log(`š¬ Processing text from ${sessionId}: "${text}"`);
|
|
441
|
-
// Direct to LLM (Skip STT)
|
|
442
|
-
const result = await orchestrator.processMessage(sessionId, text, async (fillerText) => {
|
|
443
|
-
console.log(`[Server] sending filler text: "${fillerText}"`);
|
|
444
|
-
clientWs.send(JSON.stringify({
|
|
445
|
-
type: 'response',
|
|
446
|
-
data: {
|
|
447
|
-
text: `*${fillerText}*`,
|
|
448
|
-
audio: null,
|
|
449
|
-
isFinal: false, // Widget will switch to "Processing" state
|
|
450
|
-
shouldEndSession: false
|
|
451
|
-
}
|
|
452
|
-
}));
|
|
453
|
-
});
|
|
454
|
-
processResponse(result);
|
|
455
|
-
}
|
|
456
|
-
// Handle AUDIO input
|
|
457
|
-
else if (message.type === 'audio') {
|
|
458
|
-
// Reject audio input in TEXT mode
|
|
459
|
-
if (sessionMode === 'TEXT') {
|
|
460
|
-
console.error(`ā Audio input rejected: Session ${sessionId} is in TEXT mode`);
|
|
461
|
-
clientWs.send(JSON.stringify({
|
|
462
|
-
type: 'error',
|
|
463
|
-
message: 'This session is configured for text input only'
|
|
464
|
-
}));
|
|
465
|
-
return;
|
|
466
|
-
}
|
|
467
|
-
const audioBase64 = message.data;
|
|
468
|
-
console.log(`š¤ Processing audio from ${sessionId} (${audioBase64.length} chars)`);
|
|
469
|
-
// 1. STT (Delegated to Orchestrator with side-effect storage)
|
|
470
|
-
const startSTT = Date.now();
|
|
471
|
-
// Use Orchestrator to transcribe (and implicitly record)
|
|
472
|
-
const transcript = await orchestrator.transcribeAudio(sessionId, audioBase64);
|
|
473
|
-
// Old manual call: const transcript = await voiceAdapter.speechToText(audioBase64);
|
|
474
|
-
// Old manual storage: voiceStorage.appendAudio(...)
|
|
475
|
-
const sttDuration = Date.now() - startSTT;
|
|
476
|
-
console.log(`[STT] "${transcript}" (${sttDuration}ms)`);
|
|
477
|
-
// Send transcript immediately to client
|
|
478
|
-
clientWs.send(JSON.stringify({
|
|
479
|
-
type: 'transcript',
|
|
480
|
-
data: {
|
|
481
|
-
transcript: transcript,
|
|
482
|
-
isFinal: true
|
|
483
|
-
}
|
|
484
|
-
}));
|
|
485
|
-
// 2. LLM Processing
|
|
486
|
-
const result = await orchestrator.processMessage(sessionId, transcript, async (fillerText) => {
|
|
487
|
-
console.log(`[Server] Generating filler audio: "${fillerText}"`);
|
|
488
|
-
if (sessionMode === 'VOICE') {
|
|
489
|
-
try {
|
|
490
|
-
const audio = await orchestrator.synthesizeResponse(sessionId, fillerText);
|
|
491
|
-
clientWs.send(JSON.stringify({
|
|
492
|
-
type: 'response',
|
|
493
|
-
data: {
|
|
494
|
-
text: `*${fillerText}*`,
|
|
495
|
-
audio: Buffer.from(audio).toString('base64'),
|
|
496
|
-
isFinal: false,
|
|
497
|
-
shouldEndSession: false
|
|
498
|
-
}
|
|
499
|
-
}));
|
|
500
|
-
}
|
|
501
|
-
catch (e) {
|
|
502
|
-
console.error('Filler TTS failed', e);
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
});
|
|
506
|
-
processResponse(result);
|
|
507
|
-
}
|
|
508
|
-
async function processResponse(result) {
|
|
509
|
-
const response = result.messages[result.messages.length - 1]?.content;
|
|
510
|
-
const shouldEndSession = result.metadata?.shouldEndSession || false;
|
|
511
|
-
const detectedLanguage = result.metadata?.detectedLanguage;
|
|
512
|
-
const languageName = result.metadata?.languageName;
|
|
513
|
-
const languageChanged = result.metadata?.languageChanged;
|
|
514
|
-
console.log(`[LLM] Response: "${response}"`);
|
|
515
|
-
if (detectedLanguage) {
|
|
516
|
-
console.log(`[Language] ${languageChanged ? 'Switched to' : 'Detected'}: ${languageName} (${detectedLanguage})`);
|
|
517
|
-
}
|
|
518
|
-
// 3. Send Text Response IMMEDIATELY (Decoupled from Audio)
|
|
519
|
-
// CRITICAL: If audio is coming, FORCE shouldEndSession to false here
|
|
520
|
-
// so the client waits for the audio message before acting on the end signal.
|
|
521
|
-
const textShouldEndSession = (sessionMode === 'VOICE' && response) ? false : shouldEndSession;
|
|
522
|
-
clientWs.send(JSON.stringify({
|
|
523
|
-
type: 'response',
|
|
524
|
-
data: {
|
|
525
|
-
text: response,
|
|
526
|
-
audio: null, // Audio will come later
|
|
527
|
-
isFinal: false, // Not final yet, audio is pending
|
|
528
|
-
shouldEndSession: textShouldEndSession,
|
|
529
|
-
detectedLanguage: detectedLanguage,
|
|
530
|
-
languageName: languageName
|
|
531
|
-
}
|
|
532
|
-
}));
|
|
533
|
-
// 4. TTS (Only if mode is VOICE)
|
|
534
|
-
if (sessionMode === 'VOICE' && response) {
|
|
535
|
-
const startTTS = Date.now();
|
|
536
|
-
// Use Orchestrator to synthesize (and implicitly record)
|
|
537
|
-
const audioResponse = await orchestrator.synthesizeResponse(sessionId, response);
|
|
538
|
-
const ttsDuration = Date.now() - startTTS;
|
|
539
|
-
console.log(`[TTS] Generated ${audioResponse.length} bytes (${ttsDuration}ms)`);
|
|
540
|
-
// Send Audio Response
|
|
541
|
-
clientWs.send(JSON.stringify({
|
|
542
|
-
type: 'response',
|
|
543
|
-
data: {
|
|
544
|
-
text: null, // Text already sent
|
|
545
|
-
audio: Buffer.from(audioResponse).toString('base64'),
|
|
546
|
-
isFinal: true, // Now it's final
|
|
547
|
-
shouldEndSession: shouldEndSession
|
|
548
|
-
}
|
|
549
|
-
}));
|
|
550
|
-
}
|
|
551
|
-
else {
|
|
552
|
-
// If no audio needed, send a final confirmation (optional, or rely on first message)
|
|
553
|
-
clientWs.send(JSON.stringify({
|
|
554
|
-
type: 'response',
|
|
555
|
-
data: {
|
|
556
|
-
isFinal: true
|
|
557
|
-
}
|
|
558
|
-
}));
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
catch (error) {
|
|
563
|
-
console.error(`ā Error processing message:`, error);
|
|
564
|
-
clientWs.send(JSON.stringify({
|
|
565
|
-
type: 'error',
|
|
566
|
-
message: error instanceof Error ? error.message : 'Unknown error'
|
|
567
|
-
}));
|
|
568
|
-
}
|
|
569
|
-
});
|
|
570
|
-
// Handle client disconnect
|
|
571
|
-
clientWs.on('close', async () => {
|
|
572
|
-
console.log(`\nš Client disconnected: ${sessionId}`);
|
|
573
|
-
try {
|
|
574
|
-
// Ensure session is marked as completed and triggers webhooks
|
|
575
|
-
// Ensure session is marked as completed and triggers webhooks
|
|
576
|
-
// Orchestrator.completeSession handles finalization if storage is present
|
|
577
|
-
// We don't need to manually finalize.
|
|
578
|
-
await orchestrator.completeSession(sessionId);
|
|
579
|
-
}
|
|
580
|
-
catch (error) {
|
|
581
|
-
console.error(`ā Error completing session ${sessionId}:`, error);
|
|
582
|
-
}
|
|
583
|
-
finally {
|
|
584
|
-
sessions.delete(sessionId);
|
|
585
|
-
}
|
|
586
|
-
});
|
|
587
|
-
// Handle errors
|
|
588
|
-
clientWs.on('error', (error) => {
|
|
589
|
-
console.error(`ā Client error for ${sessionId}:`, error);
|
|
590
|
-
});
|
|
591
|
-
}
|
|
592
|
-
catch (error) {
|
|
593
|
-
console.error(`ā Error setting up session ${sessionId}:`, error);
|
|
594
|
-
clientWs.send(JSON.stringify({
|
|
595
|
-
type: 'error',
|
|
596
|
-
message: error instanceof Error ? error.message : 'Unknown error'
|
|
597
|
-
}));
|
|
598
|
-
clientWs.close();
|
|
599
|
-
}
|
|
600
|
-
});
|
|
601
|
-
// Graceful shutdown
|
|
602
|
-
process.on('SIGINT', () => {
|
|
603
|
-
console.log('\n\nš Shutting down server...');
|
|
604
|
-
sessions.forEach((session) => {
|
|
605
|
-
session.ws.close();
|
|
606
|
-
});
|
|
607
|
-
wss.close();
|
|
608
|
-
httpServer.close(() => {
|
|
609
|
-
console.log('ā
Server shut down gracefully');
|
|
610
|
-
process.exit(0);
|
|
611
|
-
});
|
|
612
|
-
setTimeout(() => {
|
|
613
|
-
console.log('ā ļø Forcing shutdown...');
|
|
614
|
-
process.exit(0);
|
|
615
|
-
}, 2000);
|
|
616
|
-
});
|
|
617
|
-
// Log active sessions every 30 seconds
|
|
618
|
-
setInterval(() => {
|
|
619
|
-
if (sessions.size > 0) {
|
|
620
|
-
console.log(`\nš Active sessions: ${sessions.size}`);
|
|
621
|
-
sessions.forEach((session) => {
|
|
622
|
-
const duration = Math.floor((Date.now() - session.createdAt.getTime()) / 1000);
|
|
623
|
-
console.log(` - ${session.id} (${duration}s)`);
|
|
624
|
-
});
|
|
625
|
-
}
|
|
626
|
-
}, 30000);
|
|
627
|
-
//# sourceMappingURL=realtime-voice-server.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"realtime-voice-server.js","sourceRoot":"","sources":["../../src/server/realtime-voice-server.ts"],"names":[],"mappings":"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"}
|