@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,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hive TTS — Índice de modelos disponibles
|
|
3
|
+
* Modelos en español desde HuggingFace
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface TTSModel {
|
|
7
|
+
id: string
|
|
8
|
+
name: string
|
|
9
|
+
language: string
|
|
10
|
+
quality: "low" | "medium" | "high"
|
|
11
|
+
size: string
|
|
12
|
+
modelUrl: string
|
|
13
|
+
configUrl: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const HF_BASE = "https://huggingface.co/spaces/HirCoir/Piper-TTS-Spanish/resolve/main"
|
|
17
|
+
|
|
18
|
+
export const TTS_MODELS: TTSModel[] = [
|
|
19
|
+
{
|
|
20
|
+
id: "es_MX-claude-14947-epoch-high",
|
|
21
|
+
name: "Claude (México)",
|
|
22
|
+
language: "es-MX",
|
|
23
|
+
quality: "high",
|
|
24
|
+
size: "63.1 MB",
|
|
25
|
+
modelUrl: `${HF_BASE}/es_MX-claude-14947-epoch-high.onnx`,
|
|
26
|
+
configUrl: `${HF_BASE}/es_MX-claude-14947-epoch-high.onnx.json`,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: "es_MX-cortana-19669-epoch-high",
|
|
30
|
+
name: "Cortana (México)",
|
|
31
|
+
language: "es-MX",
|
|
32
|
+
quality: "high",
|
|
33
|
+
size: "63.1 MB",
|
|
34
|
+
modelUrl: `${HF_BASE}/es_MX-cortana-19669-epoch-high.onnx`,
|
|
35
|
+
configUrl: `${HF_BASE}/es_MX-cortana-19669-epoch-high.onnx.json`,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "es_MX-gevy-10196-epoch-high",
|
|
39
|
+
name: "Gevy (México)",
|
|
40
|
+
language: "es-MX",
|
|
41
|
+
quality: "high",
|
|
42
|
+
size: "63.1 MB",
|
|
43
|
+
modelUrl: `${HF_BASE}/es_MX-gevy-10196-epoch-high.onnx`,
|
|
44
|
+
configUrl: `${HF_BASE}/es_MX-gevy-10196-epoch-high.onnx.json`,
|
|
45
|
+
},
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
export function getModelById(id: string): TTSModel | undefined {
|
|
49
|
+
return TTS_MODELS.find((m) => m.id === id)
|
|
50
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Hive TTS Server
|
|
4
|
+
* HTTP server local que expone Piper TTS como API REST
|
|
5
|
+
* Puerto: 5500 (configurable con env TTS_PORT)
|
|
6
|
+
*
|
|
7
|
+
* GET /health → { ok: true, voice: string, voices: string[] }
|
|
8
|
+
* POST /tts → audio/wav binary
|
|
9
|
+
* GET /voices → { voices: string[] }
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { existsSync, readdirSync, readFileSync } from "fs"
|
|
13
|
+
import { join } from "path"
|
|
14
|
+
import { homedir } from "os"
|
|
15
|
+
import { detectPlatform, getPiperBinaryName, DEFAULT_VOICE } from "./detect.js"
|
|
16
|
+
|
|
17
|
+
const log = {
|
|
18
|
+
info: (msg: string) => console.log(`[TTS] ${msg}`),
|
|
19
|
+
warn: (msg: string) => console.warn(`[TTS] ${msg}`),
|
|
20
|
+
error: (msg: string) => console.error(`[TTS] ${msg}`),
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const TTS_ROOT =
|
|
24
|
+
process.env.HIVE_TTS_ROOT ??
|
|
25
|
+
join(process.env.HIVE_HOME ?? join(homedir(), ".hive"), "tts")
|
|
26
|
+
const BIN_DIR = join(TTS_ROOT, "bin")
|
|
27
|
+
const VOICES_DIR = join(TTS_ROOT, "voices")
|
|
28
|
+
const PORT = Number(process.env.TTS_PORT ?? 5500)
|
|
29
|
+
const DEFAULT_VOICE_ENV = process.env.TTS_VOICE ?? DEFAULT_VOICE
|
|
30
|
+
|
|
31
|
+
function getPiperPath(): string {
|
|
32
|
+
const platform = detectPlatform()
|
|
33
|
+
const binaryName = getPiperBinaryName(platform)
|
|
34
|
+
const binaryPath = join(BIN_DIR, binaryName)
|
|
35
|
+
|
|
36
|
+
if (!existsSync(binaryPath)) {
|
|
37
|
+
throw new Error("Piper no instalado. Ejecuta: bun run src/install.ts")
|
|
38
|
+
}
|
|
39
|
+
return binaryPath
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function listVoices(): string[] {
|
|
43
|
+
if (!existsSync(VOICES_DIR)) return []
|
|
44
|
+
return readdirSync(VOICES_DIR)
|
|
45
|
+
.filter((f) => f.endsWith(".onnx"))
|
|
46
|
+
.map((f) => f.replace(".onnx", ""))
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function synthesize(text: string, voice: string): Promise<ArrayBuffer> {
|
|
50
|
+
const piperPath = getPiperPath()
|
|
51
|
+
let modelPath = join(VOICES_DIR, `${voice}.onnx`)
|
|
52
|
+
let configPath = join(VOICES_DIR, `${voice}.onnx.json`)
|
|
53
|
+
|
|
54
|
+
if (!existsSync(modelPath)) {
|
|
55
|
+
console.warn(`[TTS] Voz no encontrada: ${voice}. Usando por defecto: ${DEFAULT_VOICE}`);
|
|
56
|
+
voice = DEFAULT_VOICE;
|
|
57
|
+
modelPath = join(VOICES_DIR, `${voice}.onnx`);
|
|
58
|
+
configPath = join(VOICES_DIR, `${voice}.onnx.json`);
|
|
59
|
+
|
|
60
|
+
if (!existsSync(modelPath)) {
|
|
61
|
+
throw new Error(`Ni siquiera la voz por defecto se encuentra: ${voice}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Leer configuración del modelo para obtener parámetros de inferencia
|
|
66
|
+
let lengthScale = 0.95 // Más lento = más natural
|
|
67
|
+
let noiseScale = 0.6 // Menos variación = más consistente
|
|
68
|
+
let noiseW = 0.75 // Más suave = menos artefactos
|
|
69
|
+
let sentenceSilence = 0.2 // Pausa entre frases para naturalidad
|
|
70
|
+
|
|
71
|
+
if (existsSync(configPath)) {
|
|
72
|
+
try {
|
|
73
|
+
const config = JSON.parse(readFileSync(configPath, "utf-8"))
|
|
74
|
+
const inference = config.inference || {}
|
|
75
|
+
|
|
76
|
+
// Usar valores del modelo con ajustes para mejorar naturalidad
|
|
77
|
+
lengthScale = (inference.length_scale ?? 1) * 0.95
|
|
78
|
+
noiseScale = (inference.noise_scale ?? 0.667) * 0.9
|
|
79
|
+
noiseW = (inference.noise_w ?? 0.8) * 0.95
|
|
80
|
+
} catch (err) {
|
|
81
|
+
log.warn(`No se pudo leer configuración del modelo: ${err}`)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Sobrescribir con variables de entorno si existen
|
|
86
|
+
lengthScale = Number(process.env.PIPER_LENGTH_SCALE ?? lengthScale)
|
|
87
|
+
noiseScale = Number(process.env.PIPER_NOISE_SCALE ?? noiseScale)
|
|
88
|
+
noiseW = Number(process.env.PIPER_NOISE_W ?? noiseW)
|
|
89
|
+
sentenceSilence = Number(process.env.PIPER_SENTENCE_SILENCE ?? sentenceSilence)
|
|
90
|
+
|
|
91
|
+
const args = [
|
|
92
|
+
piperPath,
|
|
93
|
+
"--model", modelPath,
|
|
94
|
+
"--output-raw",
|
|
95
|
+
"--length_scale", String(lengthScale),
|
|
96
|
+
"--noise_scale", String(noiseScale),
|
|
97
|
+
"--noise_w", String(noiseW),
|
|
98
|
+
"--sentence_silence", String(sentenceSilence),
|
|
99
|
+
]
|
|
100
|
+
|
|
101
|
+
const proc = Bun.spawn(
|
|
102
|
+
args,
|
|
103
|
+
{
|
|
104
|
+
stdin: "pipe",
|
|
105
|
+
stdout: "pipe",
|
|
106
|
+
stderr: "pipe",
|
|
107
|
+
}
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
proc.stdin.write(new TextEncoder().encode(text))
|
|
111
|
+
proc.stdin.end()
|
|
112
|
+
|
|
113
|
+
const [audioBuffer, exitCode] = await Promise.all([
|
|
114
|
+
new Response(proc.stdout).arrayBuffer(),
|
|
115
|
+
proc.exited,
|
|
116
|
+
])
|
|
117
|
+
|
|
118
|
+
if (exitCode !== 0) {
|
|
119
|
+
const errText = await new Response(proc.stderr).text()
|
|
120
|
+
throw new Error(`Piper error (exit ${exitCode}): ${errText}`)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// --output-raw devuelve PCM 16-bit LE 22050Hz mono — envolver en WAV header
|
|
124
|
+
return wrapInWav(audioBuffer, 22050, 1, 16)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function wrapInWav(
|
|
128
|
+
pcm: ArrayBuffer,
|
|
129
|
+
sampleRate: number,
|
|
130
|
+
channels: number,
|
|
131
|
+
bitsPerSample: number
|
|
132
|
+
): ArrayBuffer {
|
|
133
|
+
const dataSize = pcm.byteLength
|
|
134
|
+
const header = new ArrayBuffer(44)
|
|
135
|
+
const view = new DataView(header)
|
|
136
|
+
|
|
137
|
+
const writeStr = (offset: number, str: string) => {
|
|
138
|
+
for (let i = 0; i < str.length; i++)
|
|
139
|
+
view.setUint8(offset + i, str.charCodeAt(i))
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
writeStr(0, "RIFF")
|
|
143
|
+
view.setUint32(4, 36 + dataSize, true)
|
|
144
|
+
writeStr(8, "WAVE")
|
|
145
|
+
writeStr(12, "fmt ")
|
|
146
|
+
view.setUint32(16, 16, true)
|
|
147
|
+
view.setUint16(20, 1, true) // PCM
|
|
148
|
+
view.setUint16(22, channels, true)
|
|
149
|
+
view.setUint32(24, sampleRate, true)
|
|
150
|
+
view.setUint32(28, (sampleRate * channels * bitsPerSample) / 8, true)
|
|
151
|
+
view.setUint16(32, (channels * bitsPerSample) / 8, true)
|
|
152
|
+
view.setUint16(34, bitsPerSample, true)
|
|
153
|
+
writeStr(36, "data")
|
|
154
|
+
view.setUint32(40, dataSize, true)
|
|
155
|
+
|
|
156
|
+
const wav = new Uint8Array(44 + dataSize)
|
|
157
|
+
wav.set(new Uint8Array(header), 0)
|
|
158
|
+
wav.set(new Uint8Array(pcm), 44)
|
|
159
|
+
return wav.buffer
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const CORS = {
|
|
163
|
+
"Access-Control-Allow-Origin": "*",
|
|
164
|
+
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
|
|
165
|
+
"Access-Control-Allow-Headers": "Content-Type",
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Inicia el servidor TTS en-proceso.
|
|
170
|
+
* Exportado para que el gateway pueda llamarlo directamente
|
|
171
|
+
* sin necesidad de spawnar un subproceso externo.
|
|
172
|
+
*/
|
|
173
|
+
export function startTTSServer(opts?: { port?: number }): ReturnType<typeof Bun.serve> {
|
|
174
|
+
const listenPort = opts?.port ?? PORT
|
|
175
|
+
|
|
176
|
+
const server = Bun.serve({
|
|
177
|
+
port: listenPort,
|
|
178
|
+
async fetch(req) {
|
|
179
|
+
const url = new URL(req.url)
|
|
180
|
+
|
|
181
|
+
if (req.method === "OPTIONS") {
|
|
182
|
+
return new Response(null, { status: 204, headers: CORS })
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (req.method === "GET" && url.pathname === "/health") {
|
|
186
|
+
return Response.json(
|
|
187
|
+
{ ok: true, voice: DEFAULT_VOICE_ENV, voices: listVoices() },
|
|
188
|
+
{ headers: CORS }
|
|
189
|
+
)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (req.method === "GET" && url.pathname === "/voices") {
|
|
193
|
+
return Response.json({ voices: listVoices() }, { headers: CORS })
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if (req.method === "POST" && url.pathname === "/tts") {
|
|
197
|
+
let body: { text?: string; voice?: string }
|
|
198
|
+
try {
|
|
199
|
+
body = await req.json()
|
|
200
|
+
} catch {
|
|
201
|
+
return Response.json(
|
|
202
|
+
{ error: "Body JSON inválido" },
|
|
203
|
+
{ status: 400, headers: CORS }
|
|
204
|
+
)
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const { text, voice = DEFAULT_VOICE_ENV } = body
|
|
208
|
+
|
|
209
|
+
if (!text || typeof text !== "string" || text.trim().length === 0) {
|
|
210
|
+
return Response.json(
|
|
211
|
+
{ error: "Campo 'text' requerido" },
|
|
212
|
+
{ status: 400, headers: CORS }
|
|
213
|
+
)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (text.length > 2000) {
|
|
217
|
+
return Response.json(
|
|
218
|
+
{ error: "Texto demasiado largo (máx 2000 chars)" },
|
|
219
|
+
{ status: 400, headers: CORS }
|
|
220
|
+
)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
try {
|
|
224
|
+
const audio = await synthesize(text.trim(), voice)
|
|
225
|
+
return new Response(audio, {
|
|
226
|
+
headers: {
|
|
227
|
+
...CORS,
|
|
228
|
+
"Content-Type": "audio/wav",
|
|
229
|
+
"Content-Length": String(audio.byteLength),
|
|
230
|
+
},
|
|
231
|
+
})
|
|
232
|
+
} catch (err) {
|
|
233
|
+
const message = err instanceof Error ? err.message : "Error interno"
|
|
234
|
+
return Response.json({ error: message }, { status: 500, headers: CORS })
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return Response.json({ error: "Not found" }, { status: 404, headers: CORS })
|
|
239
|
+
},
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
log.info(`Hive TTS Server escuchando en http://localhost:${listenPort}`)
|
|
243
|
+
log.info(`Voz por defecto: ${DEFAULT_VOICE_ENV}`)
|
|
244
|
+
log.info(`Voces disponibles: ${listVoices().join(", ") || "ninguna (ejecuta install.ts primero)"}`)
|
|
245
|
+
return server
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Ejecución directa: bun run src/server.ts
|
|
249
|
+
// @ts-ignore
|
|
250
|
+
if (import.meta.main) {
|
|
251
|
+
startTTSServer()
|
|
252
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { Config } from "../config/loader.ts";
|
|
2
|
+
import { logger } from "../utils/logger.ts";
|
|
3
|
+
|
|
4
|
+
export interface HealthStatus {
|
|
5
|
+
status: "healthy" | "degraded" | "unhealthy";
|
|
6
|
+
checks: Record<string, {
|
|
7
|
+
status: "ok" | "warning" | "error";
|
|
8
|
+
message?: string;
|
|
9
|
+
latency?: number;
|
|
10
|
+
}>;
|
|
11
|
+
uptime: number;
|
|
12
|
+
lastCheck: Date;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface HeartbeatOptions {
|
|
16
|
+
intervalMs?: number;
|
|
17
|
+
onHealthChange?: (status: HealthStatus) => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
type HealthCheck = () => Promise<{
|
|
21
|
+
status: "ok" | "warning" | "error";
|
|
22
|
+
message?: string;
|
|
23
|
+
latency?: number;
|
|
24
|
+
}>;
|
|
25
|
+
|
|
26
|
+
export class Heartbeat {
|
|
27
|
+
private intervalMs: number;
|
|
28
|
+
private checks: Map<string, HealthCheck> = new Map();
|
|
29
|
+
private intervalId: Timer | null = null;
|
|
30
|
+
private startTime: Date;
|
|
31
|
+
private lastStatus: HealthStatus | null = null;
|
|
32
|
+
private onHealthChange?: (status: HealthStatus) => void;
|
|
33
|
+
private log = logger.child("heartbeat");
|
|
34
|
+
|
|
35
|
+
constructor(_config: Config, options: HeartbeatOptions = {}) {
|
|
36
|
+
this.intervalMs = options.intervalMs ?? 30000;
|
|
37
|
+
this.onHealthChange = options.onHealthChange;
|
|
38
|
+
this.startTime = new Date();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
registerCheck(name: string, check: HealthCheck): void {
|
|
42
|
+
this.checks.set(name, check);
|
|
43
|
+
this.log.debug(`Registered health check: ${name}`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
removeCheck(name: string): boolean {
|
|
47
|
+
return this.checks.delete(name);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async runChecks(): Promise<HealthStatus> {
|
|
51
|
+
const checks: HealthStatus["checks"] = {};
|
|
52
|
+
let overallStatus: "healthy" | "degraded" | "unhealthy" = "healthy";
|
|
53
|
+
|
|
54
|
+
for (const [name, check] of this.checks) {
|
|
55
|
+
try {
|
|
56
|
+
const start = Date.now();
|
|
57
|
+
const result = await check();
|
|
58
|
+
const latency = Date.now() - start;
|
|
59
|
+
|
|
60
|
+
checks[name] = {
|
|
61
|
+
status: result.status,
|
|
62
|
+
message: result.message,
|
|
63
|
+
latency: result.latency ?? latency,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
if (result.status === "warning" && overallStatus === "healthy") {
|
|
67
|
+
overallStatus = "degraded";
|
|
68
|
+
} else if (result.status === "error") {
|
|
69
|
+
overallStatus = "unhealthy";
|
|
70
|
+
}
|
|
71
|
+
} catch (error) {
|
|
72
|
+
checks[name] = {
|
|
73
|
+
status: "error",
|
|
74
|
+
message: (error as Error).message,
|
|
75
|
+
};
|
|
76
|
+
overallStatus = "unhealthy";
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const status: HealthStatus = {
|
|
81
|
+
status: overallStatus,
|
|
82
|
+
checks,
|
|
83
|
+
uptime: Date.now() - this.startTime.getTime(),
|
|
84
|
+
lastCheck: new Date(),
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const prevStatus = this.lastStatus?.status;
|
|
88
|
+
if (prevStatus && prevStatus !== overallStatus) {
|
|
89
|
+
this.log.info(`Health status changed: ${prevStatus} -> ${overallStatus}`);
|
|
90
|
+
this.onHealthChange?.(status);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
this.lastStatus = status;
|
|
94
|
+
return status;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
start(): void {
|
|
98
|
+
if (this.intervalId) {
|
|
99
|
+
this.log.warn("Heartbeat already running");
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
this.runChecks();
|
|
104
|
+
|
|
105
|
+
this.intervalId = setInterval(async () => {
|
|
106
|
+
await this.runChecks();
|
|
107
|
+
}, this.intervalMs);
|
|
108
|
+
|
|
109
|
+
this.log.info(`Heartbeat started (interval: ${this.intervalMs}ms)`);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
stop(): void {
|
|
113
|
+
if (this.intervalId) {
|
|
114
|
+
clearInterval(this.intervalId);
|
|
115
|
+
this.intervalId = null;
|
|
116
|
+
this.log.info("Heartbeat stopped");
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
getStatus(): HealthStatus | null {
|
|
121
|
+
return this.lastStatus;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
isRunning(): boolean {
|
|
125
|
+
return this.intervalId !== null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export function createHeartbeat(config: Config, options?: HeartbeatOptions): Heartbeat {
|
|
130
|
+
const heartbeat = new Heartbeat(config, options);
|
|
131
|
+
|
|
132
|
+
heartbeat.registerCheck("memory", async () => {
|
|
133
|
+
const memUsage = process.memoryUsage();
|
|
134
|
+
const heapUsedMB = Math.round(memUsage.heapUsed / 1024 / 1024);
|
|
135
|
+
const heapTotalMB = Math.round(memUsage.heapTotal / 1024 / 1024);
|
|
136
|
+
const ratio = memUsage.heapUsed / memUsage.heapTotal;
|
|
137
|
+
|
|
138
|
+
if (ratio > 0.9) {
|
|
139
|
+
return {
|
|
140
|
+
status: "error",
|
|
141
|
+
message: `Memory critically high: ${heapUsedMB}/${heapTotalMB}MB`,
|
|
142
|
+
};
|
|
143
|
+
} else if (ratio > 0.75) {
|
|
144
|
+
return {
|
|
145
|
+
status: "warning",
|
|
146
|
+
message: `Memory usage high: ${heapUsedMB}/${heapTotalMB}MB`,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return {
|
|
151
|
+
status: "ok",
|
|
152
|
+
message: `${heapUsedMB}/${heapTotalMB}MB used`,
|
|
153
|
+
};
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
return heartbeat;
|
|
157
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// Gateway
|
|
2
|
+
export * from "./gateway/index.ts";
|
|
3
|
+
export * from "./gateway/server.ts";
|
|
4
|
+
|
|
5
|
+
// Agent (core functionality)
|
|
6
|
+
export * from "./agent/service.ts";
|
|
7
|
+
export * from "./agent/agent-loop.ts";
|
|
8
|
+
export * from "./agent/context-compiler.ts";
|
|
9
|
+
export * from "./agent/prompt-builder.ts";
|
|
10
|
+
export * from "./agent/conversation-store.ts";
|
|
11
|
+
export * from "./agent/tool-selector.ts";
|
|
12
|
+
export * from "./agent/skill-selector.ts";
|
|
13
|
+
export * from "./agent/playbook-selector.ts";
|
|
14
|
+
export * from "./agent/llm-client.ts";
|
|
15
|
+
|
|
16
|
+
// Channels
|
|
17
|
+
export * from "./channels/index.ts";
|
|
18
|
+
export * from "./channels/manager.ts";
|
|
19
|
+
export * from "./channels/base.ts";
|
|
20
|
+
export * from "./channels/telegram.ts";
|
|
21
|
+
export * from "./channels/discord.ts";
|
|
22
|
+
export * from "./channels/whatsapp.ts";
|
|
23
|
+
export * from "./channels/slack.ts";
|
|
24
|
+
export * from "./channels/webchat.ts";
|
|
25
|
+
|
|
26
|
+
// Storage
|
|
27
|
+
export * from "./storage/sqlite.ts";
|
|
28
|
+
export * from "./storage/schema.ts";
|
|
29
|
+
export * from "./storage/seed.ts";
|
|
30
|
+
export * from "./storage/crypto.ts";
|
|
31
|
+
export * from "./storage/onboarding.ts";
|
|
32
|
+
|
|
33
|
+
// Tools (main index)
|
|
34
|
+
export { createAllTools, createToolsByCategory } from "./tools/index.ts";
|
|
35
|
+
export type { Tool, ToolResult } from "./tools/types.ts";
|
|
36
|
+
export * from "./tool-runtime/index.ts";
|
|
37
|
+
|
|
38
|
+
// Config
|
|
39
|
+
export * from "./config/index.ts";
|
|
40
|
+
|
|
41
|
+
// Utils
|
|
42
|
+
export * from "./utils/logger.ts";
|
|
43
|
+
export { retry } from "./utils/retry.ts";
|
|
44
|
+
|
|
45
|
+
// Other core modules
|
|
46
|
+
export * from "./security/index.ts";
|
|
47
|
+
export * from "./heartbeat/index.ts";
|
|
48
|
+
export * from "./events/event-bus.ts";
|
|
49
|
+
export * from "./events/agent-bus.ts";
|
|
50
|
+
export * from "./state/store.ts";
|
|
51
|
+
export * from "./resilience/circuit-breaker.ts";
|
|
52
|
+
export * from "./plugins/index.ts";
|
|
53
|
+
export * from "./canvas/index.ts";
|
|
54
|
+
|
|
55
|
+
// Re-export native-tools types
|
|
56
|
+
export type { Tool as NativeTool, ToolResult as NativeToolResult } from "./agent/native-tools.ts";
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Hot Reload
|
|
3
|
+
*
|
|
4
|
+
* Watches for MCP server changes in DB and updates MCP Manager automatically
|
|
5
|
+
*
|
|
6
|
+
* Architecture: Direct Connection
|
|
7
|
+
* - MCP servers are tracked in DB (mcp_servers table)
|
|
8
|
+
* - MCP tools are loaded at runtime from connected servers (not stored in DB)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { getDb } from "../storage/sqlite";
|
|
12
|
+
import { logger } from "../utils/logger";
|
|
13
|
+
import { loadMcpHeaders } from "../storage/crypto";
|
|
14
|
+
import { syncMCPToolsToDB, syncMCPToolsToFTS, clearMCPToolsFromDB } from "./tool-sync";
|
|
15
|
+
import type { MCPClientManager } from "@johpaz/hive-agents-mcp";
|
|
16
|
+
|
|
17
|
+
const log = logger.child("mcp:hot-reload");
|
|
18
|
+
|
|
19
|
+
let _watchInterval: Timer | null = null;
|
|
20
|
+
let _lastKnownServers = new Set<string>();
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Start watching for MCP server changes
|
|
24
|
+
* Checks every 2 seconds for new/removed servers
|
|
25
|
+
*/
|
|
26
|
+
export function startMCPHotReload(mcpManager: MCPClientManager): void {
|
|
27
|
+
if (_watchInterval) {
|
|
28
|
+
log.warn("MCP Hot Reload already running");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
log.info("Starting MCP Hot Reload watcher (2s interval)");
|
|
33
|
+
|
|
34
|
+
// Initial sync - sync all currently connected servers
|
|
35
|
+
syncMCPServers(mcpManager).then(() => {
|
|
36
|
+
log.info("Initial MCP server sync complete");
|
|
37
|
+
}).catch(err => {
|
|
38
|
+
log.error(`Initial MCP server sync failed: ${err.message}`);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Watch for changes
|
|
42
|
+
_watchInterval = setInterval(() => {
|
|
43
|
+
syncMCPServers(mcpManager);
|
|
44
|
+
}, 2000);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Stop watching
|
|
49
|
+
*/
|
|
50
|
+
export function stopMCPHotReload(): void {
|
|
51
|
+
if (_watchInterval) {
|
|
52
|
+
clearInterval(_watchInterval);
|
|
53
|
+
_watchInterval = null;
|
|
54
|
+
log.info("MCP Hot Reload stopped");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Sync MCP servers from DB to MCP Manager
|
|
60
|
+
* Note: Only server status is tracked, tools are loaded at runtime
|
|
61
|
+
*/
|
|
62
|
+
async function syncMCPServers(mcpManager: MCPClientManager): Promise<void> {
|
|
63
|
+
try {
|
|
64
|
+
const db = getDb();
|
|
65
|
+
const dbServers = db.query(`SELECT * FROM mcp_servers WHERE enabled = 1`).all() as Record<string, any>[];
|
|
66
|
+
|
|
67
|
+
const currentServerNames = new Set(dbServers.map(s => s.id || s.name));
|
|
68
|
+
|
|
69
|
+
// Detect new servers
|
|
70
|
+
for (const server of dbServers) {
|
|
71
|
+
const serverName = server.id || server.name;
|
|
72
|
+
|
|
73
|
+
if (!_lastKnownServers.has(serverName)) {
|
|
74
|
+
log.info(`New MCP server detected: ${serverName} - connecting...`);
|
|
75
|
+
|
|
76
|
+
try {
|
|
77
|
+
const mcpServerConfig: any = {
|
|
78
|
+
transport: server.transport,
|
|
79
|
+
command: server.command,
|
|
80
|
+
args: server.args ? JSON.parse(server.args) : [],
|
|
81
|
+
url: server.url,
|
|
82
|
+
enabled: true,
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const mcpHeaders = await loadMcpHeaders(server.id || server.name);
|
|
86
|
+
if (Object.keys(mcpHeaders).length > 0) {
|
|
87
|
+
mcpServerConfig.headers = mcpHeaders;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Update MCP Manager config (auto-connects new servers)
|
|
91
|
+
const currentConfig = (mcpManager as any).config || { servers: {} };
|
|
92
|
+
await mcpManager.updateConfig({
|
|
93
|
+
...currentConfig,
|
|
94
|
+
servers: {
|
|
95
|
+
...currentConfig.servers,
|
|
96
|
+
[serverName]: mcpServerConfig,
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// Wait a bit for connection to establish
|
|
101
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
102
|
+
|
|
103
|
+
// Get tools count and update status
|
|
104
|
+
const tools = mcpManager.getServerTools(serverName) || [];
|
|
105
|
+
db.query(`UPDATE mcp_servers SET status = ?, tools_count = ? WHERE id = ?`).run("connected", tools.length, serverName);
|
|
106
|
+
|
|
107
|
+
// Persist MCP tool definitions to DB and FTS5
|
|
108
|
+
// Use server.name (human-readable) for mcpToolId consistency with context-compiler
|
|
109
|
+
syncMCPToolsToDB(server.id || server.name, server.name || serverName, tools);
|
|
110
|
+
await syncMCPToolsToFTS();
|
|
111
|
+
|
|
112
|
+
log.info(`MCP server ${serverName} connected: ${tools.length} tools available`);
|
|
113
|
+
} catch (err) {
|
|
114
|
+
log.error(`Failed to connect MCP server ${serverName}: ${(err as Error).message}`);
|
|
115
|
+
db.query(`UPDATE mcp_servers SET status = ? WHERE id = ?`).run("error", serverName);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Detect removed servers
|
|
121
|
+
for (const oldServerName of _lastKnownServers) {
|
|
122
|
+
if (!currentServerNames.has(oldServerName)) {
|
|
123
|
+
log.info(`MCP server removed: ${oldServerName} - disconnecting...`);
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
// Remove from MCP Manager
|
|
127
|
+
const currentConfig = (mcpManager as any).config || { servers: {} };
|
|
128
|
+
delete currentConfig.servers[oldServerName];
|
|
129
|
+
await mcpManager.updateConfig(currentConfig);
|
|
130
|
+
|
|
131
|
+
// Delete MCP tool definitions from DB and FTS5
|
|
132
|
+
clearMCPToolsFromDB(oldServerName);
|
|
133
|
+
|
|
134
|
+
// Update DB status
|
|
135
|
+
db.query(`UPDATE mcp_servers SET status = ?, tools_count = 0 WHERE id = ?`).run("disconnected", oldServerName);
|
|
136
|
+
|
|
137
|
+
log.info(`MCP server ${oldServerName} disconnected`);
|
|
138
|
+
} catch (err) {
|
|
139
|
+
log.error(`Failed to disconnect MCP server ${oldServerName}: ${(err as Error).message}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
_lastKnownServers = currentServerNames;
|
|
145
|
+
} catch (err) {
|
|
146
|
+
log.error(`MCP server sync failed: ${(err as Error).message}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Manager Singleton
|
|
3
|
+
*
|
|
4
|
+
* Provides global access to the MCP Manager instance
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { MCPClientManager } from "@johpaz/hive-agents-mcp";
|
|
8
|
+
|
|
9
|
+
let _mcpManager: MCPClientManager | null = null;
|
|
10
|
+
|
|
11
|
+
export function setMCPManager(m: MCPClientManager): void {
|
|
12
|
+
_mcpManager = m;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function getMCPManager(): MCPClientManager | null {
|
|
16
|
+
return _mcpManager;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function hasMCPManager(): boolean {
|
|
20
|
+
return _mcpManager !== null;
|
|
21
|
+
}
|