@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,50 @@
1
+ /**
2
+ * Hive TTS — Índice de modelos disponibles
3
+ * Modelos en español desde HuggingFace
4
+ */
5
+
6
+ export interface TTSModel {
7
+ id: string
8
+ name: string
9
+ language: string
10
+ quality: "low" | "medium" | "high"
11
+ size: string
12
+ modelUrl: string
13
+ configUrl: string
14
+ }
15
+
16
+ const HF_BASE = "https://huggingface.co/spaces/HirCoir/Piper-TTS-Spanish/resolve/main"
17
+
18
+ export const TTS_MODELS: TTSModel[] = [
19
+ {
20
+ id: "es_MX-claude-14947-epoch-high",
21
+ name: "Claude (México)",
22
+ language: "es-MX",
23
+ quality: "high",
24
+ size: "63.1 MB",
25
+ modelUrl: `${HF_BASE}/es_MX-claude-14947-epoch-high.onnx`,
26
+ configUrl: `${HF_BASE}/es_MX-claude-14947-epoch-high.onnx.json`,
27
+ },
28
+ {
29
+ id: "es_MX-cortana-19669-epoch-high",
30
+ name: "Cortana (México)",
31
+ language: "es-MX",
32
+ quality: "high",
33
+ size: "63.1 MB",
34
+ modelUrl: `${HF_BASE}/es_MX-cortana-19669-epoch-high.onnx`,
35
+ configUrl: `${HF_BASE}/es_MX-cortana-19669-epoch-high.onnx.json`,
36
+ },
37
+ {
38
+ id: "es_MX-gevy-10196-epoch-high",
39
+ name: "Gevy (México)",
40
+ language: "es-MX",
41
+ quality: "high",
42
+ size: "63.1 MB",
43
+ modelUrl: `${HF_BASE}/es_MX-gevy-10196-epoch-high.onnx`,
44
+ configUrl: `${HF_BASE}/es_MX-gevy-10196-epoch-high.onnx.json`,
45
+ },
46
+ ]
47
+
48
+ export function getModelById(id: string): TTSModel | undefined {
49
+ return TTS_MODELS.find((m) => m.id === id)
50
+ }
@@ -0,0 +1,252 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Hive TTS Server
4
+ * HTTP server local que expone Piper TTS como API REST
5
+ * Puerto: 5500 (configurable con env TTS_PORT)
6
+ *
7
+ * GET /health → { ok: true, voice: string, voices: string[] }
8
+ * POST /tts → audio/wav binary
9
+ * GET /voices → { voices: string[] }
10
+ */
11
+
12
+ import { existsSync, readdirSync, readFileSync } from "fs"
13
+ import { join } from "path"
14
+ import { homedir } from "os"
15
+ import { detectPlatform, getPiperBinaryName, DEFAULT_VOICE } from "./detect.js"
16
+
17
+ const log = {
18
+ info: (msg: string) => console.log(`[TTS] ${msg}`),
19
+ warn: (msg: string) => console.warn(`[TTS] ${msg}`),
20
+ error: (msg: string) => console.error(`[TTS] ${msg}`),
21
+ }
22
+
23
+ const TTS_ROOT =
24
+ process.env.HIVE_TTS_ROOT ??
25
+ join(process.env.HIVE_HOME ?? join(homedir(), ".hive"), "tts")
26
+ const BIN_DIR = join(TTS_ROOT, "bin")
27
+ const VOICES_DIR = join(TTS_ROOT, "voices")
28
+ const PORT = Number(process.env.TTS_PORT ?? 5500)
29
+ const DEFAULT_VOICE_ENV = process.env.TTS_VOICE ?? DEFAULT_VOICE
30
+
31
+ function getPiperPath(): string {
32
+ const platform = detectPlatform()
33
+ const binaryName = getPiperBinaryName(platform)
34
+ const binaryPath = join(BIN_DIR, binaryName)
35
+
36
+ if (!existsSync(binaryPath)) {
37
+ throw new Error("Piper no instalado. Ejecuta: bun run src/install.ts")
38
+ }
39
+ return binaryPath
40
+ }
41
+
42
+ function listVoices(): string[] {
43
+ if (!existsSync(VOICES_DIR)) return []
44
+ return readdirSync(VOICES_DIR)
45
+ .filter((f) => f.endsWith(".onnx"))
46
+ .map((f) => f.replace(".onnx", ""))
47
+ }
48
+
49
+ async function synthesize(text: string, voice: string): Promise<ArrayBuffer> {
50
+ const piperPath = getPiperPath()
51
+ let modelPath = join(VOICES_DIR, `${voice}.onnx`)
52
+ let configPath = join(VOICES_DIR, `${voice}.onnx.json`)
53
+
54
+ if (!existsSync(modelPath)) {
55
+ console.warn(`[TTS] Voz no encontrada: ${voice}. Usando por defecto: ${DEFAULT_VOICE}`);
56
+ voice = DEFAULT_VOICE;
57
+ modelPath = join(VOICES_DIR, `${voice}.onnx`);
58
+ configPath = join(VOICES_DIR, `${voice}.onnx.json`);
59
+
60
+ if (!existsSync(modelPath)) {
61
+ throw new Error(`Ni siquiera la voz por defecto se encuentra: ${voice}`);
62
+ }
63
+ }
64
+
65
+ // Leer configuración del modelo para obtener parámetros de inferencia
66
+ let lengthScale = 0.95 // Más lento = más natural
67
+ let noiseScale = 0.6 // Menos variación = más consistente
68
+ let noiseW = 0.75 // Más suave = menos artefactos
69
+ let sentenceSilence = 0.2 // Pausa entre frases para naturalidad
70
+
71
+ if (existsSync(configPath)) {
72
+ try {
73
+ const config = JSON.parse(readFileSync(configPath, "utf-8"))
74
+ const inference = config.inference || {}
75
+
76
+ // Usar valores del modelo con ajustes para mejorar naturalidad
77
+ lengthScale = (inference.length_scale ?? 1) * 0.95
78
+ noiseScale = (inference.noise_scale ?? 0.667) * 0.9
79
+ noiseW = (inference.noise_w ?? 0.8) * 0.95
80
+ } catch (err) {
81
+ log.warn(`No se pudo leer configuración del modelo: ${err}`)
82
+ }
83
+ }
84
+
85
+ // Sobrescribir con variables de entorno si existen
86
+ lengthScale = Number(process.env.PIPER_LENGTH_SCALE ?? lengthScale)
87
+ noiseScale = Number(process.env.PIPER_NOISE_SCALE ?? noiseScale)
88
+ noiseW = Number(process.env.PIPER_NOISE_W ?? noiseW)
89
+ sentenceSilence = Number(process.env.PIPER_SENTENCE_SILENCE ?? sentenceSilence)
90
+
91
+ const args = [
92
+ piperPath,
93
+ "--model", modelPath,
94
+ "--output-raw",
95
+ "--length_scale", String(lengthScale),
96
+ "--noise_scale", String(noiseScale),
97
+ "--noise_w", String(noiseW),
98
+ "--sentence_silence", String(sentenceSilence),
99
+ ]
100
+
101
+ const proc = Bun.spawn(
102
+ args,
103
+ {
104
+ stdin: "pipe",
105
+ stdout: "pipe",
106
+ stderr: "pipe",
107
+ }
108
+ )
109
+
110
+ proc.stdin.write(new TextEncoder().encode(text))
111
+ proc.stdin.end()
112
+
113
+ const [audioBuffer, exitCode] = await Promise.all([
114
+ new Response(proc.stdout).arrayBuffer(),
115
+ proc.exited,
116
+ ])
117
+
118
+ if (exitCode !== 0) {
119
+ const errText = await new Response(proc.stderr).text()
120
+ throw new Error(`Piper error (exit ${exitCode}): ${errText}`)
121
+ }
122
+
123
+ // --output-raw devuelve PCM 16-bit LE 22050Hz mono — envolver en WAV header
124
+ return wrapInWav(audioBuffer, 22050, 1, 16)
125
+ }
126
+
127
+ function wrapInWav(
128
+ pcm: ArrayBuffer,
129
+ sampleRate: number,
130
+ channels: number,
131
+ bitsPerSample: number
132
+ ): ArrayBuffer {
133
+ const dataSize = pcm.byteLength
134
+ const header = new ArrayBuffer(44)
135
+ const view = new DataView(header)
136
+
137
+ const writeStr = (offset: number, str: string) => {
138
+ for (let i = 0; i < str.length; i++)
139
+ view.setUint8(offset + i, str.charCodeAt(i))
140
+ }
141
+
142
+ writeStr(0, "RIFF")
143
+ view.setUint32(4, 36 + dataSize, true)
144
+ writeStr(8, "WAVE")
145
+ writeStr(12, "fmt ")
146
+ view.setUint32(16, 16, true)
147
+ view.setUint16(20, 1, true) // PCM
148
+ view.setUint16(22, channels, true)
149
+ view.setUint32(24, sampleRate, true)
150
+ view.setUint32(28, (sampleRate * channels * bitsPerSample) / 8, true)
151
+ view.setUint16(32, (channels * bitsPerSample) / 8, true)
152
+ view.setUint16(34, bitsPerSample, true)
153
+ writeStr(36, "data")
154
+ view.setUint32(40, dataSize, true)
155
+
156
+ const wav = new Uint8Array(44 + dataSize)
157
+ wav.set(new Uint8Array(header), 0)
158
+ wav.set(new Uint8Array(pcm), 44)
159
+ return wav.buffer
160
+ }
161
+
162
+ const CORS = {
163
+ "Access-Control-Allow-Origin": "*",
164
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
165
+ "Access-Control-Allow-Headers": "Content-Type",
166
+ }
167
+
168
+ /**
169
+ * Inicia el servidor TTS en-proceso.
170
+ * Exportado para que el gateway pueda llamarlo directamente
171
+ * sin necesidad de spawnar un subproceso externo.
172
+ */
173
+ export function startTTSServer(opts?: { port?: number }): ReturnType<typeof Bun.serve> {
174
+ const listenPort = opts?.port ?? PORT
175
+
176
+ const server = Bun.serve({
177
+ port: listenPort,
178
+ async fetch(req) {
179
+ const url = new URL(req.url)
180
+
181
+ if (req.method === "OPTIONS") {
182
+ return new Response(null, { status: 204, headers: CORS })
183
+ }
184
+
185
+ if (req.method === "GET" && url.pathname === "/health") {
186
+ return Response.json(
187
+ { ok: true, voice: DEFAULT_VOICE_ENV, voices: listVoices() },
188
+ { headers: CORS }
189
+ )
190
+ }
191
+
192
+ if (req.method === "GET" && url.pathname === "/voices") {
193
+ return Response.json({ voices: listVoices() }, { headers: CORS })
194
+ }
195
+
196
+ if (req.method === "POST" && url.pathname === "/tts") {
197
+ let body: { text?: string; voice?: string }
198
+ try {
199
+ body = await req.json()
200
+ } catch {
201
+ return Response.json(
202
+ { error: "Body JSON inválido" },
203
+ { status: 400, headers: CORS }
204
+ )
205
+ }
206
+
207
+ const { text, voice = DEFAULT_VOICE_ENV } = body
208
+
209
+ if (!text || typeof text !== "string" || text.trim().length === 0) {
210
+ return Response.json(
211
+ { error: "Campo 'text' requerido" },
212
+ { status: 400, headers: CORS }
213
+ )
214
+ }
215
+
216
+ if (text.length > 2000) {
217
+ return Response.json(
218
+ { error: "Texto demasiado largo (máx 2000 chars)" },
219
+ { status: 400, headers: CORS }
220
+ )
221
+ }
222
+
223
+ try {
224
+ const audio = await synthesize(text.trim(), voice)
225
+ return new Response(audio, {
226
+ headers: {
227
+ ...CORS,
228
+ "Content-Type": "audio/wav",
229
+ "Content-Length": String(audio.byteLength),
230
+ },
231
+ })
232
+ } catch (err) {
233
+ const message = err instanceof Error ? err.message : "Error interno"
234
+ return Response.json({ error: message }, { status: 500, headers: CORS })
235
+ }
236
+ }
237
+
238
+ return Response.json({ error: "Not found" }, { status: 404, headers: CORS })
239
+ },
240
+ })
241
+
242
+ log.info(`Hive TTS Server escuchando en http://localhost:${listenPort}`)
243
+ log.info(`Voz por defecto: ${DEFAULT_VOICE_ENV}`)
244
+ log.info(`Voces disponibles: ${listVoices().join(", ") || "ninguna (ejecuta install.ts primero)"}`)
245
+ return server
246
+ }
247
+
248
+ // Ejecución directa: bun run src/server.ts
249
+ // @ts-ignore
250
+ if (import.meta.main) {
251
+ startTTSServer()
252
+ }
File without changes
@@ -0,0 +1,157 @@
1
+ import type { Config } from "../config/loader.ts";
2
+ import { logger } from "../utils/logger.ts";
3
+
4
+ export interface HealthStatus {
5
+ status: "healthy" | "degraded" | "unhealthy";
6
+ checks: Record<string, {
7
+ status: "ok" | "warning" | "error";
8
+ message?: string;
9
+ latency?: number;
10
+ }>;
11
+ uptime: number;
12
+ lastCheck: Date;
13
+ }
14
+
15
+ export interface HeartbeatOptions {
16
+ intervalMs?: number;
17
+ onHealthChange?: (status: HealthStatus) => void;
18
+ }
19
+
20
+ type HealthCheck = () => Promise<{
21
+ status: "ok" | "warning" | "error";
22
+ message?: string;
23
+ latency?: number;
24
+ }>;
25
+
26
+ export class Heartbeat {
27
+ private intervalMs: number;
28
+ private checks: Map<string, HealthCheck> = new Map();
29
+ private intervalId: Timer | null = null;
30
+ private startTime: Date;
31
+ private lastStatus: HealthStatus | null = null;
32
+ private onHealthChange?: (status: HealthStatus) => void;
33
+ private log = logger.child("heartbeat");
34
+
35
+ constructor(_config: Config, options: HeartbeatOptions = {}) {
36
+ this.intervalMs = options.intervalMs ?? 30000;
37
+ this.onHealthChange = options.onHealthChange;
38
+ this.startTime = new Date();
39
+ }
40
+
41
+ registerCheck(name: string, check: HealthCheck): void {
42
+ this.checks.set(name, check);
43
+ this.log.debug(`Registered health check: ${name}`);
44
+ }
45
+
46
+ removeCheck(name: string): boolean {
47
+ return this.checks.delete(name);
48
+ }
49
+
50
+ async runChecks(): Promise<HealthStatus> {
51
+ const checks: HealthStatus["checks"] = {};
52
+ let overallStatus: "healthy" | "degraded" | "unhealthy" = "healthy";
53
+
54
+ for (const [name, check] of this.checks) {
55
+ try {
56
+ const start = Date.now();
57
+ const result = await check();
58
+ const latency = Date.now() - start;
59
+
60
+ checks[name] = {
61
+ status: result.status,
62
+ message: result.message,
63
+ latency: result.latency ?? latency,
64
+ };
65
+
66
+ if (result.status === "warning" && overallStatus === "healthy") {
67
+ overallStatus = "degraded";
68
+ } else if (result.status === "error") {
69
+ overallStatus = "unhealthy";
70
+ }
71
+ } catch (error) {
72
+ checks[name] = {
73
+ status: "error",
74
+ message: (error as Error).message,
75
+ };
76
+ overallStatus = "unhealthy";
77
+ }
78
+ }
79
+
80
+ const status: HealthStatus = {
81
+ status: overallStatus,
82
+ checks,
83
+ uptime: Date.now() - this.startTime.getTime(),
84
+ lastCheck: new Date(),
85
+ };
86
+
87
+ const prevStatus = this.lastStatus?.status;
88
+ if (prevStatus && prevStatus !== overallStatus) {
89
+ this.log.info(`Health status changed: ${prevStatus} -> ${overallStatus}`);
90
+ this.onHealthChange?.(status);
91
+ }
92
+
93
+ this.lastStatus = status;
94
+ return status;
95
+ }
96
+
97
+ start(): void {
98
+ if (this.intervalId) {
99
+ this.log.warn("Heartbeat already running");
100
+ return;
101
+ }
102
+
103
+ this.runChecks();
104
+
105
+ this.intervalId = setInterval(async () => {
106
+ await this.runChecks();
107
+ }, this.intervalMs);
108
+
109
+ this.log.info(`Heartbeat started (interval: ${this.intervalMs}ms)`);
110
+ }
111
+
112
+ stop(): void {
113
+ if (this.intervalId) {
114
+ clearInterval(this.intervalId);
115
+ this.intervalId = null;
116
+ this.log.info("Heartbeat stopped");
117
+ }
118
+ }
119
+
120
+ getStatus(): HealthStatus | null {
121
+ return this.lastStatus;
122
+ }
123
+
124
+ isRunning(): boolean {
125
+ return this.intervalId !== null;
126
+ }
127
+ }
128
+
129
+ export function createHeartbeat(config: Config, options?: HeartbeatOptions): Heartbeat {
130
+ const heartbeat = new Heartbeat(config, options);
131
+
132
+ heartbeat.registerCheck("memory", async () => {
133
+ const memUsage = process.memoryUsage();
134
+ const heapUsedMB = Math.round(memUsage.heapUsed / 1024 / 1024);
135
+ const heapTotalMB = Math.round(memUsage.heapTotal / 1024 / 1024);
136
+ const ratio = memUsage.heapUsed / memUsage.heapTotal;
137
+
138
+ if (ratio > 0.9) {
139
+ return {
140
+ status: "error",
141
+ message: `Memory critically high: ${heapUsedMB}/${heapTotalMB}MB`,
142
+ };
143
+ } else if (ratio > 0.75) {
144
+ return {
145
+ status: "warning",
146
+ message: `Memory usage high: ${heapUsedMB}/${heapTotalMB}MB`,
147
+ };
148
+ }
149
+
150
+ return {
151
+ status: "ok",
152
+ message: `${heapUsedMB}/${heapTotalMB}MB used`,
153
+ };
154
+ });
155
+
156
+ return heartbeat;
157
+ }
@@ -0,0 +1,56 @@
1
+ // Gateway
2
+ export * from "./gateway/index.ts";
3
+ export * from "./gateway/server.ts";
4
+
5
+ // Agent (core functionality)
6
+ export * from "./agent/service.ts";
7
+ export * from "./agent/agent-loop.ts";
8
+ export * from "./agent/context-compiler.ts";
9
+ export * from "./agent/prompt-builder.ts";
10
+ export * from "./agent/conversation-store.ts";
11
+ export * from "./agent/tool-selector.ts";
12
+ export * from "./agent/skill-selector.ts";
13
+ export * from "./agent/playbook-selector.ts";
14
+ export * from "./agent/llm-client.ts";
15
+
16
+ // Channels
17
+ export * from "./channels/index.ts";
18
+ export * from "./channels/manager.ts";
19
+ export * from "./channels/base.ts";
20
+ export * from "./channels/telegram.ts";
21
+ export * from "./channels/discord.ts";
22
+ export * from "./channels/whatsapp.ts";
23
+ export * from "./channels/slack.ts";
24
+ export * from "./channels/webchat.ts";
25
+
26
+ // Storage
27
+ export * from "./storage/sqlite.ts";
28
+ export * from "./storage/schema.ts";
29
+ export * from "./storage/seed.ts";
30
+ export * from "./storage/crypto.ts";
31
+ export * from "./storage/onboarding.ts";
32
+
33
+ // Tools (main index)
34
+ export { createAllTools, createToolsByCategory } from "./tools/index.ts";
35
+ export type { Tool, ToolResult } from "./tools/types.ts";
36
+ export * from "./tool-runtime/index.ts";
37
+
38
+ // Config
39
+ export * from "./config/index.ts";
40
+
41
+ // Utils
42
+ export * from "./utils/logger.ts";
43
+ export { retry } from "./utils/retry.ts";
44
+
45
+ // Other core modules
46
+ export * from "./security/index.ts";
47
+ export * from "./heartbeat/index.ts";
48
+ export * from "./events/event-bus.ts";
49
+ export * from "./events/agent-bus.ts";
50
+ export * from "./state/store.ts";
51
+ export * from "./resilience/circuit-breaker.ts";
52
+ export * from "./plugins/index.ts";
53
+ export * from "./canvas/index.ts";
54
+
55
+ // Re-export native-tools types
56
+ export type { Tool as NativeTool, ToolResult as NativeToolResult } from "./agent/native-tools.ts";
@@ -0,0 +1,148 @@
1
+ /**
2
+ * MCP Hot Reload
3
+ *
4
+ * Watches for MCP server changes in DB and updates MCP Manager automatically
5
+ *
6
+ * Architecture: Direct Connection
7
+ * - MCP servers are tracked in DB (mcp_servers table)
8
+ * - MCP tools are loaded at runtime from connected servers (not stored in DB)
9
+ */
10
+
11
+ import { getDb } from "../storage/sqlite";
12
+ import { logger } from "../utils/logger";
13
+ import { loadMcpHeaders } from "../storage/crypto";
14
+ import { syncMCPToolsToDB, syncMCPToolsToFTS, clearMCPToolsFromDB } from "./tool-sync";
15
+ import type { MCPClientManager } from "@johpaz/hive-agents-mcp";
16
+
17
+ const log = logger.child("mcp:hot-reload");
18
+
19
+ let _watchInterval: Timer | null = null;
20
+ let _lastKnownServers = new Set<string>();
21
+
22
+ /**
23
+ * Start watching for MCP server changes
24
+ * Checks every 2 seconds for new/removed servers
25
+ */
26
+ export function startMCPHotReload(mcpManager: MCPClientManager): void {
27
+ if (_watchInterval) {
28
+ log.warn("MCP Hot Reload already running");
29
+ return;
30
+ }
31
+
32
+ log.info("Starting MCP Hot Reload watcher (2s interval)");
33
+
34
+ // Initial sync - sync all currently connected servers
35
+ syncMCPServers(mcpManager).then(() => {
36
+ log.info("Initial MCP server sync complete");
37
+ }).catch(err => {
38
+ log.error(`Initial MCP server sync failed: ${err.message}`);
39
+ });
40
+
41
+ // Watch for changes
42
+ _watchInterval = setInterval(() => {
43
+ syncMCPServers(mcpManager);
44
+ }, 2000);
45
+ }
46
+
47
+ /**
48
+ * Stop watching
49
+ */
50
+ export function stopMCPHotReload(): void {
51
+ if (_watchInterval) {
52
+ clearInterval(_watchInterval);
53
+ _watchInterval = null;
54
+ log.info("MCP Hot Reload stopped");
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Sync MCP servers from DB to MCP Manager
60
+ * Note: Only server status is tracked, tools are loaded at runtime
61
+ */
62
+ async function syncMCPServers(mcpManager: MCPClientManager): Promise<void> {
63
+ try {
64
+ const db = getDb();
65
+ const dbServers = db.query(`SELECT * FROM mcp_servers WHERE enabled = 1`).all() as Record<string, any>[];
66
+
67
+ const currentServerNames = new Set(dbServers.map(s => s.id || s.name));
68
+
69
+ // Detect new servers
70
+ for (const server of dbServers) {
71
+ const serverName = server.id || server.name;
72
+
73
+ if (!_lastKnownServers.has(serverName)) {
74
+ log.info(`New MCP server detected: ${serverName} - connecting...`);
75
+
76
+ try {
77
+ const mcpServerConfig: any = {
78
+ transport: server.transport,
79
+ command: server.command,
80
+ args: server.args ? JSON.parse(server.args) : [],
81
+ url: server.url,
82
+ enabled: true,
83
+ };
84
+
85
+ const mcpHeaders = await loadMcpHeaders(server.id || server.name);
86
+ if (Object.keys(mcpHeaders).length > 0) {
87
+ mcpServerConfig.headers = mcpHeaders;
88
+ }
89
+
90
+ // Update MCP Manager config (auto-connects new servers)
91
+ const currentConfig = (mcpManager as any).config || { servers: {} };
92
+ await mcpManager.updateConfig({
93
+ ...currentConfig,
94
+ servers: {
95
+ ...currentConfig.servers,
96
+ [serverName]: mcpServerConfig,
97
+ },
98
+ });
99
+
100
+ // Wait a bit for connection to establish
101
+ await new Promise(resolve => setTimeout(resolve, 500));
102
+
103
+ // Get tools count and update status
104
+ const tools = mcpManager.getServerTools(serverName) || [];
105
+ db.query(`UPDATE mcp_servers SET status = ?, tools_count = ? WHERE id = ?`).run("connected", tools.length, serverName);
106
+
107
+ // Persist MCP tool definitions to DB and FTS5
108
+ // Use server.name (human-readable) for mcpToolId consistency with context-compiler
109
+ syncMCPToolsToDB(server.id || server.name, server.name || serverName, tools);
110
+ await syncMCPToolsToFTS();
111
+
112
+ log.info(`MCP server ${serverName} connected: ${tools.length} tools available`);
113
+ } catch (err) {
114
+ log.error(`Failed to connect MCP server ${serverName}: ${(err as Error).message}`);
115
+ db.query(`UPDATE mcp_servers SET status = ? WHERE id = ?`).run("error", serverName);
116
+ }
117
+ }
118
+ }
119
+
120
+ // Detect removed servers
121
+ for (const oldServerName of _lastKnownServers) {
122
+ if (!currentServerNames.has(oldServerName)) {
123
+ log.info(`MCP server removed: ${oldServerName} - disconnecting...`);
124
+
125
+ try {
126
+ // Remove from MCP Manager
127
+ const currentConfig = (mcpManager as any).config || { servers: {} };
128
+ delete currentConfig.servers[oldServerName];
129
+ await mcpManager.updateConfig(currentConfig);
130
+
131
+ // Delete MCP tool definitions from DB and FTS5
132
+ clearMCPToolsFromDB(oldServerName);
133
+
134
+ // Update DB status
135
+ db.query(`UPDATE mcp_servers SET status = ?, tools_count = 0 WHERE id = ?`).run("disconnected", oldServerName);
136
+
137
+ log.info(`MCP server ${oldServerName} disconnected`);
138
+ } catch (err) {
139
+ log.error(`Failed to disconnect MCP server ${oldServerName}: ${(err as Error).message}`);
140
+ }
141
+ }
142
+ }
143
+
144
+ _lastKnownServers = currentServerNames;
145
+ } catch (err) {
146
+ log.error(`MCP server sync failed: ${(err as Error).message}`);
147
+ }
148
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * MCP Manager Singleton
3
+ *
4
+ * Provides global access to the MCP Manager instance
5
+ */
6
+
7
+ import type { MCPClientManager } from "@johpaz/hive-agents-mcp";
8
+
9
+ let _mcpManager: MCPClientManager | null = null;
10
+
11
+ export function setMCPManager(m: MCPClientManager): void {
12
+ _mcpManager = m;
13
+ }
14
+
15
+ export function getMCPManager(): MCPClientManager | null {
16
+ return _mcpManager;
17
+ }
18
+
19
+ export function hasMCPManager(): boolean {
20
+ return _mcpManager !== null;
21
+ }