@johpaz/hive-agents 0.0.35 → 0.0.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -39
- package/dist/hive.js +3127 -3104
- package/dist/ui/assets/{AgentCreateForm-B4eK7efF.js → AgentCreateForm-tJZv9FZC.js} +1 -1
- package/dist/ui/assets/{AgentDetailPage-BD2uoJWk.js → AgentDetailPage-Du-mRcAX.js} +1 -1
- package/dist/ui/assets/AgentNewPage-DIFYd_Ys.js +1 -0
- package/dist/ui/assets/{AgentsPage-4JUZXvkA.js → AgentsPage-YvSgWRiw.js} +6 -6
- package/dist/ui/assets/CanvasPage-DtMwGvxf.js +33 -0
- package/dist/ui/assets/{ChannelsPage-BUn7-nhV.js → ChannelsPage-BdBXWHjj.js} +1 -1
- package/dist/ui/assets/DashboardPage-ghl1ZguH.js +6 -0
- package/dist/ui/assets/{LoginPage-C8j_urUD.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-Drh-sJPN.js → NotFound-BMeQSGcG.js} +1 -1
- package/dist/ui/assets/ProvidersPage-Ct6HsAi1.js +1 -0
- package/dist/ui/assets/{RecoverPage-DNb1Pr8h.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-R-YOwA4F.js → WebChatPage-CVRcKept.js} +2 -2
- package/dist/ui/assets/accordion-C5d5Rm5z.js +1 -0
- package/dist/ui/assets/{alert-U8FsgWi7.js → alert-C-NE-P3s.js} +1 -1
- package/dist/ui/assets/{alert-dialog-CRdMkkmk.js → alert-dialog-C5mzbHdP.js} +1 -1
- package/dist/ui/assets/{badge-Cli1jnH5.js → badge-ChpACfWO.js} +1 -1
- package/dist/ui/assets/chevron-up-BYhk0K2J.js +1 -0
- package/dist/ui/assets/{dialog-DQ3s-LuO.js → dialog-QnZ0ad8O.js} +1 -1
- package/dist/ui/assets/dropdown-menu-BK-CO3Od.js +1 -0
- package/dist/ui/assets/{es-DcMjrpbA.js → es-NQNoaWDx.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/{label-0BvGVXvZ.js → label-D2H1IR_J.js} +1 -1
- package/dist/ui/assets/progress-BherYzY6.js +1 -0
- package/dist/ui/assets/scroll-area-DkeyX32e.js +1 -0
- package/dist/ui/assets/{slider-D47dOrRa.js → slider-CsiUDxc3.js} +1 -1
- package/dist/ui/assets/switch-BDwN8RYV.js +1 -0
- package/dist/ui/assets/{table-DhowbNxQ.js → table-CSc8ubon.js} +1 -1
- package/dist/ui/assets/terminal-DN38Q456.js +1 -0
- 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/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 +6 -6
- package/package.json +137 -13
- 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/AgentNewPage-GB-tVN50.js +0 -1
- package/dist/ui/assets/BridgePage-DDcDILKu.js +0 -1
- package/dist/ui/assets/CanvasPage-oOk2sGOD.js +0 -33
- package/dist/ui/assets/DashboardPage-DV_2qWYJ.js +0 -6
- package/dist/ui/assets/LogsPage-DayYjh01.js +0 -1
- package/dist/ui/assets/MeetingPage-C01uPuqj.js +0 -1
- package/dist/ui/assets/ProjectsPage-B8_am_Ib.js +0 -1
- package/dist/ui/assets/ProvidersPage-DBzi66e4.js +0 -1
- package/dist/ui/assets/SettingsPage-CFA_Tknl.js +0 -9
- package/dist/ui/assets/SetupPage-BrUWbhvT.js +0 -1
- package/dist/ui/assets/accordion-DdAEfIXR.js +0 -1
- package/dist/ui/assets/chevron-down-DIosfU_U.js +0 -1
- package/dist/ui/assets/chevron-up-CI-W21Fy.js +0 -1
- package/dist/ui/assets/circle-S0-ouLz-.js +0 -1
- package/dist/ui/assets/circle-minus-CE0iJrl8.js +0 -1
- package/dist/ui/assets/circle-x-jUJ5zZvQ.js +0 -1
- package/dist/ui/assets/dropdown-menu-C2CXM1VE.js +0 -1
- package/dist/ui/assets/index-BN0875JH.css +0 -2
- package/dist/ui/assets/index-CH6sBa3Q.js +0 -116
- package/dist/ui/assets/pencil-5VdSj-h5.js +0 -1
- package/dist/ui/assets/progress-JN30I5fF.js +0 -1
- package/dist/ui/assets/scroll-area-BQQPitM8.js +0 -1
- package/dist/ui/assets/search-ChPgnVKj.js +0 -1
- package/dist/ui/assets/switch-C7W2-KEx.js +0 -1
- package/dist/ui/assets/terminal-C-R5Fckz.js +0 -1
- package/dist/ui/assets/useProviders-TBnWn-Hq.js +0 -1
- /package/dist/ui/assets/{card-DFKnZ6ky.js → card-CNf6BS2e.js} +0 -0
- /package/dist/ui/assets/{circle-alert-KuAm2FWh.js → circle-alert-CyHDwUj8.js} +0 -0
- /package/dist/ui/assets/{circle-check-6Ard1-2z.js → circle-check-Bb54Ebmu.js} +0 -0
- /package/dist/ui/assets/{cpu-KDy6-FAI.js → cpu-Cdgc_B1K.js} +0 -0
- /package/dist/ui/assets/{download-Cjbk4Rek.js → download-C3ifGMjJ.js} +0 -0
- /package/dist/ui/assets/{external-link-HtrFM63g.js → external-link-BvxYeTP1.js} +0 -0
- /package/dist/ui/assets/{eye-D1dB40_o.js → eye-DqNTU_GD.js} +0 -0
- /package/dist/ui/assets/{file-text-CE58EfH0.js → file-text-BT_9S9SM.js} +0 -0
- /package/dist/ui/assets/{folder-open-DIPKeiI_.js → folder-open-BhH8y9ac.js} +0 -0
- /package/dist/ui/assets/{format-BwdV8bB5.js → format-GVHeOyWI.js} +0 -0
- /package/dist/ui/assets/{gateway-url-D5uj6Nxg.js → gateway-url-COCbW0IR.js} +0 -0
- /package/dist/ui/assets/{gauge-DmQmJHEg.js → gauge-D_TMa4i9.js} +0 -0
- /package/dist/ui/assets/{globe-_hUGxQF4.js → globe-DeCQTCDJ.js} +0 -0
- /package/dist/ui/assets/{hexagon-BaNGQlQj.js → hexagon-DsGOUl-H.js} +0 -0
- /package/dist/ui/assets/{history-BfZVGlZa.js → history-BSG-Ypqf.js} +0 -0
- /package/dist/ui/assets/{info-CBZ5-AlC.js → info-NwLoa2Mj.js} +0 -0
- /package/dist/ui/assets/{key-Bv5DdTPh.js → key-3EP0dhkT.js} +0 -0
- /package/dist/ui/assets/{loader-circle-C4hhXLgp.js → loader-circle-CZNax6kS.js} +0 -0
- /package/dist/ui/assets/{lock-CkZYexqw.js → lock-Ei1_J-Nq.js} +0 -0
- /package/dist/ui/assets/{pause-Bpy1_s7y.js → pause-BUqah9Bi.js} +0 -0
- /package/dist/ui/assets/{play-Cj4osqJZ.js → play-NcZ4swwL.js} +0 -0
- /package/dist/ui/assets/{plus-BQhgZN3A.js → plus-CX1xyhp5.js} +0 -0
- /package/dist/ui/assets/{refresh-cw-BfREHVQM.js → refresh-cw-DaYdjQFk.js} +0 -0
- /package/dist/ui/assets/{save-FFTD4dMp.js → save-CUdYyHNy.js} +0 -0
- /package/dist/ui/assets/{settings-BdHKUL92.js → settings-Ds4SqD8s.js} +0 -0
- /package/dist/ui/assets/{sparkles-r4uJbJAl.js → sparkles-yUEb-7oH.js} +0 -0
- /package/dist/ui/assets/{square-G7Hyufqm.js → square-BD81nFtN.js} +0 -0
- /package/dist/ui/assets/{textarea-5kyuD04X.js → textarea-CXgXWKrT.js} +0 -0
- /package/dist/ui/assets/{trash-2-DXVBRWfh.js → trash-2-CNjMkoq6.js} +0 -0
- /package/dist/ui/assets/{triangle-alert-Bu5seg9O.js → triangle-alert-C9Y8Ub4X.js} +0 -0
- /package/dist/ui/assets/{vendor-router-CCECILJ0.js → vendor-router-C9pIYwbJ.js} +0 -0
- /package/dist/ui/assets/{volume-2-s9DuS696.js → volume-2-CeSXNDv4.js} +0 -0
- /package/dist/ui/assets/{zap-BPHZzXKV.js → zap-hlXjpSeA.js} +0 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bun Global Adapter
|
|
3
|
+
*
|
|
4
|
+
* Handles Hive installation via `bun install -g @johpaz/hive-agents`.
|
|
5
|
+
* Uses global npm-style installation with local filesystem paths.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { spawn, execSync } from "node:child_process";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
import { existsSync, readFileSync, unlinkSync } from "node:fs";
|
|
11
|
+
import type {
|
|
12
|
+
InstallationAdapter,
|
|
13
|
+
InstallationConfig,
|
|
14
|
+
GatewayConfig,
|
|
15
|
+
ValidationResult,
|
|
16
|
+
} from "./types";
|
|
17
|
+
import {
|
|
18
|
+
getHiveDir,
|
|
19
|
+
getDefaultPaths,
|
|
20
|
+
loadEnvFile,
|
|
21
|
+
mergeEnv,
|
|
22
|
+
expandPath,
|
|
23
|
+
waitForHttpPort,
|
|
24
|
+
isPortAvailable,
|
|
25
|
+
} from "./config";
|
|
26
|
+
import { PORTS } from "./types";
|
|
27
|
+
|
|
28
|
+
type SpawnedProcess = {
|
|
29
|
+
on(event: "close", listener: (code: number | null) => void): void;
|
|
30
|
+
on(event: "error", listener: (error: Error) => void): void;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Bun Global installation adapter
|
|
35
|
+
*/
|
|
36
|
+
export class BunGlobalAdapter implements InstallationAdapter {
|
|
37
|
+
readonly type = "bun-global" as const;
|
|
38
|
+
readonly name = "Bun Global (npm-style)";
|
|
39
|
+
|
|
40
|
+
private hiveDir: string;
|
|
41
|
+
private pidFile: string;
|
|
42
|
+
|
|
43
|
+
constructor(options?: { hiveDir?: string }) {
|
|
44
|
+
this.hiveDir = options?.hiveDir || getHiveDir();
|
|
45
|
+
this.pidFile = path.join(this.hiveDir, "gateway.pid");
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Check if Bun global installation is available
|
|
50
|
+
*/
|
|
51
|
+
async detect(): Promise<boolean> {
|
|
52
|
+
try {
|
|
53
|
+
// Check if Bun is installed
|
|
54
|
+
execSync("bun --version", { stdio: "ignore" });
|
|
55
|
+
|
|
56
|
+
// Check if hive is installed globally
|
|
57
|
+
try {
|
|
58
|
+
const output = execSync("bun which hive", {
|
|
59
|
+
encoding: "utf-8",
|
|
60
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const hivePath = output.trim();
|
|
64
|
+
if (hivePath && existsSync(hivePath)) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
} catch {
|
|
68
|
+
// Try alternative detection
|
|
69
|
+
const output = execSync("bun pm ls -g", {
|
|
70
|
+
encoding: "utf-8",
|
|
71
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
if (output.includes("@johpaz/hive-agents") || output.includes("hive")) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return false;
|
|
80
|
+
} catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Get Bun Global installation configuration
|
|
87
|
+
*/
|
|
88
|
+
async getConfig(): Promise<InstallationConfig> {
|
|
89
|
+
const env = await this.getEnvironment();
|
|
90
|
+
const paths = getDefaultPaths(this.hiveDir);
|
|
91
|
+
|
|
92
|
+
// For global installation, try to find UI directory
|
|
93
|
+
let uiDir: string | null = null;
|
|
94
|
+
|
|
95
|
+
// Check in dist directory relative to hive binary
|
|
96
|
+
try {
|
|
97
|
+
const hivePath = execSync("bun which hive", {
|
|
98
|
+
encoding: "utf-8",
|
|
99
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
100
|
+
}).trim();
|
|
101
|
+
|
|
102
|
+
const distDir = path.dirname(hivePath);
|
|
103
|
+
const potentialUiDir = path.join(distDir, "ui");
|
|
104
|
+
|
|
105
|
+
if (existsSync(potentialUiDir)) {
|
|
106
|
+
uiDir = potentialUiDir;
|
|
107
|
+
}
|
|
108
|
+
} catch {
|
|
109
|
+
// Binary location not found, will use embedded UI fallback
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Also check current working directory for development
|
|
113
|
+
if (!uiDir) {
|
|
114
|
+
const cwdUiDir = path.join(process.cwd(), "packages/hive-ui/dist");
|
|
115
|
+
if (existsSync(cwdUiDir)) {
|
|
116
|
+
uiDir = cwdUiDir;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
paths.uiDir = uiDir;
|
|
121
|
+
|
|
122
|
+
const port = parseInt(env.HIVE_PORT || "18790", 10) || PORTS.GATEWAY;
|
|
123
|
+
const publicUrl = env.HIVE_PUBLIC_URL || undefined;
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
type: this.type,
|
|
127
|
+
gateway: {
|
|
128
|
+
host: env.HIVE_HOST || "127.0.0.1",
|
|
129
|
+
port,
|
|
130
|
+
wsPort: port,
|
|
131
|
+
publicUrl,
|
|
132
|
+
openBrowser: !env.NO_BROWSER,
|
|
133
|
+
daemon: !!env.HIVE_DAEMON,
|
|
134
|
+
},
|
|
135
|
+
paths,
|
|
136
|
+
env,
|
|
137
|
+
isDev: process.env.HIVE_DEV === "true" || process.env.HIVE_DEV === "1",
|
|
138
|
+
hasEmbeddedUI: false,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Start Hive gateway using Bun
|
|
144
|
+
*/
|
|
145
|
+
async start(config: GatewayConfig): Promise<void> {
|
|
146
|
+
return new Promise((resolve, reject) => {
|
|
147
|
+
const args = ["hive", "start", "--skip-check"];
|
|
148
|
+
|
|
149
|
+
if (config.daemon) {
|
|
150
|
+
args.push("--daemon");
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const child = spawn("bun", args, {
|
|
154
|
+
stdio: "inherit",
|
|
155
|
+
detached: false,
|
|
156
|
+
env: mergeEnv(process.env, {
|
|
157
|
+
HIVE_HOME: this.hiveDir,
|
|
158
|
+
}),
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
const childProcess = child as unknown as SpawnedProcess;
|
|
162
|
+
childProcess.on("close", (code) => {
|
|
163
|
+
if (code === 0) {
|
|
164
|
+
resolve();
|
|
165
|
+
} else {
|
|
166
|
+
reject(new Error(`Bun hive exited with code ${code}`));
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
childProcess.on("error", (error) => {
|
|
171
|
+
reject(error);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Stop Hive gateway
|
|
178
|
+
*/
|
|
179
|
+
async stop(): Promise<void> {
|
|
180
|
+
try {
|
|
181
|
+
if (existsSync(this.pidFile)) {
|
|
182
|
+
const pid = parseInt(readFileSync(this.pidFile, "utf-8").trim(), 10);
|
|
183
|
+
|
|
184
|
+
if (!isNaN(pid)) {
|
|
185
|
+
try {
|
|
186
|
+
process.kill(pid, "SIGTERM");
|
|
187
|
+
console.log(`✅ Hive Gateway detenido (PID: ${pid})`);
|
|
188
|
+
} catch (error) {
|
|
189
|
+
if ((error as NodeJS.ErrnoException).code === "ESRCH") {
|
|
190
|
+
console.log("⚠️ Hive Gateway no está corriendo");
|
|
191
|
+
} else {
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
} finally {
|
|
195
|
+
try {
|
|
196
|
+
unlinkSync(this.pidFile);
|
|
197
|
+
} catch {
|
|
198
|
+
// Ignore errors removing PID file
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
} else {
|
|
203
|
+
// Try to kill by process name
|
|
204
|
+
try {
|
|
205
|
+
execSync("pkill -f 'bun.*hive.*start'", { stdio: "ignore" });
|
|
206
|
+
console.log("✅ Hive Gateway detenido");
|
|
207
|
+
} catch {
|
|
208
|
+
console.log("⚠️ Hive Gateway no está corriendo");
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
} catch (error) {
|
|
212
|
+
console.error("❌ Error deteniendo Hive Gateway:", (error as Error).message);
|
|
213
|
+
throw error;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Check if gateway is running
|
|
219
|
+
*/
|
|
220
|
+
async isRunning(): Promise<boolean> {
|
|
221
|
+
try {
|
|
222
|
+
if (existsSync(this.pidFile)) {
|
|
223
|
+
const pid = parseInt(readFileSync(this.pidFile, "utf-8").trim(), 10);
|
|
224
|
+
|
|
225
|
+
if (!isNaN(pid)) {
|
|
226
|
+
try {
|
|
227
|
+
process.kill(pid, 0);
|
|
228
|
+
return true;
|
|
229
|
+
} catch {
|
|
230
|
+
// Process not running, clean up stale PID file
|
|
231
|
+
try {
|
|
232
|
+
unlinkSync(this.pidFile);
|
|
233
|
+
} catch {
|
|
234
|
+
// Ignore
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Alternative: check if port is in use
|
|
241
|
+
const config = await this.getConfig();
|
|
242
|
+
const portAvailable = await isPortAvailable(config.gateway.port);
|
|
243
|
+
return !portAvailable;
|
|
244
|
+
} catch {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Get gateway process ID
|
|
251
|
+
*/
|
|
252
|
+
async getPid(): Promise<number | null> {
|
|
253
|
+
try {
|
|
254
|
+
if (existsSync(this.pidFile)) {
|
|
255
|
+
const pid = parseInt(readFileSync(this.pidFile, "utf-8").trim(), 10);
|
|
256
|
+
if (!isNaN(pid) && pid > 0) {
|
|
257
|
+
try {
|
|
258
|
+
process.kill(pid, 0);
|
|
259
|
+
return pid;
|
|
260
|
+
} catch {
|
|
261
|
+
// Process not running
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
return null;
|
|
267
|
+
} catch {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Get Bun Global environment variables
|
|
274
|
+
*/
|
|
275
|
+
async getEnvironment(): Promise<Record<string, string>> {
|
|
276
|
+
const fileEnv = loadEnvFile();
|
|
277
|
+
const homeEnv = loadEnvFile(path.join(this.hiveDir, ".env"));
|
|
278
|
+
|
|
279
|
+
const defaults = {
|
|
280
|
+
HIVE_HOST: "127.0.0.1",
|
|
281
|
+
HIVE_PORT: String(PORTS.GATEWAY),
|
|
282
|
+
HIVE_HOME: this.hiveDir,
|
|
283
|
+
NO_BROWSER: "0",
|
|
284
|
+
HIVE_PUBLIC_URL: "",
|
|
285
|
+
HIVE_DAEMON: "0",
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
return mergeEnv(defaults, fileEnv, homeEnv, process.env);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Validate Bun Global installation
|
|
293
|
+
*/
|
|
294
|
+
async validate(): Promise<ValidationResult> {
|
|
295
|
+
const errors: string[] = [];
|
|
296
|
+
const warnings: string[] = [];
|
|
297
|
+
const info: string[] = [];
|
|
298
|
+
|
|
299
|
+
// Check Bun installation
|
|
300
|
+
try {
|
|
301
|
+
const version = execSync("bun --version", { encoding: "utf-8" }).trim();
|
|
302
|
+
info.push(`Bun: v${version}`);
|
|
303
|
+
} catch {
|
|
304
|
+
errors.push("Bun is not installed or not in PATH");
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Check global hive installation
|
|
308
|
+
try {
|
|
309
|
+
const hivePath = execSync("bun which hive", {
|
|
310
|
+
encoding: "utf-8",
|
|
311
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
312
|
+
}).trim();
|
|
313
|
+
|
|
314
|
+
if (hivePath && existsSync(hivePath)) {
|
|
315
|
+
info.push(`Hive binary: ${hivePath}`);
|
|
316
|
+
|
|
317
|
+
// Check if UI directory exists
|
|
318
|
+
const distDir = path.dirname(hivePath);
|
|
319
|
+
const uiDir = path.join(distDir, "ui");
|
|
320
|
+
|
|
321
|
+
if (existsSync(uiDir)) {
|
|
322
|
+
info.push(`UI directory: ${uiDir}`);
|
|
323
|
+
} else {
|
|
324
|
+
warnings.push("UI directory not found - may use embedded UI");
|
|
325
|
+
}
|
|
326
|
+
} else {
|
|
327
|
+
errors.push("Hive is not installed globally");
|
|
328
|
+
}
|
|
329
|
+
} catch {
|
|
330
|
+
errors.push("Hive is not installed globally (try: bun install -g @johpaz/hive-agents)");
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// Check Hive directory
|
|
334
|
+
if (existsSync(this.hiveDir)) {
|
|
335
|
+
info.push(`Hive home: ${this.hiveDir}`);
|
|
336
|
+
} else {
|
|
337
|
+
warnings.push(`Hive home directory does not exist: ${this.hiveDir}`);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// Check if gateway is running
|
|
341
|
+
const running = await this.isRunning();
|
|
342
|
+
if (running) {
|
|
343
|
+
info.push("Hive Gateway is running");
|
|
344
|
+
|
|
345
|
+
// Check health endpoint
|
|
346
|
+
const config = await this.getConfig();
|
|
347
|
+
const healthy = await waitForHttpPort(config.gateway.port, "/health", 5000);
|
|
348
|
+
|
|
349
|
+
if (healthy) {
|
|
350
|
+
info.push("Hive health check passed");
|
|
351
|
+
} else {
|
|
352
|
+
warnings.push("Hive Gateway is running but health check failed");
|
|
353
|
+
}
|
|
354
|
+
} else {
|
|
355
|
+
warnings.push("Hive Gateway is not running");
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// Check for conflicting installations
|
|
359
|
+
try {
|
|
360
|
+
execSync("docker --version", { stdio: "ignore" });
|
|
361
|
+
const dockerAdapter = new (await import("./docker")).DockerAdapter();
|
|
362
|
+
const dockerInstalled = await dockerAdapter.detect();
|
|
363
|
+
|
|
364
|
+
if (dockerInstalled) {
|
|
365
|
+
info.push("Note: Docker installation also detected");
|
|
366
|
+
}
|
|
367
|
+
} catch {
|
|
368
|
+
// Docker not installed, no conflict
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
return {
|
|
372
|
+
valid: errors.length === 0,
|
|
373
|
+
errors,
|
|
374
|
+
warnings,
|
|
375
|
+
info,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration utilities for installation adapters
|
|
3
|
+
*
|
|
4
|
+
* Provides shared configuration loading, validation, and normalization
|
|
5
|
+
* across different installation methods.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
11
|
+
import type { GatewayConfig, InstallationConfig, InstallationPaths } from "./types";
|
|
12
|
+
import { DEFAULT_GATEWAY_CONFIG, PORTS, gatewayConfigSchema, installationConfigSchema } from "./types";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Get the base Hive directory from environment or default
|
|
16
|
+
*/
|
|
17
|
+
export function getHiveDir(customDir?: string): string {
|
|
18
|
+
if (customDir) {
|
|
19
|
+
return path.resolve(customDir);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Check environment variable
|
|
23
|
+
if (process.env.HIVE_HOME) {
|
|
24
|
+
return path.resolve(process.env.HIVE_HOME);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Development mode
|
|
28
|
+
if (process.env.HIVE_DEV === "true") {
|
|
29
|
+
return path.join(process.env.HOME || "", ".hive-dev");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Default production location
|
|
33
|
+
return path.join(process.env.HOME || "", ".hive");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Get default installation paths for the current environment
|
|
38
|
+
*/
|
|
39
|
+
export function getDefaultPaths(hiveDir?: string): InstallationPaths {
|
|
40
|
+
const dir = getHiveDir(hiveDir);
|
|
41
|
+
const dataDir = path.join(dir, "data");
|
|
42
|
+
const logsDir = path.join(dir, "logs");
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
hiveDir: dir,
|
|
46
|
+
dbPath: path.join(dataDir, "hive.db"),
|
|
47
|
+
logPath: path.join(logsDir, "gateway.log"),
|
|
48
|
+
pidPath: path.join(dir, "gateway.pid"),
|
|
49
|
+
uiDir: null, // Will be set by adapter
|
|
50
|
+
workspaceDir: null, // Will be set from config
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Load environment variables from .env file if it exists
|
|
56
|
+
*/
|
|
57
|
+
export function loadEnvFile(envPath?: string): Record<string, string> {
|
|
58
|
+
const filePath = envPath || path.join(process.cwd(), ".env");
|
|
59
|
+
|
|
60
|
+
if (!existsSync(filePath)) {
|
|
61
|
+
return {};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
try {
|
|
65
|
+
const content = readFileSync(filePath, "utf-8");
|
|
66
|
+
const env: Record<string, string> = {};
|
|
67
|
+
|
|
68
|
+
for (const line of content.split("\n")) {
|
|
69
|
+
const trimmed = line.trim();
|
|
70
|
+
// Skip comments and empty lines
|
|
71
|
+
if (!trimmed || trimmed.startsWith("#")) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const [key, ...valueParts] = trimmed.split("=");
|
|
76
|
+
if (key && valueParts.length > 0) {
|
|
77
|
+
const value = valueParts.join("=").trim();
|
|
78
|
+
// Remove quotes if present
|
|
79
|
+
const cleanValue = value.replace(/^["']|["']$/g, "");
|
|
80
|
+
env[key.trim()] = cleanValue;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return env;
|
|
85
|
+
} catch {
|
|
86
|
+
return {};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Merge environment variables with precedence
|
|
92
|
+
*/
|
|
93
|
+
export function mergeEnv(...envs: Array<Record<string, string>>): Record<string, string> {
|
|
94
|
+
const result: Record<string, string> = {};
|
|
95
|
+
|
|
96
|
+
for (const env of envs) {
|
|
97
|
+
Object.assign(result, env);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Validate and normalize gateway configuration
|
|
105
|
+
*/
|
|
106
|
+
export function validateGatewayConfig(
|
|
107
|
+
config: Partial<GatewayConfig>
|
|
108
|
+
): GatewayConfig {
|
|
109
|
+
const merged = { ...DEFAULT_GATEWAY_CONFIG, ...config };
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
return gatewayConfigSchema.parse(merged);
|
|
113
|
+
} catch (error) {
|
|
114
|
+
if (error instanceof z.ZodError) {
|
|
115
|
+
const messages = error.issues.map((e) => `${e.path.join(".")}: ${e.message}`);
|
|
116
|
+
throw new Error(`Invalid gateway configuration:\n${messages.join("\n")}`);
|
|
117
|
+
}
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Validate complete installation configuration
|
|
124
|
+
*/
|
|
125
|
+
export function validateInstallationConfig(
|
|
126
|
+
config: unknown
|
|
127
|
+
): InstallationConfig {
|
|
128
|
+
try {
|
|
129
|
+
return installationConfigSchema.parse(config);
|
|
130
|
+
} catch (error) {
|
|
131
|
+
if (error instanceof z.ZodError) {
|
|
132
|
+
const messages = error.issues.map((e) => `${e.path.join(".")}: ${e.message}`);
|
|
133
|
+
throw new Error(`Invalid installation configuration:\n${messages.join("\n")}`);
|
|
134
|
+
}
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Find a free port starting from the given port
|
|
141
|
+
*/
|
|
142
|
+
export async function findFreePort(startPort: number, maxAttempts: number = 100): Promise<number> {
|
|
143
|
+
for (let port = startPort; port < startPort + maxAttempts; port++) {
|
|
144
|
+
try {
|
|
145
|
+
const server = Bun.serve({
|
|
146
|
+
port,
|
|
147
|
+
hostname: "0.0.0.0",
|
|
148
|
+
fetch: () => new Response(""),
|
|
149
|
+
});
|
|
150
|
+
server.stop();
|
|
151
|
+
return port;
|
|
152
|
+
} catch {
|
|
153
|
+
// Port is in use, try next
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
throw new Error(`No free port found starting from ${startPort}`);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Check if a port is available
|
|
161
|
+
*/
|
|
162
|
+
export async function isPortAvailable(port: number): Promise<boolean> {
|
|
163
|
+
try {
|
|
164
|
+
const server = Bun.serve({
|
|
165
|
+
port,
|
|
166
|
+
hostname: "0.0.0.0",
|
|
167
|
+
fetch: () => new Response(""),
|
|
168
|
+
});
|
|
169
|
+
server.stop();
|
|
170
|
+
return true;
|
|
171
|
+
} catch {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Wait for a port to become available
|
|
178
|
+
*/
|
|
179
|
+
export async function waitForPort(
|
|
180
|
+
port: number,
|
|
181
|
+
timeout: number = 30000,
|
|
182
|
+
interval: number = 500
|
|
183
|
+
): Promise<boolean> {
|
|
184
|
+
const start = Date.now();
|
|
185
|
+
|
|
186
|
+
while (Date.now() - start < timeout) {
|
|
187
|
+
if (await isPortAvailable(port)) {
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Wait for a port to respond to HTTP requests
|
|
198
|
+
*/
|
|
199
|
+
export async function waitForHttpPort(
|
|
200
|
+
port: number,
|
|
201
|
+
path: string = "/health",
|
|
202
|
+
timeout: number = 30000
|
|
203
|
+
): Promise<boolean> {
|
|
204
|
+
const start = Date.now();
|
|
205
|
+
|
|
206
|
+
while (Date.now() - start < timeout) {
|
|
207
|
+
try {
|
|
208
|
+
const response = await fetch(`http://127.0.0.1:${port}${path}`, {
|
|
209
|
+
signal: AbortSignal.timeout(1000),
|
|
210
|
+
});
|
|
211
|
+
if (response.ok) {
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
} catch {
|
|
215
|
+
// Port not ready yet
|
|
216
|
+
}
|
|
217
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Expand a path that may contain ~ or environment variables
|
|
225
|
+
*/
|
|
226
|
+
export function expandPath(input: string): string {
|
|
227
|
+
if (!input) {
|
|
228
|
+
return input;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Expand ~ to home directory
|
|
232
|
+
if (input.startsWith("~/")) {
|
|
233
|
+
return path.join(process.env.HOME || "", input.slice(2));
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Expand environment variables ${VAR} or $VAR
|
|
237
|
+
return input.replace(/\$\{?([A-Z_][A-Z0-9_]*)\}?/gi, (_, name) => {
|
|
238
|
+
return process.env[name] || name;
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Get the distribution directory where the binary is located
|
|
244
|
+
*/
|
|
245
|
+
export function getDistDir(): string | null {
|
|
246
|
+
// Check environment variable
|
|
247
|
+
if (process.env.HIVE_DIST_DIR) {
|
|
248
|
+
return process.env.HIVE_DIST_DIR;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Try to detect from process.argv
|
|
252
|
+
const scriptPath = process.argv[1];
|
|
253
|
+
if (!scriptPath) {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const dir = path.dirname(scriptPath);
|
|
258
|
+
|
|
259
|
+
// Check if we're in a dist directory
|
|
260
|
+
if (path.basename(dir) === "dist") {
|
|
261
|
+
return dir;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Check if dist exists as a sibling
|
|
265
|
+
const distPath = path.join(dir, "dist");
|
|
266
|
+
if (existsSync(distPath)) {
|
|
267
|
+
return distPath;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Check if running in development mode
|
|
275
|
+
*
|
|
276
|
+
* Development mode is ONLY activated when HIVE_DEV is set to "true" or "1".
|
|
277
|
+
* Otherwise, defaults to production mode.
|
|
278
|
+
*
|
|
279
|
+
* This is a simple and reliable check:
|
|
280
|
+
* - Set HIVE_DEV=true in your development environment
|
|
281
|
+
* - Production installations don't need to set anything
|
|
282
|
+
*/
|
|
283
|
+
export function isDevMode(): boolean {
|
|
284
|
+
return process.env.HIVE_DEV === "true" || process.env.HIVE_DEV === "1";
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Check if running as a child process
|
|
289
|
+
*/
|
|
290
|
+
export function isChildProcess(): boolean {
|
|
291
|
+
return process.env.HIVE_GATEWAY_CHILD === "1";
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Get platform-specific information
|
|
296
|
+
*/
|
|
297
|
+
export function getPlatformInfo(): {
|
|
298
|
+
platform: string;
|
|
299
|
+
arch: string;
|
|
300
|
+
isLinux: boolean;
|
|
301
|
+
isMac: boolean;
|
|
302
|
+
isWindows: boolean;
|
|
303
|
+
} {
|
|
304
|
+
const platform = process.platform;
|
|
305
|
+
const arch = process.arch;
|
|
306
|
+
|
|
307
|
+
return {
|
|
308
|
+
platform,
|
|
309
|
+
arch,
|
|
310
|
+
isLinux: platform === "linux",
|
|
311
|
+
isMac: platform === "darwin",
|
|
312
|
+
isWindows: platform === "win32",
|
|
313
|
+
};
|
|
314
|
+
}
|