@johpaz/hive-agents 0.0.35 → 0.0.37

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 (441) hide show
  1. package/README.md +64 -39
  2. package/dist/hive.js +3231 -3189
  3. package/dist/tool-worker.js +218406 -0
  4. package/dist/ui/assets/{AgentCreateForm-B4eK7efF.js → AgentCreateForm-tJZv9FZC.js} +1 -1
  5. package/dist/ui/assets/{AgentDetailPage-BD2uoJWk.js → AgentDetailPage-Du-mRcAX.js} +1 -1
  6. package/dist/ui/assets/AgentNewPage-DIFYd_Ys.js +1 -0
  7. package/dist/ui/assets/{AgentsPage-4JUZXvkA.js → AgentsPage-YvSgWRiw.js} +6 -6
  8. package/dist/ui/assets/CanvasPage-DtMwGvxf.js +33 -0
  9. package/dist/ui/assets/{ChannelsPage-BUn7-nhV.js → ChannelsPage-BdBXWHjj.js} +1 -1
  10. package/dist/ui/assets/DashboardPage-ghl1ZguH.js +6 -0
  11. package/dist/ui/assets/{LoginPage-C8j_urUD.js → LoginPage-CAmSI9Vy.js} +1 -1
  12. package/dist/ui/assets/LogsPage-DAPBHkwK.js +1 -0
  13. package/dist/ui/assets/MeetingPage-WjjGOqqU.js +1 -0
  14. package/dist/ui/assets/{NotFound-Drh-sJPN.js → NotFound-BMeQSGcG.js} +1 -1
  15. package/dist/ui/assets/ProvidersPage-Ct6HsAi1.js +1 -0
  16. package/dist/ui/assets/{RecoverPage-DNb1Pr8h.js → RecoverPage-DpW3l-yv.js} +1 -1
  17. package/dist/ui/assets/SettingsPage-DBJ7_E6C.js +9 -0
  18. package/dist/ui/assets/SetupPage-DKmLVUaj.js +1 -0
  19. package/dist/ui/assets/{WebChatPage-R-YOwA4F.js → WebChatPage-CVRcKept.js} +2 -2
  20. package/dist/ui/assets/accordion-C5d5Rm5z.js +1 -0
  21. package/dist/ui/assets/{alert-U8FsgWi7.js → alert-C-NE-P3s.js} +1 -1
  22. package/dist/ui/assets/{alert-dialog-CRdMkkmk.js → alert-dialog-C5mzbHdP.js} +1 -1
  23. package/dist/ui/assets/{badge-Cli1jnH5.js → badge-ChpACfWO.js} +1 -1
  24. package/dist/ui/assets/chevron-up-BYhk0K2J.js +1 -0
  25. package/dist/ui/assets/{dialog-DQ3s-LuO.js → dialog-QnZ0ad8O.js} +1 -1
  26. package/dist/ui/assets/dropdown-menu-BK-CO3Od.js +1 -0
  27. package/dist/ui/assets/{es-DcMjrpbA.js → es-NQNoaWDx.js} +1 -1
  28. package/dist/ui/assets/index-B2fCYtTS.css +2 -0
  29. package/dist/ui/assets/index-DMCjjdqf.js +116 -0
  30. package/dist/ui/assets/{label-0BvGVXvZ.js → label-D2H1IR_J.js} +1 -1
  31. package/dist/ui/assets/progress-BherYzY6.js +1 -0
  32. package/dist/ui/assets/scroll-area-DkeyX32e.js +1 -0
  33. package/dist/ui/assets/{slider-D47dOrRa.js → slider-CsiUDxc3.js} +1 -1
  34. package/dist/ui/assets/switch-BDwN8RYV.js +1 -0
  35. package/dist/ui/assets/{table-DhowbNxQ.js → table-CSc8ubon.js} +1 -1
  36. package/dist/ui/assets/terminal-DN38Q456.js +1 -0
  37. package/dist/ui/assets/useProviders-C6_QHsEi.js +1 -0
  38. package/dist/ui/assets/{vendor-radix-JY4ncZrD.js → vendor-radix-cw1bQaVC.js} +4 -4
  39. package/dist/ui/assets/{vendor-react-CscwQerf.js → vendor-react-D4s9E-zj.js} +1 -1
  40. package/dist/ui/dist/assets/AgentCreateForm-tJZv9FZC.js +1 -0
  41. package/dist/ui/dist/assets/AgentDetailPage-Du-mRcAX.js +1 -0
  42. package/dist/ui/dist/assets/AgentNewPage-DIFYd_Ys.js +1 -0
  43. package/dist/ui/dist/assets/AgentsPage-YvSgWRiw.js +10 -0
  44. package/dist/ui/dist/assets/CanvasPage-DtMwGvxf.js +33 -0
  45. package/dist/ui/dist/assets/ChannelsPage-BdBXWHjj.js +8 -0
  46. package/dist/ui/dist/assets/DashboardPage-ghl1ZguH.js +6 -0
  47. package/dist/ui/dist/assets/LoginPage-CAmSI9Vy.js +1 -0
  48. package/dist/ui/dist/assets/LogsPage-DAPBHkwK.js +1 -0
  49. package/dist/ui/dist/assets/MeetingPage-WjjGOqqU.js +1 -0
  50. package/dist/ui/dist/assets/NotFound-BMeQSGcG.js +1 -0
  51. package/dist/ui/dist/assets/ProvidersPage-Ct6HsAi1.js +1 -0
  52. package/dist/ui/dist/assets/RecoverPage-DpW3l-yv.js +1 -0
  53. package/dist/ui/dist/assets/SettingsPage-DBJ7_E6C.js +9 -0
  54. package/dist/ui/dist/assets/SetupPage-DKmLVUaj.js +1 -0
  55. package/dist/ui/dist/assets/WebChatPage-CVRcKept.js +16 -0
  56. package/dist/ui/dist/assets/accordion-C5d5Rm5z.js +1 -0
  57. package/dist/ui/dist/assets/activity-c3pNngT_.js +1 -0
  58. package/dist/ui/dist/assets/alert-C-NE-P3s.js +1 -0
  59. package/dist/ui/dist/assets/alert-dialog-C5mzbHdP.js +1 -0
  60. package/dist/ui/dist/assets/arrow-left-CBcbX5EZ.js +1 -0
  61. package/dist/ui/dist/assets/badge-ChpACfWO.js +1 -0
  62. package/dist/ui/dist/assets/calendar-B-KZ9RQO.js +1 -0
  63. package/dist/ui/dist/assets/card-CNf6BS2e.js +1 -0
  64. package/dist/ui/dist/assets/chevron-left-D4U-5A27.js +1 -0
  65. package/dist/ui/dist/assets/chevron-right-CR4Skrf3.js +1 -0
  66. package/dist/ui/dist/assets/chevron-up-BYhk0K2J.js +1 -0
  67. package/dist/ui/dist/assets/circle-alert-CyHDwUj8.js +1 -0
  68. package/dist/ui/dist/assets/circle-check-Bb54Ebmu.js +1 -0
  69. package/dist/ui/dist/assets/cpu-Cdgc_B1K.js +1 -0
  70. package/dist/ui/dist/assets/dialog-QnZ0ad8O.js +1 -0
  71. package/dist/ui/dist/assets/download-C3ifGMjJ.js +1 -0
  72. package/dist/ui/dist/assets/dropdown-menu-BK-CO3Od.js +1 -0
  73. package/dist/ui/dist/assets/es-NQNoaWDx.js +1 -0
  74. package/dist/ui/dist/assets/external-link-BvxYeTP1.js +1 -0
  75. package/dist/ui/dist/assets/eye-DqNTU_GD.js +1 -0
  76. package/dist/ui/dist/assets/file-text-BT_9S9SM.js +1 -0
  77. package/dist/ui/dist/assets/folder-open-BhH8y9ac.js +1 -0
  78. package/dist/ui/dist/assets/format-GVHeOyWI.js +1 -0
  79. package/dist/ui/dist/assets/gateway-url-COCbW0IR.js +1 -0
  80. package/dist/ui/dist/assets/gauge-D_TMa4i9.js +1 -0
  81. package/dist/ui/dist/assets/globe-DeCQTCDJ.js +1 -0
  82. package/dist/ui/dist/assets/hexagon-DsGOUl-H.js +1 -0
  83. package/dist/ui/dist/assets/history-BSG-Ypqf.js +1 -0
  84. package/dist/ui/dist/assets/index-B2fCYtTS.css +2 -0
  85. package/dist/ui/dist/assets/index-DMCjjdqf.js +116 -0
  86. package/dist/ui/dist/assets/info-NwLoa2Mj.js +1 -0
  87. package/dist/ui/dist/assets/key-3EP0dhkT.js +1 -0
  88. package/dist/ui/dist/assets/label-D2H1IR_J.js +1 -0
  89. package/dist/ui/dist/assets/loader-circle-CZNax6kS.js +1 -0
  90. package/dist/ui/dist/assets/lock-Ei1_J-Nq.js +1 -0
  91. package/dist/ui/dist/assets/pause-BUqah9Bi.js +1 -0
  92. package/dist/ui/dist/assets/play-NcZ4swwL.js +1 -0
  93. package/dist/ui/dist/assets/plus-CX1xyhp5.js +1 -0
  94. package/dist/ui/dist/assets/progress-BherYzY6.js +1 -0
  95. package/dist/ui/dist/assets/refresh-cw-DaYdjQFk.js +1 -0
  96. package/dist/ui/dist/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
  97. package/dist/ui/dist/assets/save-CUdYyHNy.js +1 -0
  98. package/dist/ui/dist/assets/scroll-area-DkeyX32e.js +1 -0
  99. package/dist/ui/dist/assets/send-B0H5SEIE.js +1 -0
  100. package/dist/ui/dist/assets/settings-Ds4SqD8s.js +1 -0
  101. package/dist/ui/dist/assets/slider-CsiUDxc3.js +14 -0
  102. package/dist/ui/dist/assets/sparkles-yUEb-7oH.js +1 -0
  103. package/dist/ui/dist/assets/square-BD81nFtN.js +1 -0
  104. package/dist/ui/dist/assets/switch-BDwN8RYV.js +1 -0
  105. package/dist/ui/dist/assets/table-CSc8ubon.js +1 -0
  106. package/dist/ui/dist/assets/terminal-DN38Q456.js +1 -0
  107. package/dist/ui/dist/assets/textarea-CXgXWKrT.js +1 -0
  108. package/dist/ui/dist/assets/trash-2-CNjMkoq6.js +1 -0
  109. package/dist/ui/dist/assets/triangle-alert-C9Y8Ub4X.js +1 -0
  110. package/dist/ui/dist/assets/useProviders-C6_QHsEi.js +1 -0
  111. package/dist/ui/dist/assets/utils-3pnRFmFe.js +1 -0
  112. package/dist/ui/dist/assets/vendor-charts-Bu2lyBKP.js +65 -0
  113. package/dist/ui/dist/assets/vendor-query-DsWPbQdG.js +1 -0
  114. package/dist/ui/dist/assets/vendor-radix-cw1bQaVC.js +63 -0
  115. package/dist/ui/dist/assets/vendor-react-D4s9E-zj.js +1 -0
  116. package/dist/ui/dist/assets/vendor-router-C9pIYwbJ.js +3 -0
  117. package/dist/ui/dist/assets/volume-2-CeSXNDv4.js +1 -0
  118. package/dist/ui/dist/assets/zap-hlXjpSeA.js +1 -0
  119. package/dist/ui/dist/favicon.ico +0 -0
  120. package/dist/ui/dist/index.html +40 -0
  121. package/dist/ui/dist/placeholder.svg +1 -0
  122. package/dist/ui/index.html +6 -6
  123. package/package.json +138 -13
  124. package/packages/cli/src/adapters/binary.ts +461 -0
  125. package/packages/cli/src/adapters/bun-global.ts +378 -0
  126. package/packages/cli/src/adapters/config.ts +314 -0
  127. package/packages/cli/src/adapters/docker.ts +308 -0
  128. package/packages/cli/src/adapters/factory.ts +168 -0
  129. package/packages/cli/src/adapters/index.ts +80 -0
  130. package/packages/cli/src/adapters/types.ts +218 -0
  131. package/packages/cli/src/commands/agent-run.ts +168 -0
  132. package/packages/cli/src/commands/agents.ts +398 -0
  133. package/packages/cli/src/commands/chat.ts +142 -0
  134. package/packages/cli/src/commands/config.ts +49 -0
  135. package/packages/cli/src/commands/cron.ts +487 -0
  136. package/packages/cli/src/commands/dev.ts +58 -0
  137. package/packages/cli/src/commands/doctor.ts +320 -0
  138. package/packages/cli/src/commands/gateway.ts +719 -0
  139. package/packages/cli/src/commands/logs.ts +57 -0
  140. package/packages/cli/src/commands/mcp.ts +175 -0
  141. package/packages/cli/src/commands/message.ts +77 -0
  142. package/packages/cli/src/commands/migrate.ts +90 -0
  143. package/packages/cli/src/commands/onboard.ts +1656 -0
  144. package/packages/cli/src/commands/security.ts +144 -0
  145. package/packages/cli/src/commands/service.ts +50 -0
  146. package/packages/cli/src/commands/sessions.ts +116 -0
  147. package/packages/cli/src/commands/skills.ts +215 -0
  148. package/packages/cli/src/commands/update.ts +203 -0
  149. package/packages/cli/src/index.ts +210 -0
  150. package/packages/cli/src/ui-bundle.generated.ts +3 -0
  151. package/packages/cli/src/utils/token.ts +6 -0
  152. package/packages/core/src/agent/agent-loop.ts +691 -0
  153. package/packages/core/src/agent/compaction.ts +240 -0
  154. package/packages/core/src/agent/context-compiler.ts +467 -0
  155. package/packages/core/src/agent/context-guard.ts +91 -0
  156. package/packages/core/src/agent/conversation-store.ts +244 -0
  157. package/packages/core/src/agent/curator.ts +158 -0
  158. package/packages/core/src/agent/hooks.ts +166 -0
  159. package/packages/core/src/agent/llm-client.ts +167 -0
  160. package/packages/core/src/agent/llm-providers/anthropic.ts +212 -0
  161. package/packages/core/src/agent/llm-providers/deepseek.ts +8 -0
  162. package/packages/core/src/agent/llm-providers/gemini.ts +215 -0
  163. package/packages/core/src/agent/llm-providers/groq.ts +5 -0
  164. package/packages/core/src/agent/llm-providers/interface.ts +195 -0
  165. package/packages/core/src/agent/llm-providers/kimi.ts +8 -0
  166. package/packages/core/src/agent/llm-providers/local-llama.ts +37 -0
  167. package/packages/core/src/agent/llm-providers/mistral.ts +5 -0
  168. package/packages/core/src/agent/llm-providers/nvidia.ts +5 -0
  169. package/packages/core/src/agent/llm-providers/ollama.ts +175 -0
  170. package/packages/core/src/agent/llm-providers/openai-compat-base.ts +379 -0
  171. package/packages/core/src/agent/llm-providers/openai.ts +5 -0
  172. package/packages/core/src/agent/llm-providers/openrouter.ts +5 -0
  173. package/packages/core/src/agent/llm-providers/qwen.ts +5 -0
  174. package/packages/core/src/agent/native-tools.ts +31 -0
  175. package/packages/core/src/agent/playbook-selector.ts +147 -0
  176. package/packages/core/src/agent/prompt-builder.ts +169 -0
  177. package/packages/core/src/agent/providers/index.ts +204 -0
  178. package/packages/core/src/agent/providers.ts +1 -0
  179. package/packages/core/src/agent/reflector.ts +200 -0
  180. package/packages/core/src/agent/service.ts +267 -0
  181. package/packages/core/src/agent/skill-selector.ts +479 -0
  182. package/packages/core/src/agent/stuck-loop.ts +133 -0
  183. package/packages/core/src/agent/tool-selector.ts +569 -0
  184. package/packages/core/src/agent/tracer.ts +100 -0
  185. package/packages/core/src/auth/auth.ts +108 -0
  186. package/packages/core/src/auth/index.ts +1 -0
  187. package/packages/core/src/canvas/a2ui-tools.ts +255 -0
  188. package/packages/core/src/canvas/canvas-manager.ts +390 -0
  189. package/packages/core/src/canvas/canvas-tools.ts +448 -0
  190. package/packages/core/src/canvas/emitter.ts +149 -0
  191. package/packages/core/src/canvas/index.ts +3 -0
  192. package/packages/core/src/channels/base.ts +154 -0
  193. package/packages/core/src/channels/discord.ts +273 -0
  194. package/packages/core/src/channels/index.ts +7 -0
  195. package/packages/core/src/channels/manager.ts +450 -0
  196. package/packages/core/src/channels/slack.ts +323 -0
  197. package/packages/core/src/channels/telegram.ts +612 -0
  198. package/packages/core/src/channels/webchat.ts +139 -0
  199. package/packages/core/src/channels/whatsapp.ts +548 -0
  200. package/packages/core/src/config/index.ts +12 -0
  201. package/packages/core/src/config/loader.ts +569 -0
  202. package/packages/core/src/events/agent-bus.ts +460 -0
  203. package/packages/core/src/events/event-bus.ts +169 -0
  204. package/packages/core/src/gateway/channel-notify.ts +64 -0
  205. package/packages/core/src/gateway/helpers/cors.ts +32 -0
  206. package/packages/core/src/gateway/helpers/index.ts +4 -0
  207. package/packages/core/src/gateway/helpers/narration.ts +57 -0
  208. package/packages/core/src/gateway/helpers/path.ts +13 -0
  209. package/packages/core/src/gateway/helpers/redact.ts +61 -0
  210. package/packages/core/src/gateway/index.ts +5 -0
  211. package/packages/core/src/gateway/initializer.ts +363 -0
  212. package/packages/core/src/gateway/lane-queue.ts +169 -0
  213. package/packages/core/src/gateway/llm-local/client.ts +94 -0
  214. package/packages/core/src/gateway/llm-local/detector.ts +321 -0
  215. package/packages/core/src/gateway/llm-local/downloader.ts +216 -0
  216. package/packages/core/src/gateway/llm-local/index.ts +34 -0
  217. package/packages/core/src/gateway/llm-local/manager.ts +186 -0
  218. package/packages/core/src/gateway/llm-local/models.ts +149 -0
  219. package/packages/core/src/gateway/llm-local/server.ts +179 -0
  220. package/packages/core/src/gateway/resolver.ts +108 -0
  221. package/packages/core/src/gateway/router.ts +124 -0
  222. package/packages/core/src/gateway/routes/agents.ts +210 -0
  223. package/packages/core/src/gateway/routes/auth.ts +244 -0
  224. package/packages/core/src/gateway/routes/channels.ts +484 -0
  225. package/packages/core/src/gateway/routes/chat.ts +241 -0
  226. package/packages/core/src/gateway/routes/config.ts +12 -0
  227. package/packages/core/src/gateway/routes/cron-api.ts +544 -0
  228. package/packages/core/src/gateway/routes/ethics.ts +46 -0
  229. package/packages/core/src/gateway/routes/llm-local.ts +271 -0
  230. package/packages/core/src/gateway/routes/mcp.ts +319 -0
  231. package/packages/core/src/gateway/routes/meeting.ts +232 -0
  232. package/packages/core/src/gateway/routes/models.ts +163 -0
  233. package/packages/core/src/gateway/routes/multimodal.ts +93 -0
  234. package/packages/core/src/gateway/routes/providers.ts +220 -0
  235. package/packages/core/src/gateway/routes/setup.ts +441 -0
  236. package/packages/core/src/gateway/routes/skills.ts +115 -0
  237. package/packages/core/src/gateway/routes/system.ts +469 -0
  238. package/packages/core/src/gateway/routes/tasks.ts +44 -0
  239. package/packages/core/src/gateway/routes/tools.ts +59 -0
  240. package/packages/core/src/gateway/routes/tts-local.ts +388 -0
  241. package/packages/core/src/gateway/routes/users.ts +122 -0
  242. package/packages/core/src/gateway/routes/voice.ts +189 -0
  243. package/packages/core/src/gateway/routes/workspace.ts +281 -0
  244. package/packages/core/src/gateway/server.ts +2744 -0
  245. package/packages/core/src/gateway/session.ts +95 -0
  246. package/packages/core/src/gateway/slash-commands.ts +207 -0
  247. package/packages/core/src/gateway/tts/README.md +94 -0
  248. package/packages/core/src/gateway/tts/package.json +25 -0
  249. package/packages/core/src/gateway/tts/src/client.ts +59 -0
  250. package/packages/core/src/gateway/tts/src/detect.ts +42 -0
  251. package/packages/core/src/gateway/tts/src/index.ts +15 -0
  252. package/packages/core/src/gateway/tts/src/install.ts +129 -0
  253. package/packages/core/src/gateway/tts/src/models.ts +50 -0
  254. package/packages/core/src/gateway/tts/src/server.ts +252 -0
  255. package/packages/core/src/gateway/tts/voices/.gitkeep +0 -0
  256. package/packages/core/src/heartbeat/index.ts +157 -0
  257. package/packages/core/src/index.ts +56 -0
  258. package/packages/core/src/mcp/hot-reload.ts +148 -0
  259. package/packages/core/src/mcp/singleton.ts +21 -0
  260. package/packages/core/src/mcp/tool-sync.ts +176 -0
  261. package/packages/core/src/multimodal/index.ts +2 -0
  262. package/packages/core/src/multimodal/types.ts +28 -0
  263. package/packages/core/src/multimodal/vision-service.ts +283 -0
  264. package/packages/core/src/plugins/api.ts +128 -0
  265. package/packages/core/src/plugins/index.ts +2 -0
  266. package/packages/core/src/plugins/loader.ts +365 -0
  267. package/packages/core/src/resilience/circuit-breaker.ts +225 -0
  268. package/packages/core/src/scheduler/CronScheduler.ts +699 -0
  269. package/packages/core/src/scheduler/dag/AgentExecutor.ts +53 -0
  270. package/packages/core/src/scheduler/dag/DAGScheduler.ts +250 -0
  271. package/packages/core/src/scheduler/dag/EventBridge.ts +122 -0
  272. package/packages/core/src/scheduler/dag/TaskGraph.ts +192 -0
  273. package/packages/core/src/scheduler/dag/TaskNode.ts +97 -0
  274. package/packages/core/src/scheduler/dag/TaskResult.ts +22 -0
  275. package/packages/core/src/scheduler/dag/errors.ts +37 -0
  276. package/packages/core/src/scheduler/dag/index.ts +26 -0
  277. package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +97 -0
  278. package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +21 -0
  279. package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +46 -0
  280. package/packages/core/src/scheduler/index.ts +22 -0
  281. package/packages/core/src/scheduler/integration.ts +237 -0
  282. package/packages/core/src/scheduler/types.ts +164 -0
  283. package/packages/core/src/security/google-chat.ts +269 -0
  284. package/packages/core/src/security/index.ts +192 -0
  285. package/packages/core/src/security/pairing.ts +250 -0
  286. package/packages/core/src/security/rate-limit.ts +270 -0
  287. package/packages/core/src/security/signal.ts +321 -0
  288. package/packages/core/src/state/store.ts +312 -0
  289. package/packages/core/src/storage/crypto.ts +197 -0
  290. package/packages/core/src/storage/migrate.ts +147 -0
  291. package/packages/core/src/storage/onboarding.ts +1506 -0
  292. package/packages/core/src/storage/schema.ts +666 -0
  293. package/packages/core/src/storage/seed.ts +628 -0
  294. package/packages/core/src/storage/sqlite.ts +407 -0
  295. package/packages/core/src/storage/usage.ts +374 -0
  296. package/packages/core/src/tool-runtime/index.ts +502 -0
  297. package/packages/core/src/tool-runtime/tool-worker.ts +125 -0
  298. package/packages/core/src/tools/agents/get-available-models.ts +118 -0
  299. package/packages/core/src/tools/agents/index.ts +610 -0
  300. package/packages/core/src/tools/canvas/index.ts +420 -0
  301. package/packages/core/src/tools/cli/index.ts +142 -0
  302. package/packages/core/src/tools/core/index.ts +478 -0
  303. package/packages/core/src/tools/cron/index.ts +635 -0
  304. package/packages/core/src/tools/filesystem/fs-delete.ts +78 -0
  305. package/packages/core/src/tools/filesystem/fs-edit.ts +106 -0
  306. package/packages/core/src/tools/filesystem/fs-exists.ts +63 -0
  307. package/packages/core/src/tools/filesystem/fs-glob.ts +108 -0
  308. package/packages/core/src/tools/filesystem/fs-list.ts +129 -0
  309. package/packages/core/src/tools/filesystem/fs-read.ts +72 -0
  310. package/packages/core/src/tools/filesystem/fs-write.ts +67 -0
  311. package/packages/core/src/tools/filesystem/index.ts +34 -0
  312. package/packages/core/src/tools/filesystem/workspace-guard.ts +62 -0
  313. package/packages/core/src/tools/index.ts +197 -0
  314. package/packages/core/src/tools/meeting/index.ts +363 -0
  315. package/packages/core/src/tools/office/index.ts +47 -0
  316. package/packages/core/src/tools/office/office-escribir-docx.ts +192 -0
  317. package/packages/core/src/tools/office/office-escribir-pdf.ts +172 -0
  318. package/packages/core/src/tools/office/office-escribir-pptx.ts +174 -0
  319. package/packages/core/src/tools/office/office-escribir-xlsx.ts +116 -0
  320. package/packages/core/src/tools/office/office-leer-docx.ts +93 -0
  321. package/packages/core/src/tools/office/office-leer-pdf.ts +114 -0
  322. package/packages/core/src/tools/office/office-leer-pptx.ts +136 -0
  323. package/packages/core/src/tools/office/office-leer-xlsx.ts +124 -0
  324. package/packages/core/src/tools/types.ts +39 -0
  325. package/packages/core/src/tools/voice/index.ts +104 -0
  326. package/packages/core/src/tools/web/browser-click.ts +78 -0
  327. package/packages/core/src/tools/web/browser-extract.ts +139 -0
  328. package/packages/core/src/tools/web/browser-navigate.ts +106 -0
  329. package/packages/core/src/tools/web/browser-screenshot.ts +87 -0
  330. package/packages/core/src/tools/web/browser-script.ts +88 -0
  331. package/packages/core/src/tools/web/browser-service.ts +554 -0
  332. package/packages/core/src/tools/web/browser-type.ts +101 -0
  333. package/packages/core/src/tools/web/browser-wait.ts +136 -0
  334. package/packages/core/src/tools/web/index.ts +41 -0
  335. package/packages/core/src/tools/web/web-fetch.ts +78 -0
  336. package/packages/core/src/tools/web/web-search.ts +123 -0
  337. package/packages/core/src/utils/benchmark.ts +80 -0
  338. package/packages/core/src/utils/crypto.ts +73 -0
  339. package/packages/core/src/utils/date.ts +42 -0
  340. package/packages/core/src/utils/index.ts +5 -0
  341. package/packages/core/src/utils/logger.ts +389 -0
  342. package/packages/core/src/utils/retry.ts +70 -0
  343. package/packages/core/src/utils/toon.ts +253 -0
  344. package/packages/core/src/voice/index.ts +643 -0
  345. package/packages/mcp/src/config.ts +13 -0
  346. package/packages/mcp/src/index.ts +1 -0
  347. package/packages/mcp/src/logger.ts +47 -0
  348. package/packages/mcp/src/manager.ts +439 -0
  349. package/packages/mcp/src/transports/index.ts +67 -0
  350. package/packages/mcp/src/transports/sse.ts +238 -0
  351. package/packages/mcp/src/transports/websocket.ts +159 -0
  352. package/packages/skills/src/bundled/agents/agent_spawner/SKILL.md +167 -0
  353. package/packages/skills/src/bundled/agents/code_delegator/SKILL.md +156 -0
  354. package/packages/skills/src/bundled/agents/memory_manager/SKILL.md +143 -0
  355. package/packages/skills/src/bundled/agents/research_and_remember/SKILL.md +139 -0
  356. package/packages/skills/src/bundled/agents/task_orchestrator/SKILL.md +198 -0
  357. package/packages/skills/src/bundled/canvas/a2ui_dashboard/SKILL.md +176 -0
  358. package/packages/skills/src/bundled/canvas/a2ui_form/SKILL.md +202 -0
  359. package/packages/skills/src/bundled/canvas/a2ui_interactive/SKILL.md +206 -0
  360. package/packages/skills/src/bundled/canvas/canvas_dashboard/SKILL.md +146 -0
  361. package/packages/skills/src/bundled/canvas/canvas_interact/SKILL.md +148 -0
  362. package/packages/skills/src/bundled/canvas/canvas_report/SKILL.md +146 -0
  363. package/packages/skills/src/bundled/cli/cli_pipeline/SKILL.md +136 -0
  364. package/packages/skills/src/bundled/cli/cli_safe_exec/SKILL.md +125 -0
  365. package/packages/skills/src/bundled/cron_manager/SKILL.md +188 -0
  366. package/packages/skills/src/bundled/cron_reminder/SKILL.md +112 -0
  367. package/packages/skills/src/bundled/filesystem/file_manager/SKILL.md +118 -0
  368. package/packages/skills/src/bundled/filesystem/file_read_and_summarize/SKILL.md +108 -0
  369. package/packages/skills/src/bundled/filesystem/file_writer/SKILL.md +135 -0
  370. package/packages/skills/src/bundled/meeting/meeting_transcription/SKILL.md +213 -0
  371. package/packages/skills/src/bundled/office/office_document_manager/SKILL.md +262 -0
  372. package/packages/skills/src/bundled/search_knowledge/busqueda_fts5/SKILL.md +74 -0
  373. package/packages/skills/src/bundled/voice/voice_assistant/SKILL.md +174 -0
  374. package/packages/skills/src/bundled/voice/voice_input/SKILL.md +146 -0
  375. package/packages/skills/src/bundled/voice/voice_output/SKILL.md +151 -0
  376. package/packages/skills/src/bundled/web/browser_automate/SKILL.md +120 -0
  377. package/packages/skills/src/bundled/web/browser_scrape/SKILL.md +109 -0
  378. package/packages/skills/src/bundled/web/web_monitor/SKILL.md +127 -0
  379. package/packages/skills/src/bundled/web/web_research/SKILL.md +119 -0
  380. package/packages/skills/src/bundled-data.generated.ts +1964 -0
  381. package/packages/skills/src/index.ts +1 -0
  382. package/packages/skills/src/loader.ts +388 -0
  383. package/dist/ui/assets/AgentNewPage-GB-tVN50.js +0 -1
  384. package/dist/ui/assets/BridgePage-DDcDILKu.js +0 -1
  385. package/dist/ui/assets/CanvasPage-oOk2sGOD.js +0 -33
  386. package/dist/ui/assets/DashboardPage-DV_2qWYJ.js +0 -6
  387. package/dist/ui/assets/LogsPage-DayYjh01.js +0 -1
  388. package/dist/ui/assets/MeetingPage-C01uPuqj.js +0 -1
  389. package/dist/ui/assets/ProjectsPage-B8_am_Ib.js +0 -1
  390. package/dist/ui/assets/ProvidersPage-DBzi66e4.js +0 -1
  391. package/dist/ui/assets/SettingsPage-CFA_Tknl.js +0 -9
  392. package/dist/ui/assets/SetupPage-BrUWbhvT.js +0 -1
  393. package/dist/ui/assets/accordion-DdAEfIXR.js +0 -1
  394. package/dist/ui/assets/chevron-down-DIosfU_U.js +0 -1
  395. package/dist/ui/assets/chevron-up-CI-W21Fy.js +0 -1
  396. package/dist/ui/assets/circle-S0-ouLz-.js +0 -1
  397. package/dist/ui/assets/circle-minus-CE0iJrl8.js +0 -1
  398. package/dist/ui/assets/circle-x-jUJ5zZvQ.js +0 -1
  399. package/dist/ui/assets/dropdown-menu-C2CXM1VE.js +0 -1
  400. package/dist/ui/assets/index-BN0875JH.css +0 -2
  401. package/dist/ui/assets/index-CH6sBa3Q.js +0 -116
  402. package/dist/ui/assets/pencil-5VdSj-h5.js +0 -1
  403. package/dist/ui/assets/progress-JN30I5fF.js +0 -1
  404. package/dist/ui/assets/scroll-area-BQQPitM8.js +0 -1
  405. package/dist/ui/assets/search-ChPgnVKj.js +0 -1
  406. package/dist/ui/assets/switch-C7W2-KEx.js +0 -1
  407. package/dist/ui/assets/terminal-C-R5Fckz.js +0 -1
  408. package/dist/ui/assets/useProviders-TBnWn-Hq.js +0 -1
  409. /package/dist/ui/assets/{card-DFKnZ6ky.js → card-CNf6BS2e.js} +0 -0
  410. /package/dist/ui/assets/{circle-alert-KuAm2FWh.js → circle-alert-CyHDwUj8.js} +0 -0
  411. /package/dist/ui/assets/{circle-check-6Ard1-2z.js → circle-check-Bb54Ebmu.js} +0 -0
  412. /package/dist/ui/assets/{cpu-KDy6-FAI.js → cpu-Cdgc_B1K.js} +0 -0
  413. /package/dist/ui/assets/{download-Cjbk4Rek.js → download-C3ifGMjJ.js} +0 -0
  414. /package/dist/ui/assets/{external-link-HtrFM63g.js → external-link-BvxYeTP1.js} +0 -0
  415. /package/dist/ui/assets/{eye-D1dB40_o.js → eye-DqNTU_GD.js} +0 -0
  416. /package/dist/ui/assets/{file-text-CE58EfH0.js → file-text-BT_9S9SM.js} +0 -0
  417. /package/dist/ui/assets/{folder-open-DIPKeiI_.js → folder-open-BhH8y9ac.js} +0 -0
  418. /package/dist/ui/assets/{format-BwdV8bB5.js → format-GVHeOyWI.js} +0 -0
  419. /package/dist/ui/assets/{gateway-url-D5uj6Nxg.js → gateway-url-COCbW0IR.js} +0 -0
  420. /package/dist/ui/assets/{gauge-DmQmJHEg.js → gauge-D_TMa4i9.js} +0 -0
  421. /package/dist/ui/assets/{globe-_hUGxQF4.js → globe-DeCQTCDJ.js} +0 -0
  422. /package/dist/ui/assets/{hexagon-BaNGQlQj.js → hexagon-DsGOUl-H.js} +0 -0
  423. /package/dist/ui/assets/{history-BfZVGlZa.js → history-BSG-Ypqf.js} +0 -0
  424. /package/dist/ui/assets/{info-CBZ5-AlC.js → info-NwLoa2Mj.js} +0 -0
  425. /package/dist/ui/assets/{key-Bv5DdTPh.js → key-3EP0dhkT.js} +0 -0
  426. /package/dist/ui/assets/{loader-circle-C4hhXLgp.js → loader-circle-CZNax6kS.js} +0 -0
  427. /package/dist/ui/assets/{lock-CkZYexqw.js → lock-Ei1_J-Nq.js} +0 -0
  428. /package/dist/ui/assets/{pause-Bpy1_s7y.js → pause-BUqah9Bi.js} +0 -0
  429. /package/dist/ui/assets/{play-Cj4osqJZ.js → play-NcZ4swwL.js} +0 -0
  430. /package/dist/ui/assets/{plus-BQhgZN3A.js → plus-CX1xyhp5.js} +0 -0
  431. /package/dist/ui/assets/{refresh-cw-BfREHVQM.js → refresh-cw-DaYdjQFk.js} +0 -0
  432. /package/dist/ui/assets/{save-FFTD4dMp.js → save-CUdYyHNy.js} +0 -0
  433. /package/dist/ui/assets/{settings-BdHKUL92.js → settings-Ds4SqD8s.js} +0 -0
  434. /package/dist/ui/assets/{sparkles-r4uJbJAl.js → sparkles-yUEb-7oH.js} +0 -0
  435. /package/dist/ui/assets/{square-G7Hyufqm.js → square-BD81nFtN.js} +0 -0
  436. /package/dist/ui/assets/{textarea-5kyuD04X.js → textarea-CXgXWKrT.js} +0 -0
  437. /package/dist/ui/assets/{trash-2-DXVBRWfh.js → trash-2-CNjMkoq6.js} +0 -0
  438. /package/dist/ui/assets/{triangle-alert-Bu5seg9O.js → triangle-alert-C9Y8Ub4X.js} +0 -0
  439. /package/dist/ui/assets/{vendor-router-CCECILJ0.js → vendor-router-C9pIYwbJ.js} +0 -0
  440. /package/dist/ui/assets/{volume-2-s9DuS696.js → volume-2-CeSXNDv4.js} +0 -0
  441. /package/dist/ui/assets/{zap-BPHZzXKV.js → zap-hlXjpSeA.js} +0 -0
