@johpaz/hive-agents 0.0.34 → 0.0.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -39
- package/dist/hive.js +4539 -4586
- package/dist/ui/assets/AgentCreateForm-tJZv9FZC.js +1 -0
- package/dist/ui/assets/AgentDetailPage-Du-mRcAX.js +1 -0
- package/dist/ui/assets/AgentNewPage-DIFYd_Ys.js +1 -0
- package/dist/ui/assets/{AgentsPage-DhCjvDNa.js → AgentsPage-YvSgWRiw.js} +7 -7
- package/dist/ui/assets/CanvasPage-DtMwGvxf.js +33 -0
- package/dist/ui/assets/ChannelsPage-BdBXWHjj.js +8 -0
- package/dist/ui/assets/DashboardPage-ghl1ZguH.js +6 -0
- package/dist/ui/assets/{LoginPage-B30OrEBy.js → LoginPage-CAmSI9Vy.js} +1 -1
- package/dist/ui/assets/LogsPage-DAPBHkwK.js +1 -0
- package/dist/ui/assets/MeetingPage-WjjGOqqU.js +1 -0
- package/dist/ui/assets/{NotFound-HD1Yp9yK.js → NotFound-BMeQSGcG.js} +1 -1
- package/dist/ui/assets/ProvidersPage-Ct6HsAi1.js +1 -0
- package/dist/ui/assets/{RecoverPage-CLF6buGP.js → RecoverPage-DpW3l-yv.js} +1 -1
- package/dist/ui/assets/SettingsPage-DBJ7_E6C.js +9 -0
- package/dist/ui/assets/SetupPage-DKmLVUaj.js +1 -0
- package/dist/ui/assets/{WebChatPage-Um3VANzn.js → WebChatPage-CVRcKept.js} +2 -2
- package/dist/ui/assets/accordion-C5d5Rm5z.js +1 -0
- package/dist/ui/assets/{activity-SfJ6UDF2.js → activity-c3pNngT_.js} +1 -1
- package/dist/ui/assets/alert-C-NE-P3s.js +1 -0
- package/dist/ui/assets/{alert-dialog-M893TdvF.js → alert-dialog-C5mzbHdP.js} +1 -1
- package/dist/ui/assets/arrow-left-CBcbX5EZ.js +1 -0
- package/dist/ui/assets/badge-ChpACfWO.js +1 -0
- package/dist/ui/assets/{calendar-CMMeWsP-.js → calendar-B-KZ9RQO.js} +1 -1
- package/dist/ui/assets/{card-C7P3W6_y.js → card-CNf6BS2e.js} +1 -1
- package/dist/ui/assets/chevron-left-D4U-5A27.js +1 -0
- package/dist/ui/assets/chevron-right-CR4Skrf3.js +1 -0
- package/dist/ui/assets/chevron-up-BYhk0K2J.js +1 -0
- package/dist/ui/assets/{circle-alert-7koABcbO.js → circle-alert-CyHDwUj8.js} +1 -1
- package/dist/ui/assets/circle-check-Bb54Ebmu.js +1 -0
- package/dist/ui/assets/{cpu-mBJgRJzM.js → cpu-Cdgc_B1K.js} +1 -1
- package/dist/ui/assets/dialog-QnZ0ad8O.js +1 -0
- package/dist/ui/assets/{download-oaofq4K1.js → download-C3ifGMjJ.js} +1 -1
- package/dist/ui/assets/dropdown-menu-BK-CO3Od.js +1 -0
- package/dist/ui/assets/{es-eUrU2hyB.js → es-NQNoaWDx.js} +1 -1
- package/dist/ui/assets/{external-link-SkkF2Z7B.js → external-link-BvxYeTP1.js} +1 -1
- package/dist/ui/assets/{eye-B8lq7sWG.js → eye-DqNTU_GD.js} +1 -1
- package/dist/ui/assets/{file-text-0oYol8Bb.js → file-text-BT_9S9SM.js} +1 -1
- package/dist/ui/assets/{folder-open-DVYu2lgk.js → folder-open-BhH8y9ac.js} +1 -1
- package/dist/ui/assets/gauge-D_TMa4i9.js +1 -0
- package/dist/ui/assets/{globe-BVPd5DRa.js → globe-DeCQTCDJ.js} +1 -1
- package/dist/ui/assets/{hexagon-BIAFUAlQ.js → hexagon-DsGOUl-H.js} +1 -1
- package/dist/ui/assets/{history-BUAnaMQo.js → history-BSG-Ypqf.js} +1 -1
- package/dist/ui/assets/index-B2fCYtTS.css +2 -0
- package/dist/ui/assets/index-DMCjjdqf.js +116 -0
- package/dist/ui/assets/{info-DWioleen.js → info-NwLoa2Mj.js} +1 -1
- package/dist/ui/assets/{key-BCGwSKKc.js → key-3EP0dhkT.js} +1 -1
- package/dist/ui/assets/label-D2H1IR_J.js +1 -0
- package/dist/ui/assets/loader-circle-CZNax6kS.js +1 -0
- package/dist/ui/assets/{lock-D7PCO7GC.js → lock-Ei1_J-Nq.js} +1 -1
- package/dist/ui/assets/{pause-CI1JFH6r.js → pause-BUqah9Bi.js} +1 -1
- package/dist/ui/assets/play-NcZ4swwL.js +1 -0
- package/dist/ui/assets/plus-CX1xyhp5.js +1 -0
- package/dist/ui/assets/progress-BherYzY6.js +1 -0
- package/dist/ui/assets/{refresh-cw-BLmKlO4J.js → refresh-cw-DaYdjQFk.js} +1 -1
- package/dist/ui/assets/{save-M1nv6H3P.js → save-CUdYyHNy.js} +1 -1
- package/dist/ui/assets/scroll-area-DkeyX32e.js +1 -0
- package/dist/ui/assets/{send-ijRfR0gp.js → send-B0H5SEIE.js} +1 -1
- package/dist/ui/assets/{settings-BvXhlJCF.js → settings-Ds4SqD8s.js} +1 -1
- package/dist/ui/assets/{slider-DrDFLwXh.js → slider-CsiUDxc3.js} +1 -1
- package/dist/ui/assets/{sparkles-C4MACMbE.js → sparkles-yUEb-7oH.js} +1 -1
- package/dist/ui/assets/{square-D_-gRT1l.js → square-BD81nFtN.js} +1 -1
- package/dist/ui/assets/switch-BDwN8RYV.js +1 -0
- package/dist/ui/assets/{table-DWEJJiuF.js → table-CSc8ubon.js} +1 -1
- package/dist/ui/assets/terminal-DN38Q456.js +1 -0
- package/dist/ui/assets/{textarea-CwPvQVAG.js → textarea-CXgXWKrT.js} +1 -1
- package/dist/ui/assets/{trash-2-Blkv31Dz.js → trash-2-CNjMkoq6.js} +1 -1
- package/dist/ui/assets/{triangle-alert-BKgbd30k.js → triangle-alert-C9Y8Ub4X.js} +1 -1
- package/dist/ui/assets/useProviders-C6_QHsEi.js +1 -0
- package/dist/ui/assets/{vendor-radix-JY4ncZrD.js → vendor-radix-cw1bQaVC.js} +4 -4
- package/dist/ui/assets/{vendor-react-CscwQerf.js → vendor-react-D4s9E-zj.js} +1 -1
- package/dist/ui/assets/{volume-2-BiUgObeI.js → volume-2-CeSXNDv4.js} +1 -1
- package/dist/ui/assets/{zap-CpyuQJEC.js → zap-hlXjpSeA.js} +1 -1
- package/dist/ui/dist/assets/AgentCreateForm-tJZv9FZC.js +1 -0
- package/dist/ui/dist/assets/AgentDetailPage-Du-mRcAX.js +1 -0
- package/dist/ui/dist/assets/AgentNewPage-DIFYd_Ys.js +1 -0
- package/dist/ui/dist/assets/AgentsPage-YvSgWRiw.js +10 -0
- package/dist/ui/dist/assets/CanvasPage-DtMwGvxf.js +33 -0
- package/dist/ui/dist/assets/ChannelsPage-BdBXWHjj.js +8 -0
- package/dist/ui/dist/assets/DashboardPage-ghl1ZguH.js +6 -0
- package/dist/ui/dist/assets/LoginPage-CAmSI9Vy.js +1 -0
- package/dist/ui/dist/assets/LogsPage-DAPBHkwK.js +1 -0
- package/dist/ui/dist/assets/MeetingPage-WjjGOqqU.js +1 -0
- package/dist/ui/dist/assets/NotFound-BMeQSGcG.js +1 -0
- package/dist/ui/dist/assets/ProvidersPage-Ct6HsAi1.js +1 -0
- package/dist/ui/dist/assets/RecoverPage-DpW3l-yv.js +1 -0
- package/dist/ui/dist/assets/SettingsPage-DBJ7_E6C.js +9 -0
- package/dist/ui/dist/assets/SetupPage-DKmLVUaj.js +1 -0
- package/dist/ui/dist/assets/WebChatPage-CVRcKept.js +16 -0
- package/dist/ui/dist/assets/accordion-C5d5Rm5z.js +1 -0
- package/dist/ui/dist/assets/activity-c3pNngT_.js +1 -0
- package/dist/ui/dist/assets/alert-C-NE-P3s.js +1 -0
- package/dist/ui/dist/assets/alert-dialog-C5mzbHdP.js +1 -0
- package/dist/ui/dist/assets/arrow-left-CBcbX5EZ.js +1 -0
- package/dist/ui/dist/assets/badge-ChpACfWO.js +1 -0
- package/dist/ui/dist/assets/calendar-B-KZ9RQO.js +1 -0
- package/dist/ui/dist/assets/card-CNf6BS2e.js +1 -0
- package/dist/ui/dist/assets/chevron-left-D4U-5A27.js +1 -0
- package/dist/ui/dist/assets/chevron-right-CR4Skrf3.js +1 -0
- package/dist/ui/dist/assets/chevron-up-BYhk0K2J.js +1 -0
- package/dist/ui/dist/assets/circle-alert-CyHDwUj8.js +1 -0
- package/dist/ui/dist/assets/circle-check-Bb54Ebmu.js +1 -0
- package/dist/ui/dist/assets/cpu-Cdgc_B1K.js +1 -0
- package/dist/ui/dist/assets/dialog-QnZ0ad8O.js +1 -0
- package/dist/ui/dist/assets/download-C3ifGMjJ.js +1 -0
- package/dist/ui/dist/assets/dropdown-menu-BK-CO3Od.js +1 -0
- package/dist/ui/dist/assets/es-NQNoaWDx.js +1 -0
- package/dist/ui/dist/assets/external-link-BvxYeTP1.js +1 -0
- package/dist/ui/dist/assets/eye-DqNTU_GD.js +1 -0
- package/dist/ui/dist/assets/file-text-BT_9S9SM.js +1 -0
- package/dist/ui/dist/assets/folder-open-BhH8y9ac.js +1 -0
- package/dist/ui/dist/assets/format-GVHeOyWI.js +1 -0
- package/dist/ui/dist/assets/gateway-url-COCbW0IR.js +1 -0
- package/dist/ui/dist/assets/gauge-D_TMa4i9.js +1 -0
- package/dist/ui/dist/assets/globe-DeCQTCDJ.js +1 -0
- package/dist/ui/dist/assets/hexagon-DsGOUl-H.js +1 -0
- package/dist/ui/dist/assets/history-BSG-Ypqf.js +1 -0
- package/dist/ui/dist/assets/index-B2fCYtTS.css +2 -0
- package/dist/ui/dist/assets/index-DMCjjdqf.js +116 -0
- package/dist/ui/dist/assets/info-NwLoa2Mj.js +1 -0
- package/dist/ui/dist/assets/key-3EP0dhkT.js +1 -0
- package/dist/ui/dist/assets/label-D2H1IR_J.js +1 -0
- package/dist/ui/dist/assets/loader-circle-CZNax6kS.js +1 -0
- package/dist/ui/dist/assets/lock-Ei1_J-Nq.js +1 -0
- package/dist/ui/dist/assets/pause-BUqah9Bi.js +1 -0
- package/dist/ui/dist/assets/play-NcZ4swwL.js +1 -0
- package/dist/ui/dist/assets/plus-CX1xyhp5.js +1 -0
- package/dist/ui/dist/assets/progress-BherYzY6.js +1 -0
- package/dist/ui/dist/assets/refresh-cw-DaYdjQFk.js +1 -0
- package/dist/ui/dist/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
- package/dist/ui/dist/assets/save-CUdYyHNy.js +1 -0
- package/dist/ui/dist/assets/scroll-area-DkeyX32e.js +1 -0
- package/dist/ui/dist/assets/send-B0H5SEIE.js +1 -0
- package/dist/ui/dist/assets/settings-Ds4SqD8s.js +1 -0
- package/dist/ui/dist/assets/slider-CsiUDxc3.js +14 -0
- package/dist/ui/dist/assets/sparkles-yUEb-7oH.js +1 -0
- package/dist/ui/dist/assets/square-BD81nFtN.js +1 -0
- package/dist/ui/dist/assets/switch-BDwN8RYV.js +1 -0
- package/dist/ui/dist/assets/table-CSc8ubon.js +1 -0
- package/dist/ui/dist/assets/terminal-DN38Q456.js +1 -0
- package/dist/ui/dist/assets/textarea-CXgXWKrT.js +1 -0
- package/dist/ui/dist/assets/trash-2-CNjMkoq6.js +1 -0
- package/dist/ui/dist/assets/triangle-alert-C9Y8Ub4X.js +1 -0
- package/dist/ui/dist/assets/useProviders-C6_QHsEi.js +1 -0
- package/dist/ui/dist/assets/utils-3pnRFmFe.js +1 -0
- package/dist/ui/dist/assets/vendor-charts-Bu2lyBKP.js +65 -0
- package/dist/ui/dist/assets/vendor-query-DsWPbQdG.js +1 -0
- package/dist/ui/dist/assets/vendor-radix-cw1bQaVC.js +63 -0
- package/dist/ui/dist/assets/vendor-react-D4s9E-zj.js +1 -0
- package/dist/ui/dist/assets/vendor-router-C9pIYwbJ.js +3 -0
- package/dist/ui/dist/assets/volume-2-CeSXNDv4.js +1 -0
- package/dist/ui/dist/assets/zap-hlXjpSeA.js +1 -0
- package/dist/ui/dist/favicon.ico +0 -0
- package/dist/ui/dist/index.html +40 -0
- package/dist/ui/dist/placeholder.svg +1 -0
- package/dist/ui/index.html +7 -11
- package/package.json +137 -15
- package/packages/cli/src/adapters/binary.ts +461 -0
- package/packages/cli/src/adapters/bun-global.ts +378 -0
- package/packages/cli/src/adapters/config.ts +314 -0
- package/packages/cli/src/adapters/docker.ts +308 -0
- package/packages/cli/src/adapters/factory.ts +168 -0
- package/packages/cli/src/adapters/index.ts +80 -0
- package/packages/cli/src/adapters/types.ts +218 -0
- package/packages/cli/src/commands/agent-run.ts +168 -0
- package/packages/cli/src/commands/agents.ts +398 -0
- package/packages/cli/src/commands/chat.ts +142 -0
- package/packages/cli/src/commands/config.ts +49 -0
- package/packages/cli/src/commands/cron.ts +487 -0
- package/packages/cli/src/commands/dev.ts +58 -0
- package/packages/cli/src/commands/doctor.ts +320 -0
- package/packages/cli/src/commands/gateway.ts +719 -0
- package/packages/cli/src/commands/logs.ts +57 -0
- package/packages/cli/src/commands/mcp.ts +175 -0
- package/packages/cli/src/commands/message.ts +77 -0
- package/packages/cli/src/commands/migrate.ts +90 -0
- package/packages/cli/src/commands/onboard.ts +1656 -0
- package/packages/cli/src/commands/security.ts +144 -0
- package/packages/cli/src/commands/service.ts +50 -0
- package/packages/cli/src/commands/sessions.ts +116 -0
- package/packages/cli/src/commands/skills.ts +215 -0
- package/packages/cli/src/commands/update.ts +203 -0
- package/packages/cli/src/index.ts +210 -0
- package/packages/cli/src/ui-bundle.generated.ts +3 -0
- package/packages/cli/src/utils/token.ts +6 -0
- package/packages/core/src/agent/agent-loop.ts +691 -0
- package/packages/core/src/agent/compaction.ts +240 -0
- package/packages/core/src/agent/context-compiler.ts +467 -0
- package/packages/core/src/agent/context-guard.ts +91 -0
- package/packages/core/src/agent/conversation-store.ts +244 -0
- package/packages/core/src/agent/curator.ts +158 -0
- package/packages/core/src/agent/hooks.ts +166 -0
- package/packages/core/src/agent/llm-client.ts +167 -0
- package/packages/core/src/agent/llm-providers/anthropic.ts +212 -0
- package/packages/core/src/agent/llm-providers/deepseek.ts +8 -0
- package/packages/core/src/agent/llm-providers/gemini.ts +215 -0
- package/packages/core/src/agent/llm-providers/groq.ts +5 -0
- package/packages/core/src/agent/llm-providers/interface.ts +195 -0
- package/packages/core/src/agent/llm-providers/kimi.ts +8 -0
- package/packages/core/src/agent/llm-providers/local-llama.ts +37 -0
- package/packages/core/src/agent/llm-providers/mistral.ts +5 -0
- package/packages/core/src/agent/llm-providers/nvidia.ts +5 -0
- package/packages/core/src/agent/llm-providers/ollama.ts +175 -0
- package/packages/core/src/agent/llm-providers/openai-compat-base.ts +379 -0
- package/packages/core/src/agent/llm-providers/openai.ts +5 -0
- package/packages/core/src/agent/llm-providers/openrouter.ts +5 -0
- package/packages/core/src/agent/llm-providers/qwen.ts +5 -0
- package/packages/core/src/agent/native-tools.ts +31 -0
- package/packages/core/src/agent/playbook-selector.ts +147 -0
- package/packages/core/src/agent/prompt-builder.ts +169 -0
- package/packages/core/src/agent/providers/index.ts +204 -0
- package/packages/core/src/agent/providers.ts +1 -0
- package/packages/core/src/agent/reflector.ts +200 -0
- package/packages/core/src/agent/service.ts +267 -0
- package/packages/core/src/agent/skill-selector.ts +479 -0
- package/packages/core/src/agent/stuck-loop.ts +133 -0
- package/packages/core/src/agent/tool-selector.ts +569 -0
- package/packages/core/src/agent/tracer.ts +100 -0
- package/packages/core/src/auth/auth.ts +108 -0
- package/packages/core/src/auth/index.ts +1 -0
- package/packages/core/src/canvas/a2ui-tools.ts +255 -0
- package/packages/core/src/canvas/canvas-manager.ts +390 -0
- package/packages/core/src/canvas/canvas-tools.ts +448 -0
- package/packages/core/src/canvas/emitter.ts +149 -0
- package/packages/core/src/canvas/index.ts +3 -0
- package/packages/core/src/channels/base.ts +154 -0
- package/packages/core/src/channels/discord.ts +273 -0
- package/packages/core/src/channels/index.ts +7 -0
- package/packages/core/src/channels/manager.ts +450 -0
- package/packages/core/src/channels/slack.ts +323 -0
- package/packages/core/src/channels/telegram.ts +612 -0
- package/packages/core/src/channels/webchat.ts +139 -0
- package/packages/core/src/channels/whatsapp.ts +548 -0
- package/packages/core/src/config/index.ts +12 -0
- package/packages/core/src/config/loader.ts +569 -0
- package/packages/core/src/events/agent-bus.ts +460 -0
- package/packages/core/src/events/event-bus.ts +169 -0
- package/packages/core/src/gateway/channel-notify.ts +64 -0
- package/packages/core/src/gateway/helpers/cors.ts +32 -0
- package/packages/core/src/gateway/helpers/index.ts +4 -0
- package/packages/core/src/gateway/helpers/narration.ts +57 -0
- package/packages/core/src/gateway/helpers/path.ts +13 -0
- package/packages/core/src/gateway/helpers/redact.ts +61 -0
- package/packages/core/src/gateway/index.ts +5 -0
- package/packages/core/src/gateway/initializer.ts +363 -0
- package/packages/core/src/gateway/lane-queue.ts +169 -0
- package/packages/core/src/gateway/llm-local/client.ts +94 -0
- package/packages/core/src/gateway/llm-local/detector.ts +321 -0
- package/packages/core/src/gateway/llm-local/downloader.ts +216 -0
- package/packages/core/src/gateway/llm-local/index.ts +34 -0
- package/packages/core/src/gateway/llm-local/manager.ts +186 -0
- package/packages/core/src/gateway/llm-local/models.ts +149 -0
- package/packages/core/src/gateway/llm-local/server.ts +179 -0
- package/packages/core/src/gateway/resolver.ts +108 -0
- package/packages/core/src/gateway/router.ts +124 -0
- package/packages/core/src/gateway/routes/agents.ts +210 -0
- package/packages/core/src/gateway/routes/auth.ts +244 -0
- package/packages/core/src/gateway/routes/channels.ts +484 -0
- package/packages/core/src/gateway/routes/chat.ts +241 -0
- package/packages/core/src/gateway/routes/config.ts +12 -0
- package/packages/core/src/gateway/routes/cron-api.ts +544 -0
- package/packages/core/src/gateway/routes/ethics.ts +46 -0
- package/packages/core/src/gateway/routes/llm-local.ts +271 -0
- package/packages/core/src/gateway/routes/mcp.ts +319 -0
- package/packages/core/src/gateway/routes/meeting.ts +232 -0
- package/packages/core/src/gateway/routes/models.ts +163 -0
- package/packages/core/src/gateway/routes/multimodal.ts +93 -0
- package/packages/core/src/gateway/routes/providers.ts +220 -0
- package/packages/core/src/gateway/routes/setup.ts +441 -0
- package/packages/core/src/gateway/routes/skills.ts +115 -0
- package/packages/core/src/gateway/routes/system.ts +469 -0
- package/packages/core/src/gateway/routes/tasks.ts +44 -0
- package/packages/core/src/gateway/routes/tools.ts +59 -0
- package/packages/core/src/gateway/routes/tts-local.ts +388 -0
- package/packages/core/src/gateway/routes/users.ts +122 -0
- package/packages/core/src/gateway/routes/voice.ts +189 -0
- package/packages/core/src/gateway/routes/workspace.ts +281 -0
- package/packages/core/src/gateway/server.ts +2744 -0
- package/packages/core/src/gateway/session.ts +95 -0
- package/packages/core/src/gateway/slash-commands.ts +207 -0
- package/packages/core/src/gateway/tts/README.md +94 -0
- package/packages/core/src/gateway/tts/package.json +25 -0
- package/packages/core/src/gateway/tts/src/client.ts +59 -0
- package/packages/core/src/gateway/tts/src/detect.ts +42 -0
- package/packages/core/src/gateway/tts/src/index.ts +15 -0
- package/packages/core/src/gateway/tts/src/install.ts +129 -0
- package/packages/core/src/gateway/tts/src/models.ts +50 -0
- package/packages/core/src/gateway/tts/src/server.ts +252 -0
- package/packages/core/src/gateway/tts/voices/.gitkeep +0 -0
- package/packages/core/src/heartbeat/index.ts +157 -0
- package/packages/core/src/index.ts +56 -0
- package/packages/core/src/mcp/hot-reload.ts +148 -0
- package/packages/core/src/mcp/singleton.ts +21 -0
- package/packages/core/src/mcp/tool-sync.ts +176 -0
- package/packages/core/src/multimodal/index.ts +2 -0
- package/packages/core/src/multimodal/types.ts +28 -0
- package/packages/core/src/multimodal/vision-service.ts +283 -0
- package/packages/core/src/plugins/api.ts +128 -0
- package/packages/core/src/plugins/index.ts +2 -0
- package/packages/core/src/plugins/loader.ts +365 -0
- package/packages/core/src/resilience/circuit-breaker.ts +225 -0
- package/packages/core/src/scheduler/CronScheduler.ts +699 -0
- package/packages/core/src/scheduler/dag/AgentExecutor.ts +53 -0
- package/packages/core/src/scheduler/dag/DAGScheduler.ts +250 -0
- package/packages/core/src/scheduler/dag/EventBridge.ts +122 -0
- package/packages/core/src/scheduler/dag/TaskGraph.ts +192 -0
- package/packages/core/src/scheduler/dag/TaskNode.ts +97 -0
- package/packages/core/src/scheduler/dag/TaskResult.ts +22 -0
- package/packages/core/src/scheduler/dag/errors.ts +37 -0
- package/packages/core/src/scheduler/dag/index.ts +26 -0
- package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +97 -0
- package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +21 -0
- package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +46 -0
- package/packages/core/src/scheduler/index.ts +22 -0
- package/packages/core/src/scheduler/integration.ts +237 -0
- package/packages/core/src/scheduler/types.ts +164 -0
- package/packages/core/src/security/google-chat.ts +269 -0
- package/packages/core/src/security/index.ts +192 -0
- package/packages/core/src/security/pairing.ts +250 -0
- package/packages/core/src/security/rate-limit.ts +270 -0
- package/packages/core/src/security/signal.ts +321 -0
- package/packages/core/src/state/store.ts +312 -0
- package/packages/core/src/storage/crypto.ts +197 -0
- package/packages/core/src/storage/migrate.ts +147 -0
- package/packages/core/src/storage/onboarding.ts +1506 -0
- package/packages/core/src/storage/schema.ts +666 -0
- package/packages/core/src/storage/seed.ts +628 -0
- package/packages/core/src/storage/sqlite.ts +407 -0
- package/packages/core/src/storage/usage.ts +374 -0
- package/packages/core/src/tool-runtime/index.ts +476 -0
- package/packages/core/src/tool-runtime/tool-worker.ts +125 -0
- package/packages/core/src/tools/agents/get-available-models.ts +118 -0
- package/packages/core/src/tools/agents/index.ts +610 -0
- package/packages/core/src/tools/canvas/index.ts +420 -0
- package/packages/core/src/tools/cli/index.ts +142 -0
- package/packages/core/src/tools/core/index.ts +478 -0
- package/packages/core/src/tools/cron/index.ts +635 -0
- package/packages/core/src/tools/filesystem/fs-delete.ts +78 -0
- package/packages/core/src/tools/filesystem/fs-edit.ts +106 -0
- package/packages/core/src/tools/filesystem/fs-exists.ts +63 -0
- package/packages/core/src/tools/filesystem/fs-glob.ts +108 -0
- package/packages/core/src/tools/filesystem/fs-list.ts +129 -0
- package/packages/core/src/tools/filesystem/fs-read.ts +72 -0
- package/packages/core/src/tools/filesystem/fs-write.ts +67 -0
- package/packages/core/src/tools/filesystem/index.ts +34 -0
- package/packages/core/src/tools/filesystem/workspace-guard.ts +62 -0
- package/packages/core/src/tools/index.ts +197 -0
- package/packages/core/src/tools/meeting/index.ts +363 -0
- package/packages/core/src/tools/office/index.ts +47 -0
- package/packages/core/src/tools/office/office-escribir-docx.ts +192 -0
- package/packages/core/src/tools/office/office-escribir-pdf.ts +172 -0
- package/packages/core/src/tools/office/office-escribir-pptx.ts +174 -0
- package/packages/core/src/tools/office/office-escribir-xlsx.ts +116 -0
- package/packages/core/src/tools/office/office-leer-docx.ts +93 -0
- package/packages/core/src/tools/office/office-leer-pdf.ts +114 -0
- package/packages/core/src/tools/office/office-leer-pptx.ts +136 -0
- package/packages/core/src/tools/office/office-leer-xlsx.ts +124 -0
- package/packages/core/src/tools/types.ts +39 -0
- package/packages/core/src/tools/voice/index.ts +104 -0
- package/packages/core/src/tools/web/browser-click.ts +78 -0
- package/packages/core/src/tools/web/browser-extract.ts +139 -0
- package/packages/core/src/tools/web/browser-navigate.ts +106 -0
- package/packages/core/src/tools/web/browser-screenshot.ts +87 -0
- package/packages/core/src/tools/web/browser-script.ts +88 -0
- package/packages/core/src/tools/web/browser-service.ts +554 -0
- package/packages/core/src/tools/web/browser-type.ts +101 -0
- package/packages/core/src/tools/web/browser-wait.ts +136 -0
- package/packages/core/src/tools/web/index.ts +41 -0
- package/packages/core/src/tools/web/web-fetch.ts +78 -0
- package/packages/core/src/tools/web/web-search.ts +123 -0
- package/packages/core/src/utils/benchmark.ts +80 -0
- package/packages/core/src/utils/crypto.ts +73 -0
- package/packages/core/src/utils/date.ts +42 -0
- package/packages/core/src/utils/index.ts +5 -0
- package/packages/core/src/utils/logger.ts +389 -0
- package/packages/core/src/utils/retry.ts +70 -0
- package/packages/core/src/utils/toon.ts +253 -0
- package/packages/core/src/voice/index.ts +643 -0
- package/packages/mcp/src/config.ts +13 -0
- package/packages/mcp/src/index.ts +1 -0
- package/packages/mcp/src/logger.ts +47 -0
- package/packages/mcp/src/manager.ts +439 -0
- package/packages/mcp/src/transports/index.ts +67 -0
- package/packages/mcp/src/transports/sse.ts +238 -0
- package/packages/mcp/src/transports/websocket.ts +159 -0
- package/packages/skills/src/bundled/agents/agent_spawner/SKILL.md +167 -0
- package/packages/skills/src/bundled/agents/code_delegator/SKILL.md +156 -0
- package/packages/skills/src/bundled/agents/memory_manager/SKILL.md +143 -0
- package/packages/skills/src/bundled/agents/research_and_remember/SKILL.md +139 -0
- package/packages/skills/src/bundled/agents/task_orchestrator/SKILL.md +198 -0
- package/packages/skills/src/bundled/canvas/a2ui_dashboard/SKILL.md +176 -0
- package/packages/skills/src/bundled/canvas/a2ui_form/SKILL.md +202 -0
- package/packages/skills/src/bundled/canvas/a2ui_interactive/SKILL.md +206 -0
- package/packages/skills/src/bundled/canvas/canvas_dashboard/SKILL.md +146 -0
- package/packages/skills/src/bundled/canvas/canvas_interact/SKILL.md +148 -0
- package/packages/skills/src/bundled/canvas/canvas_report/SKILL.md +146 -0
- package/packages/skills/src/bundled/cli/cli_pipeline/SKILL.md +136 -0
- package/packages/skills/src/bundled/cli/cli_safe_exec/SKILL.md +125 -0
- package/packages/skills/src/bundled/cron_manager/SKILL.md +188 -0
- package/packages/skills/src/bundled/cron_reminder/SKILL.md +112 -0
- package/packages/skills/src/bundled/filesystem/file_manager/SKILL.md +118 -0
- package/packages/skills/src/bundled/filesystem/file_read_and_summarize/SKILL.md +108 -0
- package/packages/skills/src/bundled/filesystem/file_writer/SKILL.md +135 -0
- package/packages/skills/src/bundled/meeting/meeting_transcription/SKILL.md +213 -0
- package/packages/skills/src/bundled/office/office_document_manager/SKILL.md +262 -0
- package/packages/skills/src/bundled/search_knowledge/busqueda_fts5/SKILL.md +74 -0
- package/packages/skills/src/bundled/voice/voice_assistant/SKILL.md +174 -0
- package/packages/skills/src/bundled/voice/voice_input/SKILL.md +146 -0
- package/packages/skills/src/bundled/voice/voice_output/SKILL.md +151 -0
- package/packages/skills/src/bundled/web/browser_automate/SKILL.md +120 -0
- package/packages/skills/src/bundled/web/browser_scrape/SKILL.md +109 -0
- package/packages/skills/src/bundled/web/web_monitor/SKILL.md +127 -0
- package/packages/skills/src/bundled/web/web_research/SKILL.md +119 -0
- package/packages/skills/src/bundled-data.generated.ts +1964 -0
- package/packages/skills/src/index.ts +1 -0
- package/packages/skills/src/loader.ts +388 -0
- package/dist/ui/assets/AgentCreateForm-DS6yXjGV.js +0 -1
- package/dist/ui/assets/AgentDetailPage-Ud552U7_.js +0 -1
- package/dist/ui/assets/AgentNewPage-DWWs1P7s.js +0 -1
- package/dist/ui/assets/BridgePage-BD93aBKM.js +0 -1
- package/dist/ui/assets/CanvasPage-CM35yj0Q.js +0 -33
- package/dist/ui/assets/ChannelsPage-CtsWtJdc.js +0 -8
- package/dist/ui/assets/DashboardPage-BpiwR5Jg.js +0 -6
- package/dist/ui/assets/LogsPage-DqUsG3MW.js +0 -1
- package/dist/ui/assets/MeetingPage-C5B8-IzE.js +0 -1
- package/dist/ui/assets/ProjectsPage-zic2sjUf.js +0 -1
- package/dist/ui/assets/ProvidersPage-BxyIGKzh.js +0 -1
- package/dist/ui/assets/SettingsPage-CNFm3nun.js +0 -9
- package/dist/ui/assets/SetupPage-RBcjQtv7.js +0 -1
- package/dist/ui/assets/accordion-BEVqJf2A.js +0 -1
- package/dist/ui/assets/alert-BeGcM0nb.js +0 -1
- package/dist/ui/assets/api-q5Ax-vD2.js +0 -63
- package/dist/ui/assets/arrow-left-B_jlw8X_.js +0 -1
- package/dist/ui/assets/badge-pNhtItyt.js +0 -1
- package/dist/ui/assets/chevron-down-B16UVNlu.js +0 -1
- package/dist/ui/assets/chevron-left-_8ly7Fz0.js +0 -1
- package/dist/ui/assets/chevron-right-yzZLjezG.js +0 -1
- package/dist/ui/assets/chevron-up-CxKDQEE5.js +0 -1
- package/dist/ui/assets/circle-CFKiO9Ds.js +0 -1
- package/dist/ui/assets/circle-check-E2u7ZS2r.js +0 -1
- package/dist/ui/assets/circle-minus-1-TZF2pu.js +0 -1
- package/dist/ui/assets/circle-x-Cm3Sr-xb.js +0 -1
- package/dist/ui/assets/dialog-BaJbZsQF.js +0 -1
- package/dist/ui/assets/dist-DB-fE0Co.js +0 -1
- package/dist/ui/assets/dropdown-menu-DJoOchfz.js +0 -1
- package/dist/ui/assets/gauge-BTpFKuAj.js +0 -1
- package/dist/ui/assets/index-BN0875JH.css +0 -2
- package/dist/ui/assets/index-D4pdc0Uw.js +0 -54
- package/dist/ui/assets/label-C6tqnnKd.js +0 -1
- package/dist/ui/assets/loader-circle-CK3qRV3f.js +0 -1
- package/dist/ui/assets/pencil-BF2_XX-i.js +0 -1
- package/dist/ui/assets/play-DidATMfT.js +0 -1
- package/dist/ui/assets/plus-DXm1XDhQ.js +0 -1
- package/dist/ui/assets/progress-B1HC9cB_.js +0 -1
- package/dist/ui/assets/scroll-area-DKNpYkRA.js +0 -1
- package/dist/ui/assets/search-Co6mulZS.js +0 -1
- package/dist/ui/assets/switch-7AuR7x2g.js +0 -1
- package/dist/ui/assets/terminal-CjZu0OZ0.js +0 -1
- package/dist/ui/assets/useProviders-Bxsnav4y.js +0 -1
- package/dist/ui/assets/useWebSocketStore-ZCW_Nt1w.js +0 -1
- package/dist/ui/assets/x-5cXW_1ZS.js +0 -1
- /package/dist/ui/assets/{format-C0EOLKvf.js → format-GVHeOyWI.js} +0 -0
- /package/dist/ui/assets/{gateway-url-OqLaEDK-.js → gateway-url-COCbW0IR.js} +0 -0
- /package/dist/ui/assets/{utils-_qMjiZaF.js → utils-3pnRFmFe.js} +0 -0
- /package/dist/ui/assets/{vendor-router-DhLEd920.js → vendor-router-C9pIYwbJ.js} +0 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
2
|
+
import { logger } from "../logger";
|
|
3
|
+
|
|
4
|
+
export interface SSETransportConfig {
|
|
5
|
+
url: string; // URL base
|
|
6
|
+
headers?: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class SSETransport implements Transport {
|
|
10
|
+
private baseUrl: string;
|
|
11
|
+
private messagesUrl: string | null = null; // Endpoint recibido del servidor
|
|
12
|
+
|
|
13
|
+
private headers: Record<string, string>;
|
|
14
|
+
private abortController: AbortController | null = null;
|
|
15
|
+
private cookies: string[] = [];
|
|
16
|
+
private startResolve: (() => void) | null = null;
|
|
17
|
+
private startReject: ((err: Error) => void) | null = null;
|
|
18
|
+
sessionId?: string;
|
|
19
|
+
|
|
20
|
+
onmessage: ((message: unknown) => void) | undefined;
|
|
21
|
+
onerror: ((error: Error) => void) | undefined;
|
|
22
|
+
onclose: (() => void) | undefined;
|
|
23
|
+
|
|
24
|
+
constructor(config: SSETransportConfig) {
|
|
25
|
+
this.baseUrl = config.url;
|
|
26
|
+
this.headers = config.headers ?? {};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async start(): Promise<void> {
|
|
30
|
+
this.abortController = new AbortController();
|
|
31
|
+
|
|
32
|
+
return new Promise(async (resolve, reject) => {
|
|
33
|
+
// Timeout fallback: if no endpoint received in 5s, continue anyway
|
|
34
|
+
const timeout = setTimeout(() => {
|
|
35
|
+
this.startResolve = null;
|
|
36
|
+
this.startReject = null;
|
|
37
|
+
resolve();
|
|
38
|
+
}, 5000);
|
|
39
|
+
|
|
40
|
+
this.startResolve = () => {
|
|
41
|
+
clearTimeout(timeout);
|
|
42
|
+
this.startResolve = null;
|
|
43
|
+
this.startReject = null;
|
|
44
|
+
resolve();
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
this.startReject = (err) => {
|
|
48
|
+
clearTimeout(timeout);
|
|
49
|
+
this.startResolve = null;
|
|
50
|
+
this.startReject = null;
|
|
51
|
+
reject(err);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
logger.debug(`[SSE] Connecting to: ${this.baseUrl}`);
|
|
56
|
+
const response = await fetch(this.baseUrl, {
|
|
57
|
+
method: "GET",
|
|
58
|
+
headers: {
|
|
59
|
+
"Accept": "application/json, text/event-stream",
|
|
60
|
+
"Cache-Control": "no-cache",
|
|
61
|
+
...this.headers,
|
|
62
|
+
},
|
|
63
|
+
signal: this.abortController!.signal,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
if (response.status === 405 || response.status === 400) {
|
|
67
|
+
logger.debug(`[SSE] GET not allowed (${response.status}), falling back to Streamable HTTP pattern for ${this.baseUrl}`);
|
|
68
|
+
this.startResolve();
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (!response.ok) {
|
|
73
|
+
this.startReject(new Error(`MCP SSE connection failed: ${response.status} ${response.statusText}`));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
this.readSessionId(response);
|
|
78
|
+
|
|
79
|
+
if (response.body) {
|
|
80
|
+
this.startReading(response.body);
|
|
81
|
+
} else {
|
|
82
|
+
this.startResolve();
|
|
83
|
+
}
|
|
84
|
+
} catch (error: any) {
|
|
85
|
+
if (error.name !== "AbortError") {
|
|
86
|
+
this.startReject(error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private readSessionId(response: Response) {
|
|
93
|
+
const sessionId = response.headers.get("x-session-id") ??
|
|
94
|
+
response.headers.get("mcp-session-id");
|
|
95
|
+
if (sessionId) {
|
|
96
|
+
this.sessionId = sessionId;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Track cookies for session affinity (important for n8n/proxies)
|
|
100
|
+
const setCookie = response.headers.get("set-cookie");
|
|
101
|
+
if (setCookie) {
|
|
102
|
+
// Simple cookie extraction: just keep the keys and values
|
|
103
|
+
const newCookies = setCookie.split(',').map(c => c.split(';')[0].trim());
|
|
104
|
+
this.cookies = [...new Set([...this.cookies, ...newCookies])];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private startReading(stream: ReadableStream<Uint8Array>) {
|
|
109
|
+
const reader = stream.getReader();
|
|
110
|
+
const decoder = new TextDecoder();
|
|
111
|
+
let buffer = "";
|
|
112
|
+
|
|
113
|
+
this.processStream(reader, decoder, buffer).catch((error) => {
|
|
114
|
+
if (this.onerror && error.name !== "AbortError") {
|
|
115
|
+
this.onerror(error instanceof Error ? error : new Error(String(error)));
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private async processStream(
|
|
121
|
+
reader: ReadableStreamDefaultReader<Uint8Array>,
|
|
122
|
+
decoder: TextDecoder,
|
|
123
|
+
buffer: string
|
|
124
|
+
): Promise<void> {
|
|
125
|
+
try {
|
|
126
|
+
let eventType = "message";
|
|
127
|
+
let eventData = "";
|
|
128
|
+
|
|
129
|
+
while (true) {
|
|
130
|
+
const { done, value } = await reader.read();
|
|
131
|
+
|
|
132
|
+
if (done) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
buffer += decoder.decode(value, { stream: true });
|
|
137
|
+
|
|
138
|
+
const lines = buffer.split("\n");
|
|
139
|
+
buffer = lines.pop() ?? "";
|
|
140
|
+
|
|
141
|
+
for (const line of lines) {
|
|
142
|
+
if (line.startsWith("event: ")) {
|
|
143
|
+
eventType = line.slice(7).trim();
|
|
144
|
+
} else if (line.startsWith("data: ")) {
|
|
145
|
+
const data = line.slice(6);
|
|
146
|
+
if (data.trim() === "[DONE]") {
|
|
147
|
+
this.onclose?.();
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
eventData += data + "\n";
|
|
151
|
+
} else if (line === "") {
|
|
152
|
+
if (eventData) {
|
|
153
|
+
eventData = eventData.trim();
|
|
154
|
+
if (eventType === "endpoint") {
|
|
155
|
+
try {
|
|
156
|
+
this.messagesUrl = new URL(eventData, this.baseUrl).href;
|
|
157
|
+
logger.debug(`[SSE] Messages endpoint received: ${this.messagesUrl}`);
|
|
158
|
+
this.startResolve?.();
|
|
159
|
+
} catch (e) {
|
|
160
|
+
logger.warn(`[SSE] Failed to parse endpoint: ${eventData}`);
|
|
161
|
+
}
|
|
162
|
+
} else if (eventType === "message" || eventType === "") {
|
|
163
|
+
try {
|
|
164
|
+
const parsed = JSON.parse(eventData);
|
|
165
|
+
this.onmessage?.(parsed);
|
|
166
|
+
} catch {
|
|
167
|
+
// Ignorar heartbeats o no-JSON
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
eventData = "";
|
|
171
|
+
}
|
|
172
|
+
eventType = "message";
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
} catch (error: any) {
|
|
177
|
+
if (error.name !== "AbortError") {
|
|
178
|
+
this.onerror?.(error instanceof Error ? error : new Error(String(error)));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
async close(): Promise<void> {
|
|
184
|
+
this.abortController?.abort();
|
|
185
|
+
this.abortController = null;
|
|
186
|
+
this.sessionId = undefined;
|
|
187
|
+
this.onclose?.();
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
async send(message: unknown): Promise<void> {
|
|
191
|
+
if (!this.abortController) {
|
|
192
|
+
throw new Error("SSE transport not started — llama start() primero");
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const targetUrl = this.messagesUrl || this.baseUrl;
|
|
196
|
+
|
|
197
|
+
const response = await fetch(targetUrl, {
|
|
198
|
+
method: "POST",
|
|
199
|
+
headers: {
|
|
200
|
+
"Content-Type": "application/json",
|
|
201
|
+
"Accept": "application/json, text/event-stream",
|
|
202
|
+
...this.headers,
|
|
203
|
+
// Streamable HTTP spec requires session ID as header, not query param
|
|
204
|
+
...(this.sessionId ? { "mcp-session-id": this.sessionId } : {}),
|
|
205
|
+
...(this.cookies.length > 0 ? { "Cookie": this.cookies.join('; ') } : {}),
|
|
206
|
+
},
|
|
207
|
+
body: JSON.stringify(message),
|
|
208
|
+
signal: this.abortController.signal,
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
this.readSessionId(response);
|
|
212
|
+
|
|
213
|
+
if (!response.ok) {
|
|
214
|
+
const body = await response.text().catch(() => "");
|
|
215
|
+
throw new Error(`MCP message failed (${response.status}): ${body || response.statusText}`);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
219
|
+
|
|
220
|
+
if (contentType.includes("text/event-stream") && response.body) {
|
|
221
|
+
this.startReading(response.body);
|
|
222
|
+
}
|
|
223
|
+
else if (contentType.includes("application/json")) {
|
|
224
|
+
const text = await response.text();
|
|
225
|
+
if (text.trim()) {
|
|
226
|
+
try {
|
|
227
|
+
this.onmessage?.(JSON.parse(text));
|
|
228
|
+
} catch {
|
|
229
|
+
// ignored
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export function createSSETransport(config: SSETransportConfig): Transport {
|
|
237
|
+
return new SSETransport(config) as unknown as Transport;
|
|
238
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
2
|
+
|
|
3
|
+
export interface WebSocketTransportConfig {
|
|
4
|
+
url: string;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
reconnect?: boolean; // reconectar automáticamente si se cae (default: true)
|
|
7
|
+
reconnectDelay?: number; // ms entre intentos de reconexión (default: 3000)
|
|
8
|
+
reconnectMaxAttempts?: number; // máximo de intentos (default: 10)
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class WebSocketTransport implements Transport {
|
|
12
|
+
private url: string;
|
|
13
|
+
private ws: WebSocket | null = null;
|
|
14
|
+
private headers?: Record<string, string>;
|
|
15
|
+
private intentionallyClosed = false; // distingue close() manual de caída
|
|
16
|
+
private reconnectAttempts = 0;
|
|
17
|
+
private reconnectDelay: number;
|
|
18
|
+
private reconnectMaxAttempts: number;
|
|
19
|
+
private shouldReconnect: boolean;
|
|
20
|
+
|
|
21
|
+
onmessage: ((message: unknown) => void) | undefined;
|
|
22
|
+
onerror: ((error: Error) => void) | undefined;
|
|
23
|
+
onclose: (() => void) | undefined;
|
|
24
|
+
|
|
25
|
+
constructor(config: WebSocketTransportConfig) {
|
|
26
|
+
this.url = config.url;
|
|
27
|
+
this.headers = config.headers;
|
|
28
|
+
this.shouldReconnect = config.reconnect ?? true;
|
|
29
|
+
this.reconnectDelay = config.reconnectDelay ?? 3000;
|
|
30
|
+
this.reconnectMaxAttempts = config.reconnectMaxAttempts ?? 10;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async start(): Promise<void> {
|
|
34
|
+
this.intentionallyClosed = false;
|
|
35
|
+
this.reconnectAttempts = 0;
|
|
36
|
+
return this.connect();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private connect(): Promise<void> {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
|
|
42
|
+
// CORRECCIÓN 1 — headers en Bun WebSocket
|
|
43
|
+
// Bun acepta las opciones como segundo argumento cuando no hay subprotocols,
|
|
44
|
+
// o como objeto con `headers` dentro de un array de subprotocols vacío.
|
|
45
|
+
// La forma más segura y compatible:
|
|
46
|
+
const ws = this.headers && Object.keys(this.headers).length > 0
|
|
47
|
+
? new WebSocket(this.url, {
|
|
48
|
+
// @ts-expect-error — Bun extiende la API estándar de WebSocket
|
|
49
|
+
headers: this.headers,
|
|
50
|
+
})
|
|
51
|
+
: new WebSocket(this.url);
|
|
52
|
+
|
|
53
|
+
this.ws = ws;
|
|
54
|
+
let resolved = false;
|
|
55
|
+
|
|
56
|
+
ws.onopen = () => {
|
|
57
|
+
resolved = true;
|
|
58
|
+
this.reconnectAttempts = 0; // reset contador al conectar exitosamente
|
|
59
|
+
resolve();
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
ws.onmessage = (event: MessageEvent) => {
|
|
63
|
+
try {
|
|
64
|
+
const data = JSON.parse(event.data as string);
|
|
65
|
+
this.onmessage?.(data);
|
|
66
|
+
} catch {
|
|
67
|
+
// Ignorar mensajes no-JSON (ping/pong, heartbeats)
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
// CORRECCIÓN 2 — separar el error de conexión del error post-conexión
|
|
72
|
+
ws.onerror = (event: Event) => {
|
|
73
|
+
const error =
|
|
74
|
+
(event as ErrorEvent).error ??
|
|
75
|
+
new Error(`WebSocket error en ${this.url}`);
|
|
76
|
+
|
|
77
|
+
if (!resolved) {
|
|
78
|
+
// Error durante la conexión inicial → rechazar la promesa
|
|
79
|
+
reject(error);
|
|
80
|
+
} else {
|
|
81
|
+
// Error después de conectar → notificar sin rechazar
|
|
82
|
+
this.onerror?.(error instanceof Error ? error : new Error(String(error)));
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// CORRECCIÓN 3 — reconexión automática en cierre inesperado
|
|
87
|
+
ws.onclose = (event: CloseEvent) => {
|
|
88
|
+
this.ws = null;
|
|
89
|
+
|
|
90
|
+
if (this.intentionallyClosed) {
|
|
91
|
+
// Cierre manual con close() — notificar y no reconectar
|
|
92
|
+
this.onclose?.();
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (!resolved) {
|
|
97
|
+
// Cierre antes de que se abriera → rechazar la promesa
|
|
98
|
+
reject(new Error(
|
|
99
|
+
`WebSocket cerrado antes de conectar — code: ${event.code}, reason: ${event.reason}`
|
|
100
|
+
));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Cierre inesperado después de conectar
|
|
105
|
+
if (
|
|
106
|
+
this.shouldReconnect &&
|
|
107
|
+
this.reconnectAttempts < this.reconnectMaxAttempts
|
|
108
|
+
) {
|
|
109
|
+
this.reconnectAttempts++;
|
|
110
|
+
const delay = this.reconnectDelay * this.reconnectAttempts; // backoff lineal
|
|
111
|
+
|
|
112
|
+
setTimeout(async () => {
|
|
113
|
+
try {
|
|
114
|
+
await this.connect();
|
|
115
|
+
} catch (err) {
|
|
116
|
+
this.onerror?.(err instanceof Error ? err : new Error(String(err)));
|
|
117
|
+
this.onclose?.();
|
|
118
|
+
}
|
|
119
|
+
}, delay);
|
|
120
|
+
} else {
|
|
121
|
+
// Sin más intentos → notificar cierre definitivo
|
|
122
|
+
this.onerror?.(new Error(
|
|
123
|
+
`WebSocket desconectado después de ${this.reconnectAttempts} intentos — ${this.url}`
|
|
124
|
+
));
|
|
125
|
+
this.onclose?.();
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async close(): Promise<void> {
|
|
132
|
+
this.intentionallyClosed = true; // marcar como cierre intencional
|
|
133
|
+
if (this.ws) {
|
|
134
|
+
// Código 1000 = cierre normal
|
|
135
|
+
this.ws.close(1000, "Client closed connection");
|
|
136
|
+
this.ws = null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async send(message: unknown): Promise<void> {
|
|
141
|
+
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
142
|
+
throw new Error(
|
|
143
|
+
`WebSocket no está conectado — readyState: ${this.ws?.readyState ?? "null"}`
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
this.ws.send(JSON.stringify(message));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Útil para health checks desde el MCP client
|
|
150
|
+
get isConnected(): boolean {
|
|
151
|
+
return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function createWebSocketTransport(
|
|
156
|
+
config: WebSocketTransportConfig
|
|
157
|
+
): Transport {
|
|
158
|
+
return new WebSocketTransport(config) as unknown as Transport;
|
|
159
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent_spawner
|
|
3
|
+
description: "Create and manage specialized worker agents with optimal tool assignments and lifecycle control"
|
|
4
|
+
version: 1.1.0
|
|
5
|
+
author: Hive Team
|
|
6
|
+
icon: "🤖"
|
|
7
|
+
category: agents
|
|
8
|
+
permissions:
|
|
9
|
+
- agent_manage
|
|
10
|
+
dependencies: []
|
|
11
|
+
tools: [get_available_models, find_agent, create_agent, archive_agent]
|
|
12
|
+
|
|
13
|
+
# Structured skill fields
|
|
14
|
+
triggers:
|
|
15
|
+
- "creá un agente"
|
|
16
|
+
- "create agent"
|
|
17
|
+
- "creá un worker"
|
|
18
|
+
- "create worker"
|
|
19
|
+
- "nuevo agente"
|
|
20
|
+
- "new agent"
|
|
21
|
+
- "agente especializado"
|
|
22
|
+
- "specialized agent"
|
|
23
|
+
- "buscá un agente"
|
|
24
|
+
- "find agent"
|
|
25
|
+
- "archivá agente"
|
|
26
|
+
- "archive agent"
|
|
27
|
+
- "worker inactivo"
|
|
28
|
+
- "inactive worker"
|
|
29
|
+
|
|
30
|
+
preferred_agents: []
|
|
31
|
+
|
|
32
|
+
steps:
|
|
33
|
+
- step: 1
|
|
34
|
+
action: find_agent
|
|
35
|
+
instruction: "Search for existing agents before creating new one"
|
|
36
|
+
params:
|
|
37
|
+
search: "agent name or specialty"
|
|
38
|
+
status: "idle"
|
|
39
|
+
output: existing_agents
|
|
40
|
+
|
|
41
|
+
- step: 2
|
|
42
|
+
action: decision_reuse_or_create
|
|
43
|
+
instruction: "If suitable agent exists, reuse it. Otherwise, proceed to create"
|
|
44
|
+
output: decision
|
|
45
|
+
|
|
46
|
+
- step: 3
|
|
47
|
+
action: get_available_models
|
|
48
|
+
instruction: "Query available providers and models from database to select optimal model for the agent"
|
|
49
|
+
params:
|
|
50
|
+
capabilities: "required capability (coding, chat, analysis, vision)"
|
|
51
|
+
modelType: "llm (default)"
|
|
52
|
+
output: available_models
|
|
53
|
+
|
|
54
|
+
- step: 4
|
|
55
|
+
action: create_agent
|
|
56
|
+
instruction: "Create new worker with focused system_prompt, minimal tools, and optimal provider/model"
|
|
57
|
+
params:
|
|
58
|
+
name: "specialty_name"
|
|
59
|
+
description: "Clear specialty description"
|
|
60
|
+
system_prompt: "Focused instructions for role"
|
|
61
|
+
tools_json: ["minimal", "required", "tools"]
|
|
62
|
+
providerId: "selected from get_available_models"
|
|
63
|
+
modelId: "selected from get_available_models"
|
|
64
|
+
output: new_agent_id
|
|
65
|
+
|
|
66
|
+
- step: 5
|
|
67
|
+
action: archive_agent (if needed)
|
|
68
|
+
instruction: "Archive workers that are no longer needed or inactive >14 days"
|
|
69
|
+
params:
|
|
70
|
+
agent_id: "agent to archive"
|
|
71
|
+
reason: "no longer needed"
|
|
72
|
+
output: archived
|
|
73
|
+
|
|
74
|
+
rules:
|
|
75
|
+
- "ALWAYS use find_agent BEFORE create_agent — never duplicate workers"
|
|
76
|
+
- "ALWAYS use get_available_models BEFORE create_agent — providerId y modelId son OBLIGATORIOS"
|
|
77
|
+
- "Workers have role='worker', coordinator has role='coordinator'"
|
|
78
|
+
- "Assign MINIMUM required tools (principle of least privilege)"
|
|
79
|
+
- "system_prompt must be specific and focused on specialty"
|
|
80
|
+
- "Use descriptive names that indicate agent's purpose"
|
|
81
|
+
- "Archive agents inactive >14 days (Curator does this automatically)"
|
|
82
|
+
|
|
83
|
+
output_format:
|
|
84
|
+
structure: markdown
|
|
85
|
+
sections:
|
|
86
|
+
- "action_taken"
|
|
87
|
+
- "agent_name"
|
|
88
|
+
- "specialty"
|
|
89
|
+
- "tools_assigned"
|
|
90
|
+
- "status"
|
|
91
|
+
max_length: "Agent creation/management summary"
|
|
92
|
+
|
|
93
|
+
examples:
|
|
94
|
+
- user_input: "creá un agente para investigación web"
|
|
95
|
+
expected_behavior: "find_agent('researcher') → if not exists, create_agent({ name: 'ai_researcher', tools: ['web_search', 'web_fetch'] })"
|
|
96
|
+
|
|
97
|
+
- user_input: "hay un worker para escribir contenido"
|
|
98
|
+
expected_behavior: "find_agent({ search: 'writer' }) → return existing writer agents"
|
|
99
|
+
|
|
100
|
+
- user_input: "archivá los agentes inactivos"
|
|
101
|
+
expected_behavior: "find_agent({ status: 'idle' }) → archive_agent for those inactive >14 days"
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
# Agent Spawner Skill
|
|
105
|
+
|
|
106
|
+
## Cuándo se Activa
|
|
107
|
+
|
|
108
|
+
Para crear nuevos workers especializados o gestionar el ciclo de vida de agents existentes.
|
|
109
|
+
|
|
110
|
+
## Herramientas Disponibles
|
|
111
|
+
|
|
112
|
+
| Tool | Qué hace | Cuándo usarla |
|
|
113
|
+
|------|----------|---------------|
|
|
114
|
+
| `get_available_models` | Consulta providers y modelos activos de la BD | **ANTES de crear** — seleccionar modelo óptimo |
|
|
115
|
+
| `find_agent` | Busca agents existentes | **PRIMERO** — antes de crear |
|
|
116
|
+
| `create_agent` | Crea nuevo worker | Si no existe apto |
|
|
117
|
+
| `archive_agent` | Archiva worker | Limpieza, inactivos |
|
|
118
|
+
|
|
119
|
+
## Workflow
|
|
120
|
+
|
|
121
|
+
### Crear Agent
|
|
122
|
+
1. **Buscar** → `find_agent({ search })` — ¿existe?
|
|
123
|
+
2. **Si existe** → Reutilizar
|
|
124
|
+
3. **Si no existe** → `get_available_models({ capabilities })` — seleccionar modelo óptimo
|
|
125
|
+
4. **Crear** → `create_agent({...})` con providerId y modelId seleccionados
|
|
126
|
+
|
|
127
|
+
### Create Agent Config
|
|
128
|
+
```javascript
|
|
129
|
+
// 1. Consultar modelos disponibles para coding
|
|
130
|
+
get_available_models({ capabilities: "coding" })
|
|
131
|
+
// → [{ providerId: "openai", modelId: "gpt-4o", contextWindow: 128000 }, ...]
|
|
132
|
+
|
|
133
|
+
// 2. Crear agente con modelo óptimo (providerId y modelId son OBLIGATORIOS)
|
|
134
|
+
create_agent({
|
|
135
|
+
name: "ai_coder",
|
|
136
|
+
description: "Especialista en código y refactorización",
|
|
137
|
+
system_prompt: `
|
|
138
|
+
Sos desarrollador experto. Tu rol:
|
|
139
|
+
1. Escribir código limpio y testeable
|
|
140
|
+
2. Refactorizar código existente
|
|
141
|
+
3. Revisar PRs y sugerir mejoras
|
|
142
|
+
`,
|
|
143
|
+
tools_json: ["fs_read", "fs_write", "fs_edit", "cli_exec"],
|
|
144
|
+
providerId: "openai", // OBLIGATORIO - seleccionado de get_available_models
|
|
145
|
+
modelId: "gpt-4o", // OBLIGATORIO - seleccionado de get_available_models
|
|
146
|
+
tone: "professional",
|
|
147
|
+
max_iterations: 15
|
|
148
|
+
})
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Mejores Prácticas
|
|
152
|
+
|
|
153
|
+
- **Buscar primero**: Nunca duplicar workers
|
|
154
|
+
- **Consultar modelos**: Usar `get_available_models` ANTES de crear para seleccionar provider/model óptimo
|
|
155
|
+
- **System prompt específico**: Enfocado en especialidad
|
|
156
|
+
- **Mínimo privilegio**: Solo tools necesarias
|
|
157
|
+
- **Nombres descriptivos**: Que indiquen propósito
|
|
158
|
+
- **Modelo adecuado**: Seleccionar según capacidad requerida (coding, chat, analysis, vision)
|
|
159
|
+
|
|
160
|
+
## Errores a Evitar
|
|
161
|
+
|
|
162
|
+
- ❌ Crear sin buscar primero
|
|
163
|
+
- ❌ Crear sin consultar modelos disponibles (`get_available_models`)
|
|
164
|
+
- ❌ Usar modelo inadecuado para la tarea (ej: modelo pequeño para coding complejo)
|
|
165
|
+
- ❌ Tools en exceso ("por las dudas")
|
|
166
|
+
- ❌ System prompt genérico
|
|
167
|
+
- ❌ Nombres vagos ("worker1", "agent1")
|