chat-flow-ardymalihi 1.0.2 → 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 (359) hide show
  1. package/README.md +2 -0
  2. package/dist/{adapters → src/adapters}/intent/IntentMatcher.d.ts +16 -0
  3. package/dist/src/adapters/intent/IntentMatcher.d.ts.map +1 -0
  4. package/dist/src/adapters/intent/IntentMatcher.js +167 -0
  5. package/dist/src/adapters/intent/IntentMatcher.js.map +1 -0
  6. package/dist/{adapters → src/adapters}/intent/IntentService.d.ts +4 -5
  7. package/dist/src/adapters/intent/IntentService.d.ts.map +1 -0
  8. package/dist/{adapters → src/adapters}/intent/IntentService.js +15 -9
  9. package/dist/src/adapters/intent/IntentService.js.map +1 -0
  10. package/dist/src/adapters/intent/MockIntentService.d.ts +7 -0
  11. package/dist/src/adapters/intent/MockIntentService.d.ts.map +1 -0
  12. package/dist/{intent → src/adapters/intent}/MockIntentService.js +9 -3
  13. package/dist/src/adapters/intent/MockIntentService.js.map +1 -0
  14. package/dist/src/adapters/llm/GeminiLLMAdapter.d.ts.map +1 -0
  15. package/dist/src/adapters/llm/GeminiLLMAdapter.js.map +1 -0
  16. package/dist/src/adapters/llm/MockLLMAdapter.d.ts.map +1 -0
  17. package/dist/src/adapters/llm/MockLLMAdapter.js.map +1 -0
  18. package/dist/src/adapters/llm/OllamaLLMAdapter.d.ts +9 -0
  19. package/dist/src/adapters/llm/OllamaLLMAdapter.d.ts.map +1 -0
  20. package/dist/src/adapters/llm/OllamaLLMAdapter.js +74 -0
  21. package/dist/src/adapters/llm/OllamaLLMAdapter.js.map +1 -0
  22. package/dist/src/adapters/logger/ConsoleLogger.d.ts +12 -0
  23. package/dist/src/adapters/logger/ConsoleLogger.d.ts.map +1 -0
  24. package/dist/src/adapters/logger/ConsoleLogger.js +37 -0
  25. package/dist/src/adapters/logger/ConsoleLogger.js.map +1 -0
  26. package/dist/src/adapters/repository/InMemoryRepository.d.ts +57 -0
  27. package/dist/src/adapters/repository/InMemoryRepository.d.ts.map +1 -0
  28. package/dist/src/adapters/repository/InMemoryRepository.js +269 -0
  29. package/dist/src/adapters/repository/InMemoryRepository.js.map +1 -0
  30. package/dist/src/adapters/repository/RedisRepository.d.ts +72 -0
  31. package/dist/src/adapters/repository/RedisRepository.d.ts.map +1 -0
  32. package/dist/src/adapters/repository/RedisRepository.js +700 -0
  33. package/dist/src/adapters/repository/RedisRepository.js.map +1 -0
  34. package/dist/src/adapters/repository/SupabaseRepository.d.ts +60 -0
  35. package/dist/src/adapters/repository/SupabaseRepository.d.ts.map +1 -0
  36. package/dist/src/adapters/repository/SupabaseRepository.js +774 -0
  37. package/dist/src/adapters/repository/SupabaseRepository.js.map +1 -0
  38. package/dist/src/adapters/storage/RedisAudioStorageAdapter.d.ts +33 -0
  39. package/dist/src/adapters/storage/RedisAudioStorageAdapter.d.ts.map +1 -0
  40. package/dist/src/adapters/storage/RedisAudioStorageAdapter.js +121 -0
  41. package/dist/src/adapters/storage/RedisAudioStorageAdapter.js.map +1 -0
  42. package/dist/src/adapters/voice/GoogleVoiceAdapter.d.ts +33 -0
  43. package/dist/src/adapters/voice/GoogleVoiceAdapter.d.ts.map +1 -0
  44. package/dist/src/adapters/voice/GoogleVoiceAdapter.js +155 -0
  45. package/dist/src/adapters/voice/GoogleVoiceAdapter.js.map +1 -0
  46. package/dist/src/adapters/voice/LanguageVoiceMapper.d.ts +60 -0
  47. package/dist/src/adapters/voice/LanguageVoiceMapper.d.ts.map +1 -0
  48. package/dist/src/adapters/voice/LanguageVoiceMapper.js +130 -0
  49. package/dist/src/adapters/voice/LanguageVoiceMapper.js.map +1 -0
  50. package/dist/src/adapters/voice/VertexVoiceAdapter.d.ts +32 -0
  51. package/dist/src/adapters/voice/VertexVoiceAdapter.d.ts.map +1 -0
  52. package/dist/src/adapters/voice/VertexVoiceAdapter.js +179 -0
  53. package/dist/src/adapters/voice/VertexVoiceAdapter.js.map +1 -0
  54. package/dist/src/adapters/webhook/WebhookService.d.ts +47 -0
  55. package/dist/src/adapters/webhook/WebhookService.d.ts.map +1 -0
  56. package/dist/src/adapters/webhook/WebhookService.js +265 -0
  57. package/dist/src/adapters/webhook/WebhookService.js.map +1 -0
  58. package/dist/src/adapters/workflow/MockWorkflowAdapter.d.ts.map +1 -0
  59. package/dist/{workflow → src/adapters/workflow}/MockWorkflowAdapter.js +12 -1
  60. package/dist/src/adapters/workflow/MockWorkflowAdapter.js.map +1 -0
  61. package/dist/src/adapters/workflow/WorkflowAdapter.d.ts +55 -0
  62. package/dist/src/adapters/workflow/WorkflowAdapter.d.ts.map +1 -0
  63. package/dist/src/adapters/workflow/WorkflowAdapter.js +203 -0
  64. package/dist/src/adapters/workflow/WorkflowAdapter.js.map +1 -0
  65. package/dist/src/adapters/workflow/actions/index.d.ts +6 -0
  66. package/dist/src/adapters/workflow/actions/index.d.ts.map +1 -0
  67. package/dist/src/adapters/workflow/actions/index.js +22 -0
  68. package/dist/src/adapters/workflow/actions/index.js.map +1 -0
  69. package/dist/src/adapters/workflow/actions/pushOutputResultAction.d.ts +11 -0
  70. package/dist/src/adapters/workflow/actions/pushOutputResultAction.d.ts.map +1 -0
  71. package/dist/src/adapters/workflow/actions/pushOutputResultAction.js +31 -0
  72. package/dist/src/adapters/workflow/actions/pushOutputResultAction.js.map +1 -0
  73. package/dist/src/adapters/workflow/engine/constants.d.ts +3 -0
  74. package/dist/src/adapters/workflow/engine/constants.d.ts.map +1 -0
  75. package/dist/src/adapters/workflow/engine/constants.js +6 -0
  76. package/dist/src/adapters/workflow/engine/constants.js.map +1 -0
  77. package/dist/src/adapters/workflow/engine/engine.d.ts +32 -0
  78. package/dist/src/adapters/workflow/engine/engine.d.ts.map +1 -0
  79. package/dist/src/adapters/workflow/engine/engine.js +622 -0
  80. package/dist/src/adapters/workflow/engine/engine.js.map +1 -0
  81. package/dist/src/adapters/workflow/engine/event-registry.d.ts +12 -0
  82. package/dist/src/adapters/workflow/engine/event-registry.d.ts.map +1 -0
  83. package/dist/src/adapters/workflow/engine/event-registry.js +33 -0
  84. package/dist/src/adapters/workflow/engine/event-registry.js.map +1 -0
  85. package/dist/src/adapters/workflow/engine/interpolator.d.ts +11 -0
  86. package/dist/src/adapters/workflow/engine/interpolator.d.ts.map +1 -0
  87. package/dist/src/adapters/workflow/engine/interpolator.js +93 -0
  88. package/dist/src/adapters/workflow/engine/interpolator.js.map +1 -0
  89. package/dist/src/adapters/workflow/engine/registry.d.ts +12 -0
  90. package/dist/src/adapters/workflow/engine/registry.d.ts.map +1 -0
  91. package/dist/src/adapters/workflow/engine/registry.js +39 -0
  92. package/dist/src/adapters/workflow/engine/registry.js.map +1 -0
  93. package/dist/src/adapters/workflow/engine/template-registry.d.ts +60 -0
  94. package/dist/src/adapters/workflow/engine/template-registry.d.ts.map +1 -0
  95. package/dist/src/adapters/workflow/engine/template-registry.js +92 -0
  96. package/dist/src/adapters/workflow/engine/template-registry.js.map +1 -0
  97. package/dist/src/adapters/workflow/engine/utils/format-utils.d.ts +43 -0
  98. package/dist/src/adapters/workflow/engine/utils/format-utils.d.ts.map +1 -0
  99. package/dist/src/adapters/workflow/engine/utils/format-utils.js +137 -0
  100. package/dist/src/adapters/workflow/engine/utils/format-utils.js.map +1 -0
  101. package/dist/src/adapters/workflow/engine/utils/layout-calculator.d.ts +7 -0
  102. package/dist/src/adapters/workflow/engine/utils/layout-calculator.d.ts.map +1 -0
  103. package/dist/src/adapters/workflow/engine/utils/layout-calculator.js +87 -0
  104. package/dist/src/adapters/workflow/engine/utils/layout-calculator.js.map +1 -0
  105. package/dist/src/adapters/workflow/engine/utils/slugify.d.ts +2 -0
  106. package/dist/src/adapters/workflow/engine/utils/slugify.d.ts.map +1 -0
  107. package/dist/src/adapters/workflow/engine/utils/slugify.js +41 -0
  108. package/dist/src/adapters/workflow/engine/utils/slugify.js.map +1 -0
  109. package/dist/src/adapters/workflow/engine/validator.d.ts +9 -0
  110. package/dist/src/adapters/workflow/engine/validator.d.ts.map +1 -0
  111. package/dist/src/adapters/workflow/engine/validator.js +425 -0
  112. package/dist/src/adapters/workflow/engine/validator.js.map +1 -0
  113. package/dist/src/api/router.d.ts +3 -0
  114. package/dist/src/api/router.d.ts.map +1 -0
  115. package/dist/src/api/router.js +27 -0
  116. package/dist/src/api/router.js.map +1 -0
  117. package/dist/src/api/routes/configs.d.ts +3 -0
  118. package/dist/src/api/routes/configs.d.ts.map +1 -0
  119. package/dist/src/api/routes/configs.js +110 -0
  120. package/dist/src/api/routes/configs.js.map +1 -0
  121. package/dist/src/api/routes/executions.d.ts +3 -0
  122. package/dist/src/api/routes/executions.d.ts.map +1 -0
  123. package/dist/src/api/routes/executions.js +77 -0
  124. package/dist/src/api/routes/executions.js.map +1 -0
  125. package/dist/src/api/routes/intents.d.ts +3 -0
  126. package/dist/src/api/routes/intents.d.ts.map +1 -0
  127. package/dist/src/api/routes/intents.js +128 -0
  128. package/dist/src/api/routes/intents.js.map +1 -0
  129. package/dist/src/api/routes/sessions.d.ts +3 -0
  130. package/dist/src/api/routes/sessions.d.ts.map +1 -0
  131. package/dist/src/api/routes/sessions.js +105 -0
  132. package/dist/src/api/routes/sessions.js.map +1 -0
  133. package/dist/src/api/routes/users.d.ts +3 -0
  134. package/dist/src/api/routes/users.d.ts.map +1 -0
  135. package/dist/src/api/routes/users.js +51 -0
  136. package/dist/src/api/routes/users.js.map +1 -0
  137. package/dist/src/api/routes/workflows.d.ts +3 -0
  138. package/dist/src/api/routes/workflows.d.ts.map +1 -0
  139. package/dist/src/api/routes/workflows.js +132 -0
  140. package/dist/src/api/routes/workflows.js.map +1 -0
  141. package/dist/{config → src/config}/ChatFlowConfig.d.ts +7 -0
  142. package/dist/src/config/ChatFlowConfig.d.ts.map +1 -0
  143. package/dist/{config → src/config}/ChatFlowConfig.js +5 -0
  144. package/dist/src/config/ChatFlowConfig.js.map +1 -0
  145. package/dist/src/config/index.d.ts.map +1 -0
  146. package/dist/src/config/index.js.map +1 -0
  147. package/dist/src/config/swagger.d.ts +2 -0
  148. package/dist/src/config/swagger.d.ts.map +1 -0
  149. package/dist/src/config/swagger.js +136 -0
  150. package/dist/src/config/swagger.js.map +1 -0
  151. package/dist/src/core/entities/ConversationSession.d.ts +58 -0
  152. package/dist/src/core/entities/ConversationSession.d.ts.map +1 -0
  153. package/dist/src/core/entities/ConversationSession.js +160 -0
  154. package/dist/src/core/entities/ConversationSession.js.map +1 -0
  155. package/dist/{core → src/core}/entities/Message.d.ts +5 -2
  156. package/dist/src/core/entities/Message.d.ts.map +1 -0
  157. package/dist/{core → src/core}/entities/Message.js +2 -0
  158. package/dist/src/core/entities/Message.js.map +1 -0
  159. package/dist/src/core/errors/ChatFlowError.d.ts.map +1 -0
  160. package/dist/src/core/errors/ChatFlowError.js.map +1 -0
  161. package/dist/src/core/errors/index.d.ts.map +1 -0
  162. package/dist/src/core/errors/index.js.map +1 -0
  163. package/dist/src/core/utils/AudioUtils.d.ts +41 -0
  164. package/dist/src/core/utils/AudioUtils.d.ts.map +1 -0
  165. package/dist/src/core/utils/AudioUtils.js +188 -0
  166. package/dist/src/core/utils/AudioUtils.js.map +1 -0
  167. package/dist/src/core/utils/LanguageDetector.d.ts +52 -0
  168. package/dist/src/core/utils/LanguageDetector.d.ts.map +1 -0
  169. package/dist/src/core/utils/LanguageDetector.js +173 -0
  170. package/dist/src/core/utils/LanguageDetector.js.map +1 -0
  171. package/dist/src/demo/cli-demo.d.ts.map +1 -0
  172. package/dist/{demo → src/demo}/cli-demo.js +10 -6
  173. package/dist/src/demo/cli-demo.js.map +1 -0
  174. package/dist/src/demo/console-chat.d.ts.map +1 -0
  175. package/dist/{demo → src/demo}/console-chat.js +10 -6
  176. package/dist/src/demo/console-chat.js.map +1 -0
  177. package/dist/{index.d.ts → src/index.d.ts} +10 -5
  178. package/dist/src/index.d.ts.map +1 -0
  179. package/dist/{index.js → src/index.js} +25 -8
  180. package/dist/src/index.js.map +1 -0
  181. package/dist/src/interfaces.d.ts +663 -0
  182. package/dist/src/interfaces.d.ts.map +1 -0
  183. package/dist/src/interfaces.js +36 -0
  184. package/dist/src/interfaces.js.map +1 -0
  185. package/dist/src/orchestrator/Orchestrator.d.ts +62 -0
  186. package/dist/src/orchestrator/Orchestrator.d.ts.map +1 -0
  187. package/dist/src/orchestrator/Orchestrator.js +697 -0
  188. package/dist/src/orchestrator/Orchestrator.js.map +1 -0
  189. package/dist/src/scripts/debug-redis.d.ts.map +1 -0
  190. package/dist/src/scripts/debug-redis.js.map +1 -0
  191. package/dist/src/scripts/seed-collaborative-intents.d.ts +2 -0
  192. package/dist/src/scripts/seed-collaborative-intents.d.ts.map +1 -0
  193. package/dist/src/scripts/seed-collaborative-intents.js +90 -0
  194. package/dist/src/scripts/seed-collaborative-intents.js.map +1 -0
  195. package/dist/src/scripts/test-isolated-config.d.ts +2 -0
  196. package/dist/src/scripts/test-isolated-config.d.ts.map +1 -0
  197. package/dist/src/scripts/test-isolated-config.js +80 -0
  198. package/dist/src/scripts/test-isolated-config.js.map +1 -0
  199. package/dist/src/scripts/verify_memory_intents.d.ts.map +1 -0
  200. package/dist/src/scripts/verify_memory_intents.js.map +1 -0
  201. package/dist/src/scripts/verify_redis_intents.d.ts.map +1 -0
  202. package/dist/{scripts → src/scripts}/verify_redis_intents.js +4 -2
  203. package/dist/src/scripts/verify_redis_intents.js.map +1 -0
  204. package/dist/src/server/ChatFlowWebSocketServer.d.ts +42 -0
  205. package/dist/src/server/ChatFlowWebSocketServer.d.ts.map +1 -0
  206. package/dist/src/server/ChatFlowWebSocketServer.js +355 -0
  207. package/dist/src/server/ChatFlowWebSocketServer.js.map +1 -0
  208. package/dist/src/utils/crypto.d.ts +7 -0
  209. package/dist/src/utils/crypto.d.ts.map +1 -0
  210. package/dist/src/utils/crypto.js +35 -0
  211. package/dist/src/utils/crypto.js.map +1 -0
  212. package/dist/src/utils/encryption-helpers.d.ts +14 -0
  213. package/dist/src/utils/encryption-helpers.d.ts.map +1 -0
  214. package/dist/src/utils/encryption-helpers.js +49 -0
  215. package/dist/src/utils/encryption-helpers.js.map +1 -0
  216. package/dist/web/seed-demo-data.d.ts +2 -0
  217. package/dist/web/seed-demo-data.d.ts.map +1 -0
  218. package/dist/web/seed-demo-data.js +267 -0
  219. package/dist/web/seed-demo-data.js.map +1 -0
  220. package/dist/web/web-server.d.ts +2 -0
  221. package/dist/web/web-server.d.ts.map +1 -0
  222. package/dist/web/web-server.js +165 -0
  223. package/dist/web/web-server.js.map +1 -0
  224. package/package.json +32 -3
  225. package/dist/adapters/db/InMemorySessionRepository.js +0 -15
  226. package/dist/adapters/db/RedisSessionRepository.js +0 -41
  227. package/dist/adapters/intent/IntentMatcher.d.ts.map +0 -1
  228. package/dist/adapters/intent/IntentMatcher.js +0 -89
  229. package/dist/adapters/intent/IntentMatcher.js.map +0 -1
  230. package/dist/adapters/intent/IntentService.d.ts.map +0 -1
  231. package/dist/adapters/intent/IntentService.js.map +0 -1
  232. package/dist/adapters/intent/MockIntentAdapter.js +0 -29
  233. package/dist/adapters/llm/GeminiLLMAdapter.d.ts.map +0 -1
  234. package/dist/adapters/llm/GeminiLLMAdapter.js.map +0 -1
  235. package/dist/adapters/llm/MockLLMAdapter.d.ts.map +0 -1
  236. package/dist/adapters/llm/MockLLMAdapter.js.map +0 -1
  237. package/dist/adapters/memory/InMemorySessionRepository.js +0 -15
  238. package/dist/adapters/redis/RedisSessionRepository.js +0 -41
  239. package/dist/adapters/repository/InMemoryRepository.d.ts +0 -15
  240. package/dist/adapters/repository/InMemoryRepository.d.ts.map +0 -1
  241. package/dist/adapters/repository/InMemoryRepository.js +0 -41
  242. package/dist/adapters/repository/InMemoryRepository.js.map +0 -1
  243. package/dist/adapters/repository/IntentRepository.d.ts +0 -15
  244. package/dist/adapters/repository/IntentRepository.d.ts.map +0 -1
  245. package/dist/adapters/repository/IntentRepository.js +0 -28
  246. package/dist/adapters/repository/IntentRepository.js.map +0 -1
  247. package/dist/adapters/repository/RedisRepository.d.ts +0 -16
  248. package/dist/adapters/repository/RedisRepository.d.ts.map +0 -1
  249. package/dist/adapters/repository/RedisRepository.js +0 -87
  250. package/dist/adapters/repository/RedisRepository.js.map +0 -1
  251. package/dist/adapters/workflow/MockWorkflowAdapter.d.ts.map +0 -1
  252. package/dist/adapters/workflow/MockWorkflowAdapter.js +0 -162
  253. package/dist/adapters/workflow/MockWorkflowAdapter.js.map +0 -1
  254. package/dist/application/ConversationSession.d.ts +0 -23
  255. package/dist/application/ConversationSession.d.ts.map +0 -1
  256. package/dist/application/ConversationSession.js +0 -83
  257. package/dist/application/ConversationSession.js.map +0 -1
  258. package/dist/application/Message.d.ts +0 -11
  259. package/dist/application/Message.d.ts.map +0 -1
  260. package/dist/application/Message.js +0 -30
  261. package/dist/application/Message.js.map +0 -1
  262. package/dist/application/Orchestrator.d.ts +0 -18
  263. package/dist/application/Orchestrator.d.ts.map +0 -1
  264. package/dist/application/Orchestrator.js +0 -80
  265. package/dist/application/Orchestrator.js.map +0 -1
  266. package/dist/application/SessionState.js +0 -2
  267. package/dist/application/usecases/CreateSession.js +0 -20
  268. package/dist/application/usecases/HandleUserMessage.js +0 -69
  269. package/dist/config/ChatFlowConfig.d.ts.map +0 -1
  270. package/dist/config/ChatFlowConfig.js.map +0 -1
  271. package/dist/config/index.d.ts.map +0 -1
  272. package/dist/config/index.js.map +0 -1
  273. package/dist/core/entities/ConversationSession.d.ts +0 -23
  274. package/dist/core/entities/ConversationSession.d.ts.map +0 -1
  275. package/dist/core/entities/ConversationSession.js +0 -83
  276. package/dist/core/entities/ConversationSession.js.map +0 -1
  277. package/dist/core/entities/Message.d.ts.map +0 -1
  278. package/dist/core/entities/Message.js.map +0 -1
  279. package/dist/core/errors/ChatFlowError.d.ts.map +0 -1
  280. package/dist/core/errors/ChatFlowError.js.map +0 -1
  281. package/dist/core/errors/index.d.ts.map +0 -1
  282. package/dist/core/errors/index.js.map +0 -1
  283. package/dist/db/InMemoryRepository.d.ts +0 -15
  284. package/dist/db/InMemoryRepository.d.ts.map +0 -1
  285. package/dist/db/InMemoryRepository.js +0 -41
  286. package/dist/db/InMemoryRepository.js.map +0 -1
  287. package/dist/db/RedisRepository.d.ts +0 -16
  288. package/dist/db/RedisRepository.d.ts.map +0 -1
  289. package/dist/db/RedisRepository.js +0 -87
  290. package/dist/db/RedisRepository.js.map +0 -1
  291. package/dist/demo/cli-demo.d.ts.map +0 -1
  292. package/dist/demo/cli-demo.js.map +0 -1
  293. package/dist/demo/console-chat.d.ts.map +0 -1
  294. package/dist/demo/console-chat.js.map +0 -1
  295. package/dist/domain/conversation/ConversationSession.js +0 -82
  296. package/dist/domain/conversation/Message.js +0 -33
  297. package/dist/domain/conversation/SessionState.js +0 -10
  298. package/dist/index.d.ts.map +0 -1
  299. package/dist/index.js.map +0 -1
  300. package/dist/intent/IntentService.d.ts +0 -17
  301. package/dist/intent/IntentService.d.ts.map +0 -1
  302. package/dist/intent/IntentService.js +0 -51
  303. package/dist/intent/IntentService.js.map +0 -1
  304. package/dist/intent/MockIntentService.d.ts +0 -6
  305. package/dist/intent/MockIntentService.d.ts.map +0 -1
  306. package/dist/intent/MockIntentService.js.map +0 -1
  307. package/dist/interfaces.d.ts +0 -108
  308. package/dist/interfaces.d.ts.map +0 -1
  309. package/dist/interfaces.js +0 -18
  310. package/dist/interfaces.js.map +0 -1
  311. package/dist/llm/GeminiLLMAdapter.d.ts +0 -10
  312. package/dist/llm/GeminiLLMAdapter.d.ts.map +0 -1
  313. package/dist/llm/GeminiLLMAdapter.js +0 -102
  314. package/dist/llm/GeminiLLMAdapter.js.map +0 -1
  315. package/dist/llm/MockLLMAdapter.d.ts +0 -5
  316. package/dist/llm/MockLLMAdapter.d.ts.map +0 -1
  317. package/dist/llm/MockLLMAdapter.js +0 -31
  318. package/dist/llm/MockLLMAdapter.js.map +0 -1
  319. package/dist/orchestrator/Orchestrator.d.ts +0 -18
  320. package/dist/orchestrator/Orchestrator.d.ts.map +0 -1
  321. package/dist/orchestrator/Orchestrator.js +0 -80
  322. package/dist/orchestrator/Orchestrator.js.map +0 -1
  323. package/dist/ports/IIntentRepository.d.ts +0 -27
  324. package/dist/ports/IIntentRepository.d.ts.map +0 -1
  325. package/dist/ports/IIntentRepository.js +0 -3
  326. package/dist/ports/IIntentRepository.js.map +0 -1
  327. package/dist/ports/IntentPort.js +0 -2
  328. package/dist/ports/LLMPort.js +0 -2
  329. package/dist/ports/SessionRepository.js +0 -2
  330. package/dist/ports/WorkflowPort.js +0 -2
  331. package/dist/scripts/debug-redis.d.ts.map +0 -1
  332. package/dist/scripts/debug-redis.js.map +0 -1
  333. package/dist/scripts/verify_memory_intents.d.ts.map +0 -1
  334. package/dist/scripts/verify_memory_intents.js.map +0 -1
  335. package/dist/scripts/verify_redis_intents.d.ts.map +0 -1
  336. package/dist/scripts/verify_redis_intents.js.map +0 -1
  337. package/dist/verify_memory_intents.js +0 -44
  338. package/dist/verify_redis_intents.js +0 -49
  339. package/dist/workflow/MockWorkflowAdapter.d.ts +0 -5
  340. package/dist/workflow/MockWorkflowAdapter.d.ts.map +0 -1
  341. package/dist/workflow/MockWorkflowAdapter.js.map +0 -1
  342. /package/dist/{adapters → src/adapters}/llm/GeminiLLMAdapter.d.ts +0 -0
  343. /package/dist/{adapters → src/adapters}/llm/GeminiLLMAdapter.js +0 -0
  344. /package/dist/{adapters → src/adapters}/llm/MockLLMAdapter.d.ts +0 -0
  345. /package/dist/{adapters → src/adapters}/llm/MockLLMAdapter.js +0 -0
  346. /package/dist/{adapters → src/adapters}/workflow/MockWorkflowAdapter.d.ts +0 -0
  347. /package/dist/{config → src/config}/index.d.ts +0 -0
  348. /package/dist/{config → src/config}/index.js +0 -0
  349. /package/dist/{core → src/core}/errors/ChatFlowError.d.ts +0 -0
  350. /package/dist/{core → src/core}/errors/ChatFlowError.js +0 -0
  351. /package/dist/{core → src/core}/errors/index.d.ts +0 -0
  352. /package/dist/{core → src/core}/errors/index.js +0 -0
  353. /package/dist/{demo → src/demo}/cli-demo.d.ts +0 -0
  354. /package/dist/{demo → src/demo}/console-chat.d.ts +0 -0
  355. /package/dist/{scripts → src/scripts}/debug-redis.d.ts +0 -0
  356. /package/dist/{scripts → src/scripts}/debug-redis.js +0 -0
  357. /package/dist/{scripts → src/scripts}/verify_memory_intents.d.ts +0 -0
  358. /package/dist/{scripts → src/scripts}/verify_memory_intents.js +0 -0
  359. /package/dist/{scripts → src/scripts}/verify_redis_intents.d.ts +0 -0
