@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,378 @@
1
+ /**
2
+ * Bun Global Adapter
3
+ *
4
+ * Handles Hive installation via `bun install -g @johpaz/hive-agents`.
5
+ * Uses global npm-style installation with local filesystem paths.
6
+ */
7
+
8
+ import { spawn, execSync } from "node:child_process";
9
+ import * as path from "node:path";
10
+ import { existsSync, readFileSync, unlinkSync } from "node:fs";
11
+ import type {
12
+ InstallationAdapter,
13
+ InstallationConfig,
14
+ GatewayConfig,
15
+ ValidationResult,
16
+ } from "./types";
17
+ import {
18
+ getHiveDir,
19
+ getDefaultPaths,
20
+ loadEnvFile,
21
+ mergeEnv,
22
+ expandPath,
23
+ waitForHttpPort,
24
+ isPortAvailable,
25
+ } from "./config";
26
+ import { PORTS } from "./types";
27
+
28
+ type SpawnedProcess = {
29
+ on(event: "close", listener: (code: number | null) => void): void;
30
+ on(event: "error", listener: (error: Error) => void): void;
31
+ };
32
+
33
+ /**
34
+ * Bun Global installation adapter
35
+ */
36
+ export class BunGlobalAdapter implements InstallationAdapter {
37
+ readonly type = "bun-global" as const;
38
+ readonly name = "Bun Global (npm-style)";
39
+
40
+ private hiveDir: string;
41
+ private pidFile: string;
42
+
43
+ constructor(options?: { hiveDir?: string }) {
44
+ this.hiveDir = options?.hiveDir || getHiveDir();
45
+ this.pidFile = path.join(this.hiveDir, "gateway.pid");
46
+ }
47
+
48
+ /**
49
+ * Check if Bun global installation is available
50
+ */
51
+ async detect(): Promise<boolean> {
52
+ try {
53
+ // Check if Bun is installed
54
+ execSync("bun --version", { stdio: "ignore" });
55
+
56
+ // Check if hive is installed globally
57
+ try {
58
+ const output = execSync("bun which hive", {
59
+ encoding: "utf-8",
60
+ stdio: ["ignore", "pipe", "ignore"],
61
+ });
62
+
63
+ const hivePath = output.trim();
64
+ if (hivePath && existsSync(hivePath)) {
65
+ return true;
66
+ }
67
+ } catch {
68
+ // Try alternative detection
69
+ const output = execSync("bun pm ls -g", {
70
+ encoding: "utf-8",
71
+ stdio: ["ignore", "pipe", "ignore"],
72
+ });
73
+
74
+ if (output.includes("@johpaz/hive-agents") || output.includes("hive")) {
75
+ return true;
76
+ }
77
+ }
78
+
79
+ return false;
80
+ } catch {
81
+ return false;
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Get Bun Global installation configuration
87
+ */
88
+ async getConfig(): Promise<InstallationConfig> {
89
+ const env = await this.getEnvironment();
90
+ const paths = getDefaultPaths(this.hiveDir);
91
+
92
+ // For global installation, try to find UI directory
93
+ let uiDir: string | null = null;
94
+
95
+ // Check in dist directory relative to hive binary
96
+ try {
97
+ const hivePath = execSync("bun which hive", {
98
+ encoding: "utf-8",
99
+ stdio: ["ignore", "pipe", "ignore"],
100
+ }).trim();
101
+
102
+ const distDir = path.dirname(hivePath);
103
+ const potentialUiDir = path.join(distDir, "ui");
104
+
105
+ if (existsSync(potentialUiDir)) {
106
+ uiDir = potentialUiDir;
107
+ }
108
+ } catch {
109
+ // Binary location not found, will use embedded UI fallback
110
+ }
111
+
112
+ // Also check current working directory for development
113
+ if (!uiDir) {
114
+ const cwdUiDir = path.join(process.cwd(), "packages/hive-ui/dist");
115
+ if (existsSync(cwdUiDir)) {
116
+ uiDir = cwdUiDir;
117
+ }
118
+ }
119
+
120
+ paths.uiDir = uiDir;
121
+
122
+ const port = parseInt(env.HIVE_PORT || "18790", 10) || PORTS.GATEWAY;
123
+ const publicUrl = env.HIVE_PUBLIC_URL || undefined;
124
+
125
+ return {
126
+ type: this.type,
127
+ gateway: {
128
+ host: env.HIVE_HOST || "127.0.0.1",
129
+ port,
130
+ wsPort: port,
131
+ publicUrl,
132
+ openBrowser: !env.NO_BROWSER,
133
+ daemon: !!env.HIVE_DAEMON,
134
+ },
135
+ paths,
136
+ env,
137
+ isDev: process.env.HIVE_DEV === "true" || process.env.HIVE_DEV === "1",
138
+ hasEmbeddedUI: false,
139
+ };
140
+ }
141
+
142
+ /**
143
+ * Start Hive gateway using Bun
144
+ */
145
+ async start(config: GatewayConfig): Promise<void> {
146
+ return new Promise((resolve, reject) => {
147
+ const args = ["hive", "start", "--skip-check"];
148
+
149
+ if (config.daemon) {
150
+ args.push("--daemon");
151
+ }
152
+
153
+ const child = spawn("bun", args, {
154
+ stdio: "inherit",
155
+ detached: false,
156
+ env: mergeEnv(process.env, {
157
+ HIVE_HOME: this.hiveDir,
158
+ }),
159
+ });
160
+
161
+ const childProcess = child as unknown as SpawnedProcess;
162
+ childProcess.on("close", (code) => {
163
+ if (code === 0) {
164
+ resolve();
165
+ } else {
166
+ reject(new Error(`Bun hive exited with code ${code}`));
167
+ }
168
+ });
169
+
170
+ childProcess.on("error", (error) => {
171
+ reject(error);
172
+ });
173
+ });
174
+ }
175
+
176
+ /**
177
+ * Stop Hive gateway
178
+ */
179
+ async stop(): Promise<void> {
180
+ try {
181
+ if (existsSync(this.pidFile)) {
182
+ const pid = parseInt(readFileSync(this.pidFile, "utf-8").trim(), 10);
183
+
184
+ if (!isNaN(pid)) {
185
+ try {
186
+ process.kill(pid, "SIGTERM");
187
+ console.log(`✅ Hive Gateway detenido (PID: ${pid})`);
188
+ } catch (error) {
189
+ if ((error as NodeJS.ErrnoException).code === "ESRCH") {
190
+ console.log("⚠️ Hive Gateway no está corriendo");
191
+ } else {
192
+ throw error;
193
+ }
194
+ } finally {
195
+ try {
196
+ unlinkSync(this.pidFile);
197
+ } catch {
198
+ // Ignore errors removing PID file
199
+ }
200
+ }
201
+ }
202
+ } else {
203
+ // Try to kill by process name
204
+ try {
205
+ execSync("pkill -f 'bun.*hive.*start'", { stdio: "ignore" });
206
+ console.log("✅ Hive Gateway detenido");
207
+ } catch {
208
+ console.log("⚠️ Hive Gateway no está corriendo");
209
+ }
210
+ }
211
+ } catch (error) {
212
+ console.error("❌ Error deteniendo Hive Gateway:", (error as Error).message);
213
+ throw error;
214
+ }
215
+ }
216
+
217
+ /**
218
+ * Check if gateway is running
219
+ */
220
+ async isRunning(): Promise<boolean> {
221
+ try {
222
+ if (existsSync(this.pidFile)) {
223
+ const pid = parseInt(readFileSync(this.pidFile, "utf-8").trim(), 10);
224
+
225
+ if (!isNaN(pid)) {
226
+ try {
227
+ process.kill(pid, 0);
228
+ return true;
229
+ } catch {
230
+ // Process not running, clean up stale PID file
231
+ try {
232
+ unlinkSync(this.pidFile);
233
+ } catch {
234
+ // Ignore
235
+ }
236
+ }
237
+ }
238
+ }
239
+
240
+ // Alternative: check if port is in use
241
+ const config = await this.getConfig();
242
+ const portAvailable = await isPortAvailable(config.gateway.port);
243
+ return !portAvailable;
244
+ } catch {
245
+ return false;
246
+ }
247
+ }
248
+
249
+ /**
250
+ * Get gateway process ID
251
+ */
252
+ async getPid(): Promise<number | null> {
253
+ try {
254
+ if (existsSync(this.pidFile)) {
255
+ const pid = parseInt(readFileSync(this.pidFile, "utf-8").trim(), 10);
256
+ if (!isNaN(pid) && pid > 0) {
257
+ try {
258
+ process.kill(pid, 0);
259
+ return pid;
260
+ } catch {
261
+ // Process not running
262
+ }
263
+ }
264
+ }
265
+
266
+ return null;
267
+ } catch {
268
+ return null;
269
+ }
270
+ }
271
+
272
+ /**
273
+ * Get Bun Global environment variables
274
+ */
275
+ async getEnvironment(): Promise<Record<string, string>> {
276
+ const fileEnv = loadEnvFile();
277
+ const homeEnv = loadEnvFile(path.join(this.hiveDir, ".env"));
278
+
279
+ const defaults = {
280
+ HIVE_HOST: "127.0.0.1",
281
+ HIVE_PORT: String(PORTS.GATEWAY),
282
+ HIVE_HOME: this.hiveDir,
283
+ NO_BROWSER: "0",
284
+ HIVE_PUBLIC_URL: "",
285
+ HIVE_DAEMON: "0",
286
+ };
287
+
288
+ return mergeEnv(defaults, fileEnv, homeEnv, process.env);
289
+ }
290
+
291
+ /**
292
+ * Validate Bun Global installation
293
+ */
294
+ async validate(): Promise<ValidationResult> {
295
+ const errors: string[] = [];
296
+ const warnings: string[] = [];
297
+ const info: string[] = [];
298
+
299
+ // Check Bun installation
300
+ try {
301
+ const version = execSync("bun --version", { encoding: "utf-8" }).trim();
302
+ info.push(`Bun: v${version}`);
303
+ } catch {
304
+ errors.push("Bun is not installed or not in PATH");
305
+ }
306
+
307
+ // Check global hive installation
308
+ try {
309
+ const hivePath = execSync("bun which hive", {
310
+ encoding: "utf-8",
311
+ stdio: ["ignore", "pipe", "ignore"],
312
+ }).trim();
313
+
314
+ if (hivePath && existsSync(hivePath)) {
315
+ info.push(`Hive binary: ${hivePath}`);
316
+
317
+ // Check if UI directory exists
318
+ const distDir = path.dirname(hivePath);
319
+ const uiDir = path.join(distDir, "ui");
320
+
321
+ if (existsSync(uiDir)) {
322
+ info.push(`UI directory: ${uiDir}`);
323
+ } else {
324
+ warnings.push("UI directory not found - may use embedded UI");
325
+ }
326
+ } else {
327
+ errors.push("Hive is not installed globally");
328
+ }
329
+ } catch {
330
+ errors.push("Hive is not installed globally (try: bun install -g @johpaz/hive-agents)");
331
+ }
332
+
333
+ // Check Hive directory
334
+ if (existsSync(this.hiveDir)) {
335
+ info.push(`Hive home: ${this.hiveDir}`);
336
+ } else {
337
+ warnings.push(`Hive home directory does not exist: ${this.hiveDir}`);
338
+ }
339
+
340
+ // Check if gateway is running
341
+ const running = await this.isRunning();
342
+ if (running) {
343
+ info.push("Hive Gateway is running");
344
+
345
+ // Check health endpoint
346
+ const config = await this.getConfig();
347
+ const healthy = await waitForHttpPort(config.gateway.port, "/health", 5000);
348
+
349
+ if (healthy) {
350
+ info.push("Hive health check passed");
351
+ } else {
352
+ warnings.push("Hive Gateway is running but health check failed");
353
+ }
354
+ } else {
355
+ warnings.push("Hive Gateway is not running");
356
+ }
357
+
358
+ // Check for conflicting installations
359
+ try {
360
+ execSync("docker --version", { stdio: "ignore" });
361
+ const dockerAdapter = new (await import("./docker")).DockerAdapter();
362
+ const dockerInstalled = await dockerAdapter.detect();
363
+
364
+ if (dockerInstalled) {
365
+ info.push("Note: Docker installation also detected");
366
+ }
367
+ } catch {
368
+ // Docker not installed, no conflict
369
+ }
370
+
371
+ return {
372
+ valid: errors.length === 0,
373
+ errors,
374
+ warnings,
375
+ info,
376
+ };
377
+ }
378
+ }
@@ -0,0 +1,314 @@
1
+ /**
2
+ * Configuration utilities for installation adapters
3
+ *
4
+ * Provides shared configuration loading, validation, and normalization
5
+ * across different installation methods.
6
+ */
7
+
8
+ import { z } from "zod";
9
+ import * as path from "node:path";
10
+ import { existsSync, readFileSync } from "node:fs";
11
+ import type { GatewayConfig, InstallationConfig, InstallationPaths } from "./types";
12
+ import { DEFAULT_GATEWAY_CONFIG, PORTS, gatewayConfigSchema, installationConfigSchema } from "./types";
13
+
14
+ /**
15
+ * Get the base Hive directory from environment or default
16
+ */
17
+ export function getHiveDir(customDir?: string): string {
18
+ if (customDir) {
19
+ return path.resolve(customDir);
20
+ }
21
+
22
+ // Check environment variable
23
+ if (process.env.HIVE_HOME) {
24
+ return path.resolve(process.env.HIVE_HOME);
25
+ }
26
+
27
+ // Development mode
28
+ if (process.env.HIVE_DEV === "true") {
29
+ return path.join(process.env.HOME || "", ".hive-dev");
30
+ }
31
+
32
+ // Default production location
33
+ return path.join(process.env.HOME || "", ".hive");
34
+ }
35
+
36
+ /**
37
+ * Get default installation paths for the current environment
38
+ */
39
+ export function getDefaultPaths(hiveDir?: string): InstallationPaths {
40
+ const dir = getHiveDir(hiveDir);
41
+ const dataDir = path.join(dir, "data");
42
+ const logsDir = path.join(dir, "logs");
43
+
44
+ return {
45
+ hiveDir: dir,
46
+ dbPath: path.join(dataDir, "hive.db"),
47
+ logPath: path.join(logsDir, "gateway.log"),
48
+ pidPath: path.join(dir, "gateway.pid"),
49
+ uiDir: null, // Will be set by adapter
50
+ workspaceDir: null, // Will be set from config
51
+ };
52
+ }
53
+
54
+ /**
55
+ * Load environment variables from .env file if it exists
56
+ */
57
+ export function loadEnvFile(envPath?: string): Record<string, string> {
58
+ const filePath = envPath || path.join(process.cwd(), ".env");
59
+
60
+ if (!existsSync(filePath)) {
61
+ return {};
62
+ }
63
+
64
+ try {
65
+ const content = readFileSync(filePath, "utf-8");
66
+ const env: Record<string, string> = {};
67
+
68
+ for (const line of content.split("\n")) {
69
+ const trimmed = line.trim();
70
+ // Skip comments and empty lines
71
+ if (!trimmed || trimmed.startsWith("#")) {
72
+ continue;
73
+ }
74
+
75
+ const [key, ...valueParts] = trimmed.split("=");
76
+ if (key && valueParts.length > 0) {
77
+ const value = valueParts.join("=").trim();
78
+ // Remove quotes if present
79
+ const cleanValue = value.replace(/^["']|["']$/g, "");
80
+ env[key.trim()] = cleanValue;
81
+ }
82
+ }
83
+
84
+ return env;
85
+ } catch {
86
+ return {};
87
+ }
88
+ }
89
+
90
+ /**
91
+ * Merge environment variables with precedence
92
+ */
93
+ export function mergeEnv(...envs: Array<Record<string, string>>): Record<string, string> {
94
+ const result: Record<string, string> = {};
95
+
96
+ for (const env of envs) {
97
+ Object.assign(result, env);
98
+ }
99
+
100
+ return result;
101
+ }
102
+
103
+ /**
104
+ * Validate and normalize gateway configuration
105
+ */
106
+ export function validateGatewayConfig(
107
+ config: Partial<GatewayConfig>
108
+ ): GatewayConfig {
109
+ const merged = { ...DEFAULT_GATEWAY_CONFIG, ...config };
110
+
111
+ try {
112
+ return gatewayConfigSchema.parse(merged);
113
+ } catch (error) {
114
+ if (error instanceof z.ZodError) {
115
+ const messages = error.issues.map((e) => `${e.path.join(".")}: ${e.message}`);
116
+ throw new Error(`Invalid gateway configuration:\n${messages.join("\n")}`);
117
+ }
118
+ throw error;
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Validate complete installation configuration
124
+ */
125
+ export function validateInstallationConfig(
126
+ config: unknown
127
+ ): InstallationConfig {
128
+ try {
129
+ return installationConfigSchema.parse(config);
130
+ } catch (error) {
131
+ if (error instanceof z.ZodError) {
132
+ const messages = error.issues.map((e) => `${e.path.join(".")}: ${e.message}`);
133
+ throw new Error(`Invalid installation configuration:\n${messages.join("\n")}`);
134
+ }
135
+ throw error;
136
+ }
137
+ }
138
+
139
+ /**
140
+ * Find a free port starting from the given port
141
+ */
142
+ export async function findFreePort(startPort: number, maxAttempts: number = 100): Promise<number> {
143
+ for (let port = startPort; port < startPort + maxAttempts; port++) {
144
+ try {
145
+ const server = Bun.serve({
146
+ port,
147
+ hostname: "0.0.0.0",
148
+ fetch: () => new Response(""),
149
+ });
150
+ server.stop();
151
+ return port;
152
+ } catch {
153
+ // Port is in use, try next
154
+ }
155
+ }
156
+ throw new Error(`No free port found starting from ${startPort}`);
157
+ }
158
+
159
+ /**
160
+ * Check if a port is available
161
+ */
162
+ export async function isPortAvailable(port: number): Promise<boolean> {
163
+ try {
164
+ const server = Bun.serve({
165
+ port,
166
+ hostname: "0.0.0.0",
167
+ fetch: () => new Response(""),
168
+ });
169
+ server.stop();
170
+ return true;
171
+ } catch {
172
+ return false;
173
+ }
174
+ }
175
+
176
+ /**
177
+ * Wait for a port to become available
178
+ */
179
+ export async function waitForPort(
180
+ port: number,
181
+ timeout: number = 30000,
182
+ interval: number = 500
183
+ ): Promise<boolean> {
184
+ const start = Date.now();
185
+
186
+ while (Date.now() - start < timeout) {
187
+ if (await isPortAvailable(port)) {
188
+ return true;
189
+ }
190
+ await new Promise((resolve) => setTimeout(resolve, interval));
191
+ }
192
+
193
+ return false;
194
+ }
195
+
196
+ /**
197
+ * Wait for a port to respond to HTTP requests
198
+ */
199
+ export async function waitForHttpPort(
200
+ port: number,
201
+ path: string = "/health",
202
+ timeout: number = 30000
203
+ ): Promise<boolean> {
204
+ const start = Date.now();
205
+
206
+ while (Date.now() - start < timeout) {
207
+ try {
208
+ const response = await fetch(`http://127.0.0.1:${port}${path}`, {
209
+ signal: AbortSignal.timeout(1000),
210
+ });
211
+ if (response.ok) {
212
+ return true;
213
+ }
214
+ } catch {
215
+ // Port not ready yet
216
+ }
217
+ await new Promise((resolve) => setTimeout(resolve, 500));
218
+ }
219
+
220
+ return false;
221
+ }
222
+
223
+ /**
224
+ * Expand a path that may contain ~ or environment variables
225
+ */
226
+ export function expandPath(input: string): string {
227
+ if (!input) {
228
+ return input;
229
+ }
230
+
231
+ // Expand ~ to home directory
232
+ if (input.startsWith("~/")) {
233
+ return path.join(process.env.HOME || "", input.slice(2));
234
+ }
235
+
236
+ // Expand environment variables ${VAR} or $VAR
237
+ return input.replace(/\$\{?([A-Z_][A-Z0-9_]*)\}?/gi, (_, name) => {
238
+ return process.env[name] || name;
239
+ });
240
+ }
241
+
242
+ /**
243
+ * Get the distribution directory where the binary is located
244
+ */
245
+ export function getDistDir(): string | null {
246
+ // Check environment variable
247
+ if (process.env.HIVE_DIST_DIR) {
248
+ return process.env.HIVE_DIST_DIR;
249
+ }
250
+
251
+ // Try to detect from process.argv
252
+ const scriptPath = process.argv[1];
253
+ if (!scriptPath) {
254
+ return null;
255
+ }
256
+
257
+ const dir = path.dirname(scriptPath);
258
+
259
+ // Check if we're in a dist directory
260
+ if (path.basename(dir) === "dist") {
261
+ return dir;
262
+ }
263
+
264
+ // Check if dist exists as a sibling
265
+ const distPath = path.join(dir, "dist");
266
+ if (existsSync(distPath)) {
267
+ return distPath;
268
+ }
269
+
270
+ return null;
271
+ }
272
+
273
+ /**
274
+ * Check if running in development mode
275
+ *
276
+ * Development mode is ONLY activated when HIVE_DEV is set to "true" or "1".
277
+ * Otherwise, defaults to production mode.
278
+ *
279
+ * This is a simple and reliable check:
280
+ * - Set HIVE_DEV=true in your development environment
281
+ * - Production installations don't need to set anything
282
+ */
283
+ export function isDevMode(): boolean {
284
+ return process.env.HIVE_DEV === "true" || process.env.HIVE_DEV === "1";
285
+ }
286
+
287
+ /**
288
+ * Check if running as a child process
289
+ */
290
+ export function isChildProcess(): boolean {
291
+ return process.env.HIVE_GATEWAY_CHILD === "1";
292
+ }
293
+
294
+ /**
295
+ * Get platform-specific information
296
+ */
297
+ export function getPlatformInfo(): {
298
+ platform: string;
299
+ arch: string;
300
+ isLinux: boolean;
301
+ isMac: boolean;
302
+ isWindows: boolean;
303
+ } {
304
+ const platform = process.platform;
305
+ const arch = process.arch;
306
+
307
+ return {
308
+ platform,
309
+ arch,
310
+ isLinux: platform === "linux",
311
+ isMac: platform === "darwin",
312
+ isWindows: platform === "win32",
313
+ };
314
+ }