@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.
- package/README.md +64 -39
- package/dist/hive.js +4539 -4586
- package/dist/ui/assets/AgentCreateForm-tJZv9FZC.js +1 -0
- package/dist/ui/assets/AgentDetailPage-Du-mRcAX.js +1 -0
- package/dist/ui/assets/AgentNewPage-DIFYd_Ys.js +1 -0
- package/dist/ui/assets/{AgentsPage-DhCjvDNa.js → AgentsPage-YvSgWRiw.js} +7 -7
- package/dist/ui/assets/CanvasPage-DtMwGvxf.js +33 -0
- package/dist/ui/assets/ChannelsPage-BdBXWHjj.js +8 -0
- package/dist/ui/assets/DashboardPage-ghl1ZguH.js +6 -0
- package/dist/ui/assets/{LoginPage-B30OrEBy.js → LoginPage-CAmSI9Vy.js} +1 -1
- package/dist/ui/assets/LogsPage-DAPBHkwK.js +1 -0
- package/dist/ui/assets/MeetingPage-WjjGOqqU.js +1 -0
- package/dist/ui/assets/{NotFound-HD1Yp9yK.js → NotFound-BMeQSGcG.js} +1 -1
- package/dist/ui/assets/ProvidersPage-Ct6HsAi1.js +1 -0
- package/dist/ui/assets/{RecoverPage-CLF6buGP.js → RecoverPage-DpW3l-yv.js} +1 -1
- package/dist/ui/assets/SettingsPage-DBJ7_E6C.js +9 -0
- package/dist/ui/assets/SetupPage-DKmLVUaj.js +1 -0
- package/dist/ui/assets/{WebChatPage-Um3VANzn.js → WebChatPage-CVRcKept.js} +2 -2
- package/dist/ui/assets/accordion-C5d5Rm5z.js +1 -0
- package/dist/ui/assets/{activity-SfJ6UDF2.js → activity-c3pNngT_.js} +1 -1
- package/dist/ui/assets/alert-C-NE-P3s.js +1 -0
- package/dist/ui/assets/{alert-dialog-M893TdvF.js → alert-dialog-C5mzbHdP.js} +1 -1
- package/dist/ui/assets/arrow-left-CBcbX5EZ.js +1 -0
- package/dist/ui/assets/badge-ChpACfWO.js +1 -0
- package/dist/ui/assets/{calendar-CMMeWsP-.js → calendar-B-KZ9RQO.js} +1 -1
- package/dist/ui/assets/{card-C7P3W6_y.js → card-CNf6BS2e.js} +1 -1
- package/dist/ui/assets/chevron-left-D4U-5A27.js +1 -0
- package/dist/ui/assets/chevron-right-CR4Skrf3.js +1 -0
- package/dist/ui/assets/chevron-up-BYhk0K2J.js +1 -0
- package/dist/ui/assets/{circle-alert-7koABcbO.js → circle-alert-CyHDwUj8.js} +1 -1
- package/dist/ui/assets/circle-check-Bb54Ebmu.js +1 -0
- package/dist/ui/assets/{cpu-mBJgRJzM.js → cpu-Cdgc_B1K.js} +1 -1
- package/dist/ui/assets/dialog-QnZ0ad8O.js +1 -0
- package/dist/ui/assets/{download-oaofq4K1.js → download-C3ifGMjJ.js} +1 -1
- package/dist/ui/assets/dropdown-menu-BK-CO3Od.js +1 -0
- package/dist/ui/assets/{es-eUrU2hyB.js → es-NQNoaWDx.js} +1 -1
- package/dist/ui/assets/{external-link-SkkF2Z7B.js → external-link-BvxYeTP1.js} +1 -1
- package/dist/ui/assets/{eye-B8lq7sWG.js → eye-DqNTU_GD.js} +1 -1
- package/dist/ui/assets/{file-text-0oYol8Bb.js → file-text-BT_9S9SM.js} +1 -1
- package/dist/ui/assets/{folder-open-DVYu2lgk.js → folder-open-BhH8y9ac.js} +1 -1
- package/dist/ui/assets/gauge-D_TMa4i9.js +1 -0
- package/dist/ui/assets/{globe-BVPd5DRa.js → globe-DeCQTCDJ.js} +1 -1
- package/dist/ui/assets/{hexagon-BIAFUAlQ.js → hexagon-DsGOUl-H.js} +1 -1
- package/dist/ui/assets/{history-BUAnaMQo.js → history-BSG-Ypqf.js} +1 -1
- package/dist/ui/assets/index-B2fCYtTS.css +2 -0
- package/dist/ui/assets/index-DMCjjdqf.js +116 -0
- package/dist/ui/assets/{info-DWioleen.js → info-NwLoa2Mj.js} +1 -1
- package/dist/ui/assets/{key-BCGwSKKc.js → key-3EP0dhkT.js} +1 -1
- package/dist/ui/assets/label-D2H1IR_J.js +1 -0
- package/dist/ui/assets/loader-circle-CZNax6kS.js +1 -0
- package/dist/ui/assets/{lock-D7PCO7GC.js → lock-Ei1_J-Nq.js} +1 -1
- package/dist/ui/assets/{pause-CI1JFH6r.js → pause-BUqah9Bi.js} +1 -1
- package/dist/ui/assets/play-NcZ4swwL.js +1 -0
- package/dist/ui/assets/plus-CX1xyhp5.js +1 -0
- package/dist/ui/assets/progress-BherYzY6.js +1 -0
- package/dist/ui/assets/{refresh-cw-BLmKlO4J.js → refresh-cw-DaYdjQFk.js} +1 -1
- package/dist/ui/assets/{save-M1nv6H3P.js → save-CUdYyHNy.js} +1 -1
- package/dist/ui/assets/scroll-area-DkeyX32e.js +1 -0
- package/dist/ui/assets/{send-ijRfR0gp.js → send-B0H5SEIE.js} +1 -1
- package/dist/ui/assets/{settings-BvXhlJCF.js → settings-Ds4SqD8s.js} +1 -1
- package/dist/ui/assets/{slider-DrDFLwXh.js → slider-CsiUDxc3.js} +1 -1
- package/dist/ui/assets/{sparkles-C4MACMbE.js → sparkles-yUEb-7oH.js} +1 -1
- package/dist/ui/assets/{square-D_-gRT1l.js → square-BD81nFtN.js} +1 -1
- package/dist/ui/assets/switch-BDwN8RYV.js +1 -0
- package/dist/ui/assets/{table-DWEJJiuF.js → table-CSc8ubon.js} +1 -1
- package/dist/ui/assets/terminal-DN38Q456.js +1 -0
- package/dist/ui/assets/{textarea-CwPvQVAG.js → textarea-CXgXWKrT.js} +1 -1
- package/dist/ui/assets/{trash-2-Blkv31Dz.js → trash-2-CNjMkoq6.js} +1 -1
- package/dist/ui/assets/{triangle-alert-BKgbd30k.js → triangle-alert-C9Y8Ub4X.js} +1 -1
- package/dist/ui/assets/useProviders-C6_QHsEi.js +1 -0
- package/dist/ui/assets/{vendor-radix-JY4ncZrD.js → vendor-radix-cw1bQaVC.js} +4 -4
- package/dist/ui/assets/{vendor-react-CscwQerf.js → vendor-react-D4s9E-zj.js} +1 -1
- package/dist/ui/assets/{volume-2-BiUgObeI.js → volume-2-CeSXNDv4.js} +1 -1
- package/dist/ui/assets/{zap-CpyuQJEC.js → zap-hlXjpSeA.js} +1 -1
- package/dist/ui/dist/assets/AgentCreateForm-tJZv9FZC.js +1 -0
- package/dist/ui/dist/assets/AgentDetailPage-Du-mRcAX.js +1 -0
- package/dist/ui/dist/assets/AgentNewPage-DIFYd_Ys.js +1 -0
- package/dist/ui/dist/assets/AgentsPage-YvSgWRiw.js +10 -0
- package/dist/ui/dist/assets/CanvasPage-DtMwGvxf.js +33 -0
- package/dist/ui/dist/assets/ChannelsPage-BdBXWHjj.js +8 -0
- package/dist/ui/dist/assets/DashboardPage-ghl1ZguH.js +6 -0
- package/dist/ui/dist/assets/LoginPage-CAmSI9Vy.js +1 -0
- package/dist/ui/dist/assets/LogsPage-DAPBHkwK.js +1 -0
- package/dist/ui/dist/assets/MeetingPage-WjjGOqqU.js +1 -0
- package/dist/ui/dist/assets/NotFound-BMeQSGcG.js +1 -0
- package/dist/ui/dist/assets/ProvidersPage-Ct6HsAi1.js +1 -0
- package/dist/ui/dist/assets/RecoverPage-DpW3l-yv.js +1 -0
- package/dist/ui/dist/assets/SettingsPage-DBJ7_E6C.js +9 -0
- package/dist/ui/dist/assets/SetupPage-DKmLVUaj.js +1 -0
- package/dist/ui/dist/assets/WebChatPage-CVRcKept.js +16 -0
- package/dist/ui/dist/assets/accordion-C5d5Rm5z.js +1 -0
- package/dist/ui/dist/assets/activity-c3pNngT_.js +1 -0
- package/dist/ui/dist/assets/alert-C-NE-P3s.js +1 -0
- package/dist/ui/dist/assets/alert-dialog-C5mzbHdP.js +1 -0
- package/dist/ui/dist/assets/arrow-left-CBcbX5EZ.js +1 -0
- package/dist/ui/dist/assets/badge-ChpACfWO.js +1 -0
- package/dist/ui/dist/assets/calendar-B-KZ9RQO.js +1 -0
- package/dist/ui/dist/assets/card-CNf6BS2e.js +1 -0
- package/dist/ui/dist/assets/chevron-left-D4U-5A27.js +1 -0
- package/dist/ui/dist/assets/chevron-right-CR4Skrf3.js +1 -0
- package/dist/ui/dist/assets/chevron-up-BYhk0K2J.js +1 -0
- package/dist/ui/dist/assets/circle-alert-CyHDwUj8.js +1 -0
- package/dist/ui/dist/assets/circle-check-Bb54Ebmu.js +1 -0
- package/dist/ui/dist/assets/cpu-Cdgc_B1K.js +1 -0
- package/dist/ui/dist/assets/dialog-QnZ0ad8O.js +1 -0
- package/dist/ui/dist/assets/download-C3ifGMjJ.js +1 -0
- package/dist/ui/dist/assets/dropdown-menu-BK-CO3Od.js +1 -0
- package/dist/ui/dist/assets/es-NQNoaWDx.js +1 -0
- package/dist/ui/dist/assets/external-link-BvxYeTP1.js +1 -0
- package/dist/ui/dist/assets/eye-DqNTU_GD.js +1 -0
- package/dist/ui/dist/assets/file-text-BT_9S9SM.js +1 -0
- package/dist/ui/dist/assets/folder-open-BhH8y9ac.js +1 -0
- package/dist/ui/dist/assets/format-GVHeOyWI.js +1 -0
- package/dist/ui/dist/assets/gateway-url-COCbW0IR.js +1 -0
- package/dist/ui/dist/assets/gauge-D_TMa4i9.js +1 -0
- package/dist/ui/dist/assets/globe-DeCQTCDJ.js +1 -0
- package/dist/ui/dist/assets/hexagon-DsGOUl-H.js +1 -0
- package/dist/ui/dist/assets/history-BSG-Ypqf.js +1 -0
- package/dist/ui/dist/assets/index-B2fCYtTS.css +2 -0
- package/dist/ui/dist/assets/index-DMCjjdqf.js +116 -0
- package/dist/ui/dist/assets/info-NwLoa2Mj.js +1 -0
- package/dist/ui/dist/assets/key-3EP0dhkT.js +1 -0
- package/dist/ui/dist/assets/label-D2H1IR_J.js +1 -0
- package/dist/ui/dist/assets/loader-circle-CZNax6kS.js +1 -0
- package/dist/ui/dist/assets/lock-Ei1_J-Nq.js +1 -0
- package/dist/ui/dist/assets/pause-BUqah9Bi.js +1 -0
- package/dist/ui/dist/assets/play-NcZ4swwL.js +1 -0
- package/dist/ui/dist/assets/plus-CX1xyhp5.js +1 -0
- package/dist/ui/dist/assets/progress-BherYzY6.js +1 -0
- package/dist/ui/dist/assets/refresh-cw-DaYdjQFk.js +1 -0
- package/dist/ui/dist/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
- package/dist/ui/dist/assets/save-CUdYyHNy.js +1 -0
- package/dist/ui/dist/assets/scroll-area-DkeyX32e.js +1 -0
- package/dist/ui/dist/assets/send-B0H5SEIE.js +1 -0
- package/dist/ui/dist/assets/settings-Ds4SqD8s.js +1 -0
- package/dist/ui/dist/assets/slider-CsiUDxc3.js +14 -0
- package/dist/ui/dist/assets/sparkles-yUEb-7oH.js +1 -0
- package/dist/ui/dist/assets/square-BD81nFtN.js +1 -0
- package/dist/ui/dist/assets/switch-BDwN8RYV.js +1 -0
- package/dist/ui/dist/assets/table-CSc8ubon.js +1 -0
- package/dist/ui/dist/assets/terminal-DN38Q456.js +1 -0
- package/dist/ui/dist/assets/textarea-CXgXWKrT.js +1 -0
- package/dist/ui/dist/assets/trash-2-CNjMkoq6.js +1 -0
- package/dist/ui/dist/assets/triangle-alert-C9Y8Ub4X.js +1 -0
- package/dist/ui/dist/assets/useProviders-C6_QHsEi.js +1 -0
- package/dist/ui/dist/assets/utils-3pnRFmFe.js +1 -0
- package/dist/ui/dist/assets/vendor-charts-Bu2lyBKP.js +65 -0
- package/dist/ui/dist/assets/vendor-query-DsWPbQdG.js +1 -0
- package/dist/ui/dist/assets/vendor-radix-cw1bQaVC.js +63 -0
- package/dist/ui/dist/assets/vendor-react-D4s9E-zj.js +1 -0
- package/dist/ui/dist/assets/vendor-router-C9pIYwbJ.js +3 -0
- package/dist/ui/dist/assets/volume-2-CeSXNDv4.js +1 -0
- package/dist/ui/dist/assets/zap-hlXjpSeA.js +1 -0
- package/dist/ui/dist/favicon.ico +0 -0
- package/dist/ui/dist/index.html +40 -0
- package/dist/ui/dist/placeholder.svg +1 -0
- package/dist/ui/index.html +7 -11
- package/package.json +137 -15
- package/packages/cli/src/adapters/binary.ts +461 -0
- package/packages/cli/src/adapters/bun-global.ts +378 -0
- package/packages/cli/src/adapters/config.ts +314 -0
- package/packages/cli/src/adapters/docker.ts +308 -0
- package/packages/cli/src/adapters/factory.ts +168 -0
- package/packages/cli/src/adapters/index.ts +80 -0
- package/packages/cli/src/adapters/types.ts +218 -0
- package/packages/cli/src/commands/agent-run.ts +168 -0
- package/packages/cli/src/commands/agents.ts +398 -0
- package/packages/cli/src/commands/chat.ts +142 -0
- package/packages/cli/src/commands/config.ts +49 -0
- package/packages/cli/src/commands/cron.ts +487 -0
- package/packages/cli/src/commands/dev.ts +58 -0
- package/packages/cli/src/commands/doctor.ts +320 -0
- package/packages/cli/src/commands/gateway.ts +719 -0
- package/packages/cli/src/commands/logs.ts +57 -0
- package/packages/cli/src/commands/mcp.ts +175 -0
- package/packages/cli/src/commands/message.ts +77 -0
- package/packages/cli/src/commands/migrate.ts +90 -0
- package/packages/cli/src/commands/onboard.ts +1656 -0
- package/packages/cli/src/commands/security.ts +144 -0
- package/packages/cli/src/commands/service.ts +50 -0
- package/packages/cli/src/commands/sessions.ts +116 -0
- package/packages/cli/src/commands/skills.ts +215 -0
- package/packages/cli/src/commands/update.ts +203 -0
- package/packages/cli/src/index.ts +210 -0
- package/packages/cli/src/ui-bundle.generated.ts +3 -0
- package/packages/cli/src/utils/token.ts +6 -0
- package/packages/core/src/agent/agent-loop.ts +691 -0
- package/packages/core/src/agent/compaction.ts +240 -0
- package/packages/core/src/agent/context-compiler.ts +467 -0
- package/packages/core/src/agent/context-guard.ts +91 -0
- package/packages/core/src/agent/conversation-store.ts +244 -0
- package/packages/core/src/agent/curator.ts +158 -0
- package/packages/core/src/agent/hooks.ts +166 -0
- package/packages/core/src/agent/llm-client.ts +167 -0
- package/packages/core/src/agent/llm-providers/anthropic.ts +212 -0
- package/packages/core/src/agent/llm-providers/deepseek.ts +8 -0
- package/packages/core/src/agent/llm-providers/gemini.ts +215 -0
- package/packages/core/src/agent/llm-providers/groq.ts +5 -0
- package/packages/core/src/agent/llm-providers/interface.ts +195 -0
- package/packages/core/src/agent/llm-providers/kimi.ts +8 -0
- package/packages/core/src/agent/llm-providers/local-llama.ts +37 -0
- package/packages/core/src/agent/llm-providers/mistral.ts +5 -0
- package/packages/core/src/agent/llm-providers/nvidia.ts +5 -0
- package/packages/core/src/agent/llm-providers/ollama.ts +175 -0
- package/packages/core/src/agent/llm-providers/openai-compat-base.ts +379 -0
- package/packages/core/src/agent/llm-providers/openai.ts +5 -0
- package/packages/core/src/agent/llm-providers/openrouter.ts +5 -0
- package/packages/core/src/agent/llm-providers/qwen.ts +5 -0
- package/packages/core/src/agent/native-tools.ts +31 -0
- package/packages/core/src/agent/playbook-selector.ts +147 -0
- package/packages/core/src/agent/prompt-builder.ts +169 -0
- package/packages/core/src/agent/providers/index.ts +204 -0
- package/packages/core/src/agent/providers.ts +1 -0
- package/packages/core/src/agent/reflector.ts +200 -0
- package/packages/core/src/agent/service.ts +267 -0
- package/packages/core/src/agent/skill-selector.ts +479 -0
- package/packages/core/src/agent/stuck-loop.ts +133 -0
- package/packages/core/src/agent/tool-selector.ts +569 -0
- package/packages/core/src/agent/tracer.ts +100 -0
- package/packages/core/src/auth/auth.ts +108 -0
- package/packages/core/src/auth/index.ts +1 -0
- package/packages/core/src/canvas/a2ui-tools.ts +255 -0
- package/packages/core/src/canvas/canvas-manager.ts +390 -0
- package/packages/core/src/canvas/canvas-tools.ts +448 -0
- package/packages/core/src/canvas/emitter.ts +149 -0
- package/packages/core/src/canvas/index.ts +3 -0
- package/packages/core/src/channels/base.ts +154 -0
- package/packages/core/src/channels/discord.ts +273 -0
- package/packages/core/src/channels/index.ts +7 -0
- package/packages/core/src/channels/manager.ts +450 -0
- package/packages/core/src/channels/slack.ts +323 -0
- package/packages/core/src/channels/telegram.ts +612 -0
- package/packages/core/src/channels/webchat.ts +139 -0
- package/packages/core/src/channels/whatsapp.ts +548 -0
- package/packages/core/src/config/index.ts +12 -0
- package/packages/core/src/config/loader.ts +569 -0
- package/packages/core/src/events/agent-bus.ts +460 -0
- package/packages/core/src/events/event-bus.ts +169 -0
- package/packages/core/src/gateway/channel-notify.ts +64 -0
- package/packages/core/src/gateway/helpers/cors.ts +32 -0
- package/packages/core/src/gateway/helpers/index.ts +4 -0
- package/packages/core/src/gateway/helpers/narration.ts +57 -0
- package/packages/core/src/gateway/helpers/path.ts +13 -0
- package/packages/core/src/gateway/helpers/redact.ts +61 -0
- package/packages/core/src/gateway/index.ts +5 -0
- package/packages/core/src/gateway/initializer.ts +363 -0
- package/packages/core/src/gateway/lane-queue.ts +169 -0
- package/packages/core/src/gateway/llm-local/client.ts +94 -0
- package/packages/core/src/gateway/llm-local/detector.ts +321 -0
- package/packages/core/src/gateway/llm-local/downloader.ts +216 -0
- package/packages/core/src/gateway/llm-local/index.ts +34 -0
- package/packages/core/src/gateway/llm-local/manager.ts +186 -0
- package/packages/core/src/gateway/llm-local/models.ts +149 -0
- package/packages/core/src/gateway/llm-local/server.ts +179 -0
- package/packages/core/src/gateway/resolver.ts +108 -0
- package/packages/core/src/gateway/router.ts +124 -0
- package/packages/core/src/gateway/routes/agents.ts +210 -0
- package/packages/core/src/gateway/routes/auth.ts +244 -0
- package/packages/core/src/gateway/routes/channels.ts +484 -0
- package/packages/core/src/gateway/routes/chat.ts +241 -0
- package/packages/core/src/gateway/routes/config.ts +12 -0
- package/packages/core/src/gateway/routes/cron-api.ts +544 -0
- package/packages/core/src/gateway/routes/ethics.ts +46 -0
- package/packages/core/src/gateway/routes/llm-local.ts +271 -0
- package/packages/core/src/gateway/routes/mcp.ts +319 -0
- package/packages/core/src/gateway/routes/meeting.ts +232 -0
- package/packages/core/src/gateway/routes/models.ts +163 -0
- package/packages/core/src/gateway/routes/multimodal.ts +93 -0
- package/packages/core/src/gateway/routes/providers.ts +220 -0
- package/packages/core/src/gateway/routes/setup.ts +441 -0
- package/packages/core/src/gateway/routes/skills.ts +115 -0
- package/packages/core/src/gateway/routes/system.ts +469 -0
- package/packages/core/src/gateway/routes/tasks.ts +44 -0
- package/packages/core/src/gateway/routes/tools.ts +59 -0
- package/packages/core/src/gateway/routes/tts-local.ts +388 -0
- package/packages/core/src/gateway/routes/users.ts +122 -0
- package/packages/core/src/gateway/routes/voice.ts +189 -0
- package/packages/core/src/gateway/routes/workspace.ts +281 -0
- package/packages/core/src/gateway/server.ts +2744 -0
- package/packages/core/src/gateway/session.ts +95 -0
- package/packages/core/src/gateway/slash-commands.ts +207 -0
- package/packages/core/src/gateway/tts/README.md +94 -0
- package/packages/core/src/gateway/tts/package.json +25 -0
- package/packages/core/src/gateway/tts/src/client.ts +59 -0
- package/packages/core/src/gateway/tts/src/detect.ts +42 -0
- package/packages/core/src/gateway/tts/src/index.ts +15 -0
- package/packages/core/src/gateway/tts/src/install.ts +129 -0
- package/packages/core/src/gateway/tts/src/models.ts +50 -0
- package/packages/core/src/gateway/tts/src/server.ts +252 -0
- package/packages/core/src/gateway/tts/voices/.gitkeep +0 -0
- package/packages/core/src/heartbeat/index.ts +157 -0
- package/packages/core/src/index.ts +56 -0
- package/packages/core/src/mcp/hot-reload.ts +148 -0
- package/packages/core/src/mcp/singleton.ts +21 -0
- package/packages/core/src/mcp/tool-sync.ts +176 -0
- package/packages/core/src/multimodal/index.ts +2 -0
- package/packages/core/src/multimodal/types.ts +28 -0
- package/packages/core/src/multimodal/vision-service.ts +283 -0
- package/packages/core/src/plugins/api.ts +128 -0
- package/packages/core/src/plugins/index.ts +2 -0
- package/packages/core/src/plugins/loader.ts +365 -0
- package/packages/core/src/resilience/circuit-breaker.ts +225 -0
- package/packages/core/src/scheduler/CronScheduler.ts +699 -0
- package/packages/core/src/scheduler/dag/AgentExecutor.ts +53 -0
- package/packages/core/src/scheduler/dag/DAGScheduler.ts +250 -0
- package/packages/core/src/scheduler/dag/EventBridge.ts +122 -0
- package/packages/core/src/scheduler/dag/TaskGraph.ts +192 -0
- package/packages/core/src/scheduler/dag/TaskNode.ts +97 -0
- package/packages/core/src/scheduler/dag/TaskResult.ts +22 -0
- package/packages/core/src/scheduler/dag/errors.ts +37 -0
- package/packages/core/src/scheduler/dag/index.ts +26 -0
- package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +97 -0
- package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +21 -0
- package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +46 -0
- package/packages/core/src/scheduler/index.ts +22 -0
- package/packages/core/src/scheduler/integration.ts +237 -0
- package/packages/core/src/scheduler/types.ts +164 -0
- package/packages/core/src/security/google-chat.ts +269 -0
- package/packages/core/src/security/index.ts +192 -0
- package/packages/core/src/security/pairing.ts +250 -0
- package/packages/core/src/security/rate-limit.ts +270 -0
- package/packages/core/src/security/signal.ts +321 -0
- package/packages/core/src/state/store.ts +312 -0
- package/packages/core/src/storage/crypto.ts +197 -0
- package/packages/core/src/storage/migrate.ts +147 -0
- package/packages/core/src/storage/onboarding.ts +1506 -0
- package/packages/core/src/storage/schema.ts +666 -0
- package/packages/core/src/storage/seed.ts +628 -0
- package/packages/core/src/storage/sqlite.ts +407 -0
- package/packages/core/src/storage/usage.ts +374 -0
- package/packages/core/src/tool-runtime/index.ts +476 -0
- package/packages/core/src/tool-runtime/tool-worker.ts +125 -0
- package/packages/core/src/tools/agents/get-available-models.ts +118 -0
- package/packages/core/src/tools/agents/index.ts +610 -0
- package/packages/core/src/tools/canvas/index.ts +420 -0
- package/packages/core/src/tools/cli/index.ts +142 -0
- package/packages/core/src/tools/core/index.ts +478 -0
- package/packages/core/src/tools/cron/index.ts +635 -0
- package/packages/core/src/tools/filesystem/fs-delete.ts +78 -0
- package/packages/core/src/tools/filesystem/fs-edit.ts +106 -0
- package/packages/core/src/tools/filesystem/fs-exists.ts +63 -0
- package/packages/core/src/tools/filesystem/fs-glob.ts +108 -0
- package/packages/core/src/tools/filesystem/fs-list.ts +129 -0
- package/packages/core/src/tools/filesystem/fs-read.ts +72 -0
- package/packages/core/src/tools/filesystem/fs-write.ts +67 -0
- package/packages/core/src/tools/filesystem/index.ts +34 -0
- package/packages/core/src/tools/filesystem/workspace-guard.ts +62 -0
- package/packages/core/src/tools/index.ts +197 -0
- package/packages/core/src/tools/meeting/index.ts +363 -0
- package/packages/core/src/tools/office/index.ts +47 -0
- package/packages/core/src/tools/office/office-escribir-docx.ts +192 -0
- package/packages/core/src/tools/office/office-escribir-pdf.ts +172 -0
- package/packages/core/src/tools/office/office-escribir-pptx.ts +174 -0
- package/packages/core/src/tools/office/office-escribir-xlsx.ts +116 -0
- package/packages/core/src/tools/office/office-leer-docx.ts +93 -0
- package/packages/core/src/tools/office/office-leer-pdf.ts +114 -0
- package/packages/core/src/tools/office/office-leer-pptx.ts +136 -0
- package/packages/core/src/tools/office/office-leer-xlsx.ts +124 -0
- package/packages/core/src/tools/types.ts +39 -0
- package/packages/core/src/tools/voice/index.ts +104 -0
- package/packages/core/src/tools/web/browser-click.ts +78 -0
- package/packages/core/src/tools/web/browser-extract.ts +139 -0
- package/packages/core/src/tools/web/browser-navigate.ts +106 -0
- package/packages/core/src/tools/web/browser-screenshot.ts +87 -0
- package/packages/core/src/tools/web/browser-script.ts +88 -0
- package/packages/core/src/tools/web/browser-service.ts +554 -0
- package/packages/core/src/tools/web/browser-type.ts +101 -0
- package/packages/core/src/tools/web/browser-wait.ts +136 -0
- package/packages/core/src/tools/web/index.ts +41 -0
- package/packages/core/src/tools/web/web-fetch.ts +78 -0
- package/packages/core/src/tools/web/web-search.ts +123 -0
- package/packages/core/src/utils/benchmark.ts +80 -0
- package/packages/core/src/utils/crypto.ts +73 -0
- package/packages/core/src/utils/date.ts +42 -0
- package/packages/core/src/utils/index.ts +5 -0
- package/packages/core/src/utils/logger.ts +389 -0
- package/packages/core/src/utils/retry.ts +70 -0
- package/packages/core/src/utils/toon.ts +253 -0
- package/packages/core/src/voice/index.ts +643 -0
- package/packages/mcp/src/config.ts +13 -0
- package/packages/mcp/src/index.ts +1 -0
- package/packages/mcp/src/logger.ts +47 -0
- package/packages/mcp/src/manager.ts +439 -0
- package/packages/mcp/src/transports/index.ts +67 -0
- package/packages/mcp/src/transports/sse.ts +238 -0
- package/packages/mcp/src/transports/websocket.ts +159 -0
- package/packages/skills/src/bundled/agents/agent_spawner/SKILL.md +167 -0
- package/packages/skills/src/bundled/agents/code_delegator/SKILL.md +156 -0
- package/packages/skills/src/bundled/agents/memory_manager/SKILL.md +143 -0
- package/packages/skills/src/bundled/agents/research_and_remember/SKILL.md +139 -0
- package/packages/skills/src/bundled/agents/task_orchestrator/SKILL.md +198 -0
- package/packages/skills/src/bundled/canvas/a2ui_dashboard/SKILL.md +176 -0
- package/packages/skills/src/bundled/canvas/a2ui_form/SKILL.md +202 -0
- package/packages/skills/src/bundled/canvas/a2ui_interactive/SKILL.md +206 -0
- package/packages/skills/src/bundled/canvas/canvas_dashboard/SKILL.md +146 -0
- package/packages/skills/src/bundled/canvas/canvas_interact/SKILL.md +148 -0
- package/packages/skills/src/bundled/canvas/canvas_report/SKILL.md +146 -0
- package/packages/skills/src/bundled/cli/cli_pipeline/SKILL.md +136 -0
- package/packages/skills/src/bundled/cli/cli_safe_exec/SKILL.md +125 -0
- package/packages/skills/src/bundled/cron_manager/SKILL.md +188 -0
- package/packages/skills/src/bundled/cron_reminder/SKILL.md +112 -0
- package/packages/skills/src/bundled/filesystem/file_manager/SKILL.md +118 -0
- package/packages/skills/src/bundled/filesystem/file_read_and_summarize/SKILL.md +108 -0
- package/packages/skills/src/bundled/filesystem/file_writer/SKILL.md +135 -0
- package/packages/skills/src/bundled/meeting/meeting_transcription/SKILL.md +213 -0
- package/packages/skills/src/bundled/office/office_document_manager/SKILL.md +262 -0
- package/packages/skills/src/bundled/search_knowledge/busqueda_fts5/SKILL.md +74 -0
- package/packages/skills/src/bundled/voice/voice_assistant/SKILL.md +174 -0
- package/packages/skills/src/bundled/voice/voice_input/SKILL.md +146 -0
- package/packages/skills/src/bundled/voice/voice_output/SKILL.md +151 -0
- package/packages/skills/src/bundled/web/browser_automate/SKILL.md +120 -0
- package/packages/skills/src/bundled/web/browser_scrape/SKILL.md +109 -0
- package/packages/skills/src/bundled/web/web_monitor/SKILL.md +127 -0
- package/packages/skills/src/bundled/web/web_research/SKILL.md +119 -0
- package/packages/skills/src/bundled-data.generated.ts +1964 -0
- package/packages/skills/src/index.ts +1 -0
- package/packages/skills/src/loader.ts +388 -0
- package/dist/ui/assets/AgentCreateForm-DS6yXjGV.js +0 -1
- package/dist/ui/assets/AgentDetailPage-Ud552U7_.js +0 -1
- package/dist/ui/assets/AgentNewPage-DWWs1P7s.js +0 -1
- package/dist/ui/assets/BridgePage-BD93aBKM.js +0 -1
- package/dist/ui/assets/CanvasPage-CM35yj0Q.js +0 -33
- package/dist/ui/assets/ChannelsPage-CtsWtJdc.js +0 -8
- package/dist/ui/assets/DashboardPage-BpiwR5Jg.js +0 -6
- package/dist/ui/assets/LogsPage-DqUsG3MW.js +0 -1
- package/dist/ui/assets/MeetingPage-C5B8-IzE.js +0 -1
- package/dist/ui/assets/ProjectsPage-zic2sjUf.js +0 -1
- package/dist/ui/assets/ProvidersPage-BxyIGKzh.js +0 -1
- package/dist/ui/assets/SettingsPage-CNFm3nun.js +0 -9
- package/dist/ui/assets/SetupPage-RBcjQtv7.js +0 -1
- package/dist/ui/assets/accordion-BEVqJf2A.js +0 -1
- package/dist/ui/assets/alert-BeGcM0nb.js +0 -1
- package/dist/ui/assets/api-q5Ax-vD2.js +0 -63
- package/dist/ui/assets/arrow-left-B_jlw8X_.js +0 -1
- package/dist/ui/assets/badge-pNhtItyt.js +0 -1
- package/dist/ui/assets/chevron-down-B16UVNlu.js +0 -1
- package/dist/ui/assets/chevron-left-_8ly7Fz0.js +0 -1
- package/dist/ui/assets/chevron-right-yzZLjezG.js +0 -1
- package/dist/ui/assets/chevron-up-CxKDQEE5.js +0 -1
- package/dist/ui/assets/circle-CFKiO9Ds.js +0 -1
- package/dist/ui/assets/circle-check-E2u7ZS2r.js +0 -1
- package/dist/ui/assets/circle-minus-1-TZF2pu.js +0 -1
- package/dist/ui/assets/circle-x-Cm3Sr-xb.js +0 -1
- package/dist/ui/assets/dialog-BaJbZsQF.js +0 -1
- package/dist/ui/assets/dist-DB-fE0Co.js +0 -1
- package/dist/ui/assets/dropdown-menu-DJoOchfz.js +0 -1
- package/dist/ui/assets/gauge-BTpFKuAj.js +0 -1
- package/dist/ui/assets/index-BN0875JH.css +0 -2
- package/dist/ui/assets/index-D4pdc0Uw.js +0 -54
- package/dist/ui/assets/label-C6tqnnKd.js +0 -1
- package/dist/ui/assets/loader-circle-CK3qRV3f.js +0 -1
- package/dist/ui/assets/pencil-BF2_XX-i.js +0 -1
- package/dist/ui/assets/play-DidATMfT.js +0 -1
- package/dist/ui/assets/plus-DXm1XDhQ.js +0 -1
- package/dist/ui/assets/progress-B1HC9cB_.js +0 -1
- package/dist/ui/assets/scroll-area-DKNpYkRA.js +0 -1
- package/dist/ui/assets/search-Co6mulZS.js +0 -1
- package/dist/ui/assets/switch-7AuR7x2g.js +0 -1
- package/dist/ui/assets/terminal-CjZu0OZ0.js +0 -1
- package/dist/ui/assets/useProviders-Bxsnav4y.js +0 -1
- package/dist/ui/assets/useWebSocketStore-ZCW_Nt1w.js +0 -1
- package/dist/ui/assets/x-5cXW_1ZS.js +0 -1
- /package/dist/ui/assets/{format-C0EOLKvf.js → format-GVHeOyWI.js} +0 -0
- /package/dist/ui/assets/{gateway-url-OqLaEDK-.js → gateway-url-COCbW0IR.js} +0 -0
- /package/dist/ui/assets/{utils-_qMjiZaF.js → utils-3pnRFmFe.js} +0 -0
- /package/dist/ui/assets/{vendor-router-DhLEd920.js → vendor-router-C9pIYwbJ.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.36 ║
|
|
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
|
+
}
|