@johpaz/hive-agents 0.0.34 → 0.0.36

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 (466) hide show
  1. package/README.md +64 -39
  2. package/dist/hive.js +4539 -4586
  3. package/dist/ui/assets/AgentCreateForm-tJZv9FZC.js +1 -0
  4. package/dist/ui/assets/AgentDetailPage-Du-mRcAX.js +1 -0
  5. package/dist/ui/assets/AgentNewPage-DIFYd_Ys.js +1 -0
  6. package/dist/ui/assets/{AgentsPage-DhCjvDNa.js → AgentsPage-YvSgWRiw.js} +7 -7
  7. package/dist/ui/assets/CanvasPage-DtMwGvxf.js +33 -0
  8. package/dist/ui/assets/ChannelsPage-BdBXWHjj.js +8 -0
  9. package/dist/ui/assets/DashboardPage-ghl1ZguH.js +6 -0
  10. package/dist/ui/assets/{LoginPage-B30OrEBy.js → LoginPage-CAmSI9Vy.js} +1 -1
  11. package/dist/ui/assets/LogsPage-DAPBHkwK.js +1 -0
  12. package/dist/ui/assets/MeetingPage-WjjGOqqU.js +1 -0
  13. package/dist/ui/assets/{NotFound-HD1Yp9yK.js → NotFound-BMeQSGcG.js} +1 -1
  14. package/dist/ui/assets/ProvidersPage-Ct6HsAi1.js +1 -0
  15. package/dist/ui/assets/{RecoverPage-CLF6buGP.js → RecoverPage-DpW3l-yv.js} +1 -1
  16. package/dist/ui/assets/SettingsPage-DBJ7_E6C.js +9 -0
  17. package/dist/ui/assets/SetupPage-DKmLVUaj.js +1 -0
  18. package/dist/ui/assets/{WebChatPage-Um3VANzn.js → WebChatPage-CVRcKept.js} +2 -2
  19. package/dist/ui/assets/accordion-C5d5Rm5z.js +1 -0
  20. package/dist/ui/assets/{activity-SfJ6UDF2.js → activity-c3pNngT_.js} +1 -1
  21. package/dist/ui/assets/alert-C-NE-P3s.js +1 -0
  22. package/dist/ui/assets/{alert-dialog-M893TdvF.js → alert-dialog-C5mzbHdP.js} +1 -1
  23. package/dist/ui/assets/arrow-left-CBcbX5EZ.js +1 -0
  24. package/dist/ui/assets/badge-ChpACfWO.js +1 -0
  25. package/dist/ui/assets/{calendar-CMMeWsP-.js → calendar-B-KZ9RQO.js} +1 -1
  26. package/dist/ui/assets/{card-C7P3W6_y.js → card-CNf6BS2e.js} +1 -1
  27. package/dist/ui/assets/chevron-left-D4U-5A27.js +1 -0
  28. package/dist/ui/assets/chevron-right-CR4Skrf3.js +1 -0
  29. package/dist/ui/assets/chevron-up-BYhk0K2J.js +1 -0
  30. package/dist/ui/assets/{circle-alert-7koABcbO.js → circle-alert-CyHDwUj8.js} +1 -1
  31. package/dist/ui/assets/circle-check-Bb54Ebmu.js +1 -0
  32. package/dist/ui/assets/{cpu-mBJgRJzM.js → cpu-Cdgc_B1K.js} +1 -1
  33. package/dist/ui/assets/dialog-QnZ0ad8O.js +1 -0
  34. package/dist/ui/assets/{download-oaofq4K1.js → download-C3ifGMjJ.js} +1 -1
  35. package/dist/ui/assets/dropdown-menu-BK-CO3Od.js +1 -0
  36. package/dist/ui/assets/{es-eUrU2hyB.js → es-NQNoaWDx.js} +1 -1
  37. package/dist/ui/assets/{external-link-SkkF2Z7B.js → external-link-BvxYeTP1.js} +1 -1
  38. package/dist/ui/assets/{eye-B8lq7sWG.js → eye-DqNTU_GD.js} +1 -1
  39. package/dist/ui/assets/{file-text-0oYol8Bb.js → file-text-BT_9S9SM.js} +1 -1
  40. package/dist/ui/assets/{folder-open-DVYu2lgk.js → folder-open-BhH8y9ac.js} +1 -1
  41. package/dist/ui/assets/gauge-D_TMa4i9.js +1 -0
  42. package/dist/ui/assets/{globe-BVPd5DRa.js → globe-DeCQTCDJ.js} +1 -1
  43. package/dist/ui/assets/{hexagon-BIAFUAlQ.js → hexagon-DsGOUl-H.js} +1 -1
  44. package/dist/ui/assets/{history-BUAnaMQo.js → history-BSG-Ypqf.js} +1 -1
  45. package/dist/ui/assets/index-B2fCYtTS.css +2 -0
  46. package/dist/ui/assets/index-DMCjjdqf.js +116 -0
  47. package/dist/ui/assets/{info-DWioleen.js → info-NwLoa2Mj.js} +1 -1
  48. package/dist/ui/assets/{key-BCGwSKKc.js → key-3EP0dhkT.js} +1 -1
  49. package/dist/ui/assets/label-D2H1IR_J.js +1 -0
  50. package/dist/ui/assets/loader-circle-CZNax6kS.js +1 -0
  51. package/dist/ui/assets/{lock-D7PCO7GC.js → lock-Ei1_J-Nq.js} +1 -1
  52. package/dist/ui/assets/{pause-CI1JFH6r.js → pause-BUqah9Bi.js} +1 -1
  53. package/dist/ui/assets/play-NcZ4swwL.js +1 -0
  54. package/dist/ui/assets/plus-CX1xyhp5.js +1 -0
  55. package/dist/ui/assets/progress-BherYzY6.js +1 -0
  56. package/dist/ui/assets/{refresh-cw-BLmKlO4J.js → refresh-cw-DaYdjQFk.js} +1 -1
  57. package/dist/ui/assets/{save-M1nv6H3P.js → save-CUdYyHNy.js} +1 -1
  58. package/dist/ui/assets/scroll-area-DkeyX32e.js +1 -0
  59. package/dist/ui/assets/{send-ijRfR0gp.js → send-B0H5SEIE.js} +1 -1
  60. package/dist/ui/assets/{settings-BvXhlJCF.js → settings-Ds4SqD8s.js} +1 -1
  61. package/dist/ui/assets/{slider-DrDFLwXh.js → slider-CsiUDxc3.js} +1 -1
  62. package/dist/ui/assets/{sparkles-C4MACMbE.js → sparkles-yUEb-7oH.js} +1 -1
  63. package/dist/ui/assets/{square-D_-gRT1l.js → square-BD81nFtN.js} +1 -1
  64. package/dist/ui/assets/switch-BDwN8RYV.js +1 -0
  65. package/dist/ui/assets/{table-DWEJJiuF.js → table-CSc8ubon.js} +1 -1
  66. package/dist/ui/assets/terminal-DN38Q456.js +1 -0
  67. package/dist/ui/assets/{textarea-CwPvQVAG.js → textarea-CXgXWKrT.js} +1 -1
  68. package/dist/ui/assets/{trash-2-Blkv31Dz.js → trash-2-CNjMkoq6.js} +1 -1
  69. package/dist/ui/assets/{triangle-alert-BKgbd30k.js → triangle-alert-C9Y8Ub4X.js} +1 -1
  70. package/dist/ui/assets/useProviders-C6_QHsEi.js +1 -0
  71. package/dist/ui/assets/{vendor-radix-JY4ncZrD.js → vendor-radix-cw1bQaVC.js} +4 -4
  72. package/dist/ui/assets/{vendor-react-CscwQerf.js → vendor-react-D4s9E-zj.js} +1 -1
  73. package/dist/ui/assets/{volume-2-BiUgObeI.js → volume-2-CeSXNDv4.js} +1 -1
  74. package/dist/ui/assets/{zap-CpyuQJEC.js → zap-hlXjpSeA.js} +1 -1
  75. package/dist/ui/dist/assets/AgentCreateForm-tJZv9FZC.js +1 -0
  76. package/dist/ui/dist/assets/AgentDetailPage-Du-mRcAX.js +1 -0
  77. package/dist/ui/dist/assets/AgentNewPage-DIFYd_Ys.js +1 -0
  78. package/dist/ui/dist/assets/AgentsPage-YvSgWRiw.js +10 -0
  79. package/dist/ui/dist/assets/CanvasPage-DtMwGvxf.js +33 -0
  80. package/dist/ui/dist/assets/ChannelsPage-BdBXWHjj.js +8 -0
  81. package/dist/ui/dist/assets/DashboardPage-ghl1ZguH.js +6 -0
  82. package/dist/ui/dist/assets/LoginPage-CAmSI9Vy.js +1 -0
  83. package/dist/ui/dist/assets/LogsPage-DAPBHkwK.js +1 -0
  84. package/dist/ui/dist/assets/MeetingPage-WjjGOqqU.js +1 -0
  85. package/dist/ui/dist/assets/NotFound-BMeQSGcG.js +1 -0
  86. package/dist/ui/dist/assets/ProvidersPage-Ct6HsAi1.js +1 -0
  87. package/dist/ui/dist/assets/RecoverPage-DpW3l-yv.js +1 -0
  88. package/dist/ui/dist/assets/SettingsPage-DBJ7_E6C.js +9 -0
  89. package/dist/ui/dist/assets/SetupPage-DKmLVUaj.js +1 -0
  90. package/dist/ui/dist/assets/WebChatPage-CVRcKept.js +16 -0
  91. package/dist/ui/dist/assets/accordion-C5d5Rm5z.js +1 -0
  92. package/dist/ui/dist/assets/activity-c3pNngT_.js +1 -0
  93. package/dist/ui/dist/assets/alert-C-NE-P3s.js +1 -0
  94. package/dist/ui/dist/assets/alert-dialog-C5mzbHdP.js +1 -0
  95. package/dist/ui/dist/assets/arrow-left-CBcbX5EZ.js +1 -0
  96. package/dist/ui/dist/assets/badge-ChpACfWO.js +1 -0
  97. package/dist/ui/dist/assets/calendar-B-KZ9RQO.js +1 -0
  98. package/dist/ui/dist/assets/card-CNf6BS2e.js +1 -0
  99. package/dist/ui/dist/assets/chevron-left-D4U-5A27.js +1 -0
  100. package/dist/ui/dist/assets/chevron-right-CR4Skrf3.js +1 -0
  101. package/dist/ui/dist/assets/chevron-up-BYhk0K2J.js +1 -0
  102. package/dist/ui/dist/assets/circle-alert-CyHDwUj8.js +1 -0
  103. package/dist/ui/dist/assets/circle-check-Bb54Ebmu.js +1 -0
  104. package/dist/ui/dist/assets/cpu-Cdgc_B1K.js +1 -0
  105. package/dist/ui/dist/assets/dialog-QnZ0ad8O.js +1 -0
  106. package/dist/ui/dist/assets/download-C3ifGMjJ.js +1 -0
  107. package/dist/ui/dist/assets/dropdown-menu-BK-CO3Od.js +1 -0
  108. package/dist/ui/dist/assets/es-NQNoaWDx.js +1 -0
  109. package/dist/ui/dist/assets/external-link-BvxYeTP1.js +1 -0
  110. package/dist/ui/dist/assets/eye-DqNTU_GD.js +1 -0
  111. package/dist/ui/dist/assets/file-text-BT_9S9SM.js +1 -0
  112. package/dist/ui/dist/assets/folder-open-BhH8y9ac.js +1 -0
  113. package/dist/ui/dist/assets/format-GVHeOyWI.js +1 -0
  114. package/dist/ui/dist/assets/gateway-url-COCbW0IR.js +1 -0
  115. package/dist/ui/dist/assets/gauge-D_TMa4i9.js +1 -0
  116. package/dist/ui/dist/assets/globe-DeCQTCDJ.js +1 -0
  117. package/dist/ui/dist/assets/hexagon-DsGOUl-H.js +1 -0
  118. package/dist/ui/dist/assets/history-BSG-Ypqf.js +1 -0
  119. package/dist/ui/dist/assets/index-B2fCYtTS.css +2 -0
  120. package/dist/ui/dist/assets/index-DMCjjdqf.js +116 -0
  121. package/dist/ui/dist/assets/info-NwLoa2Mj.js +1 -0
  122. package/dist/ui/dist/assets/key-3EP0dhkT.js +1 -0
  123. package/dist/ui/dist/assets/label-D2H1IR_J.js +1 -0
  124. package/dist/ui/dist/assets/loader-circle-CZNax6kS.js +1 -0
  125. package/dist/ui/dist/assets/lock-Ei1_J-Nq.js +1 -0
  126. package/dist/ui/dist/assets/pause-BUqah9Bi.js +1 -0
  127. package/dist/ui/dist/assets/play-NcZ4swwL.js +1 -0
  128. package/dist/ui/dist/assets/plus-CX1xyhp5.js +1 -0
  129. package/dist/ui/dist/assets/progress-BherYzY6.js +1 -0
  130. package/dist/ui/dist/assets/refresh-cw-DaYdjQFk.js +1 -0
  131. package/dist/ui/dist/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
  132. package/dist/ui/dist/assets/save-CUdYyHNy.js +1 -0
  133. package/dist/ui/dist/assets/scroll-area-DkeyX32e.js +1 -0
  134. package/dist/ui/dist/assets/send-B0H5SEIE.js +1 -0
  135. package/dist/ui/dist/assets/settings-Ds4SqD8s.js +1 -0
  136. package/dist/ui/dist/assets/slider-CsiUDxc3.js +14 -0
  137. package/dist/ui/dist/assets/sparkles-yUEb-7oH.js +1 -0
  138. package/dist/ui/dist/assets/square-BD81nFtN.js +1 -0
  139. package/dist/ui/dist/assets/switch-BDwN8RYV.js +1 -0
  140. package/dist/ui/dist/assets/table-CSc8ubon.js +1 -0
  141. package/dist/ui/dist/assets/terminal-DN38Q456.js +1 -0
  142. package/dist/ui/dist/assets/textarea-CXgXWKrT.js +1 -0
  143. package/dist/ui/dist/assets/trash-2-CNjMkoq6.js +1 -0
  144. package/dist/ui/dist/assets/triangle-alert-C9Y8Ub4X.js +1 -0
  145. package/dist/ui/dist/assets/useProviders-C6_QHsEi.js +1 -0
  146. package/dist/ui/dist/assets/utils-3pnRFmFe.js +1 -0
  147. package/dist/ui/dist/assets/vendor-charts-Bu2lyBKP.js +65 -0
  148. package/dist/ui/dist/assets/vendor-query-DsWPbQdG.js +1 -0
  149. package/dist/ui/dist/assets/vendor-radix-cw1bQaVC.js +63 -0
  150. package/dist/ui/dist/assets/vendor-react-D4s9E-zj.js +1 -0
  151. package/dist/ui/dist/assets/vendor-router-C9pIYwbJ.js +3 -0
  152. package/dist/ui/dist/assets/volume-2-CeSXNDv4.js +1 -0
  153. package/dist/ui/dist/assets/zap-hlXjpSeA.js +1 -0
  154. package/dist/ui/dist/favicon.ico +0 -0
  155. package/dist/ui/dist/index.html +40 -0
  156. package/dist/ui/dist/placeholder.svg +1 -0
  157. package/dist/ui/index.html +7 -11
  158. package/package.json +137 -15
  159. package/packages/cli/src/adapters/binary.ts +461 -0
  160. package/packages/cli/src/adapters/bun-global.ts +378 -0
  161. package/packages/cli/src/adapters/config.ts +314 -0
  162. package/packages/cli/src/adapters/docker.ts +308 -0
  163. package/packages/cli/src/adapters/factory.ts +168 -0
  164. package/packages/cli/src/adapters/index.ts +80 -0
  165. package/packages/cli/src/adapters/types.ts +218 -0
  166. package/packages/cli/src/commands/agent-run.ts +168 -0
  167. package/packages/cli/src/commands/agents.ts +398 -0
  168. package/packages/cli/src/commands/chat.ts +142 -0
  169. package/packages/cli/src/commands/config.ts +49 -0
  170. package/packages/cli/src/commands/cron.ts +487 -0
  171. package/packages/cli/src/commands/dev.ts +58 -0
  172. package/packages/cli/src/commands/doctor.ts +320 -0
  173. package/packages/cli/src/commands/gateway.ts +719 -0
  174. package/packages/cli/src/commands/logs.ts +57 -0
  175. package/packages/cli/src/commands/mcp.ts +175 -0
  176. package/packages/cli/src/commands/message.ts +77 -0
  177. package/packages/cli/src/commands/migrate.ts +90 -0
  178. package/packages/cli/src/commands/onboard.ts +1656 -0
  179. package/packages/cli/src/commands/security.ts +144 -0
  180. package/packages/cli/src/commands/service.ts +50 -0
  181. package/packages/cli/src/commands/sessions.ts +116 -0
  182. package/packages/cli/src/commands/skills.ts +215 -0
  183. package/packages/cli/src/commands/update.ts +203 -0
  184. package/packages/cli/src/index.ts +210 -0
  185. package/packages/cli/src/ui-bundle.generated.ts +3 -0
  186. package/packages/cli/src/utils/token.ts +6 -0
  187. package/packages/core/src/agent/agent-loop.ts +691 -0
  188. package/packages/core/src/agent/compaction.ts +240 -0
  189. package/packages/core/src/agent/context-compiler.ts +467 -0
  190. package/packages/core/src/agent/context-guard.ts +91 -0
  191. package/packages/core/src/agent/conversation-store.ts +244 -0
  192. package/packages/core/src/agent/curator.ts +158 -0
  193. package/packages/core/src/agent/hooks.ts +166 -0
  194. package/packages/core/src/agent/llm-client.ts +167 -0
  195. package/packages/core/src/agent/llm-providers/anthropic.ts +212 -0
  196. package/packages/core/src/agent/llm-providers/deepseek.ts +8 -0
  197. package/packages/core/src/agent/llm-providers/gemini.ts +215 -0
  198. package/packages/core/src/agent/llm-providers/groq.ts +5 -0
  199. package/packages/core/src/agent/llm-providers/interface.ts +195 -0
  200. package/packages/core/src/agent/llm-providers/kimi.ts +8 -0
  201. package/packages/core/src/agent/llm-providers/local-llama.ts +37 -0
  202. package/packages/core/src/agent/llm-providers/mistral.ts +5 -0
  203. package/packages/core/src/agent/llm-providers/nvidia.ts +5 -0
  204. package/packages/core/src/agent/llm-providers/ollama.ts +175 -0
  205. package/packages/core/src/agent/llm-providers/openai-compat-base.ts +379 -0
  206. package/packages/core/src/agent/llm-providers/openai.ts +5 -0
  207. package/packages/core/src/agent/llm-providers/openrouter.ts +5 -0
  208. package/packages/core/src/agent/llm-providers/qwen.ts +5 -0
  209. package/packages/core/src/agent/native-tools.ts +31 -0
  210. package/packages/core/src/agent/playbook-selector.ts +147 -0
  211. package/packages/core/src/agent/prompt-builder.ts +169 -0
  212. package/packages/core/src/agent/providers/index.ts +204 -0
  213. package/packages/core/src/agent/providers.ts +1 -0
  214. package/packages/core/src/agent/reflector.ts +200 -0
  215. package/packages/core/src/agent/service.ts +267 -0
  216. package/packages/core/src/agent/skill-selector.ts +479 -0
  217. package/packages/core/src/agent/stuck-loop.ts +133 -0
  218. package/packages/core/src/agent/tool-selector.ts +569 -0
  219. package/packages/core/src/agent/tracer.ts +100 -0
  220. package/packages/core/src/auth/auth.ts +108 -0
  221. package/packages/core/src/auth/index.ts +1 -0
  222. package/packages/core/src/canvas/a2ui-tools.ts +255 -0
  223. package/packages/core/src/canvas/canvas-manager.ts +390 -0
  224. package/packages/core/src/canvas/canvas-tools.ts +448 -0
  225. package/packages/core/src/canvas/emitter.ts +149 -0
  226. package/packages/core/src/canvas/index.ts +3 -0
  227. package/packages/core/src/channels/base.ts +154 -0
  228. package/packages/core/src/channels/discord.ts +273 -0
  229. package/packages/core/src/channels/index.ts +7 -0
  230. package/packages/core/src/channels/manager.ts +450 -0
  231. package/packages/core/src/channels/slack.ts +323 -0
  232. package/packages/core/src/channels/telegram.ts +612 -0
  233. package/packages/core/src/channels/webchat.ts +139 -0
  234. package/packages/core/src/channels/whatsapp.ts +548 -0
  235. package/packages/core/src/config/index.ts +12 -0
  236. package/packages/core/src/config/loader.ts +569 -0
  237. package/packages/core/src/events/agent-bus.ts +460 -0
  238. package/packages/core/src/events/event-bus.ts +169 -0
  239. package/packages/core/src/gateway/channel-notify.ts +64 -0
  240. package/packages/core/src/gateway/helpers/cors.ts +32 -0
  241. package/packages/core/src/gateway/helpers/index.ts +4 -0
  242. package/packages/core/src/gateway/helpers/narration.ts +57 -0
  243. package/packages/core/src/gateway/helpers/path.ts +13 -0
  244. package/packages/core/src/gateway/helpers/redact.ts +61 -0
  245. package/packages/core/src/gateway/index.ts +5 -0
  246. package/packages/core/src/gateway/initializer.ts +363 -0
  247. package/packages/core/src/gateway/lane-queue.ts +169 -0
  248. package/packages/core/src/gateway/llm-local/client.ts +94 -0
  249. package/packages/core/src/gateway/llm-local/detector.ts +321 -0
  250. package/packages/core/src/gateway/llm-local/downloader.ts +216 -0
  251. package/packages/core/src/gateway/llm-local/index.ts +34 -0
  252. package/packages/core/src/gateway/llm-local/manager.ts +186 -0
  253. package/packages/core/src/gateway/llm-local/models.ts +149 -0
  254. package/packages/core/src/gateway/llm-local/server.ts +179 -0
  255. package/packages/core/src/gateway/resolver.ts +108 -0
  256. package/packages/core/src/gateway/router.ts +124 -0
  257. package/packages/core/src/gateway/routes/agents.ts +210 -0
  258. package/packages/core/src/gateway/routes/auth.ts +244 -0
  259. package/packages/core/src/gateway/routes/channels.ts +484 -0
  260. package/packages/core/src/gateway/routes/chat.ts +241 -0
  261. package/packages/core/src/gateway/routes/config.ts +12 -0
  262. package/packages/core/src/gateway/routes/cron-api.ts +544 -0
  263. package/packages/core/src/gateway/routes/ethics.ts +46 -0
  264. package/packages/core/src/gateway/routes/llm-local.ts +271 -0
  265. package/packages/core/src/gateway/routes/mcp.ts +319 -0
  266. package/packages/core/src/gateway/routes/meeting.ts +232 -0
  267. package/packages/core/src/gateway/routes/models.ts +163 -0
  268. package/packages/core/src/gateway/routes/multimodal.ts +93 -0
  269. package/packages/core/src/gateway/routes/providers.ts +220 -0
  270. package/packages/core/src/gateway/routes/setup.ts +441 -0
  271. package/packages/core/src/gateway/routes/skills.ts +115 -0
  272. package/packages/core/src/gateway/routes/system.ts +469 -0
  273. package/packages/core/src/gateway/routes/tasks.ts +44 -0
  274. package/packages/core/src/gateway/routes/tools.ts +59 -0
  275. package/packages/core/src/gateway/routes/tts-local.ts +388 -0
  276. package/packages/core/src/gateway/routes/users.ts +122 -0
  277. package/packages/core/src/gateway/routes/voice.ts +189 -0
  278. package/packages/core/src/gateway/routes/workspace.ts +281 -0
  279. package/packages/core/src/gateway/server.ts +2744 -0
  280. package/packages/core/src/gateway/session.ts +95 -0
  281. package/packages/core/src/gateway/slash-commands.ts +207 -0
  282. package/packages/core/src/gateway/tts/README.md +94 -0
  283. package/packages/core/src/gateway/tts/package.json +25 -0
  284. package/packages/core/src/gateway/tts/src/client.ts +59 -0
  285. package/packages/core/src/gateway/tts/src/detect.ts +42 -0
  286. package/packages/core/src/gateway/tts/src/index.ts +15 -0
  287. package/packages/core/src/gateway/tts/src/install.ts +129 -0
  288. package/packages/core/src/gateway/tts/src/models.ts +50 -0
  289. package/packages/core/src/gateway/tts/src/server.ts +252 -0
  290. package/packages/core/src/gateway/tts/voices/.gitkeep +0 -0
  291. package/packages/core/src/heartbeat/index.ts +157 -0
  292. package/packages/core/src/index.ts +56 -0
  293. package/packages/core/src/mcp/hot-reload.ts +148 -0
  294. package/packages/core/src/mcp/singleton.ts +21 -0
  295. package/packages/core/src/mcp/tool-sync.ts +176 -0
  296. package/packages/core/src/multimodal/index.ts +2 -0
  297. package/packages/core/src/multimodal/types.ts +28 -0
  298. package/packages/core/src/multimodal/vision-service.ts +283 -0
  299. package/packages/core/src/plugins/api.ts +128 -0
  300. package/packages/core/src/plugins/index.ts +2 -0
  301. package/packages/core/src/plugins/loader.ts +365 -0
  302. package/packages/core/src/resilience/circuit-breaker.ts +225 -0
  303. package/packages/core/src/scheduler/CronScheduler.ts +699 -0
  304. package/packages/core/src/scheduler/dag/AgentExecutor.ts +53 -0
  305. package/packages/core/src/scheduler/dag/DAGScheduler.ts +250 -0
  306. package/packages/core/src/scheduler/dag/EventBridge.ts +122 -0
  307. package/packages/core/src/scheduler/dag/TaskGraph.ts +192 -0
  308. package/packages/core/src/scheduler/dag/TaskNode.ts +97 -0
  309. package/packages/core/src/scheduler/dag/TaskResult.ts +22 -0
  310. package/packages/core/src/scheduler/dag/errors.ts +37 -0
  311. package/packages/core/src/scheduler/dag/index.ts +26 -0
  312. package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +97 -0
  313. package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +21 -0
  314. package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +46 -0
  315. package/packages/core/src/scheduler/index.ts +22 -0
  316. package/packages/core/src/scheduler/integration.ts +237 -0
  317. package/packages/core/src/scheduler/types.ts +164 -0
  318. package/packages/core/src/security/google-chat.ts +269 -0
  319. package/packages/core/src/security/index.ts +192 -0
  320. package/packages/core/src/security/pairing.ts +250 -0
  321. package/packages/core/src/security/rate-limit.ts +270 -0
  322. package/packages/core/src/security/signal.ts +321 -0
  323. package/packages/core/src/state/store.ts +312 -0
  324. package/packages/core/src/storage/crypto.ts +197 -0
  325. package/packages/core/src/storage/migrate.ts +147 -0
  326. package/packages/core/src/storage/onboarding.ts +1506 -0
  327. package/packages/core/src/storage/schema.ts +666 -0
  328. package/packages/core/src/storage/seed.ts +628 -0
  329. package/packages/core/src/storage/sqlite.ts +407 -0
  330. package/packages/core/src/storage/usage.ts +374 -0
  331. package/packages/core/src/tool-runtime/index.ts +476 -0
  332. package/packages/core/src/tool-runtime/tool-worker.ts +125 -0
  333. package/packages/core/src/tools/agents/get-available-models.ts +118 -0
  334. package/packages/core/src/tools/agents/index.ts +610 -0
  335. package/packages/core/src/tools/canvas/index.ts +420 -0
  336. package/packages/core/src/tools/cli/index.ts +142 -0
  337. package/packages/core/src/tools/core/index.ts +478 -0
  338. package/packages/core/src/tools/cron/index.ts +635 -0
  339. package/packages/core/src/tools/filesystem/fs-delete.ts +78 -0
  340. package/packages/core/src/tools/filesystem/fs-edit.ts +106 -0
  341. package/packages/core/src/tools/filesystem/fs-exists.ts +63 -0
  342. package/packages/core/src/tools/filesystem/fs-glob.ts +108 -0
  343. package/packages/core/src/tools/filesystem/fs-list.ts +129 -0
  344. package/packages/core/src/tools/filesystem/fs-read.ts +72 -0
  345. package/packages/core/src/tools/filesystem/fs-write.ts +67 -0
  346. package/packages/core/src/tools/filesystem/index.ts +34 -0
  347. package/packages/core/src/tools/filesystem/workspace-guard.ts +62 -0
  348. package/packages/core/src/tools/index.ts +197 -0
  349. package/packages/core/src/tools/meeting/index.ts +363 -0
  350. package/packages/core/src/tools/office/index.ts +47 -0
  351. package/packages/core/src/tools/office/office-escribir-docx.ts +192 -0
  352. package/packages/core/src/tools/office/office-escribir-pdf.ts +172 -0
  353. package/packages/core/src/tools/office/office-escribir-pptx.ts +174 -0
  354. package/packages/core/src/tools/office/office-escribir-xlsx.ts +116 -0
  355. package/packages/core/src/tools/office/office-leer-docx.ts +93 -0
  356. package/packages/core/src/tools/office/office-leer-pdf.ts +114 -0
  357. package/packages/core/src/tools/office/office-leer-pptx.ts +136 -0
  358. package/packages/core/src/tools/office/office-leer-xlsx.ts +124 -0
  359. package/packages/core/src/tools/types.ts +39 -0
  360. package/packages/core/src/tools/voice/index.ts +104 -0
  361. package/packages/core/src/tools/web/browser-click.ts +78 -0
  362. package/packages/core/src/tools/web/browser-extract.ts +139 -0
  363. package/packages/core/src/tools/web/browser-navigate.ts +106 -0
  364. package/packages/core/src/tools/web/browser-screenshot.ts +87 -0
  365. package/packages/core/src/tools/web/browser-script.ts +88 -0
  366. package/packages/core/src/tools/web/browser-service.ts +554 -0
  367. package/packages/core/src/tools/web/browser-type.ts +101 -0
  368. package/packages/core/src/tools/web/browser-wait.ts +136 -0
  369. package/packages/core/src/tools/web/index.ts +41 -0
  370. package/packages/core/src/tools/web/web-fetch.ts +78 -0
  371. package/packages/core/src/tools/web/web-search.ts +123 -0
  372. package/packages/core/src/utils/benchmark.ts +80 -0
  373. package/packages/core/src/utils/crypto.ts +73 -0
  374. package/packages/core/src/utils/date.ts +42 -0
  375. package/packages/core/src/utils/index.ts +5 -0
  376. package/packages/core/src/utils/logger.ts +389 -0
  377. package/packages/core/src/utils/retry.ts +70 -0
  378. package/packages/core/src/utils/toon.ts +253 -0
  379. package/packages/core/src/voice/index.ts +643 -0
  380. package/packages/mcp/src/config.ts +13 -0
  381. package/packages/mcp/src/index.ts +1 -0
  382. package/packages/mcp/src/logger.ts +47 -0
  383. package/packages/mcp/src/manager.ts +439 -0
  384. package/packages/mcp/src/transports/index.ts +67 -0
  385. package/packages/mcp/src/transports/sse.ts +238 -0
  386. package/packages/mcp/src/transports/websocket.ts +159 -0
  387. package/packages/skills/src/bundled/agents/agent_spawner/SKILL.md +167 -0
  388. package/packages/skills/src/bundled/agents/code_delegator/SKILL.md +156 -0
  389. package/packages/skills/src/bundled/agents/memory_manager/SKILL.md +143 -0
  390. package/packages/skills/src/bundled/agents/research_and_remember/SKILL.md +139 -0
  391. package/packages/skills/src/bundled/agents/task_orchestrator/SKILL.md +198 -0
  392. package/packages/skills/src/bundled/canvas/a2ui_dashboard/SKILL.md +176 -0
  393. package/packages/skills/src/bundled/canvas/a2ui_form/SKILL.md +202 -0
  394. package/packages/skills/src/bundled/canvas/a2ui_interactive/SKILL.md +206 -0
  395. package/packages/skills/src/bundled/canvas/canvas_dashboard/SKILL.md +146 -0
  396. package/packages/skills/src/bundled/canvas/canvas_interact/SKILL.md +148 -0
  397. package/packages/skills/src/bundled/canvas/canvas_report/SKILL.md +146 -0
  398. package/packages/skills/src/bundled/cli/cli_pipeline/SKILL.md +136 -0
  399. package/packages/skills/src/bundled/cli/cli_safe_exec/SKILL.md +125 -0
  400. package/packages/skills/src/bundled/cron_manager/SKILL.md +188 -0
  401. package/packages/skills/src/bundled/cron_reminder/SKILL.md +112 -0
  402. package/packages/skills/src/bundled/filesystem/file_manager/SKILL.md +118 -0
  403. package/packages/skills/src/bundled/filesystem/file_read_and_summarize/SKILL.md +108 -0
  404. package/packages/skills/src/bundled/filesystem/file_writer/SKILL.md +135 -0
  405. package/packages/skills/src/bundled/meeting/meeting_transcription/SKILL.md +213 -0
  406. package/packages/skills/src/bundled/office/office_document_manager/SKILL.md +262 -0
  407. package/packages/skills/src/bundled/search_knowledge/busqueda_fts5/SKILL.md +74 -0
  408. package/packages/skills/src/bundled/voice/voice_assistant/SKILL.md +174 -0
  409. package/packages/skills/src/bundled/voice/voice_input/SKILL.md +146 -0
  410. package/packages/skills/src/bundled/voice/voice_output/SKILL.md +151 -0
  411. package/packages/skills/src/bundled/web/browser_automate/SKILL.md +120 -0
  412. package/packages/skills/src/bundled/web/browser_scrape/SKILL.md +109 -0
  413. package/packages/skills/src/bundled/web/web_monitor/SKILL.md +127 -0
  414. package/packages/skills/src/bundled/web/web_research/SKILL.md +119 -0
  415. package/packages/skills/src/bundled-data.generated.ts +1964 -0
  416. package/packages/skills/src/index.ts +1 -0
  417. package/packages/skills/src/loader.ts +388 -0
  418. package/dist/ui/assets/AgentCreateForm-DS6yXjGV.js +0 -1
  419. package/dist/ui/assets/AgentDetailPage-Ud552U7_.js +0 -1
  420. package/dist/ui/assets/AgentNewPage-DWWs1P7s.js +0 -1
  421. package/dist/ui/assets/BridgePage-BD93aBKM.js +0 -1
  422. package/dist/ui/assets/CanvasPage-CM35yj0Q.js +0 -33
  423. package/dist/ui/assets/ChannelsPage-CtsWtJdc.js +0 -8
  424. package/dist/ui/assets/DashboardPage-BpiwR5Jg.js +0 -6
  425. package/dist/ui/assets/LogsPage-DqUsG3MW.js +0 -1
  426. package/dist/ui/assets/MeetingPage-C5B8-IzE.js +0 -1
  427. package/dist/ui/assets/ProjectsPage-zic2sjUf.js +0 -1
  428. package/dist/ui/assets/ProvidersPage-BxyIGKzh.js +0 -1
  429. package/dist/ui/assets/SettingsPage-CNFm3nun.js +0 -9
  430. package/dist/ui/assets/SetupPage-RBcjQtv7.js +0 -1
  431. package/dist/ui/assets/accordion-BEVqJf2A.js +0 -1
  432. package/dist/ui/assets/alert-BeGcM0nb.js +0 -1
  433. package/dist/ui/assets/api-q5Ax-vD2.js +0 -63
  434. package/dist/ui/assets/arrow-left-B_jlw8X_.js +0 -1
  435. package/dist/ui/assets/badge-pNhtItyt.js +0 -1
  436. package/dist/ui/assets/chevron-down-B16UVNlu.js +0 -1
  437. package/dist/ui/assets/chevron-left-_8ly7Fz0.js +0 -1
  438. package/dist/ui/assets/chevron-right-yzZLjezG.js +0 -1
  439. package/dist/ui/assets/chevron-up-CxKDQEE5.js +0 -1
  440. package/dist/ui/assets/circle-CFKiO9Ds.js +0 -1
  441. package/dist/ui/assets/circle-check-E2u7ZS2r.js +0 -1
  442. package/dist/ui/assets/circle-minus-1-TZF2pu.js +0 -1
  443. package/dist/ui/assets/circle-x-Cm3Sr-xb.js +0 -1
  444. package/dist/ui/assets/dialog-BaJbZsQF.js +0 -1
  445. package/dist/ui/assets/dist-DB-fE0Co.js +0 -1
  446. package/dist/ui/assets/dropdown-menu-DJoOchfz.js +0 -1
  447. package/dist/ui/assets/gauge-BTpFKuAj.js +0 -1
  448. package/dist/ui/assets/index-BN0875JH.css +0 -2
  449. package/dist/ui/assets/index-D4pdc0Uw.js +0 -54
  450. package/dist/ui/assets/label-C6tqnnKd.js +0 -1
  451. package/dist/ui/assets/loader-circle-CK3qRV3f.js +0 -1
  452. package/dist/ui/assets/pencil-BF2_XX-i.js +0 -1
  453. package/dist/ui/assets/play-DidATMfT.js +0 -1
  454. package/dist/ui/assets/plus-DXm1XDhQ.js +0 -1
  455. package/dist/ui/assets/progress-B1HC9cB_.js +0 -1
  456. package/dist/ui/assets/scroll-area-DKNpYkRA.js +0 -1
  457. package/dist/ui/assets/search-Co6mulZS.js +0 -1
  458. package/dist/ui/assets/switch-7AuR7x2g.js +0 -1
  459. package/dist/ui/assets/terminal-CjZu0OZ0.js +0 -1
  460. package/dist/ui/assets/useProviders-Bxsnav4y.js +0 -1
  461. package/dist/ui/assets/useWebSocketStore-ZCW_Nt1w.js +0 -1
  462. package/dist/ui/assets/x-5cXW_1ZS.js +0 -1
  463. /package/dist/ui/assets/{format-C0EOLKvf.js → format-GVHeOyWI.js} +0 -0
  464. /package/dist/ui/assets/{gateway-url-OqLaEDK-.js → gateway-url-COCbW0IR.js} +0 -0
  465. /package/dist/ui/assets/{utils-_qMjiZaF.js → utils-3pnRFmFe.js} +0 -0
  466. /package/dist/ui/assets/{vendor-router-DhLEd920.js → vendor-router-C9pIYwbJ.js} +0 -0
