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.
Files changed (322) hide show
  1. package/package.json +1 -1
  2. package/dist/adapters/db/InMemorySessionRepository.js +0 -15
  3. package/dist/adapters/db/RedisSessionRepository.js +0 -41
  4. package/dist/adapters/intent/IntentMatcher.d.ts +0 -41
  5. package/dist/adapters/intent/IntentMatcher.d.ts.map +0 -1
  6. package/dist/adapters/intent/IntentMatcher.js +0 -167
  7. package/dist/adapters/intent/IntentMatcher.js.map +0 -1
  8. package/dist/adapters/intent/IntentService.d.ts +0 -26
  9. package/dist/adapters/intent/IntentService.d.ts.map +0 -1
  10. package/dist/adapters/intent/IntentService.js +0 -65
  11. package/dist/adapters/intent/IntentService.js.map +0 -1
  12. package/dist/adapters/intent/MockIntentAdapter.js +0 -29
  13. package/dist/adapters/intent/MockIntentService.d.ts +0 -7
  14. package/dist/adapters/intent/MockIntentService.d.ts.map +0 -1
  15. package/dist/adapters/intent/MockIntentService.js +0 -36
  16. package/dist/adapters/intent/MockIntentService.js.map +0 -1
  17. package/dist/adapters/llm/GeminiLLMAdapter.d.ts +0 -10
  18. package/dist/adapters/llm/GeminiLLMAdapter.d.ts.map +0 -1
  19. package/dist/adapters/llm/GeminiLLMAdapter.js +0 -102
  20. package/dist/adapters/llm/GeminiLLMAdapter.js.map +0 -1
  21. package/dist/adapters/llm/MockLLMAdapter.d.ts +0 -5
  22. package/dist/adapters/llm/MockLLMAdapter.d.ts.map +0 -1
  23. package/dist/adapters/llm/MockLLMAdapter.js +0 -31
  24. package/dist/adapters/llm/MockLLMAdapter.js.map +0 -1
  25. package/dist/adapters/llm/OllamaLLMAdapter.d.ts +0 -9
  26. package/dist/adapters/llm/OllamaLLMAdapter.d.ts.map +0 -1
  27. package/dist/adapters/llm/OllamaLLMAdapter.js +0 -74
  28. package/dist/adapters/llm/OllamaLLMAdapter.js.map +0 -1
  29. package/dist/adapters/logger/ConsoleLogger.d.ts +0 -12
  30. package/dist/adapters/logger/ConsoleLogger.d.ts.map +0 -1
  31. package/dist/adapters/logger/ConsoleLogger.js +0 -37
  32. package/dist/adapters/logger/ConsoleLogger.js.map +0 -1
  33. package/dist/adapters/memory/InMemorySessionRepository.js +0 -15
  34. package/dist/adapters/redis/RedisSessionRepository.js +0 -41
  35. package/dist/adapters/repository/InMemoryRepository.d.ts +0 -46
  36. package/dist/adapters/repository/InMemoryRepository.d.ts.map +0 -1
  37. package/dist/adapters/repository/InMemoryRepository.js +0 -235
  38. package/dist/adapters/repository/InMemoryRepository.js.map +0 -1
  39. package/dist/adapters/repository/IntentRepository.d.ts +0 -15
  40. package/dist/adapters/repository/IntentRepository.d.ts.map +0 -1
  41. package/dist/adapters/repository/IntentRepository.js +0 -28
  42. package/dist/adapters/repository/IntentRepository.js.map +0 -1
  43. package/dist/adapters/repository/RedisRepository.d.ts +0 -63
  44. package/dist/adapters/repository/RedisRepository.d.ts.map +0 -1
  45. package/dist/adapters/repository/RedisRepository.js +0 -586
  46. package/dist/adapters/repository/RedisRepository.js.map +0 -1
  47. package/dist/adapters/storage/RedisAudioStorageAdapter.d.ts +0 -33
  48. package/dist/adapters/storage/RedisAudioStorageAdapter.d.ts.map +0 -1
  49. package/dist/adapters/storage/RedisAudioStorageAdapter.js +0 -121
  50. package/dist/adapters/storage/RedisAudioStorageAdapter.js.map +0 -1
  51. package/dist/adapters/storage/RedisBufferStorageAdapter.d.ts +0 -14
  52. package/dist/adapters/storage/RedisBufferStorageAdapter.d.ts.map +0 -1
  53. package/dist/adapters/storage/RedisBufferStorageAdapter.js +0 -94
  54. package/dist/adapters/storage/RedisBufferStorageAdapter.js.map +0 -1
  55. package/dist/adapters/voice/ElevenLabsVoiceAdapter.d.ts +0 -29
  56. package/dist/adapters/voice/ElevenLabsVoiceAdapter.d.ts.map +0 -1
  57. package/dist/adapters/voice/ElevenLabsVoiceAdapter.js +0 -75
  58. package/dist/adapters/voice/ElevenLabsVoiceAdapter.js.map +0 -1
  59. package/dist/adapters/voice/GeminiMultimodalLiveAdapter.d.ts +0 -77
  60. package/dist/adapters/voice/GeminiMultimodalLiveAdapter.d.ts.map +0 -1
  61. package/dist/adapters/voice/GeminiMultimodalLiveAdapter.js +0 -187
  62. package/dist/adapters/voice/GeminiMultimodalLiveAdapter.js.map +0 -1
  63. package/dist/adapters/voice/GeminiVoiceAdapter.d.ts +0 -36
  64. package/dist/adapters/voice/GeminiVoiceAdapter.d.ts.map +0 -1
  65. package/dist/adapters/voice/GeminiVoiceAdapter.js +0 -134
  66. package/dist/adapters/voice/GeminiVoiceAdapter.js.map +0 -1
  67. package/dist/adapters/voice/GoogleTTSAdapter.d.ts +0 -61
  68. package/dist/adapters/voice/GoogleTTSAdapter.d.ts.map +0 -1
  69. package/dist/adapters/voice/GoogleTTSAdapter.js +0 -165
  70. package/dist/adapters/voice/GoogleTTSAdapter.js.map +0 -1
  71. package/dist/adapters/voice/GoogleVoiceAdapter.d.ts +0 -33
  72. package/dist/adapters/voice/GoogleVoiceAdapter.d.ts.map +0 -1
  73. package/dist/adapters/voice/GoogleVoiceAdapter.js +0 -155
  74. package/dist/adapters/voice/GoogleVoiceAdapter.js.map +0 -1
  75. package/dist/adapters/voice/HybridVoiceAdapter.d.ts +0 -54
  76. package/dist/adapters/voice/HybridVoiceAdapter.d.ts.map +0 -1
  77. package/dist/adapters/voice/HybridVoiceAdapter.js +0 -102
  78. package/dist/adapters/voice/HybridVoiceAdapter.js.map +0 -1
  79. package/dist/adapters/voice/LanguageVoiceMapper.d.ts +0 -60
  80. package/dist/adapters/voice/LanguageVoiceMapper.d.ts.map +0 -1
  81. package/dist/adapters/voice/LanguageVoiceMapper.js +0 -130
  82. package/dist/adapters/voice/LanguageVoiceMapper.js.map +0 -1
  83. package/dist/adapters/voice/VertexVoiceAdapter.d.ts +0 -32
  84. package/dist/adapters/voice/VertexVoiceAdapter.d.ts.map +0 -1
  85. package/dist/adapters/voice/VertexVoiceAdapter.js +0 -179
  86. package/dist/adapters/voice/VertexVoiceAdapter.js.map +0 -1
  87. package/dist/adapters/webhook/WebhookService.d.ts +0 -47
  88. package/dist/adapters/webhook/WebhookService.d.ts.map +0 -1
  89. package/dist/adapters/webhook/WebhookService.js +0 -265
  90. package/dist/adapters/webhook/WebhookService.js.map +0 -1
  91. package/dist/adapters/workflow/MockWorkflowAdapter.d.ts +0 -5
  92. package/dist/adapters/workflow/MockWorkflowAdapter.d.ts.map +0 -1
  93. package/dist/adapters/workflow/MockWorkflowAdapter.js +0 -173
  94. package/dist/adapters/workflow/MockWorkflowAdapter.js.map +0 -1
  95. package/dist/adapters/workflow/WorkflowAdapter.d.ts +0 -55
  96. package/dist/adapters/workflow/WorkflowAdapter.d.ts.map +0 -1
  97. package/dist/adapters/workflow/WorkflowAdapter.js +0 -242
  98. package/dist/adapters/workflow/WorkflowAdapter.js.map +0 -1
  99. package/dist/adapters/workflow/actions/getSupportHoursAction.d.ts +0 -10
  100. package/dist/adapters/workflow/actions/getSupportHoursAction.d.ts.map +0 -1
  101. package/dist/adapters/workflow/actions/getSupportHoursAction.js +0 -33
  102. package/dist/adapters/workflow/actions/getSupportHoursAction.js.map +0 -1
  103. package/dist/adapters/workflow/actions/index.d.ts +0 -6
  104. package/dist/adapters/workflow/actions/index.d.ts.map +0 -1
  105. package/dist/adapters/workflow/actions/index.js +0 -22
  106. package/dist/adapters/workflow/actions/index.js.map +0 -1
  107. package/dist/adapters/workflow/actions/pushOutputResultAction.d.ts +0 -11
  108. package/dist/adapters/workflow/actions/pushOutputResultAction.d.ts.map +0 -1
  109. package/dist/adapters/workflow/actions/pushOutputResultAction.js +0 -31
  110. package/dist/adapters/workflow/actions/pushOutputResultAction.js.map +0 -1
  111. package/dist/adapters/workflow/actions/setWorkflowMessageAction.d.ts +0 -12
  112. package/dist/adapters/workflow/actions/setWorkflowMessageAction.d.ts.map +0 -1
  113. package/dist/adapters/workflow/actions/setWorkflowMessageAction.js +0 -32
  114. package/dist/adapters/workflow/actions/setWorkflowMessageAction.js.map +0 -1
  115. package/dist/adapters/workflow/engine/constants.d.ts +0 -3
  116. package/dist/adapters/workflow/engine/constants.d.ts.map +0 -1
  117. package/dist/adapters/workflow/engine/constants.js +0 -6
  118. package/dist/adapters/workflow/engine/constants.js.map +0 -1
  119. package/dist/adapters/workflow/engine/engine.d.ts +0 -32
  120. package/dist/adapters/workflow/engine/engine.d.ts.map +0 -1
  121. package/dist/adapters/workflow/engine/engine.js +0 -623
  122. package/dist/adapters/workflow/engine/engine.js.map +0 -1
  123. package/dist/adapters/workflow/engine/event-registry.d.ts +0 -12
  124. package/dist/adapters/workflow/engine/event-registry.d.ts.map +0 -1
  125. package/dist/adapters/workflow/engine/event-registry.js +0 -33
  126. package/dist/adapters/workflow/engine/event-registry.js.map +0 -1
  127. package/dist/adapters/workflow/engine/interpolator.d.ts +0 -11
  128. package/dist/adapters/workflow/engine/interpolator.d.ts.map +0 -1
  129. package/dist/adapters/workflow/engine/interpolator.js +0 -93
  130. package/dist/adapters/workflow/engine/interpolator.js.map +0 -1
  131. package/dist/adapters/workflow/engine/registry.d.ts +0 -12
  132. package/dist/adapters/workflow/engine/registry.d.ts.map +0 -1
  133. package/dist/adapters/workflow/engine/registry.js +0 -39
  134. package/dist/adapters/workflow/engine/registry.js.map +0 -1
  135. package/dist/adapters/workflow/engine/template-registry.d.ts +0 -60
  136. package/dist/adapters/workflow/engine/template-registry.d.ts.map +0 -1
  137. package/dist/adapters/workflow/engine/template-registry.js +0 -92
  138. package/dist/adapters/workflow/engine/template-registry.js.map +0 -1
  139. package/dist/adapters/workflow/engine/types.d.ts +0 -182
  140. package/dist/adapters/workflow/engine/types.d.ts.map +0 -1
  141. package/dist/adapters/workflow/engine/types.js +0 -3
  142. package/dist/adapters/workflow/engine/types.js.map +0 -1
  143. package/dist/adapters/workflow/engine/utils/format-utils.d.ts +0 -43
  144. package/dist/adapters/workflow/engine/utils/format-utils.d.ts.map +0 -1
  145. package/dist/adapters/workflow/engine/utils/format-utils.js +0 -137
  146. package/dist/adapters/workflow/engine/utils/format-utils.js.map +0 -1
  147. package/dist/adapters/workflow/engine/utils/layout-calculator.d.ts +0 -7
  148. package/dist/adapters/workflow/engine/utils/layout-calculator.d.ts.map +0 -1
  149. package/dist/adapters/workflow/engine/utils/layout-calculator.js +0 -87
  150. package/dist/adapters/workflow/engine/utils/layout-calculator.js.map +0 -1
  151. package/dist/adapters/workflow/engine/utils/slugify.d.ts +0 -2
  152. package/dist/adapters/workflow/engine/utils/slugify.d.ts.map +0 -1
  153. package/dist/adapters/workflow/engine/utils/slugify.js +0 -41
  154. package/dist/adapters/workflow/engine/utils/slugify.js.map +0 -1
  155. package/dist/adapters/workflow/engine/validator.d.ts +0 -9
  156. package/dist/adapters/workflow/engine/validator.d.ts.map +0 -1
  157. package/dist/adapters/workflow/engine/validator.js +0 -425
  158. package/dist/adapters/workflow/engine/validator.js.map +0 -1
  159. package/dist/application/ConversationSession.d.ts +0 -23
  160. package/dist/application/ConversationSession.d.ts.map +0 -1
  161. package/dist/application/ConversationSession.js +0 -83
  162. package/dist/application/ConversationSession.js.map +0 -1
  163. package/dist/application/Message.d.ts +0 -11
  164. package/dist/application/Message.d.ts.map +0 -1
  165. package/dist/application/Message.js +0 -30
  166. package/dist/application/Message.js.map +0 -1
  167. package/dist/application/Orchestrator.d.ts +0 -18
  168. package/dist/application/Orchestrator.d.ts.map +0 -1
  169. package/dist/application/Orchestrator.js +0 -80
  170. package/dist/application/Orchestrator.js.map +0 -1
  171. package/dist/application/SessionState.js +0 -2
  172. package/dist/application/usecases/CreateSession.js +0 -20
  173. package/dist/application/usecases/HandleUserMessage.js +0 -69
  174. package/dist/config/ChatFlowConfig.d.ts +0 -66
  175. package/dist/config/ChatFlowConfig.d.ts.map +0 -1
  176. package/dist/config/ChatFlowConfig.js +0 -54
  177. package/dist/config/ChatFlowConfig.js.map +0 -1
  178. package/dist/config/index.d.ts +0 -2
  179. package/dist/config/index.d.ts.map +0 -1
  180. package/dist/config/index.js +0 -7
  181. package/dist/config/index.js.map +0 -1
  182. package/dist/core/entities/ConversationSession.d.ts +0 -58
  183. package/dist/core/entities/ConversationSession.d.ts.map +0 -1
  184. package/dist/core/entities/ConversationSession.js +0 -160
  185. package/dist/core/entities/ConversationSession.js.map +0 -1
  186. package/dist/core/entities/Message.d.ts +0 -14
  187. package/dist/core/entities/Message.d.ts.map +0 -1
  188. package/dist/core/entities/Message.js +0 -32
  189. package/dist/core/entities/Message.js.map +0 -1
  190. package/dist/core/errors/ChatFlowError.d.ts +0 -71
  191. package/dist/core/errors/ChatFlowError.d.ts.map +0 -1
  192. package/dist/core/errors/ChatFlowError.js +0 -108
  193. package/dist/core/errors/ChatFlowError.js.map +0 -1
  194. package/dist/core/errors/index.d.ts +0 -2
  195. package/dist/core/errors/index.d.ts.map +0 -1
  196. package/dist/core/errors/index.js +0 -15
  197. package/dist/core/errors/index.js.map +0 -1
  198. package/dist/core/utils/AudioStreamBuffer.d.ts +0 -33
  199. package/dist/core/utils/AudioStreamBuffer.d.ts.map +0 -1
  200. package/dist/core/utils/AudioStreamBuffer.js +0 -55
  201. package/dist/core/utils/AudioStreamBuffer.js.map +0 -1
  202. package/dist/core/utils/AudioUtils.d.ts +0 -41
  203. package/dist/core/utils/AudioUtils.d.ts.map +0 -1
  204. package/dist/core/utils/AudioUtils.js +0 -188
  205. package/dist/core/utils/AudioUtils.js.map +0 -1
  206. package/dist/core/utils/LanguageDetector.d.ts +0 -52
  207. package/dist/core/utils/LanguageDetector.d.ts.map +0 -1
  208. package/dist/core/utils/LanguageDetector.js +0 -173
  209. package/dist/core/utils/LanguageDetector.js.map +0 -1
  210. package/dist/core/utils/WavUtils.d.ts +0 -14
  211. package/dist/core/utils/WavUtils.d.ts.map +0 -1
  212. package/dist/core/utils/WavUtils.js +0 -37
  213. package/dist/core/utils/WavUtils.js.map +0 -1
  214. package/dist/db/InMemoryRepository.d.ts +0 -15
  215. package/dist/db/InMemoryRepository.d.ts.map +0 -1
  216. package/dist/db/InMemoryRepository.js +0 -41
  217. package/dist/db/InMemoryRepository.js.map +0 -1
  218. package/dist/db/RedisRepository.d.ts +0 -16
  219. package/dist/db/RedisRepository.d.ts.map +0 -1
  220. package/dist/db/RedisRepository.js +0 -87
  221. package/dist/db/RedisRepository.js.map +0 -1
  222. package/dist/demo/cli-demo.d.ts +0 -2
  223. package/dist/demo/cli-demo.d.ts.map +0 -1
  224. package/dist/demo/cli-demo.js +0 -146
  225. package/dist/demo/cli-demo.js.map +0 -1
  226. package/dist/demo/console-chat.d.ts +0 -2
  227. package/dist/demo/console-chat.d.ts.map +0 -1
  228. package/dist/demo/console-chat.js +0 -148
  229. package/dist/demo/console-chat.js.map +0 -1
  230. package/dist/demo/interactive-voice-chat.d.ts +0 -2
  231. package/dist/demo/interactive-voice-chat.d.ts.map +0 -1
  232. package/dist/demo/interactive-voice-chat.js +0 -180
  233. package/dist/demo/interactive-voice-chat.js.map +0 -1
  234. package/dist/demo/voice-demo.d.ts +0 -2
  235. package/dist/demo/voice-demo.d.ts.map +0 -1
  236. package/dist/demo/voice-demo.js +0 -188
  237. package/dist/demo/voice-demo.js.map +0 -1
  238. package/dist/domain/conversation/ConversationSession.js +0 -82
  239. package/dist/domain/conversation/Message.js +0 -33
  240. package/dist/domain/conversation/SessionState.js +0 -10
  241. package/dist/index.d.ts +0 -26
  242. package/dist/index.d.ts.map +0 -1
  243. package/dist/index.js +0 -76
  244. package/dist/index.js.map +0 -1
  245. package/dist/intent/IntentService.d.ts +0 -17
  246. package/dist/intent/IntentService.d.ts.map +0 -1
  247. package/dist/intent/IntentService.js +0 -57
  248. package/dist/intent/IntentService.js.map +0 -1
  249. package/dist/intent/MockIntentService.d.ts +0 -7
  250. package/dist/intent/MockIntentService.d.ts.map +0 -1
  251. package/dist/intent/MockIntentService.js +0 -36
  252. package/dist/intent/MockIntentService.js.map +0 -1
  253. package/dist/interfaces.d.ts +0 -653
  254. package/dist/interfaces.d.ts.map +0 -1
  255. package/dist/interfaces.js +0 -36
  256. package/dist/interfaces.js.map +0 -1
  257. package/dist/llm/GeminiLLMAdapter.d.ts +0 -10
  258. package/dist/llm/GeminiLLMAdapter.d.ts.map +0 -1
  259. package/dist/llm/GeminiLLMAdapter.js +0 -102
  260. package/dist/llm/GeminiLLMAdapter.js.map +0 -1
  261. package/dist/llm/MockLLMAdapter.d.ts +0 -5
  262. package/dist/llm/MockLLMAdapter.d.ts.map +0 -1
  263. package/dist/llm/MockLLMAdapter.js +0 -31
  264. package/dist/llm/MockLLMAdapter.js.map +0 -1
  265. package/dist/orchestrator/Orchestrator.d.ts +0 -62
  266. package/dist/orchestrator/Orchestrator.d.ts.map +0 -1
  267. package/dist/orchestrator/Orchestrator.js +0 -697
  268. package/dist/orchestrator/Orchestrator.js.map +0 -1
  269. package/dist/ports/IIntentRepository.d.ts +0 -27
  270. package/dist/ports/IIntentRepository.d.ts.map +0 -1
  271. package/dist/ports/IIntentRepository.js +0 -3
  272. package/dist/ports/IIntentRepository.js.map +0 -1
  273. package/dist/ports/IntentPort.js +0 -2
  274. package/dist/ports/LLMPort.js +0 -2
  275. package/dist/ports/SessionRepository.js +0 -2
  276. package/dist/ports/WorkflowPort.js +0 -2
  277. package/dist/scripts/debug-redis.d.ts +0 -2
  278. package/dist/scripts/debug-redis.d.ts.map +0 -1
  279. package/dist/scripts/debug-redis.js +0 -55
  280. package/dist/scripts/debug-redis.js.map +0 -1
  281. package/dist/scripts/seed-collaborative-intents.d.ts +0 -2
  282. package/dist/scripts/seed-collaborative-intents.d.ts.map +0 -1
  283. package/dist/scripts/seed-collaborative-intents.js +0 -90
  284. package/dist/scripts/seed-collaborative-intents.js.map +0 -1
  285. package/dist/scripts/test-isolated-config.d.ts +0 -2
  286. package/dist/scripts/test-isolated-config.d.ts.map +0 -1
  287. package/dist/scripts/test-isolated-config.js +0 -80
  288. package/dist/scripts/test-isolated-config.js.map +0 -1
  289. package/dist/scripts/verify_memory_intents.d.ts +0 -2
  290. package/dist/scripts/verify_memory_intents.d.ts.map +0 -1
  291. package/dist/scripts/verify_memory_intents.js +0 -45
  292. package/dist/scripts/verify_memory_intents.js.map +0 -1
  293. package/dist/scripts/verify_redis_intents.d.ts +0 -2
  294. package/dist/scripts/verify_redis_intents.d.ts.map +0 -1
  295. package/dist/scripts/verify_redis_intents.js +0 -52
  296. package/dist/scripts/verify_redis_intents.js.map +0 -1
  297. package/dist/server/ChatFlowWebSocketServer.d.ts +0 -46
  298. package/dist/server/ChatFlowWebSocketServer.d.ts.map +0 -1
  299. package/dist/server/ChatFlowWebSocketServer.js +0 -344
  300. package/dist/server/ChatFlowWebSocketServer.js.map +0 -1
  301. package/dist/server/realtime-voice-server.d.ts +0 -2
  302. package/dist/server/realtime-voice-server.d.ts.map +0 -1
  303. package/dist/server/realtime-voice-server.js +0 -627
  304. package/dist/server/realtime-voice-server.js.map +0 -1
  305. package/dist/src/api/routes/tenants.d.ts +0 -3
  306. package/dist/src/api/routes/tenants.d.ts.map +0 -1
  307. package/dist/src/api/routes/tenants.js +0 -109
  308. package/dist/src/api/routes/tenants.js.map +0 -1
  309. package/dist/utils/crypto.d.ts +0 -7
  310. package/dist/utils/crypto.d.ts.map +0 -1
  311. package/dist/utils/crypto.js +0 -35
  312. package/dist/utils/crypto.js.map +0 -1
  313. package/dist/utils/encryption-helpers.d.ts +0 -14
  314. package/dist/utils/encryption-helpers.d.ts.map +0 -1
  315. package/dist/utils/encryption-helpers.js +0 -49
  316. package/dist/utils/encryption-helpers.js.map +0 -1
  317. package/dist/verify_memory_intents.js +0 -44
  318. package/dist/verify_redis_intents.js +0 -49
  319. package/dist/workflow/MockWorkflowAdapter.d.ts +0 -5
  320. package/dist/workflow/MockWorkflowAdapter.d.ts.map +0 -1
  321. package/dist/workflow/MockWorkflowAdapter.js +0 -162
  322. 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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"}