@@ -0,0 +1,700 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RedisRepository = void 0;
7
+ const ioredis_1 = __importDefault(require("ioredis"));
8
+ const ConversationSession_1 = require("../../core/entities/ConversationSession");
9
+ class RedisRepository {
10
+ constructor(configOrUrl = {}) {
11
+ this.SESSION_TTL = 3600; // 1 Hour for active sessions
12
+ let config;
13
+ if (typeof configOrUrl === 'string') {
14
+ config = { connection: configOrUrl };
15
+ }
16
+ else {
17
+ config = configOrUrl;
18
+ }
19
+ this.GLOBAL_PREFIX = config.keyPrefix || 'chatflow';
20
+ this.EXECUTION_TTL_SECONDS = config.defaultTtl || 604800; // 7 days (7 * 24 * 3600)
21
+ if (config.connection instanceof ioredis_1.default || config.connection?.constructor?.name === 'Cluster') {
22
+ this.client = config.connection;
23
+ }
24
+ else if (config.clusterNodes && config.clusterNodes.length > 0) {
25
+ // Cluster mode
26
+ this.client = new ioredis_1.default.Cluster(config.clusterNodes, {
27
+ ...config.clusterOptions,
28
+ redisOptions: config.redisOptions
29
+ });
30
+ }
31
+ else {
32
+ // Standalone mode
33
+ const connectionString = typeof config.connection === 'string'
34
+ ? config.connection
35
+ : process.env.REDIS_URL || 'redis://localhost:6379';
36
+ // Fix: Ensure explicitly strict argument types for ioredis constructor to avoid overload confusion
37
+ if (config.redisOptions) {
38
+ this.client = new ioredis_1.default(connectionString, config.redisOptions);
39
+ }
40
+ else {
41
+ this.client = new ioredis_1.default(connectionString);
42
+ }
43
+ }
44
+ this.client.on('error', (err) => {
45
+ console.error('[Redis Error]', err);
46
+ });
47
+ this.client.on('connect', () => {
48
+ console.log('[Redis] Connected');
49
+ });
50
+ }
51
+ /**
52
+ * Generates a user-scoped key with Hash Tags for Cluster support.
53
+ * Pattern: {prefix}:{userId}:{entityType}:{id}
54
+ * Hash Tag: {userId} -> Ensures all keys for a user map to the same slot.
55
+ */
56
+ getKey(userId, entityType, id) {
57
+ // Handle global keys (no userId) -> Use a fixed hash tag or global namespace
58
+ if (!userId || userId === 'global') {
59
+ // Global data (e.g. platform metadata)
60
+ return id ? `${this.GLOBAL_PREFIX}:{global}:${entityType}:${id}` : `${this.GLOBAL_PREFIX}:{global}:${entityType}`;
61
+ }
62
+ return id
63
+ ? `${this.GLOBAL_PREFIX}:{${userId}}:${entityType}:${id}`
64
+ : `${this.GLOBAL_PREFIX}:{${userId}}:${entityType}`;
65
+ }
66
+ /**
67
+ * Helper to add item to set with expiry (refreshes whole set expiry)
68
+ */
69
+ async addToSetWithTtl(key, member, ttl) {
70
+ const pipeline = this.client.pipeline();
71
+ pipeline.sadd(key, member);
72
+ pipeline.expire(key, ttl);
73
+ await pipeline.exec();
74
+ }
75
+ // ============================================================================
76
+ // Session Management
77
+ // ============================================================================
78
+ async saveSession(session) {
79
+ const userId = session.userId || 'global';
80
+ const key = this.getKey(userId, 'session', session.sessionId);
81
+ const data = JSON.stringify(session.toSnapshot());
82
+ const lookupKey = `${this.GLOBAL_PREFIX}:lookup:session:${session.sessionId}`;
83
+ if (session.status === 'COMPLETED' || session.status === 'FAILED') {
84
+ // Completed sessions: use configured retention TTL (e.g. 7 days)
85
+ await this.client.set(key, data, 'EX', this.EXECUTION_TTL_SECONDS);
86
+ // Persistent lookup for completed sessions
87
+ await this.client.set(lookupKey, userId, 'EX', this.EXECUTION_TTL_SECONDS);
88
+ }
89
+ else {
90
+ // Active sessions: short TTL (1 hour) to auto-clean abandoned sessions
91
+ await this.client.set(key, data, 'EX', this.SESSION_TTL);
92
+ await this.client.set(lookupKey, userId, 'EX', this.SESSION_TTL);
93
+ }
94
+ // Index session for listing (Set for now)
95
+ await this.client.sadd(this.getKey(userId, 'sessions'), session.sessionId);
96
+ }
97
+ async findSessionById(sessionId) {
98
+ // 1. Try Lookup to find User ID
99
+ const lookupKey = `${this.GLOBAL_PREFIX}:lookup:session:${sessionId}`;
100
+ const userId = await this.client.get(lookupKey);
101
+ let key;
102
+ if (userId) {
103
+ key = this.getKey(userId, 'session', sessionId);
104
+ }
105
+ else {
106
+ // Fallback for legacy keys (before this migration)
107
+ const legacyKey = `session:${sessionId}`;
108
+ const legacyData = await this.client.get(legacyKey);
109
+ if (legacyData)
110
+ return this.parseSession(legacyData, sessionId);
111
+ return null;
112
+ }
113
+ const data = await this.client.get(key);
114
+ if (!data)
115
+ return null;
116
+ return this.parseSession(data, sessionId);
117
+ }
118
+ parseSession(data, sessionId) {
119
+ try {
120
+ const parsed = JSON.parse(data);
121
+ return ConversationSession_1.ConversationSession.reconstitute(parsed);
122
+ }
123
+ catch (err) {
124
+ console.error(`Failed to reconstitute session ${sessionId}`, err);
125
+ return null;
126
+ }
127
+ }
128
+ // ============================================================================
129
+ // User & Config Management
130
+ // ============================================================================
131
+ async findUserById(id) {
132
+ const key = this.getKey('admin', 'user', id);
133
+ const data = await this.client.call('JSON.GET', key);
134
+ if (!data)
135
+ return null;
136
+ return typeof data === 'string' ? JSON.parse(data) : data;
137
+ }
138
+ async saveConversationConfig(config) {
139
+ const key = this.getKey(config.userId, 'config', config.id);
140
+ await this.client.call('JSON.SET', key, '$', JSON.stringify(config));
141
+ // Add to user's config list
142
+ const indexKey = this.getKey(config.userId, 'configs');
143
+ await this.client.sadd(indexKey, config.id);
144
+ }
145
+ async findConversationConfig(userId, configId) {
146
+ let key;
147
+ if (configId) {
148
+ key = this.getKey(userId, 'config', configId);
149
+ }
150
+ else {
151
+ // Find first available config via index
152
+ const indexKey = this.getKey(userId, 'configs');
153
+ const ids = await this.client.smembers(indexKey);
154
+ if (ids.length === 0)
155
+ return null;
156
+ key = this.getKey(userId, 'config', ids[0]);
157
+ }
158
+ const data = await this.client.call('JSON.GET', key);
159
+ if (!data)
160
+ return null;
161
+ return typeof data === 'string' ? JSON.parse(data) : data;
162
+ }
163
+ async getAllConversationConfigs(userId) {
164
+ const indexKey = this.getKey(userId, 'configs');
165
+ const ids = await this.client.smembers(indexKey);
166
+ if (ids.length === 0)
167
+ return [];
168
+ const pipeline = this.client.pipeline();
169
+ for (const id of ids) {
170
+ const key = this.getKey(userId, 'config', id);
171
+ pipeline.call('JSON.GET', key);
172
+ }
173
+ const results = await pipeline.exec();
174
+ const configs = [];
175
+ if (results) {
176
+ for (const [err, data] of results) {
177
+ if (!err && data) {
178
+ const config = typeof data === 'string' ? JSON.parse(data) : data;
179
+ configs.push(config);
180
+ }
181
+ }
182
+ }
183
+ return configs;
184
+ }
185
+ // ============================================================================
186
+ // Intent Management
187
+ // ============================================================================
188
+ async saveIntent(intent) {
189
+ const userId = intent.userId || 'global';
190
+ const key = this.getKey(userId, 'intent', intent.name);
191
+ await this.client.call('JSON.SET', key, '$', JSON.stringify(intent));
192
+ const indexKey = this.getKey(userId, 'intents');
193
+ await this.client.sadd(indexKey, intent.name);
194
+ }
195
+ async upsertIntents(intents) {
196
+ const pipeline = this.client.pipeline();
197
+ for (const intent of intents) {
198
+ const userId = intent.userId || 'global';
199
+ const key = this.getKey(userId, 'intent', intent.name);
200
+ const indexKey = this.getKey(userId, 'intents');
201
+ pipeline.call('JSON.SET', key, '$', JSON.stringify(intent));
202
+ pipeline.sadd(indexKey, intent.name);
203
+ }
204
+ await pipeline.exec();
205
+ }
206
+ async findIntentByName(name, userId) {
207
+ // 1. Try User Specific
208
+ if (userId) {
209
+ const userKey = this.getKey(userId, 'intent', name);
210
+ const userData = await this.client.call('JSON.GET', userKey);
211
+ if (userData) {
212
+ return typeof userData === 'string' ? JSON.parse(userData) : userData;
213
+ }
214
+ }
215
+ // 2. Fallback to Global
216
+ const globalKey = this.getKey('global', 'intent', name);
217
+ const globalData = await this.client.call('JSON.GET', globalKey);
218
+ if (!globalData) {
219
+ // Legacy global fallback
220
+ const legacyKey = `intent:${name}`;
221
+ const legacyData = await this.client.call('JSON.GET', legacyKey);
222
+ if (legacyData)
223
+ return typeof legacyData === 'string' ? JSON.parse(legacyData) : legacyData;
224
+ return null;
225
+ }
226
+ return typeof globalData === 'string' ? JSON.parse(globalData) : globalData;
227
+ }
228
+ async deleteIntent(name, userId) {
229
+ const tid = userId || 'global';
230
+ const key = this.getKey(tid, 'intent', name);
231
+ const indexKey = this.getKey(tid, 'intents');
232
+ await this.client.del(key);
233
+ await this.client.srem(indexKey, name);
234
+ }
235
+ async getAllIntents(userId) {
236
+ const pipeline = this.client.pipeline();
237
+ // 1. Get User Intents
238
+ if (userId) {
239
+ const indexKey = this.getKey(userId, 'intents');
240
+ const names = await this.client.smembers(indexKey);
241
+ names.forEach(name => {
242
+ pipeline.call('JSON.GET', this.getKey(userId, 'intent', name));
243
+ });
244
+ }
245
+ // 2. Get Global Intents
246
+ const globalIndexKey = this.getKey('global', 'intents');
247
+ const globalNames = await this.client.smembers(globalIndexKey);
248
+ globalNames.forEach(name => {
249
+ pipeline.call('JSON.GET', this.getKey('global', 'intent', name));
250
+ });
251
+ const results = await pipeline.exec();
252
+ if (!results)
253
+ return [];
254
+ return results
255
+ .map(([err, res]) => {
256
+ if (err || !res)
257
+ return null;
258
+ return typeof res === 'string' ? JSON.parse(res) : res;
259
+ })
260
+ .filter((i) => i !== null);
261
+ }
262
+ // ============================================================================
263
+ // Workflow Persistence Methods
264
+ // ============================================================================
265
+ async saveWorkflow(workflow) {
266
+ const tid = workflow.userId || 'global';
267
+ // Generate ID if missing (or use existing)
268
+ const id = workflow.id && workflow.id.length > 0 ? workflow.id : `wf_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
269
+ const workflowWithId = { ...workflow, id };
270
+ const key = this.getKey(tid, 'workflow', id);
271
+ await this.client.call('JSON.SET', key, '$', JSON.stringify(workflowWithId));
272
+ // Index by Event Type
273
+ const eventKey = this.getKey(tid, 'workflow:events', workflow.event_type);
274
+ await this.client.sadd(eventKey, id);
275
+ // Index for GetAll
276
+ const indexKey = this.getKey(tid, 'workflows');
277
+ await this.client.sadd(indexKey, id);
278
+ // Index Active Workflows
279
+ const activeKey = this.getKey(tid, 'workflow:active');
280
+ if (workflow.is_active) {
281
+ await this.client.sadd(activeKey, id);
282
+ }
283
+ else {
284
+ await this.client.srem(activeKey, id);
285
+ }
286
+ // Schedule if applicable
287
+ if (workflow.workflow_cron_configs) {
288
+ const schedulerKey = `${this.GLOBAL_PREFIX}:{scheduler}:workflows`;
289
+ const cronConfig = Array.isArray(workflow.workflow_cron_configs)
290
+ ? workflow.workflow_cron_configs[0]
291
+ : workflow.workflow_cron_configs;
292
+ if (cronConfig && cronConfig.next_run_at) {
293
+ const nextRun = new Date(cronConfig.next_run_at).getTime();
294
+ // Store as userId:workflowId
295
+ await this.client.zadd(schedulerKey, nextRun, `${tid}:${id}`);
296
+ }
297
+ }
298
+ else {
299
+ // Remove from scheduler if no cron config
300
+ await this.client.zrem(`${this.GLOBAL_PREFIX}:{scheduler}:workflows`, `${tid}:${id}`);
301
+ }
302
+ return id;
303
+ }
304
+ async findWorkflowById(id, userId) {
305
+ const key = this.getKey(userId || 'global', 'workflow', id);
306
+ const data = await this.client.call('JSON.GET', key);
307
+ if (!data)
308
+ return null;
309
+ return typeof data === 'string' ? JSON.parse(data) : data;
310
+ }
311
+ async getActiveWorkflowsForEvent(userId, eventType) {
312
+ const eventKey = this.getKey(userId, 'workflow:events', eventType);
313
+ const workflowIds = await this.client.smembers(eventKey);
314
+ if (workflowIds.length === 0)
315
+ return [];
316
+ const pipeline = this.client.pipeline();
317
+ for (const id of workflowIds) {
318
+ const key = this.getKey(userId, 'workflow', id);
319
+ pipeline.call('JSON.GET', key);
320
+ }
321
+ const results = await pipeline.exec();
322
+ if (!results)
323
+ return [];
324
+ return results
325
+ .map(([err, res]) => {
326
+ if (err || !res)
327
+ return null;
328
+ const workflow = typeof res === 'string' ? JSON.parse(res) : res;
329
+ return workflow.is_active ? workflow : null;
330
+ })
331
+ .filter((w) => w !== null);
332
+ }
333
+ async getAllWorkflows(userId) {
334
+ const tid = userId || 'global';
335
+ const indexKey = this.getKey(tid, 'workflows');
336
+ const workflowIds = await this.client.smembers(indexKey);
337
+ if (workflowIds.length === 0)
338
+ return [];
339
+ const pipeline = this.client.pipeline();
340
+ for (const id of workflowIds) {
341
+ const key = this.getKey(tid, 'workflow', id);
342
+ pipeline.call('JSON.GET', key);
343
+ }
344
+ const results = await pipeline.exec();
345
+ if (!results)
346
+ return [];
347
+ return results
348
+ .map(([err, res]) => {
349
+ if (err || !res)
350
+ return null;
351
+ return typeof res === 'string' ? JSON.parse(res) : res;
352
+ })
353
+ .filter((w) => w !== null);
354
+ }
355
+ async deleteWorkflow(id, userId) {
356
+ const tid = userId || 'global';
357
+ const key = this.getKey(tid, 'workflow', id);
358
+ const data = await this.client.call('JSON.GET', key);
359
+ if (data) {
360
+ const workflow = typeof data === 'string' ? JSON.parse(data) : data;
361
+ const eventKey = this.getKey(tid, 'workflow:events', workflow.event_type);
362
+ await this.client.srem(eventKey, id);
363
+ await this.client.srem(this.getKey(tid, 'workflow:active'), id);
364
+ await this.client.zrem(`${this.GLOBAL_PREFIX}:{scheduler}:workflows`, `${tid}:${id}`);
365
+ }
366
+ await this.client.del(key);
367
+ }
368
+ // ============================================================================
369
+ // Workflow Execution Management
370
+ // ============================================================================
371
+ async createWorkflowExecution(execution) {
372
+ const id = execution.id || `exec_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
373
+ const userId = execution.userId || 'global';
374
+ const newExecution = {
375
+ id,
376
+ userId,
377
+ workflow_id: execution.workflow_id || '',
378
+ event_type: execution.event_type || '',
379
+ event_payload: execution.event_payload || {},
380
+ status: execution.status || 'pending',
381
+ started_at: execution.started_at || new Date().toISOString(),
382
+ completed_at: execution.completed_at || null,
383
+ error_message: execution.error_message || null,
384
+ last_failed_step_id: execution.last_failed_step_id || null,
385
+ step_logs: execution.step_logs || [],
386
+ priority: execution.priority || 0
387
+ };
388
+ const key = this.getKey(userId, 'execution', id);
389
+ // SET with TTL
390
+ await this.client.call('JSON.SET', key, '$', JSON.stringify(newExecution));
391
+ await this.client.expire(key, this.EXECUTION_TTL_SECONDS);
392
+ // Save Lookup
393
+ const lookupKey = `${this.GLOBAL_PREFIX}:lookup:execution:${id}`;
394
+ await this.client.set(lookupKey, userId, 'EX', this.EXECUTION_TTL_SECONDS);
395
+ // Add to status index
396
+ if (newExecution.status === 'pending') {
397
+ await this.client.zadd(this.getKey(userId, 'execution:pending'), newExecution.priority || 0, id);
398
+ }
399
+ // Add to workflow index
400
+ const workflowIndexKey = this.getKey(userId, 'execution:workflow', newExecution.workflow_id);
401
+ const startedTime = new Date(newExecution.started_at).getTime();
402
+ await this.client.zadd(workflowIndexKey, startedTime, id);
403
+ // Add to global execution index for user (ZSET by time)
404
+ await this.client.zadd(this.getKey(userId, 'executions'), startedTime, id);
405
+ return newExecution;
406
+ }
407
+ async updateWorkflowExecution(executionId, updates) {
408
+ const existing = await this.getWorkflowExecutionById(executionId);
409
+ if (!existing)
410
+ return;
411
+ const userId = existing.userId || 'global';
412
+ const key = this.getKey(userId, 'execution', executionId);
413
+ const oldStatus = existing.status;
414
+ Object.assign(existing, updates);
415
+ await this.client.call('JSON.SET', key, '$', JSON.stringify(existing));
416
+ await this.client.expire(key, this.EXECUTION_TTL_SECONDS);
417
+ // Update status indexes
418
+ if (updates.status && updates.status !== oldStatus) {
419
+ const pendingKey = this.getKey(userId, 'execution:pending');
420
+ if (oldStatus === 'pending') {
421
+ await this.client.zrem(pendingKey, executionId);
422
+ }
423
+ if (updates.status === 'pending') {
424
+ await this.client.zadd(pendingKey, existing.priority || 0, executionId);
425
+ }
426
+ }
427
+ }
428
+ async getWorkflowExecutionById(executionId) {
429
+ // 1. Try Lookup
430
+ const lookupKey = `${this.GLOBAL_PREFIX}:lookup:execution:${executionId}`;
431
+ const userId = await this.client.get(lookupKey);
432
+ let key;
433
+ if (userId) {
434
+ key = this.getKey(userId, 'execution', executionId);
435
+ }
436
+ else {
437
+ // Try legacy
438
+ const legacyKey = `execution:${executionId}`;
439
+ const data = await this.client.call('JSON.GET', legacyKey);
440
+ if (data)
441
+ return typeof data === 'string' ? JSON.parse(data) : data;
442
+ // Try assuming global (pre-migration with global prefix?)
443
+ key = this.getKey('global', 'execution', executionId);
444
+ }
445
+ // 2. Fetch
446
+ const data = await this.client.call('JSON.GET', key);
447
+ if (!data)
448
+ return null;
449
+ return typeof data === 'string' ? JSON.parse(data) : data;
450
+ }
451
+ async getWorkflowExecutionWithLogs(executionId) {
452
+ const execution = await this.getWorkflowExecutionById(executionId);
453
+ if (!execution) {
454
+ throw new Error(`Execution ${executionId} not found`);
455
+ }
456
+ const userId = execution.userId || 'global';
457
+ const logs = await this.getWorkflowExecutionLogs(executionId);
458
+ const workflow = await this.findWorkflowById(execution.workflow_id, userId);
459
+ return {
460
+ ...execution,
461
+ workflow_action_logs: logs,
462
+ workflow: workflow
463
+ };
464
+ }
465
+ async getPendingWorkflowExecutions(limit) {
466
+ // GLOBAL POLLING MOCK - ideally we poll specific queues or a global one.
467
+ // For now, let's scan a global 'pending' ZSET if we implemented one?
468
+ // We only implemented per-user 'execution:pending'.
469
+ // We should PROBABLY have a global 'system:pending' for the dispatcher.
470
+ // But for this refactor, let's just assume we check the 'global' user or this method is deprecated for multi-user.
471
+ // Or we iterate all users? (Impossible efficiently).
472
+ // Fix: We should also add to a global pending queue in createWorkflowExecution if we want a global dispatcher.
473
+ // But that breaks strict data residency if required.
474
+ // Let's assume 'global' user for now or verify if we can add a global 'queue'.
475
+ // HACK: Just check 'global' user for now since existing tests/usage likely use it.
476
+ const key = this.getKey('global', 'execution:pending');
477
+ const ids = await this.client.zrange(key, 0, limit - 1);
478
+ const results = [];
479
+ for (const id of ids) {
480
+ const exec = await this.getWorkflowExecutionById(id);
481
+ if (exec)
482
+ results.push(exec);
483
+ }
484
+ return results;
485
+ }
486
+ async getActiveWorkflowExecutionCount(workflowId) {
487
+ // Limited implementation without user context
488
+ return 0;
489
+ }
490
+ async markWorkflowExecutionFailed(executionId, error) {
491
+ await this.updateWorkflowExecution(executionId, {
492
+ status: 'failed',
493
+ error_message: error,
494
+ completed_at: new Date().toISOString()
495
+ });
496
+ }
497
+ // ============================================================================
498
+ // Workflow Action Logging
499
+ // ============================================================================
500
+ async logWorkflowAction(logEntry) {
501
+ const id = logEntry.id || `log_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
502
+ const userId = logEntry.userId || 'global';
503
+ const newLog = {
504
+ id,
505
+ workflow_id: logEntry.workflow_id || null,
506
+ userId,
507
+ execution_id: logEntry.execution_id || '',
508
+ step_id: logEntry.step_id || null,
509
+ action_type: logEntry.action_type || '',
510
+ input: logEntry.input || null,
511
+ output: logEntry.output || null,
512
+ status: logEntry.status || 'pending',
513
+ error_message: logEntry.error_message || null,
514
+ started_at: logEntry.started_at || new Date().toISOString(),
515
+ completed_at: logEntry.completed_at || null
516
+ };
517
+ const key = this.getKey(userId, 'log', id);
518
+ await this.client.call('JSON.SET', key, '$', JSON.stringify(newLog));
519
+ await this.client.expire(key, this.EXECUTION_TTL_SECONDS);
520
+ // Index by execution
521
+ const indexKey = this.getKey(userId, 'logs:execution', newLog.execution_id);
522
+ await this.client.rpush(indexKey, id);
523
+ await this.client.expire(indexKey, this.EXECUTION_TTL_SECONDS);
524
+ return newLog;
525
+ }
526
+ async getWorkflowExecutionLogs(executionId) {
527
+ const execution = await this.getWorkflowExecutionById(executionId);
528
+ if (!execution)
529
+ return [];
530
+ const userId = execution.userId || 'global';
531
+ const indexKey = this.getKey(userId, 'logs:execution', executionId);
532
+ const logIds = await this.client.lrange(indexKey, 0, -1);
533
+ if (logIds.length === 0)
534
+ return [];
535
+ const pipeline = this.client.pipeline();
536
+ for (const logId of logIds) {
537
+ pipeline.call('JSON.GET', this.getKey(userId, 'log', logId));
538
+ }
539
+ const results = await pipeline.exec();
540
+ if (!results)
541
+ return [];
542
+ return results
543
+ .map(([err, res]) => {
544
+ if (err || !res)
545
+ return null;
546
+ return typeof res === 'string' ? JSON.parse(res) : res;
547
+ })
548
+ .filter((log) => log !== null);
549
+ }
550
+ // ============================================================================
551
+ // Webhook Event Storage
552
+ // ============================================================================
553
+ async storeWebhookEvent(event) {
554
+ const id = await this.client.incr(`${this.GLOBAL_PREFIX}:counter:webhook`);
555
+ const userId = event.userId || 'global';
556
+ const newEvent = {
557
+ id,
558
+ created_at: event.created_at || new Date().toISOString(),
559
+ type: event.type || '',
560
+ payload: event.payload || {},
561
+ source: event.source || '',
562
+ userId,
563
+ status: event.status || 'pending',
564
+ error_message: event.error_message || null
565
+ };
566
+ const key = this.getKey(userId, 'webhook:event', id.toString());
567
+ await this.client.call('JSON.SET', key, '$', JSON.stringify(newEvent));
568
+ await this.client.expire(key, this.EXECUTION_TTL_SECONDS);
569
+ // Save Lookup
570
+ const lookupKey = `${this.GLOBAL_PREFIX}:lookup:webhook:${id}`;
571
+ await this.client.set(lookupKey, userId, 'EX', this.EXECUTION_TTL_SECONDS);
572
+ return id;
573
+ }
574
+ async getWebhookEvent(id) {
575
+ // 1. Try Lookup
576
+ const lookupKey = `${this.GLOBAL_PREFIX}:lookup:webhook:${id}`;
577
+ const userId = await this.client.get(lookupKey);
578
+ let key;
579
+ if (userId) {
580
+ key = this.getKey(userId, 'webhook:event', id.toString());
581
+ }
582
+ else {
583
+ // Fallback to legacy or global check?
584
+ // Assuming existing ones might be under intent-less keys.
585
+ // We can't recover easily without lookup for new segmented model.
586
+ return null;
587
+ }
588
+ const data = await this.client.call('JSON.GET', key);
589
+ if (!data)
590
+ return null;
591
+ return typeof data === 'string' ? JSON.parse(data) : data;
592
+ }
593
+ async updateWebhookEventStatus(id, updates) {
594
+ const event = await this.getWebhookEvent(id);
595
+ if (!event)
596
+ return;
597
+ const userId = event.userId || 'global'; // Should be there if we found it
598
+ const key = this.getKey(userId, 'webhook:event', id.toString());
599
+ Object.assign(event, updates);
600
+ await this.client.call('JSON.SET', key, '$', JSON.stringify(event));
601
+ await this.client.expire(key, this.EXECUTION_TTL_SECONDS);
602
+ }
603
+ // ============================================================================
604
+ // Workflow Scheduling (Cron)
605
+ // ============================================================================
606
+ async getDueScheduledWorkflows(now) {
607
+ const schedulerKey = `${this.GLOBAL_PREFIX}:{scheduler}:workflows`;
608
+ const nowScore = now.getTime();
609
+ const members = await this.client.zrangebyscore(schedulerKey, 0, nowScore);
610
+ if (members.length === 0)
611
+ return [];
612
+ const workflows = [];
613
+ const pipeline = this.client.pipeline();
614
+ for (const member of members) {
615
+ const [userId, workflowId] = member.split(':');
616
+ const key = this.getKey(userId, 'workflow', workflowId);
617
+ pipeline.call('JSON.GET', key);
618
+ }
619
+ const results = await pipeline.exec();
620
+ if (!results)
621
+ return [];
622
+ results.forEach(([err, res]) => {
623
+ if (!err && res) {
624
+ workflows.push(typeof res === 'string' ? JSON.parse(res) : res);
625
+ }
626
+ });
627
+ return workflows;
628
+ }
629
+ async updateWorkflowSchedule(workflowId, nextRun) {
630
+ // Without userId, this is hard.
631
+ // We will assume this method is deprecated or called ONLY after a verification logic that should pass userId
632
+ // but interface limits us.
633
+ // We can't implement this efficiently without userId in args.
634
+ return;
635
+ }
636
+ // ============================================================================
637
+ // Listing Extensions (for API)
638
+ // ============================================================================
639
+ async getAllSessions(userId, limit = 50, offset = 0) {
640
+ // Warning: simple SCAN or global set implementation
641
+ // For accurate pagination, we should have a ZSET of session IDs by createdAt.
642
+ // Assuming we start indexing now. For scanning previous ones, we might miss them unless migrated.
643
+ // Use the new index set if available: {prefix}:{userId}:sessions
644
+ const indexKey = this.getKey(userId, 'sessions');
645
+ // This is a Set (SADD), so no order. ZSET would be better for pagination.
646
+ // Let's assume we implement ZSET indexing from now on.
647
+ // Fallback: Use SCAN if index empty? SCAN is slow for pages.
648
+ // Let's rely on SADD members for now and Slice in memory (not ideal for huge datasets but works for <10k).
649
+ const allIds = await this.client.smembers(indexKey);
650
+ const total = allIds.length;
651
+ const pageIds = allIds.slice(offset, offset + limit);
652
+ if (pageIds.length === 0)
653
+ return { sessions: [], total };
654
+ const pipeline = this.client.pipeline();
655
+ for (const id of pageIds) {
656
+ pipeline.get(this.getKey(userId, 'session', id));
657
+ }
658
+ const results = await pipeline.exec();
659
+ const sessions = [];
660
+ if (results) {
661
+ results.forEach(([err, res], i) => {
662
+ if (!err && res && typeof res === 'string') {
663
+ const session = this.parseSession(res, pageIds[i]);
664
+ if (session)
665
+ sessions.push(session);
666
+ }
667
+ });
668
+ }
669
+ return { sessions, total };
670
+ }
671
+ async getAllExecutions(userId, limit = 50, offset = 0) {
672
+ // Using ZSET 'execution:pending' for pending, but we need ALL.
673
+ // We need a {prefix}:{userId}:executions ZSET indexed by started_at.
674
+ const indexKey = this.getKey(userId, 'executions'); // ZSET
675
+ const total = await this.client.zcard(indexKey);
676
+ // ZREVRANGE for newest first
677
+ const ids = await this.client.zrevrange(indexKey, offset, offset + limit - 1);
678
+ if (ids.length === 0)
679
+ return { executions: [], total };
680
+ const pipeline = this.client.pipeline();
681
+ for (const id of ids) {
682
+ pipeline.call('JSON.GET', this.getKey(userId, 'execution', id));
683
+ }
684
+ const results = await pipeline.exec();
685
+ const executions = [];
686
+ if (results) {
687
+ results.forEach(([err, res]) => {
688
+ if (!err && res) {
689
+ executions.push(typeof res === 'string' ? JSON.parse(res) : res);
690
+ }
691
+ });
692
+ }
693
+ return { executions, total };
694
+ }
695
+ async disconnect() {
696
+ await this.client.quit();
697
+ }
698
+ }
699
+ exports.RedisRepository = RedisRepository;
700
+ //# sourceMappingURL=RedisRepository.js.map