@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,95 @@
|
|
|
1
|
+
import type { ServerWebSocket } from "bun";
|
|
2
|
+
|
|
3
|
+
export interface SessionId {
|
|
4
|
+
userId: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function parseSessionId(sessionId: string): SessionId | null {
|
|
8
|
+
if (!sessionId || sessionId.trim() === "") {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return { userId: sessionId };
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function formatSessionId(session: SessionId): string {
|
|
15
|
+
return session.userId;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface Session {
|
|
19
|
+
id: string;
|
|
20
|
+
parsed: SessionId;
|
|
21
|
+
createdAt: Date;
|
|
22
|
+
lastActivityAt: Date;
|
|
23
|
+
messageCount: number;
|
|
24
|
+
ws?: ServerWebSocket<unknown>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class SessionManager {
|
|
28
|
+
private sessions: Map<string, Session> = new Map();
|
|
29
|
+
|
|
30
|
+
create(sessionId: string, ws?: ServerWebSocket<unknown>): Session {
|
|
31
|
+
const parsed = parseSessionId(sessionId);
|
|
32
|
+
if (!parsed) {
|
|
33
|
+
throw new Error(`Invalid session ID: ${sessionId}`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const existing = this.sessions.get(sessionId);
|
|
37
|
+
if (existing) {
|
|
38
|
+
existing.lastActivityAt = new Date();
|
|
39
|
+
if (ws) {
|
|
40
|
+
existing.ws = ws;
|
|
41
|
+
}
|
|
42
|
+
return existing;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const session: Session = {
|
|
46
|
+
id: sessionId,
|
|
47
|
+
parsed,
|
|
48
|
+
createdAt: new Date(),
|
|
49
|
+
lastActivityAt: new Date(),
|
|
50
|
+
messageCount: 0,
|
|
51
|
+
};
|
|
52
|
+
if (ws !== undefined) {
|
|
53
|
+
session.ws = ws;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
this.sessions.set(sessionId, session);
|
|
57
|
+
return session;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
get(sessionId: string): Session | undefined {
|
|
61
|
+
return this.sessions.get(sessionId);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
touch(sessionId: string): void {
|
|
65
|
+
const session = this.sessions.get(sessionId);
|
|
66
|
+
if (session) {
|
|
67
|
+
session.lastActivityAt = new Date();
|
|
68
|
+
session.messageCount++;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
delete(sessionId: string): boolean {
|
|
73
|
+
return this.sessions.delete(sessionId);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
list(): Session[] {
|
|
77
|
+
return Array.from(this.sessions.values());
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
prune(maxAgeMs: number): number {
|
|
81
|
+
const now = Date.now();
|
|
82
|
+
let pruned = 0;
|
|
83
|
+
|
|
84
|
+
for (const [id, session] of this.sessions) {
|
|
85
|
+
if (now - session.lastActivityAt.getTime() > maxAgeMs) {
|
|
86
|
+
this.sessions.delete(id);
|
|
87
|
+
pruned++;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return pruned;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export const sessionManager = new SessionManager();
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import type { ServerWebSocket } from "bun";
|
|
2
|
+
import { sessionManager } from "./session.ts";
|
|
3
|
+
import { laneQueue } from "./lane-queue.ts";
|
|
4
|
+
import { logger } from "../utils/logger.ts";
|
|
5
|
+
|
|
6
|
+
export interface InboundMessage {
|
|
7
|
+
type: "message" | "command" | "ping" | "join" | "canvas_subscribe" | "canvas_unsubscribe" | "logs_subscribe" | "logs_unsubscribe" | "audio" | "canvas:interact" | "a2ui:action" | "stop";
|
|
8
|
+
sessionId: string;
|
|
9
|
+
content?: string;
|
|
10
|
+
audio?: string;
|
|
11
|
+
command?: string;
|
|
12
|
+
args?: string[];
|
|
13
|
+
metadata?: Record<string, unknown>;
|
|
14
|
+
componentId?: string;
|
|
15
|
+
data?: Record<string, unknown>;
|
|
16
|
+
action?: string;
|
|
17
|
+
image?: {
|
|
18
|
+
base64: string;
|
|
19
|
+
mimeType?: string;
|
|
20
|
+
caption?: string;
|
|
21
|
+
};
|
|
22
|
+
document?: {
|
|
23
|
+
base64: string;
|
|
24
|
+
mimeType?: string;
|
|
25
|
+
fileName?: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface OutboundMessage {
|
|
30
|
+
type: "message" | "stream" | "status" | "error" | "pong" | "command_result" | "joined" | "typing" | "audio" | "welcome" | "progress";
|
|
31
|
+
sessionId: string;
|
|
32
|
+
id?: string; // Message ID for streaming
|
|
33
|
+
content?: string;
|
|
34
|
+
chunk?: string;
|
|
35
|
+
isChunk?: boolean; // True if this is a streaming chunk
|
|
36
|
+
isLast?: boolean;
|
|
37
|
+
isTyping?: boolean;
|
|
38
|
+
isStep?: boolean;
|
|
39
|
+
stepType?: "plan" | "tool_call" | "tool_result" | "text";
|
|
40
|
+
status?: {
|
|
41
|
+
state: string;
|
|
42
|
+
model?: string;
|
|
43
|
+
tokens?: number;
|
|
44
|
+
};
|
|
45
|
+
error?: string;
|
|
46
|
+
result?: unknown;
|
|
47
|
+
audio?: string; // Base64 encoded audio
|
|
48
|
+
mimeType?: string; // Audio MIME type
|
|
49
|
+
// Welcome message fields
|
|
50
|
+
user?: {
|
|
51
|
+
id: string;
|
|
52
|
+
name: string;
|
|
53
|
+
language: string;
|
|
54
|
+
} | null;
|
|
55
|
+
agent?: {
|
|
56
|
+
id: string;
|
|
57
|
+
name: string;
|
|
58
|
+
provider: string;
|
|
59
|
+
model: string;
|
|
60
|
+
} | null;
|
|
61
|
+
channels?: string[];
|
|
62
|
+
voice?: {
|
|
63
|
+
enabled: boolean;
|
|
64
|
+
sttProvider: string | null;
|
|
65
|
+
ttsProvider: string | null;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface SlashCommand {
|
|
70
|
+
name: string;
|
|
71
|
+
description: string;
|
|
72
|
+
handler: (sessionId: string, args: string[], ws: ServerWebSocket<unknown>) => Promise<unknown>;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const slashCommands = new Map<string, SlashCommand>();
|
|
76
|
+
|
|
77
|
+
export function registerSlashCommand(command: SlashCommand): void {
|
|
78
|
+
slashCommands.set(command.name, command);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function isSlashCommand(content: string): boolean {
|
|
82
|
+
return content.startsWith("/") && content.length > 1;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function parseSlashCommand(content: string): { name: string; args: string[] } | null {
|
|
86
|
+
if (!isSlashCommand(content)) return null;
|
|
87
|
+
|
|
88
|
+
const parts = content.slice(1).split(/\s+/);
|
|
89
|
+
const name = parts[0]?.toLowerCase();
|
|
90
|
+
if (!name) return null;
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
name,
|
|
94
|
+
args: parts.slice(1),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export async function executeSlashCommand(
|
|
99
|
+
sessionId: string,
|
|
100
|
+
content: string,
|
|
101
|
+
ws: ServerWebSocket<unknown>
|
|
102
|
+
): Promise<OutboundMessage | null> {
|
|
103
|
+
const parsed = parseSlashCommand(content);
|
|
104
|
+
if (!parsed) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const command = slashCommands.get(parsed.name);
|
|
109
|
+
if (!command) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
logger.info(`Executing slash command: /${parsed.name}`, { sessionId, args: parsed.args });
|
|
114
|
+
|
|
115
|
+
try {
|
|
116
|
+
const result = await command.handler(sessionId, parsed.args, ws);
|
|
117
|
+
return {
|
|
118
|
+
type: "command_result",
|
|
119
|
+
sessionId,
|
|
120
|
+
result,
|
|
121
|
+
};
|
|
122
|
+
} catch (error) {
|
|
123
|
+
logger.error(`Slash command failed: /${parsed.name}`, { error: (error as Error).message });
|
|
124
|
+
return {
|
|
125
|
+
type: "error",
|
|
126
|
+
sessionId,
|
|
127
|
+
error: (error as Error).message,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
registerSlashCommand({
|
|
133
|
+
name: "stop",
|
|
134
|
+
description: "Stop the current task",
|
|
135
|
+
handler: async (sessionId) => {
|
|
136
|
+
const cancelled = laneQueue.cancel(sessionId);
|
|
137
|
+
return {
|
|
138
|
+
success: cancelled,
|
|
139
|
+
message: cancelled ? "Task stopped" : "No task running",
|
|
140
|
+
};
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
registerSlashCommand({
|
|
145
|
+
name: "status",
|
|
146
|
+
description: "Show session status",
|
|
147
|
+
handler: async (sessionId) => {
|
|
148
|
+
const session = sessionManager.get(sessionId);
|
|
149
|
+
const queueStatus = laneQueue.getStatus(sessionId);
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
sessionId,
|
|
153
|
+
createdAt: session?.createdAt,
|
|
154
|
+
messageCount: session?.messageCount,
|
|
155
|
+
queueLength: queueStatus.queueLength,
|
|
156
|
+
isProcessing: queueStatus.running !== undefined,
|
|
157
|
+
};
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
registerSlashCommand({
|
|
162
|
+
name: "new",
|
|
163
|
+
description: "Start a new session",
|
|
164
|
+
handler: async (sessionId) => {
|
|
165
|
+
sessionManager.delete(sessionId);
|
|
166
|
+
return { success: true, message: "Session reset" };
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
registerSlashCommand({
|
|
171
|
+
name: "compact",
|
|
172
|
+
description: "Force context compaction",
|
|
173
|
+
handler: async (sessionId) => {
|
|
174
|
+
logger.info(`Compaction requested for session: ${sessionId}`);
|
|
175
|
+
return { success: true, message: "Compaction triggered" };
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
registerSlashCommand({
|
|
180
|
+
name: "reset",
|
|
181
|
+
description: "Reset the current context",
|
|
182
|
+
handler: async (sessionId) => {
|
|
183
|
+
logger.info(`Context reset requested for session: ${sessionId}`);
|
|
184
|
+
return { success: true, message: "Context reset" };
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
registerSlashCommand({
|
|
189
|
+
name: "model",
|
|
190
|
+
description: "Switch model for this session",
|
|
191
|
+
handler: async (_sessionId, args) => {
|
|
192
|
+
const modelName = args[0];
|
|
193
|
+
if (!modelName) {
|
|
194
|
+
return { success: false, message: "Usage: /model <model-name>" };
|
|
195
|
+
}
|
|
196
|
+
return { success: true, message: `Model switched to: ${modelName}` };
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
registerSlashCommand({
|
|
201
|
+
name: "help",
|
|
202
|
+
description: "Show available commands",
|
|
203
|
+
handler: async () => {
|
|
204
|
+
const commands = Array.from(slashCommands.values()).map((c) => `/${c.name} - ${c.description}`);
|
|
205
|
+
return { commands };
|
|
206
|
+
},
|
|
207
|
+
});
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# @johpaz/hive-tts
|
|
2
|
+
|
|
3
|
+
Síntesis de voz **local y offline** para Hive, basada en [Piper TTS](https://github.com/rhasspy/piper).
|
|
4
|
+
|
|
5
|
+
## ¿Cuándo usarlo?
|
|
6
|
+
|
|
7
|
+
Este paquete es un **fallback opcional**. Hive usa primero los providers de voz configurados (ElevenLabs, OpenAI TTS, etc.). Este módulo se activa cuando:
|
|
8
|
+
|
|
9
|
+
- No hay conexión a internet
|
|
10
|
+
- No hay providers de voz configurados
|
|
11
|
+
- El usuario prefiere procesamiento 100% local y privado
|
|
12
|
+
- `packages/hivelearn` necesita generar archivos de audio narrados en el servidor (descargables, pre-generados para canales no-browser como Telegram/Discord)
|
|
13
|
+
|
|
14
|
+
> **Nota:** En el browser, `packages/hivelearn` usa Web Speech API para reproducción interactiva. Este paquete es el complemento **server-side** para generación de archivos WAV.
|
|
15
|
+
|
|
16
|
+
## Instalación
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
bun add @johpaz/hive-tts
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
El postinstall descarga automáticamente:
|
|
23
|
+
- Binario de Piper (~8MB) para tu plataforma (Linux/Windows/macOS)
|
|
24
|
+
- Modelo de voz español `es_ES-sharvard-medium` (~60MB)
|
|
25
|
+
|
|
26
|
+
Solo se descarga una vez. Si falla por falta de internet, reintenta con:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
bun run packages/tts/src/install.ts
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Uso
|
|
33
|
+
|
|
34
|
+
### Iniciar el servidor TTS
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
bun run packages/tts/src/server.ts
|
|
38
|
+
# Puerto custom:
|
|
39
|
+
TTS_PORT=5501 bun run packages/tts/src/server.ts
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Desde packages/hivelearn
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
import { isTTSAvailable, synthesizeToFile } from "@johpaz/hive-tts/client"
|
|
46
|
+
|
|
47
|
+
if (await isTTSAvailable()) {
|
|
48
|
+
await synthesizeToFile(
|
|
49
|
+
"Bienvenido al módulo de álgebra lineal.",
|
|
50
|
+
"./lessons/intro.wav"
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### API HTTP directa
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# Health check
|
|
59
|
+
curl http://localhost:5500/health
|
|
60
|
+
|
|
61
|
+
# Generar audio
|
|
62
|
+
curl -X POST http://localhost:5500/tts \
|
|
63
|
+
-H "Content-Type: application/json" \
|
|
64
|
+
-d '{"text": "Hive está procesando tu solicitud."}' \
|
|
65
|
+
--output audio.wav
|
|
66
|
+
|
|
67
|
+
# Reproducir (Linux)
|
|
68
|
+
aplay audio.wav
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Variables de entorno
|
|
72
|
+
|
|
73
|
+
| Variable | Default | Descripción |
|
|
74
|
+
|------------|-------------------------|--------------------------|
|
|
75
|
+
| `TTS_PORT` | `5500` | Puerto del servidor HTTP |
|
|
76
|
+
| `TTS_VOICE`| `es_ES-sharvard-medium` | Voz por defecto |
|
|
77
|
+
| `TTS_URL` | `http://localhost:5500` | URL para el cliente |
|
|
78
|
+
|
|
79
|
+
## Plataformas soportadas
|
|
80
|
+
|
|
81
|
+
| Plataforma | Arquitectura | Estado |
|
|
82
|
+
|------------|-------------|-------------|
|
|
83
|
+
| Linux | x64 | ✅ Testeado |
|
|
84
|
+
| Linux | arm64 | ✅ Soportado |
|
|
85
|
+
| Windows | x64 | ✅ Soportado |
|
|
86
|
+
| macOS | x64 (Intel) | ✅ Soportado |
|
|
87
|
+
| macOS | arm64 (M*) | ✅ Soportado |
|
|
88
|
+
|
|
89
|
+
## Voces adicionales
|
|
90
|
+
|
|
91
|
+
Para instalar más voces, descargar manualmente desde:
|
|
92
|
+
https://huggingface.co/rhasspy/piper-voices
|
|
93
|
+
|
|
94
|
+
Colocar los archivos `.onnx` y `.onnx.json` en `packages/tts/voices/`.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@johpaz/hive-tts",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Offline local TTS for Hive — Piper-based fallback when no internet providers available",
|
|
5
|
+
"module": "src/index.ts",
|
|
6
|
+
"main": "src/index.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./src/index.ts",
|
|
10
|
+
"./client": "./src/client.ts",
|
|
11
|
+
"./server": "./src/server.ts",
|
|
12
|
+
"./models": "./src/models.ts"
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"postinstall": "bun run src/install.ts",
|
|
16
|
+
"start": "bun run src/server.ts",
|
|
17
|
+
"dev": "bun --watch src/server.ts"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"typescript": "^5.0.0"
|
|
22
|
+
},
|
|
23
|
+
"keywords": ["hive", "tts", "offline", "piper", "voice", "spanish"],
|
|
24
|
+
"license": "MIT"
|
|
25
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hive TTS Client
|
|
3
|
+
* No bloqueante: si TTS no está disponible, las funciones retornan null silenciosamente.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const TTS_URL = process.env.TTS_URL ?? "http://localhost:5500"
|
|
7
|
+
|
|
8
|
+
export async function isTTSAvailable(): Promise<boolean> {
|
|
9
|
+
try {
|
|
10
|
+
const res = await fetch(`${TTS_URL}/health`, {
|
|
11
|
+
signal: AbortSignal.timeout(500),
|
|
12
|
+
})
|
|
13
|
+
return res.ok
|
|
14
|
+
} catch {
|
|
15
|
+
return false
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function synthesize(
|
|
20
|
+
text: string,
|
|
21
|
+
voice?: string
|
|
22
|
+
): Promise<ArrayBuffer | null> {
|
|
23
|
+
try {
|
|
24
|
+
const res = await fetch(`${TTS_URL}/tts`, {
|
|
25
|
+
method: "POST",
|
|
26
|
+
headers: { "Content-Type": "application/json" },
|
|
27
|
+
body: JSON.stringify({ text, voice }),
|
|
28
|
+
signal: AbortSignal.timeout(10_000),
|
|
29
|
+
})
|
|
30
|
+
if (!res.ok) return null
|
|
31
|
+
return res.arrayBuffer()
|
|
32
|
+
} catch {
|
|
33
|
+
return null
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export async function synthesizeToFile(
|
|
38
|
+
text: string,
|
|
39
|
+
outputPath: string,
|
|
40
|
+
voice?: string
|
|
41
|
+
): Promise<boolean> {
|
|
42
|
+
const audio = await synthesize(text, voice)
|
|
43
|
+
if (!audio) return false
|
|
44
|
+
await Bun.write(outputPath, audio)
|
|
45
|
+
return true
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export async function listVoices(): Promise<string[]> {
|
|
49
|
+
try {
|
|
50
|
+
const res = await fetch(`${TTS_URL}/voices`, {
|
|
51
|
+
signal: AbortSignal.timeout(500),
|
|
52
|
+
})
|
|
53
|
+
if (!res.ok) return []
|
|
54
|
+
const data = await res.json()
|
|
55
|
+
return data.voices ?? []
|
|
56
|
+
} catch {
|
|
57
|
+
return []
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export type Platform =
|
|
2
|
+
| "linux-x64"
|
|
3
|
+
| "linux-arm64"
|
|
4
|
+
| "windows-x64"
|
|
5
|
+
| "macos-x64"
|
|
6
|
+
| "macos-arm64"
|
|
7
|
+
|
|
8
|
+
export function detectPlatform(): Platform {
|
|
9
|
+
const os = process.platform
|
|
10
|
+
const arch = process.arch
|
|
11
|
+
|
|
12
|
+
if (os === "linux" && arch === "x64") return "linux-x64"
|
|
13
|
+
if (os === "linux" && arch === "arm64") return "linux-arm64"
|
|
14
|
+
if (os === "win32" && arch === "x64") return "windows-x64"
|
|
15
|
+
if (os === "darwin" && arch === "x64") return "macos-x64"
|
|
16
|
+
if (os === "darwin" && arch === "arm64") return "macos-arm64"
|
|
17
|
+
|
|
18
|
+
throw new Error(`Plataforma no soportada: ${os}/${arch}`)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const PIPER_VERSION = "2023.11.14-2"
|
|
22
|
+
const PIPER_BASE_URL = `https://github.com/rhasspy/piper/releases/download/${PIPER_VERSION}`
|
|
23
|
+
|
|
24
|
+
export const PIPER_URLS: Record<Platform, string> = {
|
|
25
|
+
"linux-x64": `${PIPER_BASE_URL}/piper_linux_x86_64.tar.gz`,
|
|
26
|
+
"linux-arm64": `${PIPER_BASE_URL}/piper_linux_aarch64.tar.gz`,
|
|
27
|
+
"windows-x64": `${PIPER_BASE_URL}/piper_windows_amd64.zip`,
|
|
28
|
+
"macos-x64": `${PIPER_BASE_URL}/piper_macos_x86_64.tar.gz`,
|
|
29
|
+
"macos-arm64": `${PIPER_BASE_URL}/piper_macos_aarch64.tar.gz`,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function getPiperBinaryName(platform: Platform): string {
|
|
33
|
+
return platform.startsWith("windows") ? "piper.exe" : "piper"
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const DEFAULT_VOICE = "es_MX-claude-14947-epoch-high"
|
|
37
|
+
export const VOICE_BASE_URL =
|
|
38
|
+
"https://huggingface.co/spaces/HirCoir/Piper-TTS-Spanish"
|
|
39
|
+
export const VOICE_URLS = {
|
|
40
|
+
model: `${VOICE_BASE_URL}/resolve/main/es_MX-claude-14947-epoch-high.onnx`,
|
|
41
|
+
config: `${VOICE_BASE_URL}/resolve/main/es_MX-claude-14947-epoch-high.onnx.json`,
|
|
42
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @johpaz/hive-tts
|
|
3
|
+
*
|
|
4
|
+
* Paquete standalone opcional para síntesis de voz offline en Hive.
|
|
5
|
+
* Fallback local cuando no hay internet o no hay providers configurados.
|
|
6
|
+
*
|
|
7
|
+
* Iniciar servidor:
|
|
8
|
+
* bun run packages/core/src/gateway/tts/src/server.ts
|
|
9
|
+
*
|
|
10
|
+
* Uso:
|
|
11
|
+
* import { isTTSAvailable, synthesize } from "@johpaz/hive-tts/client"
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export * from "./client.js"
|
|
15
|
+
export { detectPlatform } from "./detect.js"
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Hive TTS — instalador de Piper
|
|
4
|
+
* Los datos se guardan en $HIVE_HOME/tts/ (por defecto ~/.hive/tts/).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { existsSync, mkdirSync, readdirSync, renameSync } from "fs"
|
|
8
|
+
import { join } from "path"
|
|
9
|
+
import { homedir } from "os"
|
|
10
|
+
import {
|
|
11
|
+
detectPlatform,
|
|
12
|
+
PIPER_URLS,
|
|
13
|
+
VOICE_URLS,
|
|
14
|
+
getPiperBinaryName,
|
|
15
|
+
DEFAULT_VOICE,
|
|
16
|
+
} from "./detect.js"
|
|
17
|
+
|
|
18
|
+
const log = {
|
|
19
|
+
info: (msg: string) => console.log(`[TTS] ${msg}`),
|
|
20
|
+
warn: (msg: string) => console.warn(`[TTS] ${msg}`),
|
|
21
|
+
error: (msg: string) => console.error(`[TTS] ${msg}`),
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async function downloadFile(url: string, dest: string): Promise<void> {
|
|
25
|
+
const filename = url.split("/").pop()!
|
|
26
|
+
log.info(`Descargando ${filename}...`)
|
|
27
|
+
const res = await fetch(url)
|
|
28
|
+
if (!res.ok) throw new Error(`HTTP ${res.status} al descargar ${url}`)
|
|
29
|
+
const buf = await res.arrayBuffer()
|
|
30
|
+
await Bun.write(dest, buf)
|
|
31
|
+
log.info(`${filename} — ${(buf.byteLength / 1024 / 1024).toFixed(1)} MB`)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function extractTarGz(archivePath: string, destDir: string): Promise<void> {
|
|
35
|
+
const code = await Bun.spawn(["tar", "-xzf", archivePath, "-C", destDir], {
|
|
36
|
+
stdout: "inherit",
|
|
37
|
+
stderr: "inherit",
|
|
38
|
+
}).exited
|
|
39
|
+
if (code !== 0) throw new Error(`tar falló con código ${code}`)
|
|
40
|
+
await Bun.spawn(["rm", "-f", archivePath]).exited
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function extractZip(archivePath: string, destDir: string): Promise<void> {
|
|
44
|
+
const code = await Bun.spawn(["unzip", "-q", archivePath, "-d", destDir], {
|
|
45
|
+
stdout: "inherit",
|
|
46
|
+
stderr: "inherit",
|
|
47
|
+
}).exited
|
|
48
|
+
if (code !== 0) throw new Error(`unzip falló con código ${code}`)
|
|
49
|
+
await Bun.spawn(["rm", "-f", archivePath]).exited
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Instala Piper TTS en el directorio indicado.
|
|
54
|
+
* Exportado para llamarse inline desde el gateway sin necesidad de un script externo.
|
|
55
|
+
*/
|
|
56
|
+
export async function runInstall(ttsRoot: string): Promise<void> {
|
|
57
|
+
const BIN_DIR = join(ttsRoot, "bin")
|
|
58
|
+
const VOICES_DIR = join(ttsRoot, "voices")
|
|
59
|
+
|
|
60
|
+
mkdirSync(BIN_DIR, { recursive: true })
|
|
61
|
+
mkdirSync(VOICES_DIR, { recursive: true })
|
|
62
|
+
|
|
63
|
+
// ── Piper binary ──────────────────────────────────────────────────────────
|
|
64
|
+
const platform = detectPlatform()
|
|
65
|
+
const binaryName = getPiperBinaryName(platform)
|
|
66
|
+
const binaryPath = join(BIN_DIR, binaryName)
|
|
67
|
+
|
|
68
|
+
if (!existsSync(binaryPath)) {
|
|
69
|
+
const url = PIPER_URLS[platform]
|
|
70
|
+
const archiveExt = url.endsWith(".zip") ? ".zip" : ".tar.gz"
|
|
71
|
+
const archivePath = join(BIN_DIR, `piper${archiveExt}`)
|
|
72
|
+
|
|
73
|
+
log.info(`Instalando Piper para ${platform}...`)
|
|
74
|
+
await downloadFile(url, archivePath)
|
|
75
|
+
log.info("Extrayendo...")
|
|
76
|
+
if (archiveExt === ".zip") {
|
|
77
|
+
await extractZip(archivePath, BIN_DIR)
|
|
78
|
+
} else {
|
|
79
|
+
await extractTarGz(archivePath, BIN_DIR)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const piperSubdir = join(BIN_DIR, "piper")
|
|
83
|
+
if (existsSync(piperSubdir)) {
|
|
84
|
+
const tempDir = join(BIN_DIR, "_piper_tmp")
|
|
85
|
+
renameSync(piperSubdir, tempDir)
|
|
86
|
+
for (const entry of readdirSync(tempDir)) {
|
|
87
|
+
renameSync(join(tempDir, entry), join(BIN_DIR, entry))
|
|
88
|
+
}
|
|
89
|
+
await Bun.spawn(["rm", "-rf", tempDir]).exited
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (!existsSync(binaryPath)) {
|
|
93
|
+
throw new Error(`Binario no encontrado tras extracción: ${binaryPath}`)
|
|
94
|
+
}
|
|
95
|
+
if (!platform.startsWith("windows")) {
|
|
96
|
+
await Bun.spawn(["chmod", "+x", binaryPath]).exited
|
|
97
|
+
}
|
|
98
|
+
log.info(`Piper instalado en ${BIN_DIR}`)
|
|
99
|
+
} else {
|
|
100
|
+
log.info("Piper ya instalado, omitiendo descarga.")
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ── Voice model ───────────────────────────────────────────────────────────
|
|
104
|
+
const modelPath = join(VOICES_DIR, `${DEFAULT_VOICE}.onnx`)
|
|
105
|
+
const configPath = join(VOICES_DIR, `${DEFAULT_VOICE}.onnx.json`)
|
|
106
|
+
|
|
107
|
+
if (!existsSync(modelPath) || !existsSync(configPath)) {
|
|
108
|
+
log.info(`Descargando modelo de voz ${DEFAULT_VOICE}...`)
|
|
109
|
+
await downloadFile(VOICE_URLS.model, modelPath)
|
|
110
|
+
await downloadFile(VOICE_URLS.config, configPath)
|
|
111
|
+
log.info(`Voz instalada en ${VOICES_DIR}`)
|
|
112
|
+
} else {
|
|
113
|
+
log.info("Modelo de voz ya instalado, omitiendo descarga.")
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
log.info("Hive TTS listo.")
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Ejecución directa: bun run src/install.ts
|
|
120
|
+
// @ts-ignore
|
|
121
|
+
if (import.meta.main) {
|
|
122
|
+
const ttsRoot =
|
|
123
|
+
process.env.HIVE_TTS_ROOT ??
|
|
124
|
+
join(process.env.HIVE_HOME ?? join(homedir(), ".hive"), "tts")
|
|
125
|
+
runInstall(ttsRoot).catch((err) => {
|
|
126
|
+
log.error(`Hive TTS no pudo instalarse: ${err instanceof Error ? err.message : err}`)
|
|
127
|
+
process.exit(1)
|
|
128
|
+
})
|
|
129
|
+
}
|