@@ -0,0 +1,719 @@
1
+ /**
2
+ * Gateway Command - Refactored with Installation Adapters
3
+ *
4
+ * Manages the Hive Gateway lifecycle using the installation adapter system.
5
+ * Each installation method (Docker, Bun Global, Binary, etc.) is handled
6
+ * by its specific adapter, providing clean separation of concerns.
7
+ */
8
+
9
+ import { loadConfig, startGateway, logger, getHiveDir, initializeDatabase } from "@johpaz/hive-agents-core";
10
+ import { existsSync, mkdirSync, writeFileSync, readFileSync, unlinkSync, openSync } from "node:fs";
11
+ import * as path from "node:path";
12
+ import { spawn, ChildProcess } from "child_process";
13
+ import { embeddedUI } from "../ui-bundle.generated";
14
+
15
+ // Import adapter system
16
+ import {
17
+ detectAdapter,
18
+ DockerAdapter,
19
+ BunGlobalAdapter,
20
+ BinaryAdapter,
21
+ type InstallationAdapter,
22
+ type GatewayConfig,
23
+ DEFAULT_GATEWAY_CONFIG,
24
+ PORTS,
25
+ getHiveDir as getAdapterHiveDir,
26
+ findFreePort,
27
+ waitForHttpPort,
28
+ isDevMode,
29
+ isChildProcess,
30
+ getDistDir,
31
+ } from "../adapters";
32
+
33
+ const children: ChildProcess[] = [];
34
+
35
+ /**
36
+ * Get the active installation adapter
37
+ * Cached to avoid repeated detection
38
+ */
39
+ let _adapter: InstallationAdapter | null = null;
40
+
41
+ async function getAdapter(): Promise<InstallationAdapter> {
42
+ if (!_adapter) {
43
+ _adapter = await detectAdapter({ verbose: false });
44
+ }
45
+ return _adapter;
46
+ }
47
+
48
+ /**
49
+ * Reset the cached adapter (for testing or forced re-detection)
50
+ */
51
+ export function resetAdapter(): void {
52
+ _adapter = null;
53
+ }
54
+
55
+ /**
56
+ * Start UI server with embedded or filesystem assets
57
+ */
58
+ function startUIServer(
59
+ uiDir: string | null,
60
+ gatewayPort: number,
61
+ uiPort: number
62
+ ): void {
63
+ const configScript = `<script>window.__HIVE_CONFIG__={"apiUrl":"http://localhost:${gatewayPort}","wsUrl":"ws://localhost:${gatewayPort}"}</script>`;
64
+ const useEmbedded = embeddedUI.size > 0;
65
+
66
+ Bun.serve({
67
+ hostname: "0.0.0.0",
68
+ port: uiPort,
69
+ async fetch(req) {
70
+ const url = new URL(req.url);
71
+ let subPath = url.pathname === "/" ? "/index.html" : url.pathname;
72
+ // SPA fallback: rutas sin extensión → index.html
73
+ if (!path.extname(subPath)) subPath = "/index.html";
74
+
75
+ if (useEmbedded) {
76
+ const isIndex = subPath === "/index.html" || !embeddedUI.has(subPath);
77
+ const entry = embeddedUI.get(subPath) ?? embeddedUI.get("/index.html")!;
78
+ if (isIndex) {
79
+ const html = entry.data.toString("utf8").replace("</head>", `${configScript}</head>`);
80
+ return new Response(html, { headers: { "Content-Type": "text/html; charset=utf-8" } });
81
+ }
82
+ const bytes = entry.data as Uint8Array;
83
+ const body = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;
84
+ return new Response(body, { headers: { "Content-Type": entry.mime } });
85
+ }
86
+
87
+ // Filesystem path (npm / Docker)
88
+ const filePath = path.join(uiDir!, subPath);
89
+ const file = Bun.file(filePath);
90
+ if (!(await file.exists())) {
91
+ const index = Bun.file(path.join(uiDir!, "index.html"));
92
+ if (await index.exists()) {
93
+ const html = (await index.text()).replace("</head>", `${configScript}</head>`);
94
+ return new Response(html, { headers: { "Content-Type": "text/html" } });
95
+ }
96
+ return new Response("Not found", { status: 404 });
97
+ }
98
+ if (subPath === "/index.html") {
99
+ const html = (await file.text()).replace("</head>", `${configScript}</head>`);
100
+ return new Response(html, { headers: { "Content-Type": "text/html" } });
101
+ }
102
+ return new Response(file);
103
+ },
104
+ });
105
+ }
106
+
107
+ /**
108
+ * Cleanup child processes on exit
109
+ */
110
+ function cleanup() {
111
+ if (children.length === 0) return;
112
+ console.log("\n🧹 Limpiando procesos hijos...");
113
+ for (const child of children) {
114
+ if (child.pid) {
115
+ try {
116
+ process.kill(-child.pid, "SIGTERM");
117
+ } catch {
118
+ child.kill("SIGTERM");
119
+ }
120
+ }
121
+ }
122
+ }
123
+
124
+ // Signal handlers
125
+ process.on("SIGINT", () => {
126
+ cleanup();
127
+ process.exit(0);
128
+ });
129
+
130
+ process.on("SIGTERM", () => {
131
+ cleanup();
132
+ process.exit(0);
133
+ });
134
+
135
+ process.on("exit", () => {
136
+ cleanup();
137
+ });
138
+
139
+ /**
140
+ * Get default PID file path
141
+ */
142
+ function getDefaultPidFile(): string {
143
+ return path.join(getHiveDir(), "gateway.pid");
144
+ }
145
+
146
+ /**
147
+ * Get log file path
148
+ */
149
+ function getLogFile(): string {
150
+ return path.join(getHiveDir(), "logs", "gateway.log");
151
+ }
152
+
153
+ /**
154
+ * Get PID file path from config or default
155
+ */
156
+ async function getPidFile(): Promise<string> {
157
+ try {
158
+ const config = await loadConfig();
159
+ return config.gateway?.pidFile || getDefaultPidFile();
160
+ } catch {
161
+ return getDefaultPidFile();
162
+ }
163
+ }
164
+
165
+ /**
166
+ * Ensure log directory exists
167
+ */
168
+ function ensureLogDir(): void {
169
+ const logDir = path.dirname(getLogFile());
170
+ if (!existsSync(logDir)) {
171
+ mkdirSync(logDir, { recursive: true });
172
+ }
173
+ }
174
+
175
+ /**
176
+ * Open browser based on platform
177
+ */
178
+ function openBrowser(url: string): void {
179
+ const platform = process.platform;
180
+ let shellCmd: string;
181
+
182
+ if (platform === "win32") {
183
+ shellCmd = `start "" "${url}"`;
184
+ } else if (platform === "darwin") {
185
+ shellCmd = `open "${url}"`;
186
+ } else {
187
+ shellCmd = `gio open "${url}" 2>/dev/null || xdg-open "${url}" 2>/dev/null || sensible-browser "${url}" 2>/dev/null || x-www-browser "${url}" 2>/dev/null || true`;
188
+ }
189
+
190
+ console.log(`🌐 Abriendo navegador en ${url}`);
191
+
192
+ try {
193
+ const shell = platform === "win32" ? "cmd" : "/bin/sh";
194
+ const shellArg = platform === "win32" ? "/c" : "-c";
195
+ const proc = Bun.spawn([shell, shellArg, shellCmd], {
196
+ stdout: "ignore",
197
+ stderr: "ignore",
198
+ stdin: "ignore",
199
+ });
200
+ proc.unref();
201
+ } catch {
202
+ console.log(`\n🌐 Abre Hive aquí: ${url}\n`);
203
+ }
204
+ }
205
+
206
+ /**
207
+ * Check if setup mode is needed
208
+ */
209
+ async function isSetupMode(): Promise<boolean> {
210
+ const hiveDir = getHiveDir();
211
+ const dbPath = path.join(hiveDir, "data", "hive.db");
212
+ return !existsSync(dbPath);
213
+ }
214
+
215
+ /**
216
+ * Check if gateway is running using the adapter
217
+ */
218
+ async function isRunning(): Promise<boolean> {
219
+ try {
220
+ // Try adapter first
221
+ const adapter = await getAdapter();
222
+ const adapterRunning = await adapter.isRunning();
223
+ if (adapterRunning) {
224
+ return true;
225
+ }
226
+ } catch {
227
+ // Adapter check failed, fall through to PID check
228
+ }
229
+
230
+ // Fallback to PID file check
231
+ const pidFile = await getPidFile();
232
+ if (!existsSync(pidFile)) return false;
233
+
234
+ const pid = parseInt(readFileSync(pidFile, "utf-8").trim(), 10);
235
+ if (isNaN(pid)) return false;
236
+
237
+ try {
238
+ process.kill(pid, 0);
239
+ return true;
240
+ } catch {
241
+ try {
242
+ unlinkSync(pidFile);
243
+ } catch { }
244
+ return false;
245
+ }
246
+ }
247
+
248
+ /**
249
+ * Wait for gateway port to be ready
250
+ */
251
+ async function waitForPort(port: number, timeout: number = 30000): Promise<boolean> {
252
+ return waitForHttpPort(port, "/health", timeout);
253
+ }
254
+
255
+ /**
256
+ * Wait for Vite dev server
257
+ */
258
+ async function waitForVite(port: number, timeout: number = 30000): Promise<boolean> {
259
+ const start = Date.now();
260
+ while (Date.now() - start < timeout) {
261
+ try {
262
+ const response = await fetch(`http://127.0.0.1:${port}`, {
263
+ method: "HEAD",
264
+ signal: AbortSignal.timeout(200),
265
+ });
266
+ if (response.ok || response.status === 200) {
267
+ return true;
268
+ }
269
+ } catch {
270
+ // Port not ready yet
271
+ }
272
+ await Bun.sleep(200);
273
+ }
274
+ return false;
275
+ }
276
+
277
+ /**
278
+ * Start command - main entry point
279
+ */
280
+ export async function start(flags: string[]): Promise<void> {
281
+ const daemon = flags.includes("--daemon");
282
+ const skipCheck = flags.includes("--skip-check");
283
+ const devInternal = flags.includes("--dev-internal");
284
+
285
+ const isDev = isDevMode();
286
+ const isChild = isChildProcess();
287
+
288
+ // Detect and set adapter
289
+ const adapter = await getAdapter();
290
+ const config = await adapter.getConfig();
291
+
292
+ // Skip onboarding check if running as child process
293
+ const isGatewayChild = process.env.HIVE_GATEWAY_CHILD === "1";
294
+
295
+ if (!skipCheck && await isRunning()) {
296
+ console.log("⚠️ Hive Gateway ya está corriendo");
297
+ return;
298
+ }
299
+
300
+ // Load core config for logger settings
301
+ try {
302
+ const coreConfig = await loadConfig();
303
+ if (coreConfig.logging?.level) {
304
+ logger.setLevel(coreConfig.logging.level);
305
+ }
306
+ } catch {
307
+ // Use default logger settings
308
+ }
309
+
310
+ // Show banner only if not running as child process
311
+ if (!isGatewayChild) {
312
+ console.log(`
313
+ ╔═══════════════════════════════════════════╗
314
+ ║ ║
315
+ ║ ██╗ ██╗██╗██╗ ██╗███████╗ ║
316
+ ║ ██║ ██║██║██║ ██║██╔════╝ ║
317
+ ║ ███████║██║██║ ██║█████╗ ║
318
+ ║ ██╔══██║██║╚██╗ ██╔╝██╔══╝ ║
319
+ ║ ██║ ██║██║ ╚████╔╝ ███████╗ ║
320
+ ║ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚══════╝ ║
321
+ ║ ║
322
+ ║ Personal Swarm AI Gateway — v0.0.37 ║
323
+ ╚════════════════════════════════════════════╝
324
+
325
+ 📦 Installation: ${adapter.name}
326
+ `);
327
+ }
328
+
329
+ // Handle daemon mode
330
+ if (daemon) {
331
+ ensureLogDir();
332
+ const logFile = getLogFile();
333
+ const child = spawn(process.execPath, [process.argv[1] || "", "start", "--skip-check"], {
334
+ detached: true,
335
+ stdio: ["ignore", openSync(logFile, "a"), openSync(logFile, "a")],
336
+ env: { ...process.env, HIVE_GATEWAY_CHILD: "1" },
337
+ });
338
+ child.unref();
339
+ writeFileSync(await getPidFile(), child.pid?.toString() || "");
340
+ console.log(`✅ Hive Gateway iniciado en modo daemon (PID: ${child.pid})`);
341
+ console.log(` Logs: ${logFile}`);
342
+ return;
343
+ }
344
+
345
+ // Development mode
346
+ if (isDev) {
347
+ await handleDevMode(adapter, config.gateway, daemon);
348
+ return;
349
+ }
350
+
351
+ // Production mode
352
+ await handleProductionMode(adapter, config.gateway, daemon);
353
+ }
354
+
355
+ /**
356
+ * Handle development mode startup
357
+ */
358
+ async function handleDevMode(
359
+ adapter: InstallationAdapter,
360
+ gatewayConfig: GatewayConfig,
361
+ daemon: boolean
362
+ ): Promise<void> {
363
+ if (isChildProcess()) {
364
+ // Child process: just start gateway
365
+ logger.info("Starting Gateway server (child process)...");
366
+ const coreConfig = await loadConfig();
367
+ await startGateway(coreConfig);
368
+ return;
369
+ }
370
+
371
+ // Parent process: start Vite and Gateway
372
+ const hiveUiPath = path.join(process.cwd(), "packages/hive-ui");
373
+ const hasVite = existsSync(path.join(hiveUiPath, "package.json"));
374
+
375
+ if (hasVite) {
376
+ console.log("🎨 Iniciando Vite (UI)...\n");
377
+ const viteProcess = spawn("bun", ["run", "dev"], {
378
+ cwd: hiveUiPath,
379
+ stdio: ["ignore", "pipe", "pipe"],
380
+ detached: true,
381
+ });
382
+
383
+ viteProcess.stdout?.on("data", (data) => {
384
+ const lines = data.toString().split("\n");
385
+ for (const line of lines) {
386
+ if (line.trim()) console.log(`[Vite] ${line}`);
387
+ }
388
+ });
389
+
390
+ viteProcess.stderr?.on("data", (data) => {
391
+ const lines = data.toString().split("\n");
392
+ for (const line of lines) {
393
+ if (line.trim()) console.error(`[Vite] ${line}`);
394
+ }
395
+ });
396
+
397
+ viteProcess.on("error", (error) => {
398
+ console.error(`❌ Error iniciando Vite: ${error.message}`);
399
+ });
400
+
401
+ if (!daemon) {
402
+ children.push(viteProcess);
403
+ } else {
404
+ viteProcess.unref();
405
+ }
406
+ }
407
+
408
+ // Spawn Gateway child process
409
+ const spawnGateway = (): ReturnType<typeof spawn> => {
410
+ const gw = spawn(process.execPath, [process.argv[1] || "", "start", "--skip-check", "--dev-internal"], {
411
+ detached: true,
412
+ stdio: ["ignore", "pipe", "pipe"],
413
+ env: { ...process.env, HIVE_DEV: "true", HIVE_GATEWAY_CHILD: "1" },
414
+ });
415
+
416
+ gw.stdout?.on("data", (data) => {
417
+ const lines = data.toString().split("\n");
418
+ for (const line of lines) {
419
+ if (line.trim()) console.log(`[Gateway] ${line}`);
420
+ }
421
+ });
422
+
423
+ gw.stderr?.on("data", (data) => {
424
+ const lines = data.toString().split("\n");
425
+ for (const line of lines) {
426
+ if (line.trim()) console.error(`[Gateway] ${line}`);
427
+ }
428
+ });
429
+
430
+ gw.on("error", (error) => {
431
+ console.error(`❌ Error iniciando Gateway: ${error.message}`);
432
+ });
433
+
434
+ gw.on("exit", (code) => {
435
+ if (code === 0) {
436
+ console.log("[Gateway] Reiniciando tras setup...");
437
+ const newGw = spawnGateway();
438
+ const idx = children.indexOf(gw);
439
+ if (idx !== -1) children.splice(idx, 1, newGw);
440
+ }
441
+ });
442
+
443
+ if (!daemon) {
444
+ children.push(gw);
445
+ } else {
446
+ gw.unref();
447
+ }
448
+
449
+ return gw;
450
+ };
451
+
452
+ const gatewayProcess = spawnGateway();
453
+
454
+ // Wait for services
455
+ console.log("⏳ Esperando servicios...");
456
+ const [viteReady, gatewayReady] = await Promise.all([
457
+ hasVite ? waitForVite(5173, 30000) : Promise.resolve(true),
458
+ waitForHttpPort(18790, "/health", 30000),
459
+ ]);
460
+
461
+ if (!viteReady && hasVite) {
462
+ console.error("⚠️ Vite no respondió a tiempo");
463
+ }
464
+ if (!gatewayReady) {
465
+ console.error("⚠️ Gateway no respondió a tiempo");
466
+ return;
467
+ }
468
+
469
+ // Additional wait: ensure Gateway is fully initialized and serving UI
470
+ // In dev mode, Gateway needs a moment to set up HMR proxy
471
+ await Bun.sleep(500);
472
+
473
+ console.log("✅ Servicios listos\n");
474
+
475
+ // Open browser - en desarrollo, Gateway sirve la UI igual que en producción
476
+ const setupMode = await isSetupMode();
477
+ const browserPort = gatewayConfig.port; // 18790, igual que producción
478
+ const url = setupMode ? `http://localhost:${browserPort}/setup` : `http://localhost:${browserPort}`;
479
+
480
+ console.log(`
481
+ ╔════════════════════════════════════════╗
482
+ ║ 🐝 Hive — Modo Desarrollo ║
483
+ ╠════════════════════════════════════════╣
484
+ ║ UI: ${url.padEnd(24)}║
485
+ ║ API: http://127.0.0.1:18790 ║
486
+ ║ WebSocket: ws://127.0.0.1:18790/ws ║
487
+ ║ Canvas: ws://127.0.0.1:18790/canvas║
488
+ ║ Vite HMR: http://localhost:5173 ║
489
+ ╠════════════════════════════════════════╣
490
+ ║ ${setupMode ? "🎉 Primer arranque — abriendo setup..." : "Administra tu Hive aquí "}║
491
+ ╚════════════════════════════════════════╝
492
+ `);
493
+
494
+ openBrowser(url);
495
+
496
+ if (!daemon) {
497
+ await new Promise(() => { }); // Infinite wait
498
+ }
499
+ }
500
+
501
+ /**
502
+ * Handle production mode startup
503
+ */
504
+ async function handleProductionMode(
505
+ adapter: InstallationAdapter,
506
+ gatewayConfig: GatewayConfig,
507
+ daemon: boolean
508
+ ): Promise<void> {
509
+ if (isChildProcess()) {
510
+ const coreConfig = await loadConfig();
511
+ await startGateway(coreConfig);
512
+ return;
513
+ }
514
+
515
+ // Get UI directory from adapter config
516
+ const adapterConfig = await adapter.getConfig();
517
+ // Detect Docker environment: either DockerAdapter or BinaryAdapter in Docker container
518
+ const isDocker = adapterConfig.type === "docker"
519
+ || (adapterConfig.type === "binary" && process.env.HIVE_UI_DIR === "/app/ui");
520
+
521
+ // The gateway child process serves both the API and the UI on the same port.
522
+ // No separate UI server needed — always open the browser on the gateway port.
523
+ const uiPort = gatewayConfig.port;
524
+
525
+ // Spawn Gateway child process
526
+ const spawnGatewayProd = (): ReturnType<typeof spawn> => {
527
+ // Determine the correct command to spawn the gateway child process.
528
+ // Three cases:
529
+ // 1. Docker container (/app/hive-server)
530
+ // 2. Bundled JS or TS source → bun <script> start --skip-check
531
+ // 3. Compiled Bun binary (no .js/.ts extension) → re-exec process itself
532
+ const scriptPath = process.argv[1] || "";
533
+ const isDockerContainer = process.env.HIVE_UI_DIR === "/app/ui";
534
+ const isBunScript = scriptPath.endsWith(".js") || scriptPath.endsWith(".ts");
535
+
536
+ let command: string;
537
+ let args: string[];
538
+
539
+ if (isDockerContainer) {
540
+ // Running inside Docker container
541
+ command = "/app/hive-server";
542
+ args = ["start", "--skip-check"];
543
+ } else if (isBunScript) {
544
+ // Bundled JS (npm package) or TypeScript source: use Bun runtime
545
+ command = process.execPath;
546
+ args = [scriptPath, "start", "--skip-check"];
547
+ } else {
548
+ // Compiled Bun binary: process.execPath IS the binary
549
+ command = process.execPath;
550
+ args = ["start", "--skip-check"];
551
+ }
552
+
553
+ const gw = spawn(command, args, {
554
+ detached: true,
555
+ stdio: ["ignore", "pipe", "pipe"],
556
+ env: { ...process.env, HIVE_GATEWAY_CHILD: "1", NO_BROWSER: "1", ...(getDistDir() ? { HIVE_DIST_DIR: getDistDir()! } : {}) },
557
+ });
558
+
559
+ gw.stdout?.on("data", (data) => {
560
+ const lines = data.toString().split("\n");
561
+ for (const line of lines) {
562
+ if (line.trim()) console.log(`[Gateway] ${line}`);
563
+ }
564
+ });
565
+
566
+ gw.stderr?.on("data", (data) => {
567
+ const lines = data.toString().split("\n");
568
+ for (const line of lines) {
569
+ if (line.trim()) console.error(`[Gateway] ${line}`);
570
+ }
571
+ });
572
+
573
+ gw.on("error", (error) => {
574
+ console.error(`❌ Error iniciando Gateway: ${error.message}`);
575
+ });
576
+
577
+ gw.on("exit", (code) => {
578
+ if (code === 0) {
579
+ console.log("[Gateway] Reiniciando tras setup...");
580
+ const newGw = spawnGatewayProd();
581
+ const idx = children.indexOf(gw);
582
+ if (idx !== -1) children.splice(idx, 1, newGw);
583
+ }
584
+ });
585
+
586
+ children.push(gw);
587
+ return gw;
588
+ };
589
+
590
+ spawnGatewayProd();
591
+
592
+ // Open browser when gateway is ready
593
+ waitForPort(gatewayConfig.port, 30000).then(async () => {
594
+ let needsSetup = false;
595
+ try {
596
+ const res = await fetch(`http://127.0.0.1:${gatewayConfig.port}/api/setup/status`, {
597
+ signal: AbortSignal.timeout(3000),
598
+ });
599
+ const body = await res.json() as { setupMode?: boolean };
600
+ needsSetup = body.setupMode === true;
601
+ } catch {
602
+ const hiveDir = getHiveDir();
603
+ const dbPath = path.join(hiveDir, "data", "hive.db");
604
+ needsSetup = !existsSync(dbPath);
605
+ }
606
+
607
+ const url = needsSetup ? `http://localhost:${uiPort}/setup` : `http://localhost:${uiPort}`;
608
+
609
+ if (needsSetup) {
610
+ console.log(`
611
+ ╔════════════════════════════════════════╗
612
+ ║ 🎉 ¡Bienvenido a Hive! ║
613
+ ╠════════════════════════════════════════╣
614
+ ║ Abriendo configuración en tu browser ║
615
+ ║ ${url.padEnd(38)}║
616
+ ╚════════════════════════════════════════╝
617
+ `);
618
+ } else {
619
+ console.log(`\n🌐 Hive listo en: ${url}\n`);
620
+ }
621
+
622
+ openBrowser(url);
623
+ });
624
+
625
+ await new Promise(() => { }); // Keep parent alive
626
+ }
627
+
628
+ /**
629
+ * Stop command
630
+ */
631
+ export async function stop(): Promise<void> {
632
+ const adapter = await getAdapter();
633
+
634
+ // Try adapter stop first
635
+ try {
636
+ if (await adapter.isRunning()) {
637
+ await adapter.stop();
638
+ console.log("✅ Hive Gateway detenido");
639
+ return;
640
+ }
641
+ } catch {
642
+ // Adapter stop failed, fall through to manual stop
643
+ }
644
+
645
+ // Fallback to manual PID-based stop
646
+ if (!(await isRunning())) {
647
+ console.log("⚠️ Hive Gateway no está corriendo");
648
+ return;
649
+ }
650
+
651
+ const pidFile = await getPidFile();
652
+ const pid = parseInt(readFileSync(pidFile, "utf-8").trim(), 10);
653
+
654
+ try {
655
+ process.kill(pid, "SIGTERM");
656
+ unlinkSync(pidFile);
657
+ console.log("✅ Hive Gateway detenido");
658
+ } catch (e) {
659
+ console.error("❌ Error deteniendo el Gateway:", e);
660
+ }
661
+ }
662
+
663
+ /**
664
+ * Status command
665
+ */
666
+ export async function status(flags: string[]): Promise<void> {
667
+ const adapter = await getAdapter();
668
+ const adapterConfig = await adapter.getConfig();
669
+ const running = await adapter.isRunning();
670
+ const hiveDir = getHiveDir();
671
+
672
+ console.log("🐝 Hive Gateway Status\n");
673
+
674
+ const coreConfig = await loadConfig();
675
+ const pid = await adapter.getPid();
676
+
677
+ console.log(`Estado: ${running ? "✅ Corriendo" : "⏹️ Detenido"}`);
678
+ if (running && pid) {
679
+ console.log(`PID: ${pid}`);
680
+ }
681
+ console.log(`Installation: ${adapter.name} (${adapterConfig.type})`);
682
+ console.log(`Puerto: ${adapterConfig.gateway.port}`);
683
+ console.log(`Host: ${adapterConfig.gateway.host}`);
684
+
685
+ const provider = coreConfig.models?.defaultProvider || "no configurado";
686
+ const model = (coreConfig.models as any)?.defaults?.[provider] || (coreConfig.models as any)?.defaults?.default || "no configurado";
687
+ console.log(`Modelo: ${provider} / ${model}`);
688
+ console.log(`Home: ${hiveDir}`);
689
+ console.log(`Logs: ${getLogFile()}`);
690
+
691
+ if (flags.includes("--json")) {
692
+ console.log("\n" + JSON.stringify({
693
+ running,
694
+ pid,
695
+ type: adapterConfig.type,
696
+ config: adapterConfig,
697
+ }, null, 2));
698
+ }
699
+ }
700
+
701
+ /**
702
+ * Reload command
703
+ */
704
+ export async function reload(): Promise<void> {
705
+ if (!(await isRunning())) {
706
+ console.log("⚠️ Hive Gateway no está corriendo");
707
+ return;
708
+ }
709
+
710
+ const pidFile = await getPidFile();
711
+ const pid = parseInt(readFileSync(pidFile, "utf-8").trim(), 10);
712
+
713
+ try {
714
+ process.kill(pid, "SIGHUP");
715
+ console.log("✅ Configuración recargada");
716
+ } catch (e) {
717
+ console.error("❌ Error recargando configuración:", e);
718
+ }
719
+ }