@johpaz/hive-agents 0.0.35 → 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 (440) hide show
  1. package/README.md +64 -39
  2. package/dist/hive.js +3127 -3104
  3. package/dist/ui/assets/{AgentCreateForm-B4eK7efF.js → AgentCreateForm-tJZv9FZC.js} +1 -1
  4. package/dist/ui/assets/{AgentDetailPage-BD2uoJWk.js → AgentDetailPage-Du-mRcAX.js} +1 -1
  5. package/dist/ui/assets/AgentNewPage-DIFYd_Ys.js +1 -0
  6. package/dist/ui/assets/{AgentsPage-4JUZXvkA.js → AgentsPage-YvSgWRiw.js} +6 -6
  7. package/dist/ui/assets/CanvasPage-DtMwGvxf.js +33 -0
  8. package/dist/ui/assets/{ChannelsPage-BUn7-nhV.js → ChannelsPage-BdBXWHjj.js} +1 -1
  9. package/dist/ui/assets/DashboardPage-ghl1ZguH.js +6 -0
  10. package/dist/ui/assets/{LoginPage-C8j_urUD.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-Drh-sJPN.js → NotFound-BMeQSGcG.js} +1 -1
  14. package/dist/ui/assets/ProvidersPage-Ct6HsAi1.js +1 -0
  15. package/dist/ui/assets/{RecoverPage-DNb1Pr8h.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-R-YOwA4F.js → WebChatPage-CVRcKept.js} +2 -2
  19. package/dist/ui/assets/accordion-C5d5Rm5z.js +1 -0
  20. package/dist/ui/assets/{alert-U8FsgWi7.js → alert-C-NE-P3s.js} +1 -1
  21. package/dist/ui/assets/{alert-dialog-CRdMkkmk.js → alert-dialog-C5mzbHdP.js} +1 -1
  22. package/dist/ui/assets/{badge-Cli1jnH5.js → badge-ChpACfWO.js} +1 -1
  23. package/dist/ui/assets/chevron-up-BYhk0K2J.js +1 -0
  24. package/dist/ui/assets/{dialog-DQ3s-LuO.js → dialog-QnZ0ad8O.js} +1 -1
  25. package/dist/ui/assets/dropdown-menu-BK-CO3Od.js +1 -0
  26. package/dist/ui/assets/{es-DcMjrpbA.js → es-NQNoaWDx.js} +1 -1
  27. package/dist/ui/assets/index-B2fCYtTS.css +2 -0
  28. package/dist/ui/assets/index-DMCjjdqf.js +116 -0
  29. package/dist/ui/assets/{label-0BvGVXvZ.js → label-D2H1IR_J.js} +1 -1
  30. package/dist/ui/assets/progress-BherYzY6.js +1 -0
  31. package/dist/ui/assets/scroll-area-DkeyX32e.js +1 -0
  32. package/dist/ui/assets/{slider-D47dOrRa.js → slider-CsiUDxc3.js} +1 -1
  33. package/dist/ui/assets/switch-BDwN8RYV.js +1 -0
  34. package/dist/ui/assets/{table-DhowbNxQ.js → table-CSc8ubon.js} +1 -1
  35. package/dist/ui/assets/terminal-DN38Q456.js +1 -0
  36. package/dist/ui/assets/useProviders-C6_QHsEi.js +1 -0
  37. package/dist/ui/assets/{vendor-radix-JY4ncZrD.js → vendor-radix-cw1bQaVC.js} +4 -4
  38. package/dist/ui/assets/{vendor-react-CscwQerf.js → vendor-react-D4s9E-zj.js} +1 -1
  39. package/dist/ui/dist/assets/AgentCreateForm-tJZv9FZC.js +1 -0
  40. package/dist/ui/dist/assets/AgentDetailPage-Du-mRcAX.js +1 -0
  41. package/dist/ui/dist/assets/AgentNewPage-DIFYd_Ys.js +1 -0
  42. package/dist/ui/dist/assets/AgentsPage-YvSgWRiw.js +10 -0
  43. package/dist/ui/dist/assets/CanvasPage-DtMwGvxf.js +33 -0
  44. package/dist/ui/dist/assets/ChannelsPage-BdBXWHjj.js +8 -0
  45. package/dist/ui/dist/assets/DashboardPage-ghl1ZguH.js +6 -0
  46. package/dist/ui/dist/assets/LoginPage-CAmSI9Vy.js +1 -0
  47. package/dist/ui/dist/assets/LogsPage-DAPBHkwK.js +1 -0
  48. package/dist/ui/dist/assets/MeetingPage-WjjGOqqU.js +1 -0
  49. package/dist/ui/dist/assets/NotFound-BMeQSGcG.js +1 -0
  50. package/dist/ui/dist/assets/ProvidersPage-Ct6HsAi1.js +1 -0
  51. package/dist/ui/dist/assets/RecoverPage-DpW3l-yv.js +1 -0
  52. package/dist/ui/dist/assets/SettingsPage-DBJ7_E6C.js +9 -0
  53. package/dist/ui/dist/assets/SetupPage-DKmLVUaj.js +1 -0
  54. package/dist/ui/dist/assets/WebChatPage-CVRcKept.js +16 -0
  55. package/dist/ui/dist/assets/accordion-C5d5Rm5z.js +1 -0
  56. package/dist/ui/dist/assets/activity-c3pNngT_.js +1 -0
  57. package/dist/ui/dist/assets/alert-C-NE-P3s.js +1 -0
  58. package/dist/ui/dist/assets/alert-dialog-C5mzbHdP.js +1 -0
  59. package/dist/ui/dist/assets/arrow-left-CBcbX5EZ.js +1 -0
  60. package/dist/ui/dist/assets/badge-ChpACfWO.js +1 -0
  61. package/dist/ui/dist/assets/calendar-B-KZ9RQO.js +1 -0
  62. package/dist/ui/dist/assets/card-CNf6BS2e.js +1 -0
  63. package/dist/ui/dist/assets/chevron-left-D4U-5A27.js +1 -0
  64. package/dist/ui/dist/assets/chevron-right-CR4Skrf3.js +1 -0
  65. package/dist/ui/dist/assets/chevron-up-BYhk0K2J.js +1 -0
  66. package/dist/ui/dist/assets/circle-alert-CyHDwUj8.js +1 -0
  67. package/dist/ui/dist/assets/circle-check-Bb54Ebmu.js +1 -0
  68. package/dist/ui/dist/assets/cpu-Cdgc_B1K.js +1 -0
  69. package/dist/ui/dist/assets/dialog-QnZ0ad8O.js +1 -0
  70. package/dist/ui/dist/assets/download-C3ifGMjJ.js +1 -0
  71. package/dist/ui/dist/assets/dropdown-menu-BK-CO3Od.js +1 -0
  72. package/dist/ui/dist/assets/es-NQNoaWDx.js +1 -0
  73. package/dist/ui/dist/assets/external-link-BvxYeTP1.js +1 -0
  74. package/dist/ui/dist/assets/eye-DqNTU_GD.js +1 -0
  75. package/dist/ui/dist/assets/file-text-BT_9S9SM.js +1 -0
  76. package/dist/ui/dist/assets/folder-open-BhH8y9ac.js +1 -0
  77. package/dist/ui/dist/assets/format-GVHeOyWI.js +1 -0
  78. package/dist/ui/dist/assets/gateway-url-COCbW0IR.js +1 -0
  79. package/dist/ui/dist/assets/gauge-D_TMa4i9.js +1 -0
  80. package/dist/ui/dist/assets/globe-DeCQTCDJ.js +1 -0
  81. package/dist/ui/dist/assets/hexagon-DsGOUl-H.js +1 -0
  82. package/dist/ui/dist/assets/history-BSG-Ypqf.js +1 -0
  83. package/dist/ui/dist/assets/index-B2fCYtTS.css +2 -0
  84. package/dist/ui/dist/assets/index-DMCjjdqf.js +116 -0
  85. package/dist/ui/dist/assets/info-NwLoa2Mj.js +1 -0
  86. package/dist/ui/dist/assets/key-3EP0dhkT.js +1 -0
  87. package/dist/ui/dist/assets/label-D2H1IR_J.js +1 -0
  88. package/dist/ui/dist/assets/loader-circle-CZNax6kS.js +1 -0
  89. package/dist/ui/dist/assets/lock-Ei1_J-Nq.js +1 -0
  90. package/dist/ui/dist/assets/pause-BUqah9Bi.js +1 -0
  91. package/dist/ui/dist/assets/play-NcZ4swwL.js +1 -0
  92. package/dist/ui/dist/assets/plus-CX1xyhp5.js +1 -0
  93. package/dist/ui/dist/assets/progress-BherYzY6.js +1 -0
  94. package/dist/ui/dist/assets/refresh-cw-DaYdjQFk.js +1 -0
  95. package/dist/ui/dist/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
  96. package/dist/ui/dist/assets/save-CUdYyHNy.js +1 -0
  97. package/dist/ui/dist/assets/scroll-area-DkeyX32e.js +1 -0
  98. package/dist/ui/dist/assets/send-B0H5SEIE.js +1 -0
  99. package/dist/ui/dist/assets/settings-Ds4SqD8s.js +1 -0
  100. package/dist/ui/dist/assets/slider-CsiUDxc3.js +14 -0
  101. package/dist/ui/dist/assets/sparkles-yUEb-7oH.js +1 -0
  102. package/dist/ui/dist/assets/square-BD81nFtN.js +1 -0
  103. package/dist/ui/dist/assets/switch-BDwN8RYV.js +1 -0
  104. package/dist/ui/dist/assets/table-CSc8ubon.js +1 -0
  105. package/dist/ui/dist/assets/terminal-DN38Q456.js +1 -0
  106. package/dist/ui/dist/assets/textarea-CXgXWKrT.js +1 -0
  107. package/dist/ui/dist/assets/trash-2-CNjMkoq6.js +1 -0
  108. package/dist/ui/dist/assets/triangle-alert-C9Y8Ub4X.js +1 -0
  109. package/dist/ui/dist/assets/useProviders-C6_QHsEi.js +1 -0
  110. package/dist/ui/dist/assets/utils-3pnRFmFe.js +1 -0
  111. package/dist/ui/dist/assets/vendor-charts-Bu2lyBKP.js +65 -0
  112. package/dist/ui/dist/assets/vendor-query-DsWPbQdG.js +1 -0
  113. package/dist/ui/dist/assets/vendor-radix-cw1bQaVC.js +63 -0
  114. package/dist/ui/dist/assets/vendor-react-D4s9E-zj.js +1 -0
  115. package/dist/ui/dist/assets/vendor-router-C9pIYwbJ.js +3 -0
  116. package/dist/ui/dist/assets/volume-2-CeSXNDv4.js +1 -0
  117. package/dist/ui/dist/assets/zap-hlXjpSeA.js +1 -0
  118. package/dist/ui/dist/favicon.ico +0 -0
  119. package/dist/ui/dist/index.html +40 -0
  120. package/dist/ui/dist/placeholder.svg +1 -0
  121. package/dist/ui/index.html +6 -6
  122. package/package.json +137 -13
  123. package/packages/cli/src/adapters/binary.ts +461 -0
  124. package/packages/cli/src/adapters/bun-global.ts +378 -0
  125. package/packages/cli/src/adapters/config.ts +314 -0
  126. package/packages/cli/src/adapters/docker.ts +308 -0
  127. package/packages/cli/src/adapters/factory.ts +168 -0
  128. package/packages/cli/src/adapters/index.ts +80 -0
  129. package/packages/cli/src/adapters/types.ts +218 -0
  130. package/packages/cli/src/commands/agent-run.ts +168 -0
  131. package/packages/cli/src/commands/agents.ts +398 -0
  132. package/packages/cli/src/commands/chat.ts +142 -0
  133. package/packages/cli/src/commands/config.ts +49 -0
  134. package/packages/cli/src/commands/cron.ts +487 -0
  135. package/packages/cli/src/commands/dev.ts +58 -0
  136. package/packages/cli/src/commands/doctor.ts +320 -0
  137. package/packages/cli/src/commands/gateway.ts +719 -0
  138. package/packages/cli/src/commands/logs.ts +57 -0
  139. package/packages/cli/src/commands/mcp.ts +175 -0
  140. package/packages/cli/src/commands/message.ts +77 -0
  141. package/packages/cli/src/commands/migrate.ts +90 -0
  142. package/packages/cli/src/commands/onboard.ts +1656 -0
  143. package/packages/cli/src/commands/security.ts +144 -0
  144. package/packages/cli/src/commands/service.ts +50 -0
  145. package/packages/cli/src/commands/sessions.ts +116 -0
  146. package/packages/cli/src/commands/skills.ts +215 -0
  147. package/packages/cli/src/commands/update.ts +203 -0
  148. package/packages/cli/src/index.ts +210 -0
  149. package/packages/cli/src/ui-bundle.generated.ts +3 -0
  150. package/packages/cli/src/utils/token.ts +6 -0
  151. package/packages/core/src/agent/agent-loop.ts +691 -0
  152. package/packages/core/src/agent/compaction.ts +240 -0
  153. package/packages/core/src/agent/context-compiler.ts +467 -0
  154. package/packages/core/src/agent/context-guard.ts +91 -0
  155. package/packages/core/src/agent/conversation-store.ts +244 -0
  156. package/packages/core/src/agent/curator.ts +158 -0
  157. package/packages/core/src/agent/hooks.ts +166 -0
  158. package/packages/core/src/agent/llm-client.ts +167 -0
  159. package/packages/core/src/agent/llm-providers/anthropic.ts +212 -0
  160. package/packages/core/src/agent/llm-providers/deepseek.ts +8 -0
  161. package/packages/core/src/agent/llm-providers/gemini.ts +215 -0
  162. package/packages/core/src/agent/llm-providers/groq.ts +5 -0
  163. package/packages/core/src/agent/llm-providers/interface.ts +195 -0
  164. package/packages/core/src/agent/llm-providers/kimi.ts +8 -0
  165. package/packages/core/src/agent/llm-providers/local-llama.ts +37 -0
  166. package/packages/core/src/agent/llm-providers/mistral.ts +5 -0
  167. package/packages/core/src/agent/llm-providers/nvidia.ts +5 -0
  168. package/packages/core/src/agent/llm-providers/ollama.ts +175 -0
  169. package/packages/core/src/agent/llm-providers/openai-compat-base.ts +379 -0
  170. package/packages/core/src/agent/llm-providers/openai.ts +5 -0
  171. package/packages/core/src/agent/llm-providers/openrouter.ts +5 -0
  172. package/packages/core/src/agent/llm-providers/qwen.ts +5 -0
  173. package/packages/core/src/agent/native-tools.ts +31 -0
  174. package/packages/core/src/agent/playbook-selector.ts +147 -0
  175. package/packages/core/src/agent/prompt-builder.ts +169 -0
  176. package/packages/core/src/agent/providers/index.ts +204 -0
  177. package/packages/core/src/agent/providers.ts +1 -0
  178. package/packages/core/src/agent/reflector.ts +200 -0
  179. package/packages/core/src/agent/service.ts +267 -0
  180. package/packages/core/src/agent/skill-selector.ts +479 -0
  181. package/packages/core/src/agent/stuck-loop.ts +133 -0
  182. package/packages/core/src/agent/tool-selector.ts +569 -0
  183. package/packages/core/src/agent/tracer.ts +100 -0
  184. package/packages/core/src/auth/auth.ts +108 -0
  185. package/packages/core/src/auth/index.ts +1 -0
  186. package/packages/core/src/canvas/a2ui-tools.ts +255 -0
  187. package/packages/core/src/canvas/canvas-manager.ts +390 -0
  188. package/packages/core/src/canvas/canvas-tools.ts +448 -0
  189. package/packages/core/src/canvas/emitter.ts +149 -0
  190. package/packages/core/src/canvas/index.ts +3 -0
  191. package/packages/core/src/channels/base.ts +154 -0
  192. package/packages/core/src/channels/discord.ts +273 -0
  193. package/packages/core/src/channels/index.ts +7 -0
  194. package/packages/core/src/channels/manager.ts +450 -0
  195. package/packages/core/src/channels/slack.ts +323 -0
  196. package/packages/core/src/channels/telegram.ts +612 -0
  197. package/packages/core/src/channels/webchat.ts +139 -0
  198. package/packages/core/src/channels/whatsapp.ts +548 -0
  199. package/packages/core/src/config/index.ts +12 -0
  200. package/packages/core/src/config/loader.ts +569 -0
  201. package/packages/core/src/events/agent-bus.ts +460 -0
  202. package/packages/core/src/events/event-bus.ts +169 -0
  203. package/packages/core/src/gateway/channel-notify.ts +64 -0
  204. package/packages/core/src/gateway/helpers/cors.ts +32 -0
  205. package/packages/core/src/gateway/helpers/index.ts +4 -0
  206. package/packages/core/src/gateway/helpers/narration.ts +57 -0
  207. package/packages/core/src/gateway/helpers/path.ts +13 -0
  208. package/packages/core/src/gateway/helpers/redact.ts +61 -0
  209. package/packages/core/src/gateway/index.ts +5 -0
  210. package/packages/core/src/gateway/initializer.ts +363 -0
  211. package/packages/core/src/gateway/lane-queue.ts +169 -0
  212. package/packages/core/src/gateway/llm-local/client.ts +94 -0
  213. package/packages/core/src/gateway/llm-local/detector.ts +321 -0
  214. package/packages/core/src/gateway/llm-local/downloader.ts +216 -0
  215. package/packages/core/src/gateway/llm-local/index.ts +34 -0
  216. package/packages/core/src/gateway/llm-local/manager.ts +186 -0
  217. package/packages/core/src/gateway/llm-local/models.ts +149 -0
  218. package/packages/core/src/gateway/llm-local/server.ts +179 -0
  219. package/packages/core/src/gateway/resolver.ts +108 -0
  220. package/packages/core/src/gateway/router.ts +124 -0
  221. package/packages/core/src/gateway/routes/agents.ts +210 -0
  222. package/packages/core/src/gateway/routes/auth.ts +244 -0
  223. package/packages/core/src/gateway/routes/channels.ts +484 -0
  224. package/packages/core/src/gateway/routes/chat.ts +241 -0
  225. package/packages/core/src/gateway/routes/config.ts +12 -0
  226. package/packages/core/src/gateway/routes/cron-api.ts +544 -0
  227. package/packages/core/src/gateway/routes/ethics.ts +46 -0
  228. package/packages/core/src/gateway/routes/llm-local.ts +271 -0
  229. package/packages/core/src/gateway/routes/mcp.ts +319 -0
  230. package/packages/core/src/gateway/routes/meeting.ts +232 -0
  231. package/packages/core/src/gateway/routes/models.ts +163 -0
  232. package/packages/core/src/gateway/routes/multimodal.ts +93 -0
  233. package/packages/core/src/gateway/routes/providers.ts +220 -0
  234. package/packages/core/src/gateway/routes/setup.ts +441 -0
  235. package/packages/core/src/gateway/routes/skills.ts +115 -0
  236. package/packages/core/src/gateway/routes/system.ts +469 -0
  237. package/packages/core/src/gateway/routes/tasks.ts +44 -0
  238. package/packages/core/src/gateway/routes/tools.ts +59 -0
  239. package/packages/core/src/gateway/routes/tts-local.ts +388 -0
  240. package/packages/core/src/gateway/routes/users.ts +122 -0
  241. package/packages/core/src/gateway/routes/voice.ts +189 -0
  242. package/packages/core/src/gateway/routes/workspace.ts +281 -0
  243. package/packages/core/src/gateway/server.ts +2744 -0
  244. package/packages/core/src/gateway/session.ts +95 -0
  245. package/packages/core/src/gateway/slash-commands.ts +207 -0
  246. package/packages/core/src/gateway/tts/README.md +94 -0
  247. package/packages/core/src/gateway/tts/package.json +25 -0
  248. package/packages/core/src/gateway/tts/src/client.ts +59 -0
  249. package/packages/core/src/gateway/tts/src/detect.ts +42 -0
  250. package/packages/core/src/gateway/tts/src/index.ts +15 -0
  251. package/packages/core/src/gateway/tts/src/install.ts +129 -0
  252. package/packages/core/src/gateway/tts/src/models.ts +50 -0
  253. package/packages/core/src/gateway/tts/src/server.ts +252 -0
  254. package/packages/core/src/gateway/tts/voices/.gitkeep +0 -0
  255. package/packages/core/src/heartbeat/index.ts +157 -0
  256. package/packages/core/src/index.ts +56 -0
  257. package/packages/core/src/mcp/hot-reload.ts +148 -0
  258. package/packages/core/src/mcp/singleton.ts +21 -0
  259. package/packages/core/src/mcp/tool-sync.ts +176 -0
  260. package/packages/core/src/multimodal/index.ts +2 -0
  261. package/packages/core/src/multimodal/types.ts +28 -0
  262. package/packages/core/src/multimodal/vision-service.ts +283 -0
  263. package/packages/core/src/plugins/api.ts +128 -0
  264. package/packages/core/src/plugins/index.ts +2 -0
  265. package/packages/core/src/plugins/loader.ts +365 -0
  266. package/packages/core/src/resilience/circuit-breaker.ts +225 -0
  267. package/packages/core/src/scheduler/CronScheduler.ts +699 -0
  268. package/packages/core/src/scheduler/dag/AgentExecutor.ts +53 -0
  269. package/packages/core/src/scheduler/dag/DAGScheduler.ts +250 -0
  270. package/packages/core/src/scheduler/dag/EventBridge.ts +122 -0
  271. package/packages/core/src/scheduler/dag/TaskGraph.ts +192 -0
  272. package/packages/core/src/scheduler/dag/TaskNode.ts +97 -0
  273. package/packages/core/src/scheduler/dag/TaskResult.ts +22 -0
  274. package/packages/core/src/scheduler/dag/errors.ts +37 -0
  275. package/packages/core/src/scheduler/dag/index.ts +26 -0
  276. package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +97 -0
  277. package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +21 -0
  278. package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +46 -0
  279. package/packages/core/src/scheduler/index.ts +22 -0
  280. package/packages/core/src/scheduler/integration.ts +237 -0
  281. package/packages/core/src/scheduler/types.ts +164 -0
  282. package/packages/core/src/security/google-chat.ts +269 -0
  283. package/packages/core/src/security/index.ts +192 -0
  284. package/packages/core/src/security/pairing.ts +250 -0
  285. package/packages/core/src/security/rate-limit.ts +270 -0
  286. package/packages/core/src/security/signal.ts +321 -0
  287. package/packages/core/src/state/store.ts +312 -0
  288. package/packages/core/src/storage/crypto.ts +197 -0
  289. package/packages/core/src/storage/migrate.ts +147 -0
  290. package/packages/core/src/storage/onboarding.ts +1506 -0
  291. package/packages/core/src/storage/schema.ts +666 -0
  292. package/packages/core/src/storage/seed.ts +628 -0
  293. package/packages/core/src/storage/sqlite.ts +407 -0
  294. package/packages/core/src/storage/usage.ts +374 -0
  295. package/packages/core/src/tool-runtime/index.ts +476 -0
  296. package/packages/core/src/tool-runtime/tool-worker.ts +125 -0
  297. package/packages/core/src/tools/agents/get-available-models.ts +118 -0
  298. package/packages/core/src/tools/agents/index.ts +610 -0
  299. package/packages/core/src/tools/canvas/index.ts +420 -0
  300. package/packages/core/src/tools/cli/index.ts +142 -0
  301. package/packages/core/src/tools/core/index.ts +478 -0
  302. package/packages/core/src/tools/cron/index.ts +635 -0
  303. package/packages/core/src/tools/filesystem/fs-delete.ts +78 -0
  304. package/packages/core/src/tools/filesystem/fs-edit.ts +106 -0
  305. package/packages/core/src/tools/filesystem/fs-exists.ts +63 -0
  306. package/packages/core/src/tools/filesystem/fs-glob.ts +108 -0
  307. package/packages/core/src/tools/filesystem/fs-list.ts +129 -0
  308. package/packages/core/src/tools/filesystem/fs-read.ts +72 -0
  309. package/packages/core/src/tools/filesystem/fs-write.ts +67 -0
  310. package/packages/core/src/tools/filesystem/index.ts +34 -0
  311. package/packages/core/src/tools/filesystem/workspace-guard.ts +62 -0
  312. package/packages/core/src/tools/index.ts +197 -0
  313. package/packages/core/src/tools/meeting/index.ts +363 -0
  314. package/packages/core/src/tools/office/index.ts +47 -0
  315. package/packages/core/src/tools/office/office-escribir-docx.ts +192 -0
  316. package/packages/core/src/tools/office/office-escribir-pdf.ts +172 -0
  317. package/packages/core/src/tools/office/office-escribir-pptx.ts +174 -0
  318. package/packages/core/src/tools/office/office-escribir-xlsx.ts +116 -0
  319. package/packages/core/src/tools/office/office-leer-docx.ts +93 -0
  320. package/packages/core/src/tools/office/office-leer-pdf.ts +114 -0
  321. package/packages/core/src/tools/office/office-leer-pptx.ts +136 -0
  322. package/packages/core/src/tools/office/office-leer-xlsx.ts +124 -0
  323. package/packages/core/src/tools/types.ts +39 -0
  324. package/packages/core/src/tools/voice/index.ts +104 -0
  325. package/packages/core/src/tools/web/browser-click.ts +78 -0
  326. package/packages/core/src/tools/web/browser-extract.ts +139 -0
  327. package/packages/core/src/tools/web/browser-navigate.ts +106 -0
  328. package/packages/core/src/tools/web/browser-screenshot.ts +87 -0
  329. package/packages/core/src/tools/web/browser-script.ts +88 -0
  330. package/packages/core/src/tools/web/browser-service.ts +554 -0
  331. package/packages/core/src/tools/web/browser-type.ts +101 -0
  332. package/packages/core/src/tools/web/browser-wait.ts +136 -0
  333. package/packages/core/src/tools/web/index.ts +41 -0
  334. package/packages/core/src/tools/web/web-fetch.ts +78 -0
  335. package/packages/core/src/tools/web/web-search.ts +123 -0
  336. package/packages/core/src/utils/benchmark.ts +80 -0
  337. package/packages/core/src/utils/crypto.ts +73 -0
  338. package/packages/core/src/utils/date.ts +42 -0
  339. package/packages/core/src/utils/index.ts +5 -0
  340. package/packages/core/src/utils/logger.ts +389 -0
  341. package/packages/core/src/utils/retry.ts +70 -0
  342. package/packages/core/src/utils/toon.ts +253 -0
  343. package/packages/core/src/voice/index.ts +643 -0
  344. package/packages/mcp/src/config.ts +13 -0
  345. package/packages/mcp/src/index.ts +1 -0
  346. package/packages/mcp/src/logger.ts +47 -0
  347. package/packages/mcp/src/manager.ts +439 -0
  348. package/packages/mcp/src/transports/index.ts +67 -0
  349. package/packages/mcp/src/transports/sse.ts +238 -0
  350. package/packages/mcp/src/transports/websocket.ts +159 -0
  351. package/packages/skills/src/bundled/agents/agent_spawner/SKILL.md +167 -0
  352. package/packages/skills/src/bundled/agents/code_delegator/SKILL.md +156 -0
  353. package/packages/skills/src/bundled/agents/memory_manager/SKILL.md +143 -0
  354. package/packages/skills/src/bundled/agents/research_and_remember/SKILL.md +139 -0
  355. package/packages/skills/src/bundled/agents/task_orchestrator/SKILL.md +198 -0
  356. package/packages/skills/src/bundled/canvas/a2ui_dashboard/SKILL.md +176 -0
  357. package/packages/skills/src/bundled/canvas/a2ui_form/SKILL.md +202 -0
  358. package/packages/skills/src/bundled/canvas/a2ui_interactive/SKILL.md +206 -0
  359. package/packages/skills/src/bundled/canvas/canvas_dashboard/SKILL.md +146 -0
  360. package/packages/skills/src/bundled/canvas/canvas_interact/SKILL.md +148 -0
  361. package/packages/skills/src/bundled/canvas/canvas_report/SKILL.md +146 -0
  362. package/packages/skills/src/bundled/cli/cli_pipeline/SKILL.md +136 -0
  363. package/packages/skills/src/bundled/cli/cli_safe_exec/SKILL.md +125 -0
  364. package/packages/skills/src/bundled/cron_manager/SKILL.md +188 -0
  365. package/packages/skills/src/bundled/cron_reminder/SKILL.md +112 -0
  366. package/packages/skills/src/bundled/filesystem/file_manager/SKILL.md +118 -0
  367. package/packages/skills/src/bundled/filesystem/file_read_and_summarize/SKILL.md +108 -0
  368. package/packages/skills/src/bundled/filesystem/file_writer/SKILL.md +135 -0
  369. package/packages/skills/src/bundled/meeting/meeting_transcription/SKILL.md +213 -0
  370. package/packages/skills/src/bundled/office/office_document_manager/SKILL.md +262 -0
  371. package/packages/skills/src/bundled/search_knowledge/busqueda_fts5/SKILL.md +74 -0
  372. package/packages/skills/src/bundled/voice/voice_assistant/SKILL.md +174 -0
  373. package/packages/skills/src/bundled/voice/voice_input/SKILL.md +146 -0
  374. package/packages/skills/src/bundled/voice/voice_output/SKILL.md +151 -0
  375. package/packages/skills/src/bundled/web/browser_automate/SKILL.md +120 -0
  376. package/packages/skills/src/bundled/web/browser_scrape/SKILL.md +109 -0
  377. package/packages/skills/src/bundled/web/web_monitor/SKILL.md +127 -0
  378. package/packages/skills/src/bundled/web/web_research/SKILL.md +119 -0
  379. package/packages/skills/src/bundled-data.generated.ts +1964 -0
  380. package/packages/skills/src/index.ts +1 -0
  381. package/packages/skills/src/loader.ts +388 -0
  382. package/dist/ui/assets/AgentNewPage-GB-tVN50.js +0 -1
  383. package/dist/ui/assets/BridgePage-DDcDILKu.js +0 -1
  384. package/dist/ui/assets/CanvasPage-oOk2sGOD.js +0 -33
  385. package/dist/ui/assets/DashboardPage-DV_2qWYJ.js +0 -6
  386. package/dist/ui/assets/LogsPage-DayYjh01.js +0 -1
  387. package/dist/ui/assets/MeetingPage-C01uPuqj.js +0 -1
  388. package/dist/ui/assets/ProjectsPage-B8_am_Ib.js +0 -1
  389. package/dist/ui/assets/ProvidersPage-DBzi66e4.js +0 -1
  390. package/dist/ui/assets/SettingsPage-CFA_Tknl.js +0 -9
  391. package/dist/ui/assets/SetupPage-BrUWbhvT.js +0 -1
  392. package/dist/ui/assets/accordion-DdAEfIXR.js +0 -1
  393. package/dist/ui/assets/chevron-down-DIosfU_U.js +0 -1
  394. package/dist/ui/assets/chevron-up-CI-W21Fy.js +0 -1
  395. package/dist/ui/assets/circle-S0-ouLz-.js +0 -1
  396. package/dist/ui/assets/circle-minus-CE0iJrl8.js +0 -1
  397. package/dist/ui/assets/circle-x-jUJ5zZvQ.js +0 -1
  398. package/dist/ui/assets/dropdown-menu-C2CXM1VE.js +0 -1
  399. package/dist/ui/assets/index-BN0875JH.css +0 -2
  400. package/dist/ui/assets/index-CH6sBa3Q.js +0 -116
  401. package/dist/ui/assets/pencil-5VdSj-h5.js +0 -1
  402. package/dist/ui/assets/progress-JN30I5fF.js +0 -1
  403. package/dist/ui/assets/scroll-area-BQQPitM8.js +0 -1
  404. package/dist/ui/assets/search-ChPgnVKj.js +0 -1
  405. package/dist/ui/assets/switch-C7W2-KEx.js +0 -1
  406. package/dist/ui/assets/terminal-C-R5Fckz.js +0 -1
  407. package/dist/ui/assets/useProviders-TBnWn-Hq.js +0 -1
  408. /package/dist/ui/assets/{card-DFKnZ6ky.js → card-CNf6BS2e.js} +0 -0
  409. /package/dist/ui/assets/{circle-alert-KuAm2FWh.js → circle-alert-CyHDwUj8.js} +0 -0
  410. /package/dist/ui/assets/{circle-check-6Ard1-2z.js → circle-check-Bb54Ebmu.js} +0 -0
  411. /package/dist/ui/assets/{cpu-KDy6-FAI.js → cpu-Cdgc_B1K.js} +0 -0
  412. /package/dist/ui/assets/{download-Cjbk4Rek.js → download-C3ifGMjJ.js} +0 -0
  413. /package/dist/ui/assets/{external-link-HtrFM63g.js → external-link-BvxYeTP1.js} +0 -0
  414. /package/dist/ui/assets/{eye-D1dB40_o.js → eye-DqNTU_GD.js} +0 -0
  415. /package/dist/ui/assets/{file-text-CE58EfH0.js → file-text-BT_9S9SM.js} +0 -0
  416. /package/dist/ui/assets/{folder-open-DIPKeiI_.js → folder-open-BhH8y9ac.js} +0 -0
  417. /package/dist/ui/assets/{format-BwdV8bB5.js → format-GVHeOyWI.js} +0 -0
  418. /package/dist/ui/assets/{gateway-url-D5uj6Nxg.js → gateway-url-COCbW0IR.js} +0 -0
  419. /package/dist/ui/assets/{gauge-DmQmJHEg.js → gauge-D_TMa4i9.js} +0 -0
  420. /package/dist/ui/assets/{globe-_hUGxQF4.js → globe-DeCQTCDJ.js} +0 -0
  421. /package/dist/ui/assets/{hexagon-BaNGQlQj.js → hexagon-DsGOUl-H.js} +0 -0
  422. /package/dist/ui/assets/{history-BfZVGlZa.js → history-BSG-Ypqf.js} +0 -0
  423. /package/dist/ui/assets/{info-CBZ5-AlC.js → info-NwLoa2Mj.js} +0 -0
  424. /package/dist/ui/assets/{key-Bv5DdTPh.js → key-3EP0dhkT.js} +0 -0
  425. /package/dist/ui/assets/{loader-circle-C4hhXLgp.js → loader-circle-CZNax6kS.js} +0 -0
  426. /package/dist/ui/assets/{lock-CkZYexqw.js → lock-Ei1_J-Nq.js} +0 -0
  427. /package/dist/ui/assets/{pause-Bpy1_s7y.js → pause-BUqah9Bi.js} +0 -0
  428. /package/dist/ui/assets/{play-Cj4osqJZ.js → play-NcZ4swwL.js} +0 -0
  429. /package/dist/ui/assets/{plus-BQhgZN3A.js → plus-CX1xyhp5.js} +0 -0
  430. /package/dist/ui/assets/{refresh-cw-BfREHVQM.js → refresh-cw-DaYdjQFk.js} +0 -0
  431. /package/dist/ui/assets/{save-FFTD4dMp.js → save-CUdYyHNy.js} +0 -0
  432. /package/dist/ui/assets/{settings-BdHKUL92.js → settings-Ds4SqD8s.js} +0 -0
  433. /package/dist/ui/assets/{sparkles-r4uJbJAl.js → sparkles-yUEb-7oH.js} +0 -0
  434. /package/dist/ui/assets/{square-G7Hyufqm.js → square-BD81nFtN.js} +0 -0
  435. /package/dist/ui/assets/{textarea-5kyuD04X.js → textarea-CXgXWKrT.js} +0 -0
  436. /package/dist/ui/assets/{trash-2-DXVBRWfh.js → trash-2-CNjMkoq6.js} +0 -0
  437. /package/dist/ui/assets/{triangle-alert-Bu5seg9O.js → triangle-alert-C9Y8Ub4X.js} +0 -0
  438. /package/dist/ui/assets/{vendor-router-CCECILJ0.js → vendor-router-C9pIYwbJ.js} +0 -0
  439. /package/dist/ui/assets/{volume-2-s9DuS696.js → volume-2-CeSXNDv4.js} +0 -0
  440. /package/dist/ui/assets/{zap-BPHZzXKV.js → zap-hlXjpSeA.js} +0 -0
