@johpaz/hive-agents 0.0.35 → 0.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -39
- package/dist/hive.js +3231 -3189
- package/dist/tool-worker.js +218406 -0
- 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 +138 -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 +502 -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,271 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from "fs"
|
|
2
|
+
import { join } from "path"
|
|
3
|
+
import { homedir } from "os"
|
|
4
|
+
import { installLlamaServer, downloadModel, listLocalModels, BIN_DIR, MODELS_DIR } from "../llm-local/downloader"
|
|
5
|
+
import { llamaManager, type ServerMode } from "../llm-local/manager"
|
|
6
|
+
import { getRecommendedModel } from "../llm-local/models"
|
|
7
|
+
import { detectGPU } from "../llm-local/detector"
|
|
8
|
+
// lmmManager se encarga de los procesos
|
|
9
|
+
|
|
10
|
+
// Datos de LLM en HIVE_HOME/llm/
|
|
11
|
+
const LLM_ROOT =
|
|
12
|
+
process.env.HIVE_LLM_ROOT ??
|
|
13
|
+
join(process.env.HIVE_HOME ?? join(homedir(), ".hive"), "llm-local")
|
|
14
|
+
|
|
15
|
+
const BIN_DIR_PATH = join(LLM_ROOT, "bin")
|
|
16
|
+
const MODELS_DIR_PATH = join(LLM_ROOT, "models")
|
|
17
|
+
|
|
18
|
+
let installing = false
|
|
19
|
+
let installLogs: string[] = []
|
|
20
|
+
let downloadingModelId: string | null = null
|
|
21
|
+
|
|
22
|
+
async function getInstalledStatus() {
|
|
23
|
+
const { LLAMA_CPP_DEFAULT_VER } = await import("../llm-local/detector")
|
|
24
|
+
const gpu = await detectGPU()
|
|
25
|
+
const ext = process.platform === "win32" ? ".exe" : ""
|
|
26
|
+
const binaryPath = join(BIN_DIR_PATH, `llama-${LLAMA_CPP_DEFAULT_VER}/llama-server${ext}`)
|
|
27
|
+
const binaryExists = existsSync(binaryPath)
|
|
28
|
+
const models = listLocalModels()
|
|
29
|
+
const anyModelExists = models.some(m => m.downloaded)
|
|
30
|
+
|
|
31
|
+
const activeServers = llamaManager.getStatus()
|
|
32
|
+
const running = activeServers.length > 0
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
gpu,
|
|
36
|
+
binaryExists,
|
|
37
|
+
anyModelExists,
|
|
38
|
+
installed: binaryExists && anyModelExists,
|
|
39
|
+
running,
|
|
40
|
+
activeServers,
|
|
41
|
+
models
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Ya no usamos isRunning con fetch directo aquí, sino vía manager
|
|
46
|
+
|
|
47
|
+
export async function handleGetLocalLLMStatus(
|
|
48
|
+
req: Request,
|
|
49
|
+
addCors: (r: Response, req: Request) => Response
|
|
50
|
+
): Promise<Response> {
|
|
51
|
+
const status = await getInstalledStatus()
|
|
52
|
+
return addCors(
|
|
53
|
+
Response.json({
|
|
54
|
+
...status,
|
|
55
|
+
installing,
|
|
56
|
+
downloadingModelId
|
|
57
|
+
}),
|
|
58
|
+
req
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export async function handleGetLocalLLMLogs(
|
|
63
|
+
req: Request,
|
|
64
|
+
addCors: (r: Response, req: Request) => Response
|
|
65
|
+
): Promise<Response> {
|
|
66
|
+
const mode = new URL(req.url).searchParams.get("mode") as ServerMode || "TEXT"
|
|
67
|
+
|
|
68
|
+
// Return an SSE stream instead of a normal JSON response
|
|
69
|
+
const stream = new ReadableStream({
|
|
70
|
+
start(controller) {
|
|
71
|
+
const sendEvent = (data: any) => {
|
|
72
|
+
controller.enqueue(new TextEncoder().encode(`data: ${JSON.stringify(data)}\n\n`))
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Send initial state
|
|
76
|
+
sendEvent({ logs: installLogs.slice(-100), serverLogs: llamaManager.getLogs(mode).slice(-100), llmRoot: LLM_ROOT })
|
|
77
|
+
|
|
78
|
+
// Create an interval to push new logs (or use EventEmitter if available)
|
|
79
|
+
let lastInstallLogCount = installLogs.length
|
|
80
|
+
let lastServerLogCount = llamaManager.getLogs(mode).length
|
|
81
|
+
|
|
82
|
+
const interval = setInterval(() => {
|
|
83
|
+
const currentInstallLogs = installLogs
|
|
84
|
+
const currentServerLogs = llamaManager.getLogs(mode)
|
|
85
|
+
|
|
86
|
+
let hasChanges = false
|
|
87
|
+
const payload: any = {}
|
|
88
|
+
|
|
89
|
+
if (currentInstallLogs.length > lastInstallLogCount) {
|
|
90
|
+
payload.logs = currentInstallLogs.slice(lastInstallLogCount)
|
|
91
|
+
lastInstallLogCount = currentInstallLogs.length
|
|
92
|
+
hasChanges = true
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (currentServerLogs.length > lastServerLogCount) {
|
|
96
|
+
payload.serverLogs = currentServerLogs.slice(lastServerLogCount)
|
|
97
|
+
lastServerLogCount = currentServerLogs.length
|
|
98
|
+
hasChanges = true
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (hasChanges) {
|
|
102
|
+
sendEvent(payload)
|
|
103
|
+
}
|
|
104
|
+
}, 500) // Push changes every 500ms
|
|
105
|
+
|
|
106
|
+
req.signal.addEventListener("abort", () => {
|
|
107
|
+
clearInterval(interval)
|
|
108
|
+
controller.close()
|
|
109
|
+
})
|
|
110
|
+
}
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
const response = new Response(stream, {
|
|
114
|
+
headers: {
|
|
115
|
+
"Content-Type": "text/event-stream",
|
|
116
|
+
"Cache-Control": "no-cache",
|
|
117
|
+
"Connection": "keep-alive"
|
|
118
|
+
}
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
return addCors(response, req)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export async function handleInstallLocalLLM(
|
|
125
|
+
req: Request,
|
|
126
|
+
addCors: (r: Response, req: Request) => Response
|
|
127
|
+
): Promise<Response> {
|
|
128
|
+
if (installing) {
|
|
129
|
+
return addCors(Response.json({ started: false, reason: "Ya hay una instalación en curso" }), req)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
installing = true
|
|
133
|
+
installLogs = [`[${new Date().toISOString()}] Iniciando configuración de Local LLM...`]
|
|
134
|
+
installLogs.push(` LLM_ROOT: ${LLM_ROOT}`)
|
|
135
|
+
|
|
136
|
+
// Background installation (solo binario, NO modelos)
|
|
137
|
+
;(async () => {
|
|
138
|
+
try {
|
|
139
|
+
installLogs.push("Detectando GPU...")
|
|
140
|
+
const gpu = await detectGPU()
|
|
141
|
+
installLogs.push(`GPU detectada: ${gpu.deviceName || 'CPU'} (${gpu.backend})`)
|
|
142
|
+
|
|
143
|
+
installLogs.push("Instalando llama-server oficial...")
|
|
144
|
+
await installLlamaServer()
|
|
145
|
+
installLogs.push(`[${new Date().toISOString()}] ✓ llama-server instalado`)
|
|
146
|
+
installLogs.push(`[${new Date().toISOString()}] Ahora descarga un modelo desde la sección de modelos para empezar a usar el LLM local.`)
|
|
147
|
+
} catch (err) {
|
|
148
|
+
const msg = err instanceof Error ? err.message : String(err)
|
|
149
|
+
installLogs.push(`[error] Falló la instalación: ${msg}`)
|
|
150
|
+
console.error(`[llm-local install] Error:`, err)
|
|
151
|
+
} finally {
|
|
152
|
+
installing = false
|
|
153
|
+
}
|
|
154
|
+
})()
|
|
155
|
+
|
|
156
|
+
return addCors(Response.json({ started: true }), req)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export async function handleDownloadLLMModel(
|
|
160
|
+
req: Request,
|
|
161
|
+
addCors: (r: Response, req: Request) => Response
|
|
162
|
+
): Promise<Response> {
|
|
163
|
+
let body: { modelId?: any }
|
|
164
|
+
try {
|
|
165
|
+
body = await req.json()
|
|
166
|
+
} catch {
|
|
167
|
+
return addCors(Response.json({ error: "Body JSON inválido" }, { status: 400 }), req)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const { modelId } = body
|
|
171
|
+
if (!modelId) {
|
|
172
|
+
return addCors(Response.json({ error: "modelId requerido" }, { status: 400 }), req)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (downloadingModelId) {
|
|
176
|
+
return addCors(Response.json({ error: "Ya hay una descarga en curso" }, { status: 409 }), req)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
downloadingModelId = modelId
|
|
180
|
+
installLogs.push(`[${new Date().toISOString()}] Iniciando descarga de modelo: ${modelId}`)
|
|
181
|
+
|
|
182
|
+
// Background download
|
|
183
|
+
;(async () => {
|
|
184
|
+
try {
|
|
185
|
+
await downloadModel(modelId, (d, t) => {
|
|
186
|
+
// Opcional: Podríamos emitir eventos por WS si quisiéramos progreso real en UI
|
|
187
|
+
})
|
|
188
|
+
installLogs.push(`✓ Modelo ${modelId} descargado exitosamente`)
|
|
189
|
+
} catch (err) {
|
|
190
|
+
const msg = err instanceof Error ? err.message : String(err)
|
|
191
|
+
installLogs.push(`[error] Error descargando ${modelId}: ${msg}`)
|
|
192
|
+
} finally {
|
|
193
|
+
downloadingModelId = null
|
|
194
|
+
}
|
|
195
|
+
})()
|
|
196
|
+
|
|
197
|
+
return addCors(Response.json({ started: true }), req)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export async function handleStartLocalLLM(
|
|
201
|
+
req: Request,
|
|
202
|
+
addCors: (r: Response, req: Request) => Response
|
|
203
|
+
): Promise<Response> {
|
|
204
|
+
let body: { mode?: ServerMode; modelId?: string } = {}
|
|
205
|
+
try {
|
|
206
|
+
body = await req.json()
|
|
207
|
+
} catch { /* ignore if no body */ }
|
|
208
|
+
|
|
209
|
+
const mode = body.mode || "TEXT"
|
|
210
|
+
const modelId = body.modelId || getRecommendedModel(mode.toLowerCase() as any)
|
|
211
|
+
|
|
212
|
+
const status = await getInstalledStatus()
|
|
213
|
+
if (!status.installed && !status.binaryExists) {
|
|
214
|
+
return addCors(
|
|
215
|
+
Response.json({ started: false, reason: "LLM no está instalado (binario faltante)." }, { status: 400 }),
|
|
216
|
+
req
|
|
217
|
+
)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
try {
|
|
221
|
+
installLogs.push(`[llm-server] Iniciando servidor en modo ${mode} con modelo ${modelId}...`)
|
|
222
|
+
await llamaManager.start(mode, modelId as any)
|
|
223
|
+
installLogs.push(`[llm-server] Servidor ${mode} iniciado correctamente.`)
|
|
224
|
+
return addCors(Response.json({ started: true, mode }), req)
|
|
225
|
+
} catch (err) {
|
|
226
|
+
const msg = err instanceof Error ? err.message : String(err)
|
|
227
|
+
installLogs.push(`[error] Servidor LLM falló al iniciar: ${msg}`)
|
|
228
|
+
return addCors(Response.json({ started: false, reason: msg }), req)
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export async function handleStopLocalLLM(
|
|
233
|
+
req: Request,
|
|
234
|
+
addCors: (r: Response, req: Request) => Response
|
|
235
|
+
): Promise<Response> {
|
|
236
|
+
let body: { mode?: ServerMode } = {}
|
|
237
|
+
try {
|
|
238
|
+
body = await req.json()
|
|
239
|
+
} catch { /* ignore */ }
|
|
240
|
+
|
|
241
|
+
if (body.mode) {
|
|
242
|
+
llamaManager.stop(body.mode)
|
|
243
|
+
} else {
|
|
244
|
+
llamaManager.stopAll()
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return addCors(Response.json({ stopped: true }), req)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Verifica el estado del LLM local al iniciar el gateway.
|
|
252
|
+
* NO auto-inicia el servidor ni descarga nada — el usuario debe hacerlo manualmente.
|
|
253
|
+
*/
|
|
254
|
+
export async function initializeLocalLLM() {
|
|
255
|
+
try {
|
|
256
|
+
const status = await getInstalledStatus()
|
|
257
|
+
if (status.binaryExists) {
|
|
258
|
+
console.log(`[llm-local] ✓ Binario llama-server encontrado.`)
|
|
259
|
+
if (status.anyModelExists) {
|
|
260
|
+
console.log(`[llm-local] ✓ Modelos disponibles: ${status.models.filter(m => m.downloaded).map(m => m.id).join(", ")}`)
|
|
261
|
+
console.log(`[llm-local] ℹ️ Servidor NO auto-iniciado. Usa la UI para iniciar cuando lo necesites.`)
|
|
262
|
+
} else {
|
|
263
|
+
console.log(`[llm-local] ⚠️ No hay modelos descargados. Descarga uno desde la UI.`)
|
|
264
|
+
}
|
|
265
|
+
} else {
|
|
266
|
+
console.log(`[llm-local] ℹ️ llama-server no instalado. Instálalo desde la UI si deseas usar LLM local.`)
|
|
267
|
+
}
|
|
268
|
+
} catch (err) {
|
|
269
|
+
console.error(`[llm-local] Error verificando estado: ${err instanceof Error ? err.message : String(err)}`)
|
|
270
|
+
}
|
|
271
|
+
}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { getDb } from "../../storage/sqlite.ts"
|
|
2
|
+
import { storeMcpHeaders, loadMcpHeaders, deleteMcpSecrets } from "../../storage/crypto.ts"
|
|
3
|
+
import { logger } from "../../utils/logger.ts"
|
|
4
|
+
|
|
5
|
+
const mcpLog = logger.child("mcp:api")
|
|
6
|
+
|
|
7
|
+
export async function handleGetMcpServers(
|
|
8
|
+
req: Request,
|
|
9
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
10
|
+
mcpManager?: any
|
|
11
|
+
): Promise<Response> {
|
|
12
|
+
const db = getDb()
|
|
13
|
+
|
|
14
|
+
// Get real-time server status from MCP manager
|
|
15
|
+
const mcpServers = new Map<string, { status: string; tools: any[] }>()
|
|
16
|
+
if (mcpManager) {
|
|
17
|
+
try {
|
|
18
|
+
const servers = mcpManager.listServers?.() || []
|
|
19
|
+
mcpLog.info(`[GET] MCP Manager returned ${servers.length} servers:`, servers.map((s: any) => `${s.name}:${s.status}`))
|
|
20
|
+
for (const s of servers) {
|
|
21
|
+
mcpServers.set(s.name, {
|
|
22
|
+
status: s.status,
|
|
23
|
+
tools: s.tools || [],
|
|
24
|
+
})
|
|
25
|
+
}
|
|
26
|
+
} catch (e) {
|
|
27
|
+
mcpLog.warn(`Failed to get MCP servers: ${(e as Error).message}`)
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
mcpLog.warn(`[GET] No MCP Manager provided`)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Get all servers from database
|
|
34
|
+
const dbServers = db.query(`
|
|
35
|
+
SELECT * FROM mcp_servers ORDER BY name
|
|
36
|
+
`).all() as Record<string, unknown>[]
|
|
37
|
+
|
|
38
|
+
// Combine DB info with real-time status from MCP manager
|
|
39
|
+
const allServers = await Promise.all(dbServers.map(async s => {
|
|
40
|
+
// Try to find matching server in MCP Manager (by name or normalized name)
|
|
41
|
+
const normalizedName = (s.name as string).toLowerCase().replace(/[^a-z0-9-]/g, '-')
|
|
42
|
+
const mcpServer = mcpServers.get(s.name as string) || mcpServers.get(normalizedName)
|
|
43
|
+
const isEnabled = s.enabled === 1
|
|
44
|
+
|
|
45
|
+
// Redact headers for safe UI display
|
|
46
|
+
const rawHeaders = await loadMcpHeaders(s.id as string)
|
|
47
|
+
const headers = Object.keys(rawHeaders).length > 0
|
|
48
|
+
? Object.fromEntries(
|
|
49
|
+
Object.entries(rawHeaders).map(([k, v]) => [
|
|
50
|
+
k,
|
|
51
|
+
k.toLowerCase().includes("auth") ||
|
|
52
|
+
k.toLowerCase().includes("token") ||
|
|
53
|
+
k.toLowerCase().includes("key")
|
|
54
|
+
? `${(v as string).slice(0, 4)}••••••••`
|
|
55
|
+
: v,
|
|
56
|
+
])
|
|
57
|
+
)
|
|
58
|
+
: undefined
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
id: s.id,
|
|
62
|
+
name: s.name,
|
|
63
|
+
enabled: isEnabled,
|
|
64
|
+
status: mcpServer?.status || (isEnabled ? "disconnected" : "disconnected"),
|
|
65
|
+
config: {
|
|
66
|
+
transport: s.transport,
|
|
67
|
+
command: s.command,
|
|
68
|
+
args: s.args ? JSON.parse(s.args as string) : [],
|
|
69
|
+
url: s.url,
|
|
70
|
+
headers,
|
|
71
|
+
enabled: isEnabled
|
|
72
|
+
},
|
|
73
|
+
tools_count: mcpServer?.tools.length || s.tools_count || 0,
|
|
74
|
+
tools: mcpServer?.tools || [],
|
|
75
|
+
}
|
|
76
|
+
}))
|
|
77
|
+
|
|
78
|
+
return addCorsHeaders(Response.json(allServers), req)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export async function handleCreateMcpServer(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
82
|
+
const body = await req.json().catch(() => ({}))
|
|
83
|
+
const db = getDb()
|
|
84
|
+
|
|
85
|
+
if (!body.name || !body.config) {
|
|
86
|
+
return addCorsHeaders(new Response("Missing name or config", { status: 400 }), req)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
mcpLog.info(`Creating MCP server: ${body.name}`)
|
|
90
|
+
|
|
91
|
+
// Generate unique ID (name-based for consistency)
|
|
92
|
+
const serverId = body.name.toLowerCase().replace(/[^a-z0-9-]/g, '-')
|
|
93
|
+
|
|
94
|
+
// Save to database
|
|
95
|
+
db.query(`
|
|
96
|
+
INSERT INTO mcp_servers(id, name, transport, command, args, url, enabled, builtin, status)
|
|
97
|
+
VALUES(?, ?, ?, ?, ?, ?, ?, 0, 'disconnected')
|
|
98
|
+
`).run(
|
|
99
|
+
serverId,
|
|
100
|
+
body.name,
|
|
101
|
+
body.config.transport || "stdio",
|
|
102
|
+
body.config.command || null,
|
|
103
|
+
body.config.args ? JSON.stringify(body.config.args) : null,
|
|
104
|
+
body.config.url || null,
|
|
105
|
+
body.config.enabled !== false ? 1 : 0
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
if (body.config.headers) {
|
|
109
|
+
await storeMcpHeaders(serverId, body.config.headers)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return addCorsHeaders(Response.json({ success: true, id: serverId }), req)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export async function handleDeleteMcpServer(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
116
|
+
const url = new URL(req.url)
|
|
117
|
+
// Extract server name from path: /api/mcp/servers/{name}
|
|
118
|
+
const parts = url.pathname.split("/").filter(Boolean)
|
|
119
|
+
const serverName = parts[parts.length - 1]
|
|
120
|
+
|
|
121
|
+
if (!serverName || serverName === "servers") {
|
|
122
|
+
return addCorsHeaders(Response.json({ success: false, error: "server name required" }), req)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Delete from DB and keychain
|
|
126
|
+
const row = getDb().query(`SELECT id FROM mcp_servers WHERE id = ? OR name = ?`).get(serverName, serverName) as { id: string } | undefined
|
|
127
|
+
getDb().query(`DELETE FROM mcp_servers WHERE id = ? OR name = ?`).run(serverName, serverName)
|
|
128
|
+
if (row?.id) await deleteMcpSecrets(row.id)
|
|
129
|
+
|
|
130
|
+
return addCorsHeaders(Response.json({ success: true }), req)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export async function handleGetMcpServerDetail(
|
|
134
|
+
req: Request,
|
|
135
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
136
|
+
serverId: string
|
|
137
|
+
): Promise<Response> {
|
|
138
|
+
const db = getDb()
|
|
139
|
+
const server = db.query(`SELECT * FROM mcp_servers WHERE id = ? OR name = ?`).get(serverId, serverId) as Record<string, unknown> | undefined
|
|
140
|
+
|
|
141
|
+
if (!server) {
|
|
142
|
+
return addCorsHeaders(new Response("Server not found", { status: 404 }), req)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Load headers — unredacted, for editing
|
|
146
|
+
const rawDetail = await loadMcpHeaders(server.id as string)
|
|
147
|
+
const headers = Object.keys(rawDetail).length > 0 ? rawDetail as Record<string, string> : undefined
|
|
148
|
+
|
|
149
|
+
return addCorsHeaders(Response.json({
|
|
150
|
+
id: server.id,
|
|
151
|
+
name: server.name,
|
|
152
|
+
transport: server.transport,
|
|
153
|
+
command: server.command ?? null,
|
|
154
|
+
args: server.args ? JSON.parse(server.args as string) : [],
|
|
155
|
+
url: server.url ?? null,
|
|
156
|
+
headers,
|
|
157
|
+
enabled: server.enabled === 1,
|
|
158
|
+
builtin: server.builtin === 1,
|
|
159
|
+
status: server.status,
|
|
160
|
+
tools_count: server.tools_count ?? 0,
|
|
161
|
+
}), req)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export async function handleUpdateMcpServer(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
165
|
+
const url = new URL(req.url)
|
|
166
|
+
// Extract server name from path: /api/mcp/servers/{name}
|
|
167
|
+
const parts = url.pathname.split("/").filter(Boolean)
|
|
168
|
+
const serverName = parts[parts.length - 1]
|
|
169
|
+
const body = await req.json().catch(() => ({}))
|
|
170
|
+
const db = getDb()
|
|
171
|
+
|
|
172
|
+
if (!serverName || serverName === "servers") {
|
|
173
|
+
return addCorsHeaders(new Response("Missing server name", { status: 400 }), req)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
mcpLog.info(`Updating MCP server: ${serverName}`)
|
|
177
|
+
|
|
178
|
+
const updates: string[] = []
|
|
179
|
+
const params: unknown[] = []
|
|
180
|
+
|
|
181
|
+
if (body.transport !== undefined) {
|
|
182
|
+
updates.push("transport = ?")
|
|
183
|
+
params.push(body.transport)
|
|
184
|
+
}
|
|
185
|
+
if (body.name !== undefined) {
|
|
186
|
+
updates.push("name = ?")
|
|
187
|
+
params.push(body.name)
|
|
188
|
+
}
|
|
189
|
+
if (body.command !== undefined) {
|
|
190
|
+
updates.push("command = ?")
|
|
191
|
+
params.push(body.command)
|
|
192
|
+
}
|
|
193
|
+
if (body.args !== undefined) {
|
|
194
|
+
updates.push("args = ?")
|
|
195
|
+
params.push(JSON.stringify(body.args))
|
|
196
|
+
}
|
|
197
|
+
if (body.url !== undefined) {
|
|
198
|
+
updates.push("url = ?")
|
|
199
|
+
params.push(body.url)
|
|
200
|
+
}
|
|
201
|
+
if (body.enabled !== undefined) {
|
|
202
|
+
updates.push("enabled = ?")
|
|
203
|
+
params.push(body.enabled ? 1 : 0)
|
|
204
|
+
}
|
|
205
|
+
if (updates.length > 0) {
|
|
206
|
+
params.push(serverName)
|
|
207
|
+
params.push(serverName)
|
|
208
|
+
db.query(`UPDATE mcp_servers SET ${updates.join(", ")} WHERE id = ? OR name = ?`).run(...params as any[])
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (body.headers) {
|
|
212
|
+
await storeMcpHeaders(serverName, body.headers)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return addCorsHeaders(Response.json({ success: true }), req)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export async function handleStartMcpServer(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
219
|
+
const url = new URL(req.url)
|
|
220
|
+
const serverId = url.pathname.split("/").pop()
|
|
221
|
+
|
|
222
|
+
if (!serverId) {
|
|
223
|
+
return addCorsHeaders(Response.json({ success: false, error: "serverId required" }), req)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
getDb().query(`UPDATE mcp_servers SET enabled = 1 WHERE id = ?`).run(serverId)
|
|
227
|
+
|
|
228
|
+
return addCorsHeaders(Response.json({ success: true, serverId, enabled: true }), req)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export async function handleGetMcpServerTools(
|
|
232
|
+
req: Request,
|
|
233
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
234
|
+
serverName: string,
|
|
235
|
+
mcpManager?: any
|
|
236
|
+
): Promise<Response> {
|
|
237
|
+
if (!mcpManager) {
|
|
238
|
+
return addCorsHeaders(Response.json([]), req)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const tools = mcpManager.getServerTools(serverName)
|
|
242
|
+
return addCorsHeaders(Response.json(tools), req)
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export async function handleToggleMcpServer(
|
|
246
|
+
req: Request,
|
|
247
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
248
|
+
mcpId: string
|
|
249
|
+
): Promise<Response> {
|
|
250
|
+
const body = await req.json().catch(() => ({}))
|
|
251
|
+
const { active } = body
|
|
252
|
+
|
|
253
|
+
if (active === undefined) {
|
|
254
|
+
return addCorsHeaders(Response.json({ success: false, error: "Missing active field", message: "Falta el campo 'active'" }, { status: 400 }), req)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
getDb().query(`UPDATE mcp_servers SET active = ?, enabled = ? WHERE id = ?`).run(active ? 1 : 0, active ? 1 : 0, mcpId)
|
|
258
|
+
|
|
259
|
+
return addCorsHeaders(Response.json({ success: true, active, message: active ? "Servidor MCP activado" : "Servidor MCP desactivado" }), req)
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export async function handleMcpServerAction(
|
|
263
|
+
req: Request,
|
|
264
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
265
|
+
serverName: string,
|
|
266
|
+
action: "connect" | "disconnect",
|
|
267
|
+
mcpManager?: any
|
|
268
|
+
): Promise<Response> {
|
|
269
|
+
if (!mcpManager) {
|
|
270
|
+
return addCorsHeaders(new Response("MCP is disabled", { status: 404 }), req)
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const db = getDb()
|
|
274
|
+
|
|
275
|
+
if (action === "connect") {
|
|
276
|
+
// Check if server exists and is enabled in DB
|
|
277
|
+
const dbServer = db.query(`SELECT * FROM mcp_servers WHERE name = ? AND enabled = 1`).get(serverName)
|
|
278
|
+
if (!dbServer) {
|
|
279
|
+
return new Response("Server not found or disabled", { status: 400 })
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
await mcpManager.connectServer(serverName)
|
|
283
|
+
|
|
284
|
+
// Update tools count after connection
|
|
285
|
+
const tools = mcpManager.getServerTools(serverName) || []
|
|
286
|
+
db.query(`UPDATE mcp_servers SET status = ?, tools_count = ? WHERE name = ?`).run("connected", tools.length, serverName)
|
|
287
|
+
|
|
288
|
+
return addCorsHeaders(Response.json({ success: true, tools_count: tools.length }), req)
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (action === "disconnect") {
|
|
292
|
+
await mcpManager.disconnectServer(serverName)
|
|
293
|
+
return addCorsHeaders(Response.json({ success: true }), req)
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
return addCorsHeaders(new Response("Invalid action", { status: 400 }), req)
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Get tools for a specific MCP server
|
|
301
|
+
* Note: Tools are loaded from MCP Manager at runtime, not from DB
|
|
302
|
+
*/
|
|
303
|
+
export async function handleGetMCPServerTools(
|
|
304
|
+
req: Request,
|
|
305
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
306
|
+
serverId: string,
|
|
307
|
+
mcpManager?: any
|
|
308
|
+
): Promise<Response> {
|
|
309
|
+
if (!mcpManager) {
|
|
310
|
+
return addCorsHeaders(new Response("MCP is disabled", { status: 404 }), req);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const tools = mcpManager.getServerTools(serverId) || [];
|
|
314
|
+
|
|
315
|
+
return addCorsHeaders(Response.json({ tools }), req);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// Note: handleToggleMCPTool and handleDeleteMCPTool removed
|
|
319
|
+
// MCP tools are not stored in DB - they are loaded at runtime from servers
|