@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,271 @@
1
+ import { existsSync, readdirSync } from "fs"
2
+ import { join } from "path"
3
+ import { homedir } from "os"
4
+ import { installLlamaServer, downloadModel, listLocalModels, BIN_DIR, MODELS_DIR } from "../llm-local/downloader"
5
+ import { llamaManager, type ServerMode } from "../llm-local/manager"
6
+ import { getRecommendedModel } from "../llm-local/models"
7
+ import { detectGPU } from "../llm-local/detector"
8
+ // lmmManager se encarga de los procesos
9
+
10
+ // Datos de LLM en HIVE_HOME/llm/
11
+ const LLM_ROOT =
12
+ process.env.HIVE_LLM_ROOT ??
13
+ join(process.env.HIVE_HOME ?? join(homedir(), ".hive"), "llm-local")
14
+
15
+ const BIN_DIR_PATH = join(LLM_ROOT, "bin")
16
+ const MODELS_DIR_PATH = join(LLM_ROOT, "models")
17
+
18
+ let installing = false
19
+ let installLogs: string[] = []
20
+ let downloadingModelId: string | null = null
21
+
22
+ async function getInstalledStatus() {
23
+ const { LLAMA_CPP_DEFAULT_VER } = await import("../llm-local/detector")
24
+ const gpu = await detectGPU()
25
+ const ext = process.platform === "win32" ? ".exe" : ""
26
+ const binaryPath = join(BIN_DIR_PATH, `llama-${LLAMA_CPP_DEFAULT_VER}/llama-server${ext}`)
27
+ const binaryExists = existsSync(binaryPath)
28
+ const models = listLocalModels()
29
+ const anyModelExists = models.some(m => m.downloaded)
30
+
31
+ const activeServers = llamaManager.getStatus()
32
+ const running = activeServers.length > 0
33
+
34
+ return {
35
+ gpu,
36
+ binaryExists,
37
+ anyModelExists,
38
+ installed: binaryExists && anyModelExists,
39
+ running,
40
+ activeServers,
41
+ models
42
+ }
43
+ }
44
+
45
+ // Ya no usamos isRunning con fetch directo aquí, sino vía manager
46
+
47
+ export async function handleGetLocalLLMStatus(
48
+ req: Request,
49
+ addCors: (r: Response, req: Request) => Response
50
+ ): Promise<Response> {
51
+ const status = await getInstalledStatus()
52
+ return addCors(
53
+ Response.json({
54
+ ...status,
55
+ installing,
56
+ downloadingModelId
57
+ }),
58
+ req
59
+ )
60
+ }
61
+
62
+ export async function handleGetLocalLLMLogs(
63
+ req: Request,
64
+ addCors: (r: Response, req: Request) => Response
65
+ ): Promise<Response> {
66
+ const mode = new URL(req.url).searchParams.get("mode") as ServerMode || "TEXT"
67
+
68
+ // Return an SSE stream instead of a normal JSON response
69
+ const stream = new ReadableStream({
70
+ start(controller) {
71
+ const sendEvent = (data: any) => {
72
+ controller.enqueue(new TextEncoder().encode(`data: ${JSON.stringify(data)}\n\n`))
73
+ }
74
+
75
+ // Send initial state
76
+ sendEvent({ logs: installLogs.slice(-100), serverLogs: llamaManager.getLogs(mode).slice(-100), llmRoot: LLM_ROOT })
77
+
78
+ // Create an interval to push new logs (or use EventEmitter if available)
79
+ let lastInstallLogCount = installLogs.length
80
+ let lastServerLogCount = llamaManager.getLogs(mode).length
81
+
82
+ const interval = setInterval(() => {
83
+ const currentInstallLogs = installLogs
84
+ const currentServerLogs = llamaManager.getLogs(mode)
85
+
86
+ let hasChanges = false
87
+ const payload: any = {}
88
+
89
+ if (currentInstallLogs.length > lastInstallLogCount) {
90
+ payload.logs = currentInstallLogs.slice(lastInstallLogCount)
91
+ lastInstallLogCount = currentInstallLogs.length
92
+ hasChanges = true
93
+ }
94
+
95
+ if (currentServerLogs.length > lastServerLogCount) {
96
+ payload.serverLogs = currentServerLogs.slice(lastServerLogCount)
97
+ lastServerLogCount = currentServerLogs.length
98
+ hasChanges = true
99
+ }
100
+
101
+ if (hasChanges) {
102
+ sendEvent(payload)
103
+ }
104
+ }, 500) // Push changes every 500ms
105
+
106
+ req.signal.addEventListener("abort", () => {
107
+ clearInterval(interval)
108
+ controller.close()
109
+ })
110
+ }
111
+ })
112
+
113
+ const response = new Response(stream, {
114
+ headers: {
115
+ "Content-Type": "text/event-stream",
116
+ "Cache-Control": "no-cache",
117
+ "Connection": "keep-alive"
118
+ }
119
+ })
120
+
121
+ return addCors(response, req)
122
+ }
123
+
124
+ export async function handleInstallLocalLLM(
125
+ req: Request,
126
+ addCors: (r: Response, req: Request) => Response
127
+ ): Promise<Response> {
128
+ if (installing) {
129
+ return addCors(Response.json({ started: false, reason: "Ya hay una instalación en curso" }), req)
130
+ }
131
+
132
+ installing = true
133
+ installLogs = [`[${new Date().toISOString()}] Iniciando configuración de Local LLM...`]
134
+ installLogs.push(` LLM_ROOT: ${LLM_ROOT}`)
135
+
136
+ // Background installation (solo binario, NO modelos)
137
+ ;(async () => {
138
+ try {
139
+ installLogs.push("Detectando GPU...")
140
+ const gpu = await detectGPU()
141
+ installLogs.push(`GPU detectada: ${gpu.deviceName || 'CPU'} (${gpu.backend})`)
142
+
143
+ installLogs.push("Instalando llama-server oficial...")
144
+ await installLlamaServer()
145
+ installLogs.push(`[${new Date().toISOString()}] ✓ llama-server instalado`)
146
+ installLogs.push(`[${new Date().toISOString()}] Ahora descarga un modelo desde la sección de modelos para empezar a usar el LLM local.`)
147
+ } catch (err) {
148
+ const msg = err instanceof Error ? err.message : String(err)
149
+ installLogs.push(`[error] Falló la instalación: ${msg}`)
150
+ console.error(`[llm-local install] Error:`, err)
151
+ } finally {
152
+ installing = false
153
+ }
154
+ })()
155
+
156
+ return addCors(Response.json({ started: true }), req)
157
+ }
158
+
159
+ export async function handleDownloadLLMModel(
160
+ req: Request,
161
+ addCors: (r: Response, req: Request) => Response
162
+ ): Promise<Response> {
163
+ let body: { modelId?: any }
164
+ try {
165
+ body = await req.json()
166
+ } catch {
167
+ return addCors(Response.json({ error: "Body JSON inválido" }, { status: 400 }), req)
168
+ }
169
+
170
+ const { modelId } = body
171
+ if (!modelId) {
172
+ return addCors(Response.json({ error: "modelId requerido" }, { status: 400 }), req)
173
+ }
174
+
175
+ if (downloadingModelId) {
176
+ return addCors(Response.json({ error: "Ya hay una descarga en curso" }, { status: 409 }), req)
177
+ }
178
+
179
+ downloadingModelId = modelId
180
+ installLogs.push(`[${new Date().toISOString()}] Iniciando descarga de modelo: ${modelId}`)
181
+
182
+ // Background download
183
+ ;(async () => {
184
+ try {
185
+ await downloadModel(modelId, (d, t) => {
186
+ // Opcional: Podríamos emitir eventos por WS si quisiéramos progreso real en UI
187
+ })
188
+ installLogs.push(`✓ Modelo ${modelId} descargado exitosamente`)
189
+ } catch (err) {
190
+ const msg = err instanceof Error ? err.message : String(err)
191
+ installLogs.push(`[error] Error descargando ${modelId}: ${msg}`)
192
+ } finally {
193
+ downloadingModelId = null
194
+ }
195
+ })()
196
+
197
+ return addCors(Response.json({ started: true }), req)
198
+ }
199
+
200
+ export async function handleStartLocalLLM(
201
+ req: Request,
202
+ addCors: (r: Response, req: Request) => Response
203
+ ): Promise<Response> {
204
+ let body: { mode?: ServerMode; modelId?: string } = {}
205
+ try {
206
+ body = await req.json()
207
+ } catch { /* ignore if no body */ }
208
+
209
+ const mode = body.mode || "TEXT"
210
+ const modelId = body.modelId || getRecommendedModel(mode.toLowerCase() as any)
211
+
212
+ const status = await getInstalledStatus()
213
+ if (!status.installed && !status.binaryExists) {
214
+ return addCors(
215
+ Response.json({ started: false, reason: "LLM no está instalado (binario faltante)." }, { status: 400 }),
216
+ req
217
+ )
218
+ }
219
+
220
+ try {
221
+ installLogs.push(`[llm-server] Iniciando servidor en modo ${mode} con modelo ${modelId}...`)
222
+ await llamaManager.start(mode, modelId as any)
223
+ installLogs.push(`[llm-server] Servidor ${mode} iniciado correctamente.`)
224
+ return addCors(Response.json({ started: true, mode }), req)
225
+ } catch (err) {
226
+ const msg = err instanceof Error ? err.message : String(err)
227
+ installLogs.push(`[error] Servidor LLM falló al iniciar: ${msg}`)
228
+ return addCors(Response.json({ started: false, reason: msg }), req)
229
+ }
230
+ }
231
+
232
+ export async function handleStopLocalLLM(
233
+ req: Request,
234
+ addCors: (r: Response, req: Request) => Response
235
+ ): Promise<Response> {
236
+ let body: { mode?: ServerMode } = {}
237
+ try {
238
+ body = await req.json()
239
+ } catch { /* ignore */ }
240
+
241
+ if (body.mode) {
242
+ llamaManager.stop(body.mode)
243
+ } else {
244
+ llamaManager.stopAll()
245
+ }
246
+
247
+ return addCors(Response.json({ stopped: true }), req)
248
+ }
249
+
250
+ /**
251
+ * Verifica el estado del LLM local al iniciar el gateway.
252
+ * NO auto-inicia el servidor ni descarga nada — el usuario debe hacerlo manualmente.
253
+ */
254
+ export async function initializeLocalLLM() {
255
+ try {
256
+ const status = await getInstalledStatus()
257
+ if (status.binaryExists) {
258
+ console.log(`[llm-local] ✓ Binario llama-server encontrado.`)
259
+ if (status.anyModelExists) {
260
+ console.log(`[llm-local] ✓ Modelos disponibles: ${status.models.filter(m => m.downloaded).map(m => m.id).join(", ")}`)
261
+ console.log(`[llm-local] ℹ️ Servidor NO auto-iniciado. Usa la UI para iniciar cuando lo necesites.`)
262
+ } else {
263
+ console.log(`[llm-local] ⚠️ No hay modelos descargados. Descarga uno desde la UI.`)
264
+ }
265
+ } else {
266
+ console.log(`[llm-local] ℹ️ llama-server no instalado. Instálalo desde la UI si deseas usar LLM local.`)
267
+ }
268
+ } catch (err) {
269
+ console.error(`[llm-local] Error verificando estado: ${err instanceof Error ? err.message : String(err)}`)
270
+ }
271
+ }
@@ -0,0 +1,319 @@
1
+ import { getDb } from "../../storage/sqlite.ts"
2
+ import { storeMcpHeaders, loadMcpHeaders, deleteMcpSecrets } from "../../storage/crypto.ts"
3
+ import { logger } from "../../utils/logger.ts"
4
+
5
+ const mcpLog = logger.child("mcp:api")
6
+
7
+ export async function handleGetMcpServers(
8
+ req: Request,
9
+ addCorsHeaders: (r: Response, req: Request) => Response,
10
+ mcpManager?: any
11
+ ): Promise<Response> {
12
+ const db = getDb()
13
+
14
+ // Get real-time server status from MCP manager
15
+ const mcpServers = new Map<string, { status: string; tools: any[] }>()
16
+ if (mcpManager) {
17
+ try {
18
+ const servers = mcpManager.listServers?.() || []
19
+ mcpLog.info(`[GET] MCP Manager returned ${servers.length} servers:`, servers.map((s: any) => `${s.name}:${s.status}`))
20
+ for (const s of servers) {
21
+ mcpServers.set(s.name, {
22
+ status: s.status,
23
+ tools: s.tools || [],
24
+ })
25
+ }
26
+ } catch (e) {
27
+ mcpLog.warn(`Failed to get MCP servers: ${(e as Error).message}`)
28
+ }
29
+ } else {
30
+ mcpLog.warn(`[GET] No MCP Manager provided`)
31
+ }
32
+
33
+ // Get all servers from database
34
+ const dbServers = db.query(`
35
+ SELECT * FROM mcp_servers ORDER BY name
36
+ `).all() as Record<string, unknown>[]
37
+
38
+ // Combine DB info with real-time status from MCP manager
39
+ const allServers = await Promise.all(dbServers.map(async s => {
40
+ // Try to find matching server in MCP Manager (by name or normalized name)
41
+ const normalizedName = (s.name as string).toLowerCase().replace(/[^a-z0-9-]/g, '-')
42
+ const mcpServer = mcpServers.get(s.name as string) || mcpServers.get(normalizedName)
43
+ const isEnabled = s.enabled === 1
44
+
45
+ // Redact headers for safe UI display
46
+ const rawHeaders = await loadMcpHeaders(s.id as string)
47
+ const headers = Object.keys(rawHeaders).length > 0
48
+ ? Object.fromEntries(
49
+ Object.entries(rawHeaders).map(([k, v]) => [
50
+ k,
51
+ k.toLowerCase().includes("auth") ||
52
+ k.toLowerCase().includes("token") ||
53
+ k.toLowerCase().includes("key")
54
+ ? `${(v as string).slice(0, 4)}••••••••`
55
+ : v,
56
+ ])
57
+ )
58
+ : undefined
59
+
60
+ return {
61
+ id: s.id,
62
+ name: s.name,
63
+ enabled: isEnabled,
64
+ status: mcpServer?.status || (isEnabled ? "disconnected" : "disconnected"),
65
+ config: {
66
+ transport: s.transport,
67
+ command: s.command,
68
+ args: s.args ? JSON.parse(s.args as string) : [],
69
+ url: s.url,
70
+ headers,
71
+ enabled: isEnabled
72
+ },
73
+ tools_count: mcpServer?.tools.length || s.tools_count || 0,
74
+ tools: mcpServer?.tools || [],
75
+ }
76
+ }))
77
+
78
+ return addCorsHeaders(Response.json(allServers), req)
79
+ }
80
+
81
+ export async function handleCreateMcpServer(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
82
+ const body = await req.json().catch(() => ({}))
83
+ const db = getDb()
84
+
85
+ if (!body.name || !body.config) {
86
+ return addCorsHeaders(new Response("Missing name or config", { status: 400 }), req)
87
+ }
88
+
89
+ mcpLog.info(`Creating MCP server: ${body.name}`)
90
+
91
+ // Generate unique ID (name-based for consistency)
92
+ const serverId = body.name.toLowerCase().replace(/[^a-z0-9-]/g, '-')
93
+
94
+ // Save to database
95
+ db.query(`
96
+ INSERT INTO mcp_servers(id, name, transport, command, args, url, enabled, builtin, status)
97
+ VALUES(?, ?, ?, ?, ?, ?, ?, 0, 'disconnected')
98
+ `).run(
99
+ serverId,
100
+ body.name,
101
+ body.config.transport || "stdio",
102
+ body.config.command || null,
103
+ body.config.args ? JSON.stringify(body.config.args) : null,
104
+ body.config.url || null,
105
+ body.config.enabled !== false ? 1 : 0
106
+ )
107
+
108
+ if (body.config.headers) {
109
+ await storeMcpHeaders(serverId, body.config.headers)
110
+ }
111
+
112
+ return addCorsHeaders(Response.json({ success: true, id: serverId }), req)
113
+ }
114
+
115
+ export async function handleDeleteMcpServer(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
116
+ const url = new URL(req.url)
117
+ // Extract server name from path: /api/mcp/servers/{name}
118
+ const parts = url.pathname.split("/").filter(Boolean)
119
+ const serverName = parts[parts.length - 1]
120
+
121
+ if (!serverName || serverName === "servers") {
122
+ return addCorsHeaders(Response.json({ success: false, error: "server name required" }), req)
123
+ }
124
+
125
+ // Delete from DB and keychain
126
+ const row = getDb().query(`SELECT id FROM mcp_servers WHERE id = ? OR name = ?`).get(serverName, serverName) as { id: string } | undefined
127
+ getDb().query(`DELETE FROM mcp_servers WHERE id = ? OR name = ?`).run(serverName, serverName)
128
+ if (row?.id) await deleteMcpSecrets(row.id)
129
+
130
+ return addCorsHeaders(Response.json({ success: true }), req)
131
+ }
132
+
133
+ export async function handleGetMcpServerDetail(
134
+ req: Request,
135
+ addCorsHeaders: (r: Response, req: Request) => Response,
136
+ serverId: string
137
+ ): Promise<Response> {
138
+ const db = getDb()
139
+ const server = db.query(`SELECT * FROM mcp_servers WHERE id = ? OR name = ?`).get(serverId, serverId) as Record<string, unknown> | undefined
140
+
141
+ if (!server) {
142
+ return addCorsHeaders(new Response("Server not found", { status: 404 }), req)
143
+ }
144
+
145
+ // Load headers — unredacted, for editing
146
+ const rawDetail = await loadMcpHeaders(server.id as string)
147
+ const headers = Object.keys(rawDetail).length > 0 ? rawDetail as Record<string, string> : undefined
148
+
149
+ return addCorsHeaders(Response.json({
150
+ id: server.id,
151
+ name: server.name,
152
+ transport: server.transport,
153
+ command: server.command ?? null,
154
+ args: server.args ? JSON.parse(server.args as string) : [],
155
+ url: server.url ?? null,
156
+ headers,
157
+ enabled: server.enabled === 1,
158
+ builtin: server.builtin === 1,
159
+ status: server.status,
160
+ tools_count: server.tools_count ?? 0,
161
+ }), req)
162
+ }
163
+
164
+ export async function handleUpdateMcpServer(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
165
+ const url = new URL(req.url)
166
+ // Extract server name from path: /api/mcp/servers/{name}
167
+ const parts = url.pathname.split("/").filter(Boolean)
168
+ const serverName = parts[parts.length - 1]
169
+ const body = await req.json().catch(() => ({}))
170
+ const db = getDb()
171
+
172
+ if (!serverName || serverName === "servers") {
173
+ return addCorsHeaders(new Response("Missing server name", { status: 400 }), req)
174
+ }
175
+
176
+ mcpLog.info(`Updating MCP server: ${serverName}`)
177
+
178
+ const updates: string[] = []
179
+ const params: unknown[] = []
180
+
181
+ if (body.transport !== undefined) {
182
+ updates.push("transport = ?")
183
+ params.push(body.transport)
184
+ }
185
+ if (body.name !== undefined) {
186
+ updates.push("name = ?")
187
+ params.push(body.name)
188
+ }
189
+ if (body.command !== undefined) {
190
+ updates.push("command = ?")
191
+ params.push(body.command)
192
+ }
193
+ if (body.args !== undefined) {
194
+ updates.push("args = ?")
195
+ params.push(JSON.stringify(body.args))
196
+ }
197
+ if (body.url !== undefined) {
198
+ updates.push("url = ?")
199
+ params.push(body.url)
200
+ }
201
+ if (body.enabled !== undefined) {
202
+ updates.push("enabled = ?")
203
+ params.push(body.enabled ? 1 : 0)
204
+ }
205
+ if (updates.length > 0) {
206
+ params.push(serverName)
207
+ params.push(serverName)
208
+ db.query(`UPDATE mcp_servers SET ${updates.join(", ")} WHERE id = ? OR name = ?`).run(...params as any[])
209
+ }
210
+
211
+ if (body.headers) {
212
+ await storeMcpHeaders(serverName, body.headers)
213
+ }
214
+
215
+ return addCorsHeaders(Response.json({ success: true }), req)
216
+ }
217
+
218
+ export async function handleStartMcpServer(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
219
+ const url = new URL(req.url)
220
+ const serverId = url.pathname.split("/").pop()
221
+
222
+ if (!serverId) {
223
+ return addCorsHeaders(Response.json({ success: false, error: "serverId required" }), req)
224
+ }
225
+
226
+ getDb().query(`UPDATE mcp_servers SET enabled = 1 WHERE id = ?`).run(serverId)
227
+
228
+ return addCorsHeaders(Response.json({ success: true, serverId, enabled: true }), req)
229
+ }
230
+
231
+ export async function handleGetMcpServerTools(
232
+ req: Request,
233
+ addCorsHeaders: (r: Response, req: Request) => Response,
234
+ serverName: string,
235
+ mcpManager?: any
236
+ ): Promise<Response> {
237
+ if (!mcpManager) {
238
+ return addCorsHeaders(Response.json([]), req)
239
+ }
240
+
241
+ const tools = mcpManager.getServerTools(serverName)
242
+ return addCorsHeaders(Response.json(tools), req)
243
+ }
244
+
245
+ export async function handleToggleMcpServer(
246
+ req: Request,
247
+ addCorsHeaders: (r: Response, req: Request) => Response,
248
+ mcpId: string
249
+ ): Promise<Response> {
250
+ const body = await req.json().catch(() => ({}))
251
+ const { active } = body
252
+
253
+ if (active === undefined) {
254
+ return addCorsHeaders(Response.json({ success: false, error: "Missing active field", message: "Falta el campo 'active'" }, { status: 400 }), req)
255
+ }
256
+
257
+ getDb().query(`UPDATE mcp_servers SET active = ?, enabled = ? WHERE id = ?`).run(active ? 1 : 0, active ? 1 : 0, mcpId)
258
+
259
+ return addCorsHeaders(Response.json({ success: true, active, message: active ? "Servidor MCP activado" : "Servidor MCP desactivado" }), req)
260
+ }
261
+
262
+ export async function handleMcpServerAction(
263
+ req: Request,
264
+ addCorsHeaders: (r: Response, req: Request) => Response,
265
+ serverName: string,
266
+ action: "connect" | "disconnect",
267
+ mcpManager?: any
268
+ ): Promise<Response> {
269
+ if (!mcpManager) {
270
+ return addCorsHeaders(new Response("MCP is disabled", { status: 404 }), req)
271
+ }
272
+
273
+ const db = getDb()
274
+
275
+ if (action === "connect") {
276
+ // Check if server exists and is enabled in DB
277
+ const dbServer = db.query(`SELECT * FROM mcp_servers WHERE name = ? AND enabled = 1`).get(serverName)
278
+ if (!dbServer) {
279
+ return new Response("Server not found or disabled", { status: 400 })
280
+ }
281
+
282
+ await mcpManager.connectServer(serverName)
283
+
284
+ // Update tools count after connection
285
+ const tools = mcpManager.getServerTools(serverName) || []
286
+ db.query(`UPDATE mcp_servers SET status = ?, tools_count = ? WHERE name = ?`).run("connected", tools.length, serverName)
287
+
288
+ return addCorsHeaders(Response.json({ success: true, tools_count: tools.length }), req)
289
+ }
290
+
291
+ if (action === "disconnect") {
292
+ await mcpManager.disconnectServer(serverName)
293
+ return addCorsHeaders(Response.json({ success: true }), req)
294
+ }
295
+
296
+ return addCorsHeaders(new Response("Invalid action", { status: 400 }), req)
297
+ }
298
+
299
+ /**
300
+ * Get tools for a specific MCP server
301
+ * Note: Tools are loaded from MCP Manager at runtime, not from DB
302
+ */
303
+ export async function handleGetMCPServerTools(
304
+ req: Request,
305
+ addCorsHeaders: (r: Response, req: Request) => Response,
306
+ serverId: string,
307
+ mcpManager?: any
308
+ ): Promise<Response> {
309
+ if (!mcpManager) {
310
+ return addCorsHeaders(new Response("MCP is disabled", { status: 404 }), req);
311
+ }
312
+
313
+ const tools = mcpManager.getServerTools(serverId) || [];
314
+
315
+ return addCorsHeaders(Response.json({ tools }), req);
316
+ }
317
+
318
+ // Note: handleToggleMCPTool and handleDeleteMCPTool removed
319
+ // MCP tools are not stored in DB - they are loaded at runtime from servers