@johpaz/hive-agents 0.0.34 → 0.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. package/README.md +64 -39
  2. package/dist/hive.js +4539 -4586
  3. package/dist/ui/assets/AgentCreateForm-tJZv9FZC.js +1 -0
  4. package/dist/ui/assets/AgentDetailPage-Du-mRcAX.js +1 -0
  5. package/dist/ui/assets/AgentNewPage-DIFYd_Ys.js +1 -0
  6. package/dist/ui/assets/{AgentsPage-DhCjvDNa.js → AgentsPage-YvSgWRiw.js} +7 -7
  7. package/dist/ui/assets/CanvasPage-DtMwGvxf.js +33 -0
  8. package/dist/ui/assets/ChannelsPage-BdBXWHjj.js +8 -0
  9. package/dist/ui/assets/DashboardPage-ghl1ZguH.js +6 -0
  10. package/dist/ui/assets/{LoginPage-B30OrEBy.js → LoginPage-CAmSI9Vy.js} +1 -1
  11. package/dist/ui/assets/LogsPage-DAPBHkwK.js +1 -0
  12. package/dist/ui/assets/MeetingPage-WjjGOqqU.js +1 -0
  13. package/dist/ui/assets/{NotFound-HD1Yp9yK.js → NotFound-BMeQSGcG.js} +1 -1
  14. package/dist/ui/assets/ProvidersPage-Ct6HsAi1.js +1 -0
  15. package/dist/ui/assets/{RecoverPage-CLF6buGP.js → RecoverPage-DpW3l-yv.js} +1 -1
  16. package/dist/ui/assets/SettingsPage-DBJ7_E6C.js +9 -0
  17. package/dist/ui/assets/SetupPage-DKmLVUaj.js +1 -0
  18. package/dist/ui/assets/{WebChatPage-Um3VANzn.js → WebChatPage-CVRcKept.js} +2 -2
  19. package/dist/ui/assets/accordion-C5d5Rm5z.js +1 -0
  20. package/dist/ui/assets/{activity-SfJ6UDF2.js → activity-c3pNngT_.js} +1 -1
  21. package/dist/ui/assets/alert-C-NE-P3s.js +1 -0
  22. package/dist/ui/assets/{alert-dialog-M893TdvF.js → alert-dialog-C5mzbHdP.js} +1 -1
  23. package/dist/ui/assets/arrow-left-CBcbX5EZ.js +1 -0
  24. package/dist/ui/assets/badge-ChpACfWO.js +1 -0
  25. package/dist/ui/assets/{calendar-CMMeWsP-.js → calendar-B-KZ9RQO.js} +1 -1
  26. package/dist/ui/assets/{card-C7P3W6_y.js → card-CNf6BS2e.js} +1 -1
  27. package/dist/ui/assets/chevron-left-D4U-5A27.js +1 -0
  28. package/dist/ui/assets/chevron-right-CR4Skrf3.js +1 -0
  29. package/dist/ui/assets/chevron-up-BYhk0K2J.js +1 -0
  30. package/dist/ui/assets/{circle-alert-7koABcbO.js → circle-alert-CyHDwUj8.js} +1 -1
  31. package/dist/ui/assets/circle-check-Bb54Ebmu.js +1 -0
  32. package/dist/ui/assets/{cpu-mBJgRJzM.js → cpu-Cdgc_B1K.js} +1 -1
  33. package/dist/ui/assets/dialog-QnZ0ad8O.js +1 -0
  34. package/dist/ui/assets/{download-oaofq4K1.js → download-C3ifGMjJ.js} +1 -1
  35. package/dist/ui/assets/dropdown-menu-BK-CO3Od.js +1 -0
  36. package/dist/ui/assets/{es-eUrU2hyB.js → es-NQNoaWDx.js} +1 -1
  37. package/dist/ui/assets/{external-link-SkkF2Z7B.js → external-link-BvxYeTP1.js} +1 -1
  38. package/dist/ui/assets/{eye-B8lq7sWG.js → eye-DqNTU_GD.js} +1 -1
  39. package/dist/ui/assets/{file-text-0oYol8Bb.js → file-text-BT_9S9SM.js} +1 -1
  40. package/dist/ui/assets/{folder-open-DVYu2lgk.js → folder-open-BhH8y9ac.js} +1 -1
  41. package/dist/ui/assets/gauge-D_TMa4i9.js +1 -0
  42. package/dist/ui/assets/{globe-BVPd5DRa.js → globe-DeCQTCDJ.js} +1 -1
  43. package/dist/ui/assets/{hexagon-BIAFUAlQ.js → hexagon-DsGOUl-H.js} +1 -1
  44. package/dist/ui/assets/{history-BUAnaMQo.js → history-BSG-Ypqf.js} +1 -1
  45. package/dist/ui/assets/index-B2fCYtTS.css +2 -0
  46. package/dist/ui/assets/index-DMCjjdqf.js +116 -0
  47. package/dist/ui/assets/{info-DWioleen.js → info-NwLoa2Mj.js} +1 -1
  48. package/dist/ui/assets/{key-BCGwSKKc.js → key-3EP0dhkT.js} +1 -1
  49. package/dist/ui/assets/label-D2H1IR_J.js +1 -0
  50. package/dist/ui/assets/loader-circle-CZNax6kS.js +1 -0
  51. package/dist/ui/assets/{lock-D7PCO7GC.js → lock-Ei1_J-Nq.js} +1 -1
  52. package/dist/ui/assets/{pause-CI1JFH6r.js → pause-BUqah9Bi.js} +1 -1
  53. package/dist/ui/assets/play-NcZ4swwL.js +1 -0
  54. package/dist/ui/assets/plus-CX1xyhp5.js +1 -0
  55. package/dist/ui/assets/progress-BherYzY6.js +1 -0
  56. package/dist/ui/assets/{refresh-cw-BLmKlO4J.js → refresh-cw-DaYdjQFk.js} +1 -1
  57. package/dist/ui/assets/{save-M1nv6H3P.js → save-CUdYyHNy.js} +1 -1
  58. package/dist/ui/assets/scroll-area-DkeyX32e.js +1 -0
  59. package/dist/ui/assets/{send-ijRfR0gp.js → send-B0H5SEIE.js} +1 -1
  60. package/dist/ui/assets/{settings-BvXhlJCF.js → settings-Ds4SqD8s.js} +1 -1
  61. package/dist/ui/assets/{slider-DrDFLwXh.js → slider-CsiUDxc3.js} +1 -1
  62. package/dist/ui/assets/{sparkles-C4MACMbE.js → sparkles-yUEb-7oH.js} +1 -1
  63. package/dist/ui/assets/{square-D_-gRT1l.js → square-BD81nFtN.js} +1 -1
  64. package/dist/ui/assets/switch-BDwN8RYV.js +1 -0
  65. package/dist/ui/assets/{table-DWEJJiuF.js → table-CSc8ubon.js} +1 -1
  66. package/dist/ui/assets/terminal-DN38Q456.js +1 -0
  67. package/dist/ui/assets/{textarea-CwPvQVAG.js → textarea-CXgXWKrT.js} +1 -1
  68. package/dist/ui/assets/{trash-2-Blkv31Dz.js → trash-2-CNjMkoq6.js} +1 -1
  69. package/dist/ui/assets/{triangle-alert-BKgbd30k.js → triangle-alert-C9Y8Ub4X.js} +1 -1
  70. package/dist/ui/assets/useProviders-C6_QHsEi.js +1 -0
  71. package/dist/ui/assets/{vendor-radix-JY4ncZrD.js → vendor-radix-cw1bQaVC.js} +4 -4
  72. package/dist/ui/assets/{vendor-react-CscwQerf.js → vendor-react-D4s9E-zj.js} +1 -1
  73. package/dist/ui/assets/{volume-2-BiUgObeI.js → volume-2-CeSXNDv4.js} +1 -1
  74. package/dist/ui/assets/{zap-CpyuQJEC.js → zap-hlXjpSeA.js} +1 -1
  75. package/dist/ui/dist/assets/AgentCreateForm-tJZv9FZC.js +1 -0
  76. package/dist/ui/dist/assets/AgentDetailPage-Du-mRcAX.js +1 -0
  77. package/dist/ui/dist/assets/AgentNewPage-DIFYd_Ys.js +1 -0
  78. package/dist/ui/dist/assets/AgentsPage-YvSgWRiw.js +10 -0
  79. package/dist/ui/dist/assets/CanvasPage-DtMwGvxf.js +33 -0
  80. package/dist/ui/dist/assets/ChannelsPage-BdBXWHjj.js +8 -0
  81. package/dist/ui/dist/assets/DashboardPage-ghl1ZguH.js +6 -0
  82. package/dist/ui/dist/assets/LoginPage-CAmSI9Vy.js +1 -0
  83. package/dist/ui/dist/assets/LogsPage-DAPBHkwK.js +1 -0
  84. package/dist/ui/dist/assets/MeetingPage-WjjGOqqU.js +1 -0
  85. package/dist/ui/dist/assets/NotFound-BMeQSGcG.js +1 -0
  86. package/dist/ui/dist/assets/ProvidersPage-Ct6HsAi1.js +1 -0
  87. package/dist/ui/dist/assets/RecoverPage-DpW3l-yv.js +1 -0
  88. package/dist/ui/dist/assets/SettingsPage-DBJ7_E6C.js +9 -0
  89. package/dist/ui/dist/assets/SetupPage-DKmLVUaj.js +1 -0
  90. package/dist/ui/dist/assets/WebChatPage-CVRcKept.js +16 -0
  91. package/dist/ui/dist/assets/accordion-C5d5Rm5z.js +1 -0
  92. package/dist/ui/dist/assets/activity-c3pNngT_.js +1 -0
  93. package/dist/ui/dist/assets/alert-C-NE-P3s.js +1 -0
  94. package/dist/ui/dist/assets/alert-dialog-C5mzbHdP.js +1 -0
  95. package/dist/ui/dist/assets/arrow-left-CBcbX5EZ.js +1 -0
  96. package/dist/ui/dist/assets/badge-ChpACfWO.js +1 -0
  97. package/dist/ui/dist/assets/calendar-B-KZ9RQO.js +1 -0
  98. package/dist/ui/dist/assets/card-CNf6BS2e.js +1 -0
  99. package/dist/ui/dist/assets/chevron-left-D4U-5A27.js +1 -0
  100. package/dist/ui/dist/assets/chevron-right-CR4Skrf3.js +1 -0
  101. package/dist/ui/dist/assets/chevron-up-BYhk0K2J.js +1 -0
  102. package/dist/ui/dist/assets/circle-alert-CyHDwUj8.js +1 -0
  103. package/dist/ui/dist/assets/circle-check-Bb54Ebmu.js +1 -0
  104. package/dist/ui/dist/assets/cpu-Cdgc_B1K.js +1 -0
  105. package/dist/ui/dist/assets/dialog-QnZ0ad8O.js +1 -0
  106. package/dist/ui/dist/assets/download-C3ifGMjJ.js +1 -0
  107. package/dist/ui/dist/assets/dropdown-menu-BK-CO3Od.js +1 -0
  108. package/dist/ui/dist/assets/es-NQNoaWDx.js +1 -0
  109. package/dist/ui/dist/assets/external-link-BvxYeTP1.js +1 -0
  110. package/dist/ui/dist/assets/eye-DqNTU_GD.js +1 -0
  111. package/dist/ui/dist/assets/file-text-BT_9S9SM.js +1 -0
  112. package/dist/ui/dist/assets/folder-open-BhH8y9ac.js +1 -0
  113. package/dist/ui/dist/assets/format-GVHeOyWI.js +1 -0
  114. package/dist/ui/dist/assets/gateway-url-COCbW0IR.js +1 -0
  115. package/dist/ui/dist/assets/gauge-D_TMa4i9.js +1 -0
  116. package/dist/ui/dist/assets/globe-DeCQTCDJ.js +1 -0
  117. package/dist/ui/dist/assets/hexagon-DsGOUl-H.js +1 -0
  118. package/dist/ui/dist/assets/history-BSG-Ypqf.js +1 -0
  119. package/dist/ui/dist/assets/index-B2fCYtTS.css +2 -0
  120. package/dist/ui/dist/assets/index-DMCjjdqf.js +116 -0
  121. package/dist/ui/dist/assets/info-NwLoa2Mj.js +1 -0
  122. package/dist/ui/dist/assets/key-3EP0dhkT.js +1 -0
  123. package/dist/ui/dist/assets/label-D2H1IR_J.js +1 -0
  124. package/dist/ui/dist/assets/loader-circle-CZNax6kS.js +1 -0
  125. package/dist/ui/dist/assets/lock-Ei1_J-Nq.js +1 -0
  126. package/dist/ui/dist/assets/pause-BUqah9Bi.js +1 -0
  127. package/dist/ui/dist/assets/play-NcZ4swwL.js +1 -0
  128. package/dist/ui/dist/assets/plus-CX1xyhp5.js +1 -0
  129. package/dist/ui/dist/assets/progress-BherYzY6.js +1 -0
  130. package/dist/ui/dist/assets/refresh-cw-DaYdjQFk.js +1 -0
  131. package/dist/ui/dist/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
  132. package/dist/ui/dist/assets/save-CUdYyHNy.js +1 -0
  133. package/dist/ui/dist/assets/scroll-area-DkeyX32e.js +1 -0
  134. package/dist/ui/dist/assets/send-B0H5SEIE.js +1 -0
  135. package/dist/ui/dist/assets/settings-Ds4SqD8s.js +1 -0
  136. package/dist/ui/dist/assets/slider-CsiUDxc3.js +14 -0
  137. package/dist/ui/dist/assets/sparkles-yUEb-7oH.js +1 -0
  138. package/dist/ui/dist/assets/square-BD81nFtN.js +1 -0
  139. package/dist/ui/dist/assets/switch-BDwN8RYV.js +1 -0
  140. package/dist/ui/dist/assets/table-CSc8ubon.js +1 -0
  141. package/dist/ui/dist/assets/terminal-DN38Q456.js +1 -0
  142. package/dist/ui/dist/assets/textarea-CXgXWKrT.js +1 -0
  143. package/dist/ui/dist/assets/trash-2-CNjMkoq6.js +1 -0
  144. package/dist/ui/dist/assets/triangle-alert-C9Y8Ub4X.js +1 -0
  145. package/dist/ui/dist/assets/useProviders-C6_QHsEi.js +1 -0
  146. package/dist/ui/dist/assets/utils-3pnRFmFe.js +1 -0
  147. package/dist/ui/dist/assets/vendor-charts-Bu2lyBKP.js +65 -0
  148. package/dist/ui/dist/assets/vendor-query-DsWPbQdG.js +1 -0
  149. package/dist/ui/dist/assets/vendor-radix-cw1bQaVC.js +63 -0
  150. package/dist/ui/dist/assets/vendor-react-D4s9E-zj.js +1 -0
  151. package/dist/ui/dist/assets/vendor-router-C9pIYwbJ.js +3 -0
  152. package/dist/ui/dist/assets/volume-2-CeSXNDv4.js +1 -0
  153. package/dist/ui/dist/assets/zap-hlXjpSeA.js +1 -0
  154. package/dist/ui/dist/favicon.ico +0 -0
  155. package/dist/ui/dist/index.html +40 -0
  156. package/dist/ui/dist/placeholder.svg +1 -0
  157. package/dist/ui/index.html +7 -11
  158. package/package.json +137 -15
  159. package/packages/cli/src/adapters/binary.ts +461 -0
  160. package/packages/cli/src/adapters/bun-global.ts +378 -0
  161. package/packages/cli/src/adapters/config.ts +314 -0
  162. package/packages/cli/src/adapters/docker.ts +308 -0
  163. package/packages/cli/src/adapters/factory.ts +168 -0
  164. package/packages/cli/src/adapters/index.ts +80 -0
  165. package/packages/cli/src/adapters/types.ts +218 -0
  166. package/packages/cli/src/commands/agent-run.ts +168 -0
  167. package/packages/cli/src/commands/agents.ts +398 -0
  168. package/packages/cli/src/commands/chat.ts +142 -0
  169. package/packages/cli/src/commands/config.ts +49 -0
  170. package/packages/cli/src/commands/cron.ts +487 -0
  171. package/packages/cli/src/commands/dev.ts +58 -0
  172. package/packages/cli/src/commands/doctor.ts +320 -0
  173. package/packages/cli/src/commands/gateway.ts +719 -0
  174. package/packages/cli/src/commands/logs.ts +57 -0
  175. package/packages/cli/src/commands/mcp.ts +175 -0
  176. package/packages/cli/src/commands/message.ts +77 -0
  177. package/packages/cli/src/commands/migrate.ts +90 -0
  178. package/packages/cli/src/commands/onboard.ts +1656 -0
  179. package/packages/cli/src/commands/security.ts +144 -0
  180. package/packages/cli/src/commands/service.ts +50 -0
  181. package/packages/cli/src/commands/sessions.ts +116 -0
  182. package/packages/cli/src/commands/skills.ts +215 -0
  183. package/packages/cli/src/commands/update.ts +203 -0
  184. package/packages/cli/src/index.ts +210 -0
  185. package/packages/cli/src/ui-bundle.generated.ts +3 -0
  186. package/packages/cli/src/utils/token.ts +6 -0
  187. package/packages/core/src/agent/agent-loop.ts +691 -0
  188. package/packages/core/src/agent/compaction.ts +240 -0
  189. package/packages/core/src/agent/context-compiler.ts +467 -0
  190. package/packages/core/src/agent/context-guard.ts +91 -0
  191. package/packages/core/src/agent/conversation-store.ts +244 -0
  192. package/packages/core/src/agent/curator.ts +158 -0
  193. package/packages/core/src/agent/hooks.ts +166 -0
  194. package/packages/core/src/agent/llm-client.ts +167 -0
  195. package/packages/core/src/agent/llm-providers/anthropic.ts +212 -0
  196. package/packages/core/src/agent/llm-providers/deepseek.ts +8 -0
  197. package/packages/core/src/agent/llm-providers/gemini.ts +215 -0
  198. package/packages/core/src/agent/llm-providers/groq.ts +5 -0
  199. package/packages/core/src/agent/llm-providers/interface.ts +195 -0
  200. package/packages/core/src/agent/llm-providers/kimi.ts +8 -0
  201. package/packages/core/src/agent/llm-providers/local-llama.ts +37 -0
  202. package/packages/core/src/agent/llm-providers/mistral.ts +5 -0
  203. package/packages/core/src/agent/llm-providers/nvidia.ts +5 -0
  204. package/packages/core/src/agent/llm-providers/ollama.ts +175 -0
  205. package/packages/core/src/agent/llm-providers/openai-compat-base.ts +379 -0
  206. package/packages/core/src/agent/llm-providers/openai.ts +5 -0
  207. package/packages/core/src/agent/llm-providers/openrouter.ts +5 -0
  208. package/packages/core/src/agent/llm-providers/qwen.ts +5 -0
  209. package/packages/core/src/agent/native-tools.ts +31 -0
  210. package/packages/core/src/agent/playbook-selector.ts +147 -0
  211. package/packages/core/src/agent/prompt-builder.ts +169 -0
  212. package/packages/core/src/agent/providers/index.ts +204 -0
  213. package/packages/core/src/agent/providers.ts +1 -0
  214. package/packages/core/src/agent/reflector.ts +200 -0
  215. package/packages/core/src/agent/service.ts +267 -0
  216. package/packages/core/src/agent/skill-selector.ts +479 -0
  217. package/packages/core/src/agent/stuck-loop.ts +133 -0
  218. package/packages/core/src/agent/tool-selector.ts +569 -0
  219. package/packages/core/src/agent/tracer.ts +100 -0
  220. package/packages/core/src/auth/auth.ts +108 -0
  221. package/packages/core/src/auth/index.ts +1 -0
  222. package/packages/core/src/canvas/a2ui-tools.ts +255 -0
  223. package/packages/core/src/canvas/canvas-manager.ts +390 -0
  224. package/packages/core/src/canvas/canvas-tools.ts +448 -0
  225. package/packages/core/src/canvas/emitter.ts +149 -0
  226. package/packages/core/src/canvas/index.ts +3 -0
  227. package/packages/core/src/channels/base.ts +154 -0
  228. package/packages/core/src/channels/discord.ts +273 -0
  229. package/packages/core/src/channels/index.ts +7 -0
  230. package/packages/core/src/channels/manager.ts +450 -0
  231. package/packages/core/src/channels/slack.ts +323 -0
  232. package/packages/core/src/channels/telegram.ts +612 -0
  233. package/packages/core/src/channels/webchat.ts +139 -0
  234. package/packages/core/src/channels/whatsapp.ts +548 -0
  235. package/packages/core/src/config/index.ts +12 -0
  236. package/packages/core/src/config/loader.ts +569 -0
  237. package/packages/core/src/events/agent-bus.ts +460 -0
  238. package/packages/core/src/events/event-bus.ts +169 -0
  239. package/packages/core/src/gateway/channel-notify.ts +64 -0
  240. package/packages/core/src/gateway/helpers/cors.ts +32 -0
  241. package/packages/core/src/gateway/helpers/index.ts +4 -0
  242. package/packages/core/src/gateway/helpers/narration.ts +57 -0
  243. package/packages/core/src/gateway/helpers/path.ts +13 -0
  244. package/packages/core/src/gateway/helpers/redact.ts +61 -0
  245. package/packages/core/src/gateway/index.ts +5 -0
  246. package/packages/core/src/gateway/initializer.ts +363 -0
  247. package/packages/core/src/gateway/lane-queue.ts +169 -0
  248. package/packages/core/src/gateway/llm-local/client.ts +94 -0
  249. package/packages/core/src/gateway/llm-local/detector.ts +321 -0
  250. package/packages/core/src/gateway/llm-local/downloader.ts +216 -0
  251. package/packages/core/src/gateway/llm-local/index.ts +34 -0
  252. package/packages/core/src/gateway/llm-local/manager.ts +186 -0
  253. package/packages/core/src/gateway/llm-local/models.ts +149 -0
  254. package/packages/core/src/gateway/llm-local/server.ts +179 -0
  255. package/packages/core/src/gateway/resolver.ts +108 -0
  256. package/packages/core/src/gateway/router.ts +124 -0
  257. package/packages/core/src/gateway/routes/agents.ts +210 -0
  258. package/packages/core/src/gateway/routes/auth.ts +244 -0
  259. package/packages/core/src/gateway/routes/channels.ts +484 -0
  260. package/packages/core/src/gateway/routes/chat.ts +241 -0
  261. package/packages/core/src/gateway/routes/config.ts +12 -0
  262. package/packages/core/src/gateway/routes/cron-api.ts +544 -0
  263. package/packages/core/src/gateway/routes/ethics.ts +46 -0
  264. package/packages/core/src/gateway/routes/llm-local.ts +271 -0
  265. package/packages/core/src/gateway/routes/mcp.ts +319 -0
  266. package/packages/core/src/gateway/routes/meeting.ts +232 -0
  267. package/packages/core/src/gateway/routes/models.ts +163 -0
  268. package/packages/core/src/gateway/routes/multimodal.ts +93 -0
  269. package/packages/core/src/gateway/routes/providers.ts +220 -0
  270. package/packages/core/src/gateway/routes/setup.ts +441 -0
  271. package/packages/core/src/gateway/routes/skills.ts +115 -0
  272. package/packages/core/src/gateway/routes/system.ts +469 -0
  273. package/packages/core/src/gateway/routes/tasks.ts +44 -0
  274. package/packages/core/src/gateway/routes/tools.ts +59 -0
  275. package/packages/core/src/gateway/routes/tts-local.ts +388 -0
  276. package/packages/core/src/gateway/routes/users.ts +122 -0
  277. package/packages/core/src/gateway/routes/voice.ts +189 -0
  278. package/packages/core/src/gateway/routes/workspace.ts +281 -0
  279. package/packages/core/src/gateway/server.ts +2744 -0
  280. package/packages/core/src/gateway/session.ts +95 -0
  281. package/packages/core/src/gateway/slash-commands.ts +207 -0
  282. package/packages/core/src/gateway/tts/README.md +94 -0
  283. package/packages/core/src/gateway/tts/package.json +25 -0
  284. package/packages/core/src/gateway/tts/src/client.ts +59 -0
  285. package/packages/core/src/gateway/tts/src/detect.ts +42 -0
  286. package/packages/core/src/gateway/tts/src/index.ts +15 -0
  287. package/packages/core/src/gateway/tts/src/install.ts +129 -0
  288. package/packages/core/src/gateway/tts/src/models.ts +50 -0
  289. package/packages/core/src/gateway/tts/src/server.ts +252 -0
  290. package/packages/core/src/gateway/tts/voices/.gitkeep +0 -0
  291. package/packages/core/src/heartbeat/index.ts +157 -0
  292. package/packages/core/src/index.ts +56 -0
  293. package/packages/core/src/mcp/hot-reload.ts +148 -0
  294. package/packages/core/src/mcp/singleton.ts +21 -0
  295. package/packages/core/src/mcp/tool-sync.ts +176 -0
  296. package/packages/core/src/multimodal/index.ts +2 -0
  297. package/packages/core/src/multimodal/types.ts +28 -0
  298. package/packages/core/src/multimodal/vision-service.ts +283 -0
  299. package/packages/core/src/plugins/api.ts +128 -0
  300. package/packages/core/src/plugins/index.ts +2 -0
  301. package/packages/core/src/plugins/loader.ts +365 -0
  302. package/packages/core/src/resilience/circuit-breaker.ts +225 -0
  303. package/packages/core/src/scheduler/CronScheduler.ts +699 -0
  304. package/packages/core/src/scheduler/dag/AgentExecutor.ts +53 -0
  305. package/packages/core/src/scheduler/dag/DAGScheduler.ts +250 -0
  306. package/packages/core/src/scheduler/dag/EventBridge.ts +122 -0
  307. package/packages/core/src/scheduler/dag/TaskGraph.ts +192 -0
  308. package/packages/core/src/scheduler/dag/TaskNode.ts +97 -0
  309. package/packages/core/src/scheduler/dag/TaskResult.ts +22 -0
  310. package/packages/core/src/scheduler/dag/errors.ts +37 -0
  311. package/packages/core/src/scheduler/dag/index.ts +26 -0
  312. package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +97 -0
  313. package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +21 -0
  314. package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +46 -0
  315. package/packages/core/src/scheduler/index.ts +22 -0
  316. package/packages/core/src/scheduler/integration.ts +237 -0
  317. package/packages/core/src/scheduler/types.ts +164 -0
  318. package/packages/core/src/security/google-chat.ts +269 -0
  319. package/packages/core/src/security/index.ts +192 -0
  320. package/packages/core/src/security/pairing.ts +250 -0
  321. package/packages/core/src/security/rate-limit.ts +270 -0
  322. package/packages/core/src/security/signal.ts +321 -0
  323. package/packages/core/src/state/store.ts +312 -0
  324. package/packages/core/src/storage/crypto.ts +197 -0
  325. package/packages/core/src/storage/migrate.ts +147 -0
  326. package/packages/core/src/storage/onboarding.ts +1506 -0
  327. package/packages/core/src/storage/schema.ts +666 -0
  328. package/packages/core/src/storage/seed.ts +628 -0
  329. package/packages/core/src/storage/sqlite.ts +407 -0
  330. package/packages/core/src/storage/usage.ts +374 -0
  331. package/packages/core/src/tool-runtime/index.ts +476 -0
  332. package/packages/core/src/tool-runtime/tool-worker.ts +125 -0
  333. package/packages/core/src/tools/agents/get-available-models.ts +118 -0
  334. package/packages/core/src/tools/agents/index.ts +610 -0
  335. package/packages/core/src/tools/canvas/index.ts +420 -0
  336. package/packages/core/src/tools/cli/index.ts +142 -0
  337. package/packages/core/src/tools/core/index.ts +478 -0
  338. package/packages/core/src/tools/cron/index.ts +635 -0
  339. package/packages/core/src/tools/filesystem/fs-delete.ts +78 -0
  340. package/packages/core/src/tools/filesystem/fs-edit.ts +106 -0
  341. package/packages/core/src/tools/filesystem/fs-exists.ts +63 -0
  342. package/packages/core/src/tools/filesystem/fs-glob.ts +108 -0
  343. package/packages/core/src/tools/filesystem/fs-list.ts +129 -0
  344. package/packages/core/src/tools/filesystem/fs-read.ts +72 -0
  345. package/packages/core/src/tools/filesystem/fs-write.ts +67 -0
  346. package/packages/core/src/tools/filesystem/index.ts +34 -0
  347. package/packages/core/src/tools/filesystem/workspace-guard.ts +62 -0
  348. package/packages/core/src/tools/index.ts +197 -0
  349. package/packages/core/src/tools/meeting/index.ts +363 -0
  350. package/packages/core/src/tools/office/index.ts +47 -0
  351. package/packages/core/src/tools/office/office-escribir-docx.ts +192 -0
  352. package/packages/core/src/tools/office/office-escribir-pdf.ts +172 -0
  353. package/packages/core/src/tools/office/office-escribir-pptx.ts +174 -0
  354. package/packages/core/src/tools/office/office-escribir-xlsx.ts +116 -0
  355. package/packages/core/src/tools/office/office-leer-docx.ts +93 -0
  356. package/packages/core/src/tools/office/office-leer-pdf.ts +114 -0
  357. package/packages/core/src/tools/office/office-leer-pptx.ts +136 -0
  358. package/packages/core/src/tools/office/office-leer-xlsx.ts +124 -0
  359. package/packages/core/src/tools/types.ts +39 -0
  360. package/packages/core/src/tools/voice/index.ts +104 -0
  361. package/packages/core/src/tools/web/browser-click.ts +78 -0
  362. package/packages/core/src/tools/web/browser-extract.ts +139 -0
  363. package/packages/core/src/tools/web/browser-navigate.ts +106 -0
  364. package/packages/core/src/tools/web/browser-screenshot.ts +87 -0
  365. package/packages/core/src/tools/web/browser-script.ts +88 -0
  366. package/packages/core/src/tools/web/browser-service.ts +554 -0
  367. package/packages/core/src/tools/web/browser-type.ts +101 -0
  368. package/packages/core/src/tools/web/browser-wait.ts +136 -0
  369. package/packages/core/src/tools/web/index.ts +41 -0
  370. package/packages/core/src/tools/web/web-fetch.ts +78 -0
  371. package/packages/core/src/tools/web/web-search.ts +123 -0
  372. package/packages/core/src/utils/benchmark.ts +80 -0
  373. package/packages/core/src/utils/crypto.ts +73 -0
  374. package/packages/core/src/utils/date.ts +42 -0
  375. package/packages/core/src/utils/index.ts +5 -0
  376. package/packages/core/src/utils/logger.ts +389 -0
  377. package/packages/core/src/utils/retry.ts +70 -0
  378. package/packages/core/src/utils/toon.ts +253 -0
  379. package/packages/core/src/voice/index.ts +643 -0
  380. package/packages/mcp/src/config.ts +13 -0
  381. package/packages/mcp/src/index.ts +1 -0
  382. package/packages/mcp/src/logger.ts +47 -0
  383. package/packages/mcp/src/manager.ts +439 -0
  384. package/packages/mcp/src/transports/index.ts +67 -0
  385. package/packages/mcp/src/transports/sse.ts +238 -0
  386. package/packages/mcp/src/transports/websocket.ts +159 -0
  387. package/packages/skills/src/bundled/agents/agent_spawner/SKILL.md +167 -0
  388. package/packages/skills/src/bundled/agents/code_delegator/SKILL.md +156 -0
  389. package/packages/skills/src/bundled/agents/memory_manager/SKILL.md +143 -0
  390. package/packages/skills/src/bundled/agents/research_and_remember/SKILL.md +139 -0
  391. package/packages/skills/src/bundled/agents/task_orchestrator/SKILL.md +198 -0
  392. package/packages/skills/src/bundled/canvas/a2ui_dashboard/SKILL.md +176 -0
  393. package/packages/skills/src/bundled/canvas/a2ui_form/SKILL.md +202 -0
  394. package/packages/skills/src/bundled/canvas/a2ui_interactive/SKILL.md +206 -0
  395. package/packages/skills/src/bundled/canvas/canvas_dashboard/SKILL.md +146 -0
  396. package/packages/skills/src/bundled/canvas/canvas_interact/SKILL.md +148 -0
  397. package/packages/skills/src/bundled/canvas/canvas_report/SKILL.md +146 -0
  398. package/packages/skills/src/bundled/cli/cli_pipeline/SKILL.md +136 -0
  399. package/packages/skills/src/bundled/cli/cli_safe_exec/SKILL.md +125 -0
  400. package/packages/skills/src/bundled/cron_manager/SKILL.md +188 -0
  401. package/packages/skills/src/bundled/cron_reminder/SKILL.md +112 -0
  402. package/packages/skills/src/bundled/filesystem/file_manager/SKILL.md +118 -0
  403. package/packages/skills/src/bundled/filesystem/file_read_and_summarize/SKILL.md +108 -0
  404. package/packages/skills/src/bundled/filesystem/file_writer/SKILL.md +135 -0
  405. package/packages/skills/src/bundled/meeting/meeting_transcription/SKILL.md +213 -0
  406. package/packages/skills/src/bundled/office/office_document_manager/SKILL.md +262 -0
  407. package/packages/skills/src/bundled/search_knowledge/busqueda_fts5/SKILL.md +74 -0
  408. package/packages/skills/src/bundled/voice/voice_assistant/SKILL.md +174 -0
  409. package/packages/skills/src/bundled/voice/voice_input/SKILL.md +146 -0
  410. package/packages/skills/src/bundled/voice/voice_output/SKILL.md +151 -0
  411. package/packages/skills/src/bundled/web/browser_automate/SKILL.md +120 -0
  412. package/packages/skills/src/bundled/web/browser_scrape/SKILL.md +109 -0
  413. package/packages/skills/src/bundled/web/web_monitor/SKILL.md +127 -0
  414. package/packages/skills/src/bundled/web/web_research/SKILL.md +119 -0
  415. package/packages/skills/src/bundled-data.generated.ts +1964 -0
  416. package/packages/skills/src/index.ts +1 -0
  417. package/packages/skills/src/loader.ts +388 -0
  418. package/dist/ui/assets/AgentCreateForm-DS6yXjGV.js +0 -1
  419. package/dist/ui/assets/AgentDetailPage-Ud552U7_.js +0 -1
  420. package/dist/ui/assets/AgentNewPage-DWWs1P7s.js +0 -1
  421. package/dist/ui/assets/BridgePage-BD93aBKM.js +0 -1
  422. package/dist/ui/assets/CanvasPage-CM35yj0Q.js +0 -33
  423. package/dist/ui/assets/ChannelsPage-CtsWtJdc.js +0 -8
  424. package/dist/ui/assets/DashboardPage-BpiwR5Jg.js +0 -6
  425. package/dist/ui/assets/LogsPage-DqUsG3MW.js +0 -1
  426. package/dist/ui/assets/MeetingPage-C5B8-IzE.js +0 -1
  427. package/dist/ui/assets/ProjectsPage-zic2sjUf.js +0 -1
  428. package/dist/ui/assets/ProvidersPage-BxyIGKzh.js +0 -1
  429. package/dist/ui/assets/SettingsPage-CNFm3nun.js +0 -9
  430. package/dist/ui/assets/SetupPage-RBcjQtv7.js +0 -1
  431. package/dist/ui/assets/accordion-BEVqJf2A.js +0 -1
  432. package/dist/ui/assets/alert-BeGcM0nb.js +0 -1
  433. package/dist/ui/assets/api-q5Ax-vD2.js +0 -63
  434. package/dist/ui/assets/arrow-left-B_jlw8X_.js +0 -1
  435. package/dist/ui/assets/badge-pNhtItyt.js +0 -1
  436. package/dist/ui/assets/chevron-down-B16UVNlu.js +0 -1
  437. package/dist/ui/assets/chevron-left-_8ly7Fz0.js +0 -1
  438. package/dist/ui/assets/chevron-right-yzZLjezG.js +0 -1
  439. package/dist/ui/assets/chevron-up-CxKDQEE5.js +0 -1
  440. package/dist/ui/assets/circle-CFKiO9Ds.js +0 -1
  441. package/dist/ui/assets/circle-check-E2u7ZS2r.js +0 -1
  442. package/dist/ui/assets/circle-minus-1-TZF2pu.js +0 -1
  443. package/dist/ui/assets/circle-x-Cm3Sr-xb.js +0 -1
  444. package/dist/ui/assets/dialog-BaJbZsQF.js +0 -1
  445. package/dist/ui/assets/dist-DB-fE0Co.js +0 -1
  446. package/dist/ui/assets/dropdown-menu-DJoOchfz.js +0 -1
  447. package/dist/ui/assets/gauge-BTpFKuAj.js +0 -1
  448. package/dist/ui/assets/index-BN0875JH.css +0 -2
  449. package/dist/ui/assets/index-D4pdc0Uw.js +0 -54
  450. package/dist/ui/assets/label-C6tqnnKd.js +0 -1
  451. package/dist/ui/assets/loader-circle-CK3qRV3f.js +0 -1
  452. package/dist/ui/assets/pencil-BF2_XX-i.js +0 -1
  453. package/dist/ui/assets/play-DidATMfT.js +0 -1
  454. package/dist/ui/assets/plus-DXm1XDhQ.js +0 -1
  455. package/dist/ui/assets/progress-B1HC9cB_.js +0 -1
  456. package/dist/ui/assets/scroll-area-DKNpYkRA.js +0 -1
  457. package/dist/ui/assets/search-Co6mulZS.js +0 -1
  458. package/dist/ui/assets/switch-7AuR7x2g.js +0 -1
  459. package/dist/ui/assets/terminal-CjZu0OZ0.js +0 -1
  460. package/dist/ui/assets/useProviders-Bxsnav4y.js +0 -1
  461. package/dist/ui/assets/useWebSocketStore-ZCW_Nt1w.js +0 -1
  462. package/dist/ui/assets/x-5cXW_1ZS.js +0 -1
  463. /package/dist/ui/assets/{format-C0EOLKvf.js → format-GVHeOyWI.js} +0 -0
  464. /package/dist/ui/assets/{gateway-url-OqLaEDK-.js → gateway-url-COCbW0IR.js} +0 -0
  465. /package/dist/ui/assets/{utils-_qMjiZaF.js → utils-3pnRFmFe.js} +0 -0
  466. /package/dist/ui/assets/{vendor-router-DhLEd920.js → vendor-router-C9pIYwbJ.js} +0 -0