@@ -0,0 +1,484 @@
1
+ import { getDb } from "../../storage/sqlite"
2
+ import { storeChannelConfig, loadChannelConfig, deleteChannelSecrets } from "../../storage/crypto"
3
+
4
+ export async function handleGetChannels(
5
+ req: Request,
6
+ addCorsHeaders: (r: Response, req: Request) => Response,
7
+ channelManager?: any
8
+ ): Promise<Response> {
9
+ const channels = getDb().query(`
10
+ SELECT id, type, id as account_id, enabled, active, status, last_active,
11
+ voice_enabled, tts_enabled, stt_provider, tts_provider, tts_voice_id, step_delivery_mode,
12
+ vision_enabled, ocr_provider, vision_provider, vision_model_id
13
+ FROM channels
14
+ `).all() as Array<{
15
+ id: string;
16
+ type: string;
17
+ account_id: string;
18
+ enabled: number;
19
+ active: number;
20
+ status: string;
21
+ last_active: number | null;
22
+ voice_enabled: number;
23
+ tts_enabled: number;
24
+ stt_provider: string | null;
25
+ tts_provider: string | null;
26
+ tts_voice_id: string | null;
27
+ step_delivery_mode: string | null;
28
+ vision_enabled: number;
29
+ ocr_provider: string | null;
30
+ vision_provider: string | null;
31
+ vision_model_id: string | null;
32
+ }>
33
+
34
+ // Convert to format expected by UI (ConnectedChannel[])
35
+ // Overlay the live runtime status from channelManager so that channels like
36
+ // Telegram/Discord (which never write "connected" to the DB) show the correct state.
37
+ const formattedChannels = await Promise.all(channels.map(async c => {
38
+ let liveStatus: string = c.status;
39
+ if (channelManager && typeof channelManager.getChannelStatus === "function") {
40
+ const live = channelManager.getChannelStatus(c.type, c.id);
41
+ if (live && live.status !== "not_found") liveStatus = live.status;
42
+ }
43
+ const config = await loadChannelConfig(c.id);
44
+ const isConfigured = Object.keys(config).length > 0;
45
+
46
+ return {
47
+ id: c.id,
48
+ type: c.type as ConnectedChannel["type"],
49
+ accountId: c.account_id,
50
+ enabled: c.enabled === 1,
51
+ active: c.active === 1,
52
+ status: liveStatus as ConnectedChannel["status"],
53
+ last_active: c.last_active ?? undefined,
54
+ voice_enabled: c.voice_enabled === 1,
55
+ tts_enabled: c.tts_enabled === 1,
56
+ stt_provider: c.stt_provider ?? undefined,
57
+ tts_provider: c.tts_provider ?? undefined,
58
+ tts_voice_id: c.tts_voice_id ?? undefined,
59
+ step_delivery_mode: c.step_delivery_mode ?? undefined,
60
+ vision_enabled: c.vision_enabled === 1,
61
+ ocr_provider: c.ocr_provider ?? undefined,
62
+ vision_provider: c.vision_provider ?? undefined,
63
+ vision_model_id: c.vision_model_id ?? undefined,
64
+ isConfigured,
65
+ };
66
+ }))
67
+
68
+ return addCorsHeaders(Response.json({ channels: formattedChannels }), req)
69
+ }
70
+
71
+ type ConnectedChannel = {
72
+ id: string;
73
+ type: string;
74
+ accountId?: string;
75
+ enabled: boolean;
76
+ active: boolean;
77
+ status: string;
78
+ last_active?: number;
79
+ voice_enabled: boolean;
80
+ tts_enabled: boolean;
81
+ stt_provider?: string;
82
+ tts_provider?: string;
83
+ tts_voice_id?: string;
84
+ step_delivery_mode?: string;
85
+ vision_enabled: boolean;
86
+ ocr_provider?: string;
87
+ vision_provider?: string;
88
+ vision_model_id?: string;
89
+ isConfigured?: boolean;
90
+ }
91
+
92
+ export async function handleGetChannelConfig(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
93
+ const url = new URL(req.url)
94
+ const channelIdMatch = url.pathname.match(/^\/api\/channels\/([^/]+)$/)
95
+
96
+ if (!channelIdMatch) {
97
+ return addCorsHeaders(Response.json({ error: "Invalid path" }), req)
98
+ }
99
+
100
+ const channelId = channelIdMatch[1]
101
+ const config = getDb().query(`
102
+ SELECT * FROM user_channels WHERE channel = ?
103
+ `).all(channelId) as Record<string, unknown>[]
104
+
105
+ return addCorsHeaders(Response.json({ config }), req)
106
+ }
107
+
108
+ export async function handleActivateChannel(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
109
+ const body = await req.json().catch(() => ({}))
110
+ const { channel, config, accountId } = body
111
+
112
+ if (!channel) {
113
+ return addCorsHeaders(Response.json({ success: false, error: "channel required" }), req)
114
+ }
115
+
116
+ const userId = "default"
117
+ getDb().query(`
118
+ INSERT OR REPLACE INTO user_channels(user_id, channel, account_id, config, active)
119
+ VALUES(?, ?, ?, ?, 1)
120
+ `).run(userId, channel, accountId || null, JSON.stringify(config || {}))
121
+
122
+ return addCorsHeaders(Response.json({ success: true, channel }), req)
123
+ }
124
+
125
+ export async function handleDeactivateChannel(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
126
+ const url = new URL(req.url)
127
+ const parts = url.pathname.split("/")
128
+ const channel = parts[3]
129
+ const accountId = parts[4]
130
+
131
+ if (!channel) {
132
+ return addCorsHeaders(Response.json({ success: false, error: "channel required" }), req)
133
+ }
134
+
135
+ const userId = "default"
136
+ if (accountId) {
137
+ getDb().query(`DELETE FROM user_channels WHERE user_id = ? AND channel = ? AND account_id = ?`).run(userId, channel, accountId)
138
+ } else {
139
+ getDb().query(`DELETE FROM user_channels WHERE user_id = ? AND channel = ?`).run(userId, channel)
140
+ }
141
+
142
+ return addCorsHeaders(Response.json({ success: true }), req)
143
+ }
144
+
145
+ export async function handleCreateChannel(
146
+ req: Request,
147
+ addCorsHeaders: (r: Response, req: Request) => Response,
148
+ channelManager?: any
149
+ ): Promise<Response> {
150
+ const body = await req.json().catch(() => ({}));
151
+ const { type, config: channelConfig } = body;
152
+
153
+ if (!type) {
154
+ return addCorsHeaders(new Response("Missing type", { status: 400 }), req);
155
+ }
156
+
157
+ // Reuse the existing seeded channel record (e.g. id="whatsapp") if it exists
158
+ // and has not been configured yet — avoids creating duplicate UUID entries.
159
+ // A seeded-but-unconfigured channel has no secret in the keychain yet.
160
+ const seededRows = getDb().query(
161
+ `SELECT id FROM channels WHERE type = ? LIMIT 10`
162
+ ).all(type) as { id: string }[];
163
+
164
+ // Find a row with no config in keychain (unconfigured seed)
165
+ let seededId: string | null = null;
166
+ for (const row of seededRows) {
167
+ const existing = await loadChannelConfig(row.id);
168
+ if (Object.keys(existing).length === 0) {
169
+ seededId = row.id;
170
+ break;
171
+ }
172
+ }
173
+
174
+ let id: string;
175
+ if (seededId) {
176
+ id = seededId;
177
+ getDb().query(
178
+ `UPDATE channels SET enabled = 1, active = 1, status = 'connecting' WHERE id = ?`
179
+ ).run(id);
180
+ } else {
181
+ const { randomUUID } = await import("crypto");
182
+ id = randomUUID();
183
+ getDb().query(`
184
+ INSERT INTO channels(id, type, enabled, active, status)
185
+ VALUES(?, ?, 1, 1, 'connecting')
186
+ `).run(id, type);
187
+ }
188
+
189
+ if (channelConfig && Object.keys(channelConfig).length > 0) {
190
+ await storeChannelConfig(id, channelConfig);
191
+ }
192
+
193
+ if (channelManager) {
194
+ channelManager.addChannel(type, id, channelConfig || {}).catch((err: Error) => {
195
+ console.error(`[channels] Failed to start ${type}:${id}:`, err.message);
196
+ });
197
+ }
198
+
199
+ return addCorsHeaders(Response.json({ success: true, id, status: "connecting" }), req);
200
+ }
201
+
202
+ export async function handleReconnectChannel(
203
+ req: Request,
204
+ addCorsHeaders: (r: Response, req: Request) => Response,
205
+ channelId: string,
206
+ channelManager?: any
207
+ ): Promise<Response> {
208
+ const body = await req.json().catch(() => ({}));
209
+ const { config: newConfig } = body;
210
+
211
+ const row = getDb().query(`SELECT type FROM channels WHERE id = ?`).get(channelId) as {
212
+ type: string;
213
+ } | undefined;
214
+
215
+ if (!row) {
216
+ return addCorsHeaders(Response.json({ success: false, error: "Channel not found" }, { status: 404 }), req);
217
+ }
218
+
219
+ // Update credentials if new config provided
220
+ if (newConfig && Object.keys(newConfig).length > 0) {
221
+ await storeChannelConfig(channelId, newConfig);
222
+ }
223
+ getDb().query(`UPDATE channels SET enabled = 1, active = 1, status = 'connecting' WHERE id = ?`)
224
+ .run(channelId);
225
+
226
+ if (channelManager) {
227
+ let config: Record<string, unknown> = {};
228
+ if (newConfig && Object.keys(newConfig).length > 0) {
229
+ config = newConfig;
230
+ } else {
231
+ config = await loadChannelConfig(channelId);
232
+ }
233
+
234
+ // Remove old instance then start fresh — must be sequential to avoid race
235
+ // where removeChannel deletes the key AFTER addChannel already set it
236
+ ;(async () => {
237
+ try { await channelManager.removeChannel(row.type, channelId); } catch { /* ignore */ }
238
+ try {
239
+ await channelManager.addChannel(row.type, channelId, config);
240
+ } catch (err: unknown) {
241
+ console.error(`[channels] Failed to reconnect ${row.type}:${channelId}:`, (err as Error).message);
242
+ }
243
+ })();
244
+ }
245
+
246
+ return addCorsHeaders(Response.json({ success: true, status: "connecting" }), req);
247
+ }
248
+
249
+ export async function handleGetChannelStatus(
250
+ req: Request,
251
+ addCorsHeaders: (r: Response, req: Request) => Response,
252
+ channelManager?: any
253
+ ): Promise<Response> {
254
+ const url = new URL(req.url);
255
+ const match = url.pathname.match(/^\/api\/channels\/([^/]+)\/([^/]+)\/status$/);
256
+ if (!match) {
257
+ return addCorsHeaders(Response.json({ error: "Invalid path" }, { status: 400 }), req);
258
+ }
259
+
260
+ const [, type, id] = match;
261
+
262
+ if (!channelManager) {
263
+ return addCorsHeaders(Response.json({ status: "unknown" }), req);
264
+ }
265
+
266
+ const statusData = channelManager.getChannelStatus(type, id);
267
+ return addCorsHeaders(Response.json(statusData), req);
268
+ }
269
+
270
+ export async function handleGetChannelAccount(
271
+ req: Request,
272
+ addCorsHeaders: (r: Response, req: Request) => Response,
273
+ name: string,
274
+ accountId: string
275
+ ): Promise<Response> {
276
+ // This should read from the config file or database
277
+ // For now, return a placeholder - the actual implementation depends on config storage
278
+ return addCorsHeaders(Response.json({ name, accountId, config: {} }), req);
279
+ }
280
+
281
+ export async function handleUpdateChannelAccount(
282
+ req: Request,
283
+ addCorsHeaders: (r: Response, req: Request) => Response,
284
+ name: string,
285
+ accountId: string,
286
+ channelManager?: any
287
+ ): Promise<Response> {
288
+ const body = await req.json().catch(() => ({}));
289
+ if (!body.config) {
290
+ return new Response("Missing config", { status: 400 });
291
+ }
292
+
293
+ // Note: Channel config persistence should be handled by the caller
294
+ if (channelManager) {
295
+ await channelManager.removeChannel(name, accountId);
296
+ await channelManager.startChannel(name, accountId);
297
+ }
298
+
299
+ return addCorsHeaders(Response.json({ success: true }), req);
300
+ }
301
+
302
+ export async function handleDeleteChannelAccount(
303
+ req: Request,
304
+ addCorsHeaders: (r: Response, req: Request) => Response,
305
+ name: string,
306
+ accountId: string,
307
+ config?: any,
308
+ channelManager?: any
309
+ ): Promise<Response> {
310
+ // Note: Config update should be handled by the caller
311
+ if (channelManager) {
312
+ await channelManager.removeChannel(name, accountId);
313
+ }
314
+
315
+ return addCorsHeaders(Response.json({ success: true }), req);
316
+ }
317
+
318
+ export async function handleChannelAction(
319
+ req: Request,
320
+ addCorsHeaders: (r: Response, req: Request) => Response,
321
+ name: string,
322
+ accountId: string,
323
+ action: "start" | "stop",
324
+ channelManager?: any
325
+ ): Promise<Response> {
326
+ try {
327
+ if (!channelManager) {
328
+ return addCorsHeaders(new Response("Channel manager not available", { status: 500 }), req);
329
+ }
330
+
331
+ if (action === "start") {
332
+ await channelManager.startChannel(name, accountId);
333
+ } else {
334
+ await channelManager.stopChannel(name, accountId);
335
+ }
336
+ return addCorsHeaders(Response.json({ success: true }), req);
337
+ } catch (error) {
338
+ return addCorsHeaders(Response.json(
339
+ { success: false, error: (error as Error).message },
340
+ { status: 500 }
341
+ ), req);
342
+ }
343
+ }
344
+
345
+ export async function handleUpdateChannelSettings(
346
+ req: Request,
347
+ addCorsHeaders: (r: Response, req: Request) => Response,
348
+ channelId: string
349
+ ): Promise<Response> {
350
+ const body = await req.json().catch(() => ({})) as Record<string, unknown>;
351
+ const allowed = ["voice_enabled", "tts_enabled", "stt_provider", "tts_provider", "tts_voice_id", "step_delivery_mode", "vision_enabled", "ocr_provider", "vision_provider", "vision_model_id"] as const;
352
+ const updates: string[] = [];
353
+ const params: unknown[] = [];
354
+
355
+ for (const key of allowed) {
356
+ if (key in body) {
357
+ updates.push(`${key} = ?`);
358
+ params.push(typeof body[key] === "boolean" ? (body[key] ? 1 : 0) : body[key]);
359
+ }
360
+ }
361
+
362
+ // Merge type-specific config into config_encrypted if body.config is provided
363
+ const newConfig = body.config as Record<string, unknown> | undefined;
364
+ if (newConfig && typeof newConfig === "object" && Object.keys(newConfig).length > 0) {
365
+ const exists = getDb().query(`SELECT id FROM channels WHERE id = ?`).get(channelId);
366
+ if (exists) {
367
+ const currentConfig = await loadChannelConfig(channelId);
368
+ await storeChannelConfig(channelId, { ...currentConfig, ...newConfig });
369
+ }
370
+ }
371
+
372
+ if (updates.length === 0) {
373
+ return addCorsHeaders(Response.json({ error: "No valid fields to update" }, { status: 400 }), req);
374
+ }
375
+
376
+ params.push(channelId);
377
+ getDb().query(`UPDATE channels SET ${updates.join(", ")} WHERE id = ?`).run(...params as any[]);
378
+
379
+ return addCorsHeaders(Response.json({ success: true }), req);
380
+ }
381
+
382
+ export async function handleToggleChannel(
383
+ req: Request,
384
+ addCorsHeaders: (r: Response, req: Request) => Response,
385
+ channelId: string
386
+ ): Promise<Response> {
387
+ const body = await req.json().catch(() => ({}));
388
+ const { active } = body;
389
+
390
+ if (active === undefined) {
391
+ return addCorsHeaders(Response.json({ success: false, error: "Missing active field", message: "Falta el campo 'active'" }, { status: 400 }), req);
392
+ }
393
+
394
+ getDb().query(`UPDATE channels SET active = ?, enabled = ? WHERE id = ?`).run(active ? 1 : 0, active ? 1 : 0, channelId);
395
+
396
+ return addCorsHeaders(Response.json({ success: true, active, message: active ? `Canal "${channelId}" activado` : `Canal "${channelId}" desactivado` }), req);
397
+ }
398
+
399
+ export async function handleGetWhatsAppDetails(
400
+ req: Request,
401
+ addCorsHeaders: (r: Response, req: Request) => Response,
402
+ channelId: string,
403
+ channelManager?: any
404
+ ): Promise<Response> {
405
+ if (!channelManager) {
406
+ return addCorsHeaders(Response.json({ error: "Channel manager not available", status: 500 }), req);
407
+ }
408
+
409
+ const details = channelManager.getWhatsAppDetails(channelId);
410
+ if (!details) {
411
+ return addCorsHeaders(Response.json({ error: "WhatsApp channel not found", status: 404 }), req);
412
+ }
413
+
414
+ return addCorsHeaders(Response.json(details), req);
415
+ }
416
+
417
+ export async function handleDisconnectWhatsApp(
418
+ req: Request,
419
+ addCorsHeaders: (r: Response, req: Request) => Response,
420
+ channelId: string,
421
+ channelManager?: any
422
+ ): Promise<Response> {
423
+ const body = await req.json().catch(() => ({}));
424
+ const { clearSession } = body;
425
+
426
+ if (!channelManager) {
427
+ return addCorsHeaders(Response.json({ success: false, error: "Channel manager not available", status: 500 }), req);
428
+ }
429
+
430
+ const key = `whatsapp:${channelId}`;
431
+ const channel = channelManager.channels?.get?.(key);
432
+
433
+ if (!channel) {
434
+ return addCorsHeaders(Response.json({ success: false, error: "WhatsApp channel not found", status: 404 }), req);
435
+ }
436
+
437
+ try {
438
+ if (typeof (channel as any).disconnect === "function") {
439
+ await (channel as any).disconnect(clearSession === true);
440
+ }
441
+ return addCorsHeaders(Response.json({ success: true }), req);
442
+ } catch (error) {
443
+ return addCorsHeaders(Response.json({ success: false, error: (error as Error).message }, { status: 500 }), req);
444
+ }
445
+ }
446
+
447
+ export async function handleUpdateWhatsAppConfig(
448
+ req: Request,
449
+ addCorsHeaders: (r: Response, req: Request) => Response,
450
+ channelId: string,
451
+ channelManager?: any
452
+ ): Promise<Response> {
453
+ const body = await req.json().catch(() => ({}));
454
+ const { acceptGroups, reconnectMaxAttempts, reconnectBaseDelayMs, dmPolicy, selfMessagesOnly, allowFrom } = body;
455
+
456
+ // Read and decrypt the existing config, merge new values, then re-encrypt.
457
+ // These fields live inside config_encrypted — not as top-level columns.
458
+ const row = getDb().query(`SELECT config_encrypted, config_iv FROM channels WHERE id = ?`)
459
+ .get(channelId) as { config_encrypted: string | null; config_iv: string | null } | undefined;
460
+
461
+ if (!row) {
462
+ return addCorsHeaders(Response.json({ success: false, error: "Channel not found" }, { status: 404 }), req);
463
+ }
464
+
465
+ const currentConfig = await loadChannelConfig(channelId);
466
+ const merged: Record<string, unknown> = { ...currentConfig };
467
+ if (acceptGroups !== undefined) merged.acceptGroups = Boolean(acceptGroups);
468
+ if (reconnectMaxAttempts !== undefined) merged.reconnectMaxAttempts = Number(reconnectMaxAttempts);
469
+ if (reconnectBaseDelayMs !== undefined) merged.reconnectBaseDelayMs = Number(reconnectBaseDelayMs);
470
+ if (dmPolicy !== undefined) merged.dmPolicy = dmPolicy;
471
+ if (selfMessagesOnly !== undefined) merged.selfMessagesOnly = Boolean(selfMessagesOnly);
472
+ if (allowFrom !== undefined) merged.allowFrom = Array.isArray(allowFrom) ? allowFrom : [];
473
+ await storeChannelConfig(channelId, merged);
474
+
475
+ // Restart the running channel so it picks up the new config immediately.
476
+ if (channelManager) {
477
+ try {
478
+ await channelManager.removeChannel("whatsapp", channelId);
479
+ await channelManager.addChannel("whatsapp", channelId, merged);
480
+ } catch { /* ignore restart errors */ }
481
+ }
482
+
483
+ return addCorsHeaders(Response.json({ success: true }), req);
484
+ }