@@ -0,0 +1,450 @@
1
+ import type { Config } from "../config/loader.ts";
2
+ import { logger } from "../utils/logger.ts";
3
+ import type { IChannel, IncomingMessage, MessageHandler } from "./base.ts";
4
+ import { createTelegramChannel, type TelegramConfig } from "./telegram.ts";
5
+ import { createDiscordChannel, type DiscordConfig } from "./discord.ts";
6
+ import { createWebChatChannel, type WebChatConfig } from "./webchat.ts";
7
+ import { createWhatsAppChannel, WhatsAppChannel, type WhatsAppConfig } from "./whatsapp.ts";
8
+ import { createSlackChannel, type SlackConfig } from "./slack.ts";
9
+ import { getDb } from "../storage/sqlite.ts";
10
+ import { loadChannelConfig } from "../storage/crypto.ts";
11
+
12
+ export class ChannelManager {
13
+ private config: Config;
14
+ private channels: Map<string, IChannel> = new Map();
15
+ private messageHandler?: MessageHandler;
16
+ private log = logger.child("channels");
17
+
18
+ constructor(config: Config) {
19
+ this.config = config;
20
+ }
21
+
22
+ onMessage(handler: MessageHandler): void {
23
+ this.messageHandler = handler;
24
+ }
25
+
26
+ async initialize(): Promise<void> {
27
+ // Primero, intentar cargar canales desde la BD
28
+ await this.initializeFromDB();
29
+
30
+ // Si no hay canales en la BD, usar config
31
+ if (this.channels.size === 0) {
32
+ await this.initializeFromConfig();
33
+ }
34
+
35
+ this.log.info(`Initialized ${this.channels.size} channel(s)`);
36
+ }
37
+
38
+ private async initializeFromDB(): Promise<void> {
39
+ try {
40
+ const db = getDb();
41
+ // Load all active channels - config may be empty for webchat
42
+ const rows = db.query(`
43
+ SELECT id, type, enabled, active FROM channels WHERE enabled = 1 AND active = 1
44
+ `).all() as Array<{ id: string; type: string; enabled: number; active: number }>;
45
+
46
+ for (const row of rows) {
47
+ let config: Record<string, unknown> = {};
48
+ try {
49
+ config = await loadChannelConfig(row.id);
50
+ this.log.debug(`Loaded config for ${row.type}:${row.id}:`, Object.keys(config));
51
+ } catch (error) {
52
+ this.log.warn(`Failed to load config for channel ${row.id}:`, (error as Error).message);
53
+ }
54
+
55
+ // Use channel id as accountId
56
+ const accountId = row.id;
57
+ this.log.info(`Creating channel ${row.type}:${accountId} with config keys:`, Object.keys(config));
58
+ await this.createChannel(row.type, accountId, config);
59
+ }
60
+ } catch (error) {
61
+ this.log.debug("No channels found in DB or DB not initialized:", (error as Error).message);
62
+ }
63
+ }
64
+
65
+ private async initializeFromConfig(): Promise<void> {
66
+ const channelConfigs = this.config.channels ?? {};
67
+
68
+ for (const [channelName, channelConfig] of Object.entries(channelConfigs)) {
69
+ // If enabled is explicitly false, skip
70
+ if (channelConfig.enabled === false) {
71
+ this.log.debug(`Channel ${channelName} is disabled`);
72
+ continue;
73
+ }
74
+
75
+ const accounts = channelConfig.accounts;
76
+ if (!accounts || Object.keys(accounts).length === 0) {
77
+ this.log.warn(`Channel ${channelName} has no accounts configured`);
78
+ continue;
79
+ }
80
+
81
+ for (const [accountId, accountConfig] of Object.entries(accounts)) {
82
+ const fullConfig = { ...channelConfig, ...accountConfig };
83
+ await this.createChannel(channelName, accountId, fullConfig);
84
+ }
85
+ }
86
+ }
87
+
88
+ private async createChannel(
89
+ channelName: string,
90
+ accountId: string,
91
+ config: Record<string, unknown>
92
+ ): Promise<void> {
93
+ let channel: IChannel;
94
+
95
+ try {
96
+ switch (channelName) {
97
+ case "telegram":
98
+ channel = createTelegramChannel(accountId, {
99
+ enabled: true,
100
+ botToken: config.botToken as string,
101
+ dmPolicy: (config.dmPolicy as "open" | "pairing" | "allowlist") ?? "open",
102
+ allowFrom: (config.allowFrom as string[]) ?? [],
103
+ groups: (config.groups as boolean) ?? false,
104
+ } as TelegramConfig);
105
+ break;
106
+
107
+ case "discord":
108
+ channel = createDiscordChannel(accountId, {
109
+ enabled: true,
110
+ botToken: config.botToken as string,
111
+ applicationId: config.applicationId as string,
112
+ dmPolicy: (config.dmPolicy as "open" | "pairing" | "allowlist") ?? "allowlist",
113
+ allowFrom: (config.allowFrom as string[]) ?? [],
114
+ } as DiscordConfig);
115
+ break;
116
+
117
+ case "webchat":
118
+ channel = createWebChatChannel({
119
+ enabled: true,
120
+ dmPolicy: "open",
121
+ allowFrom: [],
122
+ } as WebChatConfig);
123
+ break;
124
+
125
+ case "whatsapp": {
126
+ let coordinatorId = "main";
127
+ try {
128
+ const coordinator = getDb().query(`SELECT id FROM agents WHERE role = 'coordinator' LIMIT 1`).get() as { id: string } | null;
129
+ if (coordinator?.id) coordinatorId = coordinator.id;
130
+ } catch { /* fallback to "main" */ }
131
+ channel = createWhatsAppChannel({
132
+ enabled: true,
133
+ accountId,
134
+ agentId: (config.agentId as string) ?? coordinatorId,
135
+ dmPolicy: (config.dmPolicy as "open" | "pairing" | "allowlist") ?? "allowlist",
136
+ allowFrom: (config.allowFrom as string[]) ?? [],
137
+ acceptGroups: (config.acceptGroups as boolean) ?? false,
138
+ reconnectMaxAttempts: (config.reconnectMaxAttempts as number) ?? 10,
139
+ reconnectBaseDelayMs: (config.reconnectBaseDelayMs as number) ?? 5000,
140
+ } as WhatsAppConfig);
141
+ break;
142
+ }
143
+
144
+ case "slack":
145
+ channel = createSlackChannel({
146
+ enabled: true,
147
+ accountId,
148
+ botToken: config.botToken as string,
149
+ signingSecret: config.signingSecret as string,
150
+ port: (config.port as number) ?? 3000,
151
+ dmPolicy: (config.dmPolicy as "open" | "pairing" | "allowlist") ?? "allowlist",
152
+ allowFrom: (config.allowFrom as string[]) ?? [],
153
+ } as SlackConfig);
154
+ break;
155
+
156
+ default:
157
+ this.log.warn(`Unknown channel type: ${channelName}`);
158
+ return;
159
+ }
160
+
161
+ channel.onMessage(async (message: IncomingMessage) => {
162
+ if (this.messageHandler) {
163
+ await this.messageHandler(message);
164
+ }
165
+ });
166
+
167
+ const key = `${channelName}:${accountId}`;
168
+ this.channels.set(key, channel);
169
+
170
+ this.log.info(`Created channel: ${key}`);
171
+ } catch (error) {
172
+ this.log.error(`Failed to create channel ${channelName}:${accountId}: ${(error as Error).message}`);
173
+ }
174
+ }
175
+
176
+ async startAll(): Promise<void> {
177
+ const promises: Promise<void>[] = [];
178
+
179
+ for (const [key, channel] of this.channels) {
180
+ if (channel.isRunning()) {
181
+ this.log.info(`Channel ${key} is already running, skipping`);
182
+ continue;
183
+ }
184
+
185
+ // WhatsApp: skip auto-start if no credentials exist.
186
+ // QR generation should only happen when the user explicitly requests connection.
187
+ if (channel instanceof WhatsAppChannel && !channel.hasCredentials()) {
188
+ this.log.info(`${key}: no credentials found, skipping auto-start — connect via UI to generate QR`);
189
+ continue;
190
+ }
191
+
192
+ promises.push(
193
+ channel.start().catch((error) => {
194
+ this.log.error(`Failed to start channel ${key}: ${error.message}`);
195
+ })
196
+ );
197
+ }
198
+
199
+ await Promise.allSettled(promises);
200
+ this.log.info("All channels started");
201
+ }
202
+
203
+ async stopAll(): Promise<void> {
204
+ const promises: Promise<void>[] = [];
205
+
206
+ for (const [key, channel] of this.channels) {
207
+ promises.push(
208
+ channel.stop().catch((error) => {
209
+ this.log.error(`Failed to stop channel ${key}: ${error.message}`);
210
+ })
211
+ );
212
+ }
213
+
214
+ await Promise.allSettled(promises);
215
+ this.log.info("All channels stopped");
216
+ }
217
+
218
+ getChannel(channelName: string, accountId?: string): IChannel | undefined {
219
+ if (accountId) {
220
+ return this.channels.get(`${channelName}:${accountId}`);
221
+ }
222
+
223
+ for (const [key, channel] of this.channels) {
224
+ if (key.startsWith(channelName)) {
225
+ return channel;
226
+ }
227
+ }
228
+
229
+ return undefined;
230
+ }
231
+
232
+ async removeChannel(channelName: string, accountId: string): Promise<void> {
233
+ const key = `${channelName}:${accountId}`;
234
+ await this.stopChannel(channelName, accountId);
235
+ this.channels.delete(key);
236
+ this.log.info(`Removed channel: ${key}`);
237
+ }
238
+
239
+ getAccountConfig(channelName: string, accountId: string): any {
240
+ const channelConfigs = (this.config.channels ?? {}) as Record<string, any>;
241
+ const channelConfig = channelConfigs[channelName];
242
+ if (!channelConfig) return null;
243
+
244
+ const accounts = channelConfig.accounts;
245
+ if (!accounts) return null;
246
+ return accounts[accountId] || null;
247
+ }
248
+
249
+ async startChannel(channelName: string, accountId: string): Promise<void> {
250
+ const key = `${channelName}:${accountId}`;
251
+ let channel = this.channels.get(key);
252
+
253
+ if (!channel) {
254
+ const channelConfigs = (this.config.channels ?? {}) as Record<string, any>;
255
+ const channelConfig = channelConfigs[channelName];
256
+ if (!channelConfig) {
257
+ throw new Error(`Channel configuration not found: ${channelName}`);
258
+ }
259
+
260
+ const accounts = channelConfig.accounts;
261
+ if (!accounts) {
262
+ throw new Error(`Accounts configuration not found for channel ${channelName}`);
263
+ }
264
+ const accountConfig = accounts[accountId];
265
+ if (!accountConfig) {
266
+ throw new Error(`Account configuration not found: ${accountId} for channel ${channelName}`);
267
+ }
268
+
269
+ const fullConfig = { ...channelConfig, ...(accountConfig ?? {}) };
270
+ await this.createChannel(channelName, accountId, fullConfig as any);
271
+ channel = this.channels.get(key);
272
+ }
273
+
274
+ if (!channel) {
275
+ throw new Error(`Failed to instantiate channel: ${key}`);
276
+ }
277
+
278
+ if (channel.isRunning()) {
279
+ this.log.info(`Channel ${key} is already running`);
280
+ return;
281
+ }
282
+
283
+ await channel.start();
284
+ this.log.info(`Started channel: ${key}`);
285
+ }
286
+
287
+ async addChannel(type: string, accountId: string, config: Record<string, unknown>): Promise<void> {
288
+ await this.createChannel(type, accountId, config);
289
+ const channel = this.channels.get(`${type}:${accountId}`);
290
+ if (channel && !channel.isRunning()) {
291
+ await channel.start();
292
+ }
293
+ }
294
+
295
+ getChannelStatus(type: string, accountId: string): { status: string; qrCode?: string } {
296
+ const key = `${type}:${accountId}`;
297
+ const channel = this.channels.get(key);
298
+ if (!channel) return { status: "not_found" };
299
+
300
+ if (type === "whatsapp" && "getConnectionState" in channel) {
301
+ const state = (channel as any).getConnectionState();
302
+ return { status: state.status, qrCode: state.qrCode };
303
+ }
304
+
305
+ if ("getState" in channel) {
306
+ const state = (channel as any).getState();
307
+ return { status: state.status };
308
+ }
309
+
310
+ return { status: channel.isRunning() ? "connected" : "disconnected" };
311
+ }
312
+
313
+ getWhatsAppDetails(accountId: string): {
314
+ status: string;
315
+ phoneNumber?: string;
316
+ waVersion?: string;
317
+ qrCode?: string;
318
+ lastConnected?: number;
319
+ reconnectAttempts: number;
320
+ reconnectMaxAttempts: number;
321
+ error?: string;
322
+ acceptGroups: boolean;
323
+ selfMessagesOnly: boolean;
324
+ dmPolicy?: string;
325
+ allowFrom: string[];
326
+ } | null {
327
+ const key = `whatsapp:${accountId}`;
328
+ const channel = this.channels.get(key) as WhatsAppChannel | undefined;
329
+
330
+ if (!channel) return null;
331
+
332
+ const state = channel.getState();
333
+ const config = channel.getConfig();
334
+
335
+ return {
336
+ status: state.status,
337
+ phoneNumber: state.phoneNumber,
338
+ waVersion: state.waVersion,
339
+ qrCode: state.qrCode,
340
+ lastConnected: state.lastConnected?.getTime(),
341
+ reconnectAttempts: state.reconnectAttempts,
342
+ reconnectMaxAttempts: config.reconnectMaxAttempts ?? 10,
343
+ error: state.error,
344
+ acceptGroups: config.acceptGroups ?? false,
345
+ selfMessagesOnly: config.selfMessagesOnly !== false,
346
+ dmPolicy: config.dmPolicy,
347
+ allowFrom: config.allowFrom ?? [],
348
+ };
349
+ }
350
+
351
+ async stopChannel(channelName: string, accountId: string): Promise<void> {
352
+ const key = `${channelName}:${accountId}`;
353
+ const channel = this.channels.get(key);
354
+
355
+ if (!channel) {
356
+ this.log.debug(`Channel ${key} not instantiated, skipping stop`);
357
+ return;
358
+ }
359
+
360
+ if (!channel.isRunning()) {
361
+ this.log.info(`Channel ${key} is not running`);
362
+ return;
363
+ }
364
+
365
+ await channel.stop();
366
+ this.log.info(`Stopped channel: ${key}`);
367
+ }
368
+
369
+ listAllAvailableChannels(): Array<{ name: string; accountId: string; running: boolean; enabled: boolean }> {
370
+ const available: Array<{ name: string; accountId: string; running: boolean; enabled: boolean }> = [];
371
+ const channelConfigs = (this.config.channels ?? {}) as Record<string, any>;
372
+
373
+ for (const [channelName, channelConfig] of Object.entries(channelConfigs)) {
374
+ const accounts = channelConfig.accounts;
375
+ if (!accounts) continue;
376
+ for (const accountId of Object.keys(accounts)) {
377
+ const key = `${channelName}:${accountId}`;
378
+ const channel = this.channels.get(key);
379
+ available.push({
380
+ name: channelName,
381
+ accountId: accountId,
382
+ running: channel ? channel.isRunning() : false,
383
+ enabled: channelConfig.enabled !== false,
384
+ });
385
+ }
386
+ }
387
+ return available;
388
+ }
389
+
390
+ listChannels(): Array<{ name: string; accountId: string; running: boolean }> {
391
+ return Array.from(this.channels.entries()).map(([key, channel]) => {
392
+ const [name, accountId] = key.split(":");
393
+ return {
394
+ name: name ?? "unknown",
395
+ accountId: accountId ?? "unknown",
396
+ running: channel.isRunning(),
397
+ };
398
+ });
399
+ }
400
+
401
+ async send(
402
+ channelName: string,
403
+ sessionId: string,
404
+ message: unknown
405
+ ): Promise<void> {
406
+ const channel = this.getChannel(channelName);
407
+
408
+ if (!channel) {
409
+ throw new Error(`Channel not found: ${channelName}`);
410
+ }
411
+
412
+ await channel.send(sessionId, message as any);
413
+ }
414
+
415
+ async startTyping(channelName: string, sessionId: string): Promise<void> {
416
+ const channel = this.getChannel(channelName);
417
+ if (channel?.startTyping) {
418
+ await channel.startTyping(sessionId);
419
+ }
420
+ }
421
+
422
+ async stopTyping(channelName: string, sessionId: string): Promise<void> {
423
+ const channel = this.getChannel(channelName);
424
+ if (channel?.stopTyping) {
425
+ await channel.stopTyping(sessionId);
426
+ }
427
+ }
428
+
429
+ async markAsRead(channelName: string, sessionId: string, messageId?: string): Promise<void> {
430
+ const channel = this.getChannel(channelName);
431
+ if (channel?.markAsRead) {
432
+ await channel.markAsRead(sessionId, messageId);
433
+ }
434
+ }
435
+
436
+ async sendAudio(channelName: string, sessionId: string, audio: Buffer, mimeType: string): Promise<void> {
437
+ const channel = this.getChannel(channelName);
438
+ if (!channel) {
439
+ throw new Error(`Channel not found: ${channelName}`);
440
+ }
441
+ if (!channel.sendAudio) {
442
+ throw new Error(`Channel ${channelName} does not support audio`);
443
+ }
444
+ await channel.sendAudio(sessionId, audio, mimeType);
445
+ }
446
+ }
447
+
448
+ export function createChannelManager(config: Config): ChannelManager {
449
+ return new ChannelManager(config);
450
+ }