@@ -0,0 +1,95 @@
1
+ import type { ServerWebSocket } from "bun";
2
+
3
+ export interface SessionId {
4
+ userId: string;
5
+ }
6
+
7
+ export function parseSessionId(sessionId: string): SessionId | null {
8
+ if (!sessionId || sessionId.trim() === "") {
9
+ return null;
10
+ }
11
+ return { userId: sessionId };
12
+ }
13
+
14
+ export function formatSessionId(session: SessionId): string {
15
+ return session.userId;
16
+ }
17
+
18
+ export interface Session {
19
+ id: string;
20
+ parsed: SessionId;
21
+ createdAt: Date;
22
+ lastActivityAt: Date;
23
+ messageCount: number;
24
+ ws?: ServerWebSocket<unknown>;
25
+ }
26
+
27
+ export class SessionManager {
28
+ private sessions: Map<string, Session> = new Map();
29
+
30
+ create(sessionId: string, ws?: ServerWebSocket<unknown>): Session {
31
+ const parsed = parseSessionId(sessionId);
32
+ if (!parsed) {
33
+ throw new Error(`Invalid session ID: ${sessionId}`);
34
+ }
35
+
36
+ const existing = this.sessions.get(sessionId);
37
+ if (existing) {
38
+ existing.lastActivityAt = new Date();
39
+ if (ws) {
40
+ existing.ws = ws;
41
+ }
42
+ return existing;
43
+ }
44
+
45
+ const session: Session = {
46
+ id: sessionId,
47
+ parsed,
48
+ createdAt: new Date(),
49
+ lastActivityAt: new Date(),
50
+ messageCount: 0,
51
+ };
52
+ if (ws !== undefined) {
53
+ session.ws = ws;
54
+ }
55
+
56
+ this.sessions.set(sessionId, session);
57
+ return session;
58
+ }
59
+
60
+ get(sessionId: string): Session | undefined {
61
+ return this.sessions.get(sessionId);
62
+ }
63
+
64
+ touch(sessionId: string): void {
65
+ const session = this.sessions.get(sessionId);
66
+ if (session) {
67
+ session.lastActivityAt = new Date();
68
+ session.messageCount++;
69
+ }
70
+ }
71
+
72
+ delete(sessionId: string): boolean {
73
+ return this.sessions.delete(sessionId);
74
+ }
75
+
76
+ list(): Session[] {
77
+ return Array.from(this.sessions.values());
78
+ }
79
+
80
+ prune(maxAgeMs: number): number {
81
+ const now = Date.now();
82
+ let pruned = 0;
83
+
84
+ for (const [id, session] of this.sessions) {
85
+ if (now - session.lastActivityAt.getTime() > maxAgeMs) {
86
+ this.sessions.delete(id);
87
+ pruned++;
88
+ }
89
+ }
90
+
91
+ return pruned;
92
+ }
93
+ }
94
+
95
+ export const sessionManager = new SessionManager();
@@ -0,0 +1,207 @@
1
+ import type { ServerWebSocket } from "bun";
2
+ import { sessionManager } from "./session.ts";
3
+ import { laneQueue } from "./lane-queue.ts";
4
+ import { logger } from "../utils/logger.ts";
5
+
6
+ export interface InboundMessage {
7
+ type: "message" | "command" | "ping" | "join" | "canvas_subscribe" | "canvas_unsubscribe" | "logs_subscribe" | "logs_unsubscribe" | "audio" | "canvas:interact" | "a2ui:action" | "stop";
8
+ sessionId: string;
9
+ content?: string;
10
+ audio?: string;
11
+ command?: string;
12
+ args?: string[];
13
+ metadata?: Record<string, unknown>;
14
+ componentId?: string;
15
+ data?: Record<string, unknown>;
16
+ action?: string;
17
+ image?: {
18
+ base64: string;
19
+ mimeType?: string;
20
+ caption?: string;
21
+ };
22
+ document?: {
23
+ base64: string;
24
+ mimeType?: string;
25
+ fileName?: string;
26
+ };
27
+ }
28
+
29
+ export interface OutboundMessage {
30
+ type: "message" | "stream" | "status" | "error" | "pong" | "command_result" | "joined" | "typing" | "audio" | "welcome" | "progress";
31
+ sessionId: string;
32
+ id?: string; // Message ID for streaming
33
+ content?: string;
34
+ chunk?: string;
35
+ isChunk?: boolean; // True if this is a streaming chunk
36
+ isLast?: boolean;
37
+ isTyping?: boolean;
38
+ isStep?: boolean;
39
+ stepType?: "plan" | "tool_call" | "tool_result" | "text";
40
+ status?: {
41
+ state: string;
42
+ model?: string;
43
+ tokens?: number;
44
+ };
45
+ error?: string;
46
+ result?: unknown;
47
+ audio?: string; // Base64 encoded audio
48
+ mimeType?: string; // Audio MIME type
49
+ // Welcome message fields
50
+ user?: {
51
+ id: string;
52
+ name: string;
53
+ language: string;
54
+ } | null;
55
+ agent?: {
56
+ id: string;
57
+ name: string;
58
+ provider: string;
59
+ model: string;
60
+ } | null;
61
+ channels?: string[];
62
+ voice?: {
63
+ enabled: boolean;
64
+ sttProvider: string | null;
65
+ ttsProvider: string | null;
66
+ };
67
+ }
68
+
69
+ export interface SlashCommand {
70
+ name: string;
71
+ description: string;
72
+ handler: (sessionId: string, args: string[], ws: ServerWebSocket<unknown>) => Promise<unknown>;
73
+ }
74
+
75
+ const slashCommands = new Map<string, SlashCommand>();
76
+
77
+ export function registerSlashCommand(command: SlashCommand): void {
78
+ slashCommands.set(command.name, command);
79
+ }
80
+
81
+ export function isSlashCommand(content: string): boolean {
82
+ return content.startsWith("/") && content.length > 1;
83
+ }
84
+
85
+ export function parseSlashCommand(content: string): { name: string; args: string[] } | null {
86
+ if (!isSlashCommand(content)) return null;
87
+
88
+ const parts = content.slice(1).split(/\s+/);
89
+ const name = parts[0]?.toLowerCase();
90
+ if (!name) return null;
91
+
92
+ return {
93
+ name,
94
+ args: parts.slice(1),
95
+ };
96
+ }
97
+
98
+ export async function executeSlashCommand(
99
+ sessionId: string,
100
+ content: string,
101
+ ws: ServerWebSocket<unknown>
102
+ ): Promise<OutboundMessage | null> {
103
+ const parsed = parseSlashCommand(content);
104
+ if (!parsed) {
105
+ return null;
106
+ }
107
+
108
+ const command = slashCommands.get(parsed.name);
109
+ if (!command) {
110
+ return null;
111
+ }
112
+
113
+ logger.info(`Executing slash command: /${parsed.name}`, { sessionId, args: parsed.args });
114
+
115
+ try {
116
+ const result = await command.handler(sessionId, parsed.args, ws);
117
+ return {
118
+ type: "command_result",
119
+ sessionId,
120
+ result,
121
+ };
122
+ } catch (error) {
123
+ logger.error(`Slash command failed: /${parsed.name}`, { error: (error as Error).message });
124
+ return {
125
+ type: "error",
126
+ sessionId,
127
+ error: (error as Error).message,
128
+ };
129
+ }
130
+ }
131
+
132
+ registerSlashCommand({
133
+ name: "stop",
134
+ description: "Stop the current task",
135
+ handler: async (sessionId) => {
136
+ const cancelled = laneQueue.cancel(sessionId);
137
+ return {
138
+ success: cancelled,
139
+ message: cancelled ? "Task stopped" : "No task running",
140
+ };
141
+ },
142
+ });
143
+
144
+ registerSlashCommand({
145
+ name: "status",
146
+ description: "Show session status",
147
+ handler: async (sessionId) => {
148
+ const session = sessionManager.get(sessionId);
149
+ const queueStatus = laneQueue.getStatus(sessionId);
150
+
151
+ return {
152
+ sessionId,
153
+ createdAt: session?.createdAt,
154
+ messageCount: session?.messageCount,
155
+ queueLength: queueStatus.queueLength,
156
+ isProcessing: queueStatus.running !== undefined,
157
+ };
158
+ },
159
+ });
160
+
161
+ registerSlashCommand({
162
+ name: "new",
163
+ description: "Start a new session",
164
+ handler: async (sessionId) => {
165
+ sessionManager.delete(sessionId);
166
+ return { success: true, message: "Session reset" };
167
+ },
168
+ });
169
+
170
+ registerSlashCommand({
171
+ name: "compact",
172
+ description: "Force context compaction",
173
+ handler: async (sessionId) => {
174
+ logger.info(`Compaction requested for session: ${sessionId}`);
175
+ return { success: true, message: "Compaction triggered" };
176
+ },
177
+ });
178
+
179
+ registerSlashCommand({
180
+ name: "reset",
181
+ description: "Reset the current context",
182
+ handler: async (sessionId) => {
183
+ logger.info(`Context reset requested for session: ${sessionId}`);
184
+ return { success: true, message: "Context reset" };
185
+ },
186
+ });
187
+
188
+ registerSlashCommand({
189
+ name: "model",
190
+ description: "Switch model for this session",
191
+ handler: async (_sessionId, args) => {
192
+ const modelName = args[0];
193
+ if (!modelName) {
194
+ return { success: false, message: "Usage: /model <model-name>" };
195
+ }
196
+ return { success: true, message: `Model switched to: ${modelName}` };
197
+ },
198
+ });
199
+
200
+ registerSlashCommand({
201
+ name: "help",
202
+ description: "Show available commands",
203
+ handler: async () => {
204
+ const commands = Array.from(slashCommands.values()).map((c) => `/${c.name} - ${c.description}`);
205
+ return { commands };
206
+ },
207
+ });
@@ -0,0 +1,94 @@
1
+ # @johpaz/hive-tts
2
+
3
+ Síntesis de voz **local y offline** para Hive, basada en [Piper TTS](https://github.com/rhasspy/piper).
4
+
5
+ ## ¿Cuándo usarlo?
6
+
7
+ Este paquete es un **fallback opcional**. Hive usa primero los providers de voz configurados (ElevenLabs, OpenAI TTS, etc.). Este módulo se activa cuando:
8
+
9
+ - No hay conexión a internet
10
+ - No hay providers de voz configurados
11
+ - El usuario prefiere procesamiento 100% local y privado
12
+ - `packages/hivelearn` necesita generar archivos de audio narrados en el servidor (descargables, pre-generados para canales no-browser como Telegram/Discord)
13
+
14
+ > **Nota:** En el browser, `packages/hivelearn` usa Web Speech API para reproducción interactiva. Este paquete es el complemento **server-side** para generación de archivos WAV.
15
+
16
+ ## Instalación
17
+
18
+ ```bash
19
+ bun add @johpaz/hive-tts
20
+ ```
21
+
22
+ El postinstall descarga automáticamente:
23
+ - Binario de Piper (~8MB) para tu plataforma (Linux/Windows/macOS)
24
+ - Modelo de voz español `es_ES-sharvard-medium` (~60MB)
25
+
26
+ Solo se descarga una vez. Si falla por falta de internet, reintenta con:
27
+
28
+ ```bash
29
+ bun run packages/tts/src/install.ts
30
+ ```
31
+
32
+ ## Uso
33
+
34
+ ### Iniciar el servidor TTS
35
+
36
+ ```bash
37
+ bun run packages/tts/src/server.ts
38
+ # Puerto custom:
39
+ TTS_PORT=5501 bun run packages/tts/src/server.ts
40
+ ```
41
+
42
+ ### Desde packages/hivelearn
43
+
44
+ ```typescript
45
+ import { isTTSAvailable, synthesizeToFile } from "@johpaz/hive-tts/client"
46
+
47
+ if (await isTTSAvailable()) {
48
+ await synthesizeToFile(
49
+ "Bienvenido al módulo de álgebra lineal.",
50
+ "./lessons/intro.wav"
51
+ )
52
+ }
53
+ ```
54
+
55
+ ### API HTTP directa
56
+
57
+ ```bash
58
+ # Health check
59
+ curl http://localhost:5500/health
60
+
61
+ # Generar audio
62
+ curl -X POST http://localhost:5500/tts \
63
+ -H "Content-Type: application/json" \
64
+ -d '{"text": "Hive está procesando tu solicitud."}' \
65
+ --output audio.wav
66
+
67
+ # Reproducir (Linux)
68
+ aplay audio.wav
69
+ ```
70
+
71
+ ## Variables de entorno
72
+
73
+ | Variable | Default | Descripción |
74
+ |------------|-------------------------|--------------------------|
75
+ | `TTS_PORT` | `5500` | Puerto del servidor HTTP |
76
+ | `TTS_VOICE`| `es_ES-sharvard-medium` | Voz por defecto |
77
+ | `TTS_URL` | `http://localhost:5500` | URL para el cliente |
78
+
79
+ ## Plataformas soportadas
80
+
81
+ | Plataforma | Arquitectura | Estado |
82
+ |------------|-------------|-------------|
83
+ | Linux | x64 | ✅ Testeado |
84
+ | Linux | arm64 | ✅ Soportado |
85
+ | Windows | x64 | ✅ Soportado |
86
+ | macOS | x64 (Intel) | ✅ Soportado |
87
+ | macOS | arm64 (M*) | ✅ Soportado |
88
+
89
+ ## Voces adicionales
90
+
91
+ Para instalar más voces, descargar manualmente desde:
92
+ https://huggingface.co/rhasspy/piper-voices
93
+
94
+ Colocar los archivos `.onnx` y `.onnx.json` en `packages/tts/voices/`.
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@johpaz/hive-tts",
3
+ "version": "0.1.0",
4
+ "description": "Offline local TTS for Hive — Piper-based fallback when no internet providers available",
5
+ "module": "src/index.ts",
6
+ "main": "src/index.ts",
7
+ "type": "module",
8
+ "exports": {
9
+ ".": "./src/index.ts",
10
+ "./client": "./src/client.ts",
11
+ "./server": "./src/server.ts",
12
+ "./models": "./src/models.ts"
13
+ },
14
+ "scripts": {
15
+ "postinstall": "bun run src/install.ts",
16
+ "start": "bun run src/server.ts",
17
+ "dev": "bun --watch src/server.ts"
18
+ },
19
+ "dependencies": {},
20
+ "devDependencies": {
21
+ "typescript": "^5.0.0"
22
+ },
23
+ "keywords": ["hive", "tts", "offline", "piper", "voice", "spanish"],
24
+ "license": "MIT"
25
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Hive TTS Client
3
+ * No bloqueante: si TTS no está disponible, las funciones retornan null silenciosamente.
4
+ */
5
+
6
+ const TTS_URL = process.env.TTS_URL ?? "http://localhost:5500"
7
+
8
+ export async function isTTSAvailable(): Promise<boolean> {
9
+ try {
10
+ const res = await fetch(`${TTS_URL}/health`, {
11
+ signal: AbortSignal.timeout(500),
12
+ })
13
+ return res.ok
14
+ } catch {
15
+ return false
16
+ }
17
+ }
18
+
19
+ export async function synthesize(
20
+ text: string,
21
+ voice?: string
22
+ ): Promise<ArrayBuffer | null> {
23
+ try {
24
+ const res = await fetch(`${TTS_URL}/tts`, {
25
+ method: "POST",
26
+ headers: { "Content-Type": "application/json" },
27
+ body: JSON.stringify({ text, voice }),
28
+ signal: AbortSignal.timeout(10_000),
29
+ })
30
+ if (!res.ok) return null
31
+ return res.arrayBuffer()
32
+ } catch {
33
+ return null
34
+ }
35
+ }
36
+
37
+ export async function synthesizeToFile(
38
+ text: string,
39
+ outputPath: string,
40
+ voice?: string
41
+ ): Promise<boolean> {
42
+ const audio = await synthesize(text, voice)
43
+ if (!audio) return false
44
+ await Bun.write(outputPath, audio)
45
+ return true
46
+ }
47
+
48
+ export async function listVoices(): Promise<string[]> {
49
+ try {
50
+ const res = await fetch(`${TTS_URL}/voices`, {
51
+ signal: AbortSignal.timeout(500),
52
+ })
53
+ if (!res.ok) return []
54
+ const data = await res.json()
55
+ return data.voices ?? []
56
+ } catch {
57
+ return []
58
+ }
59
+ }
@@ -0,0 +1,42 @@
1
+ export type Platform =
2
+ | "linux-x64"
3
+ | "linux-arm64"
4
+ | "windows-x64"
5
+ | "macos-x64"
6
+ | "macos-arm64"
7
+
8
+ export function detectPlatform(): Platform {
9
+ const os = process.platform
10
+ const arch = process.arch
11
+
12
+ if (os === "linux" && arch === "x64") return "linux-x64"
13
+ if (os === "linux" && arch === "arm64") return "linux-arm64"
14
+ if (os === "win32" && arch === "x64") return "windows-x64"
15
+ if (os === "darwin" && arch === "x64") return "macos-x64"
16
+ if (os === "darwin" && arch === "arm64") return "macos-arm64"
17
+
18
+ throw new Error(`Plataforma no soportada: ${os}/${arch}`)
19
+ }
20
+
21
+ const PIPER_VERSION = "2023.11.14-2"
22
+ const PIPER_BASE_URL = `https://github.com/rhasspy/piper/releases/download/${PIPER_VERSION}`
23
+
24
+ export const PIPER_URLS: Record<Platform, string> = {
25
+ "linux-x64": `${PIPER_BASE_URL}/piper_linux_x86_64.tar.gz`,
26
+ "linux-arm64": `${PIPER_BASE_URL}/piper_linux_aarch64.tar.gz`,
27
+ "windows-x64": `${PIPER_BASE_URL}/piper_windows_amd64.zip`,
28
+ "macos-x64": `${PIPER_BASE_URL}/piper_macos_x86_64.tar.gz`,
29
+ "macos-arm64": `${PIPER_BASE_URL}/piper_macos_aarch64.tar.gz`,
30
+ }
31
+
32
+ export function getPiperBinaryName(platform: Platform): string {
33
+ return platform.startsWith("windows") ? "piper.exe" : "piper"
34
+ }
35
+
36
+ export const DEFAULT_VOICE = "es_MX-claude-14947-epoch-high"
37
+ export const VOICE_BASE_URL =
38
+ "https://huggingface.co/spaces/HirCoir/Piper-TTS-Spanish"
39
+ export const VOICE_URLS = {
40
+ model: `${VOICE_BASE_URL}/resolve/main/es_MX-claude-14947-epoch-high.onnx`,
41
+ config: `${VOICE_BASE_URL}/resolve/main/es_MX-claude-14947-epoch-high.onnx.json`,
42
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @johpaz/hive-tts
3
+ *
4
+ * Paquete standalone opcional para síntesis de voz offline en Hive.
5
+ * Fallback local cuando no hay internet o no hay providers configurados.
6
+ *
7
+ * Iniciar servidor:
8
+ * bun run packages/core/src/gateway/tts/src/server.ts
9
+ *
10
+ * Uso:
11
+ * import { isTTSAvailable, synthesize } from "@johpaz/hive-tts/client"
12
+ */
13
+
14
+ export * from "./client.js"
15
+ export { detectPlatform } from "./detect.js"
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Hive TTS — instalador de Piper
4
+ * Los datos se guardan en $HIVE_HOME/tts/ (por defecto ~/.hive/tts/).
5
+ */
6
+
7
+ import { existsSync, mkdirSync, readdirSync, renameSync } from "fs"
8
+ import { join } from "path"
9
+ import { homedir } from "os"
10
+ import {
11
+ detectPlatform,
12
+ PIPER_URLS,
13
+ VOICE_URLS,
14
+ getPiperBinaryName,
15
+ DEFAULT_VOICE,
16
+ } from "./detect.js"
17
+
18
+ const log = {
19
+ info: (msg: string) => console.log(`[TTS] ${msg}`),
20
+ warn: (msg: string) => console.warn(`[TTS] ${msg}`),
21
+ error: (msg: string) => console.error(`[TTS] ${msg}`),
22
+ }
23
+
24
+ async function downloadFile(url: string, dest: string): Promise<void> {
25
+ const filename = url.split("/").pop()!
26
+ log.info(`Descargando ${filename}...`)
27
+ const res = await fetch(url)
28
+ if (!res.ok) throw new Error(`HTTP ${res.status} al descargar ${url}`)
29
+ const buf = await res.arrayBuffer()
30
+ await Bun.write(dest, buf)
31
+ log.info(`${filename} — ${(buf.byteLength / 1024 / 1024).toFixed(1)} MB`)
32
+ }
33
+
34
+ async function extractTarGz(archivePath: string, destDir: string): Promise<void> {
35
+ const code = await Bun.spawn(["tar", "-xzf", archivePath, "-C", destDir], {
36
+ stdout: "inherit",
37
+ stderr: "inherit",
38
+ }).exited
39
+ if (code !== 0) throw new Error(`tar falló con código ${code}`)
40
+ await Bun.spawn(["rm", "-f", archivePath]).exited
41
+ }
42
+
43
+ async function extractZip(archivePath: string, destDir: string): Promise<void> {
44
+ const code = await Bun.spawn(["unzip", "-q", archivePath, "-d", destDir], {
45
+ stdout: "inherit",
46
+ stderr: "inherit",
47
+ }).exited
48
+ if (code !== 0) throw new Error(`unzip falló con código ${code}`)
49
+ await Bun.spawn(["rm", "-f", archivePath]).exited
50
+ }
51
+
52
+ /**
53
+ * Instala Piper TTS en el directorio indicado.
54
+ * Exportado para llamarse inline desde el gateway sin necesidad de un script externo.
55
+ */
56
+ export async function runInstall(ttsRoot: string): Promise<void> {
57
+ const BIN_DIR = join(ttsRoot, "bin")
58
+ const VOICES_DIR = join(ttsRoot, "voices")
59
+
60
+ mkdirSync(BIN_DIR, { recursive: true })
61
+ mkdirSync(VOICES_DIR, { recursive: true })
62
+
63
+ // ── Piper binary ──────────────────────────────────────────────────────────
64
+ const platform = detectPlatform()
65
+ const binaryName = getPiperBinaryName(platform)
66
+ const binaryPath = join(BIN_DIR, binaryName)
67
+
68
+ if (!existsSync(binaryPath)) {
69
+ const url = PIPER_URLS[platform]
70
+ const archiveExt = url.endsWith(".zip") ? ".zip" : ".tar.gz"
71
+ const archivePath = join(BIN_DIR, `piper${archiveExt}`)
72
+
73
+ log.info(`Instalando Piper para ${platform}...`)
74
+ await downloadFile(url, archivePath)
75
+ log.info("Extrayendo...")
76
+ if (archiveExt === ".zip") {
77
+ await extractZip(archivePath, BIN_DIR)
78
+ } else {
79
+ await extractTarGz(archivePath, BIN_DIR)
80
+ }
81
+
82
+ const piperSubdir = join(BIN_DIR, "piper")
83
+ if (existsSync(piperSubdir)) {
84
+ const tempDir = join(BIN_DIR, "_piper_tmp")
85
+ renameSync(piperSubdir, tempDir)
86
+ for (const entry of readdirSync(tempDir)) {
87
+ renameSync(join(tempDir, entry), join(BIN_DIR, entry))
88
+ }
89
+ await Bun.spawn(["rm", "-rf", tempDir]).exited
90
+ }
91
+
92
+ if (!existsSync(binaryPath)) {
93
+ throw new Error(`Binario no encontrado tras extracción: ${binaryPath}`)
94
+ }
95
+ if (!platform.startsWith("windows")) {
96
+ await Bun.spawn(["chmod", "+x", binaryPath]).exited
97
+ }
98
+ log.info(`Piper instalado en ${BIN_DIR}`)
99
+ } else {
100
+ log.info("Piper ya instalado, omitiendo descarga.")
101
+ }
102
+
103
+ // ── Voice model ───────────────────────────────────────────────────────────
104
+ const modelPath = join(VOICES_DIR, `${DEFAULT_VOICE}.onnx`)
105
+ const configPath = join(VOICES_DIR, `${DEFAULT_VOICE}.onnx.json`)
106
+
107
+ if (!existsSync(modelPath) || !existsSync(configPath)) {
108
+ log.info(`Descargando modelo de voz ${DEFAULT_VOICE}...`)
109
+ await downloadFile(VOICE_URLS.model, modelPath)
110
+ await downloadFile(VOICE_URLS.config, configPath)
111
+ log.info(`Voz instalada en ${VOICES_DIR}`)
112
+ } else {
113
+ log.info("Modelo de voz ya instalado, omitiendo descarga.")
114
+ }
115
+
116
+ log.info("Hive TTS listo.")
117
+ }
118
+
119
+ // Ejecución directa: bun run src/install.ts
120
+ // @ts-ignore
121
+ if (import.meta.main) {
122
+ const ttsRoot =
123
+ process.env.HIVE_TTS_ROOT ??
124
+ join(process.env.HIVE_HOME ?? join(homedir(), ".hive"), "tts")
125
+ runInstall(ttsRoot).catch((err) => {
126
+ log.error(`Hive TTS no pudo instalarse: ${err instanceof Error ? err.message : err}`)
127
+ process.exit(1)
128
+ })
129
+ }