@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,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DAGScheduler — TaskNode
|
|
3
|
+
*
|
|
4
|
+
* Represents a single node in the task graph. Tracks its own state,
|
|
5
|
+
* retry count, timing, and the results of its dependencies.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export type NodeStatus = "PENDING" | "READY" | "RUNNING" | "COMPLETED" | "FAILED"
|
|
9
|
+
|
|
10
|
+
export interface TaskNodeConfig {
|
|
11
|
+
/** Unique ID within this graph (can match SQLite task.id) */
|
|
12
|
+
id: string
|
|
13
|
+
/** agents.id of the worker agent to execute */
|
|
14
|
+
agentId: string
|
|
15
|
+
/** Human-readable name for logging */
|
|
16
|
+
name: string
|
|
17
|
+
/** Task description passed to the worker */
|
|
18
|
+
taskDescription: string
|
|
19
|
+
/** IDs of other TaskNodes that must complete first */
|
|
20
|
+
deps: string[]
|
|
21
|
+
/** Timeout in ms before the task is cancelled. Default: 120_000 */
|
|
22
|
+
timeout?: number
|
|
23
|
+
/** How many times to retry on failure. Default: 1 */
|
|
24
|
+
maxRetries?: number
|
|
25
|
+
/** Priority hint for PriorityStrategy. Higher = runs first. Default: 0 */
|
|
26
|
+
priority?: number
|
|
27
|
+
/** Optional arbitrary metadata forwarded to the worker */
|
|
28
|
+
metadata?: Record<string, unknown>
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class TaskNode {
|
|
32
|
+
readonly id: string
|
|
33
|
+
readonly agentId: string
|
|
34
|
+
readonly name: string
|
|
35
|
+
readonly taskDescription: string
|
|
36
|
+
readonly deps: string[]
|
|
37
|
+
readonly timeout: number
|
|
38
|
+
readonly maxRetries: number
|
|
39
|
+
readonly priority: number
|
|
40
|
+
readonly metadata: Record<string, unknown>
|
|
41
|
+
|
|
42
|
+
status: NodeStatus = "PENDING"
|
|
43
|
+
retryCount = 0
|
|
44
|
+
startedAt?: number
|
|
45
|
+
completedAt?: number
|
|
46
|
+
result?: string
|
|
47
|
+
error?: string
|
|
48
|
+
|
|
49
|
+
constructor(config: TaskNodeConfig) {
|
|
50
|
+
this.id = config.id
|
|
51
|
+
this.agentId = config.agentId
|
|
52
|
+
this.name = config.name
|
|
53
|
+
this.taskDescription = config.taskDescription
|
|
54
|
+
this.deps = config.deps
|
|
55
|
+
this.timeout = config.timeout ?? 120_000
|
|
56
|
+
this.maxRetries = config.maxRetries ?? 1
|
|
57
|
+
this.priority = config.priority ?? 0
|
|
58
|
+
this.metadata = config.metadata ?? {}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Returns true if all dependency IDs are in the completed set */
|
|
62
|
+
canStart(completedIds: Set<string>): boolean {
|
|
63
|
+
return this.deps.every(dep => completedIds.has(dep))
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
markReady(): void {
|
|
67
|
+
this.status = "READY"
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
markRunning(): void {
|
|
71
|
+
this.status = "RUNNING"
|
|
72
|
+
this.startedAt = Date.now()
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
markCompleted(result: string): void {
|
|
76
|
+
this.status = "COMPLETED"
|
|
77
|
+
this.completedAt = Date.now()
|
|
78
|
+
this.result = result
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
markFailed(error: string): void {
|
|
82
|
+
this.status = "FAILED"
|
|
83
|
+
this.completedAt = Date.now()
|
|
84
|
+
this.error = error
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
canRetry(): boolean {
|
|
88
|
+
return this.retryCount < this.maxRetries
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Elapsed time in seconds since start, or total duration if done */
|
|
92
|
+
elapsedSeconds(): number {
|
|
93
|
+
if (!this.startedAt) return 0
|
|
94
|
+
const end = this.completedAt ?? Date.now()
|
|
95
|
+
return Math.round((end - this.startedAt) / 1000)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DAGScheduler — Result types
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export interface NodeSummary {
|
|
6
|
+
id: string
|
|
7
|
+
name: string
|
|
8
|
+
status: "COMPLETED" | "FAILED"
|
|
9
|
+
durationMs: number
|
|
10
|
+
result?: string
|
|
11
|
+
error?: string
|
|
12
|
+
retries: number
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface DAGResult {
|
|
16
|
+
swarmId: string
|
|
17
|
+
totalDurationMs: number
|
|
18
|
+
completed: NodeSummary[]
|
|
19
|
+
failed: NodeSummary[]
|
|
20
|
+
/** true if all nodes completed successfully */
|
|
21
|
+
success: boolean
|
|
22
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DAGScheduler — Custom errors
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export class CyclicDependencyError extends Error {
|
|
6
|
+
readonly cycle: string[]
|
|
7
|
+
|
|
8
|
+
constructor(cycle: string[]) {
|
|
9
|
+
super(`Cyclic dependency detected: ${cycle.join(" → ")}`)
|
|
10
|
+
this.name = "CyclicDependencyError"
|
|
11
|
+
this.cycle = cycle
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export class TaskTimeoutError extends Error {
|
|
16
|
+
readonly nodeId: string
|
|
17
|
+
readonly timeoutMs: number
|
|
18
|
+
|
|
19
|
+
constructor(nodeId: string, timeoutMs: number) {
|
|
20
|
+
super(`Task "${nodeId}" timed out after ${timeoutMs}ms`)
|
|
21
|
+
this.name = "TaskTimeoutError"
|
|
22
|
+
this.nodeId = nodeId
|
|
23
|
+
this.timeoutMs = timeoutMs
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class TaskFailureError extends Error {
|
|
28
|
+
readonly nodeId: string
|
|
29
|
+
readonly cause: Error
|
|
30
|
+
|
|
31
|
+
constructor(nodeId: string, cause: Error) {
|
|
32
|
+
super(`Task "${nodeId}" failed: ${cause.message}`)
|
|
33
|
+
this.name = "TaskFailureError"
|
|
34
|
+
this.nodeId = nodeId
|
|
35
|
+
this.cause = cause
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DAGScheduler — Public API
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* import { DAGScheduler, TaskGraph, ParallelStrategy } from "./dag"
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export { DAGScheduler } from "./DAGScheduler"
|
|
9
|
+
export type { DAGSchedulerOptions } from "./DAGScheduler"
|
|
10
|
+
|
|
11
|
+
export { TaskGraph } from "./TaskGraph"
|
|
12
|
+
export { TaskNode } from "./TaskNode"
|
|
13
|
+
export type { TaskNodeConfig, NodeStatus } from "./TaskNode"
|
|
14
|
+
export type { DAGResult, NodeSummary } from "./TaskResult"
|
|
15
|
+
|
|
16
|
+
export { AgentExecutor } from "./AgentExecutor"
|
|
17
|
+
export { EventBridge } from "./EventBridge"
|
|
18
|
+
|
|
19
|
+
export { CyclicDependencyError, TaskTimeoutError, TaskFailureError } from "./errors"
|
|
20
|
+
|
|
21
|
+
export { ParallelStrategy } from "./strategies/ParallelStrategy"
|
|
22
|
+
export type { ExecutionStrategy } from "./strategies/ParallelStrategy"
|
|
23
|
+
export { PriorityStrategy } from "./strategies/PriorityStrategy"
|
|
24
|
+
|
|
25
|
+
export { createResearchGraph } from "./presets/ResearchPreset"
|
|
26
|
+
export type { ResearchAgentIds } from "./presets/ResearchPreset"
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ResearchPreset — Pre-configured DAG for general research swarms
|
|
3
|
+
*
|
|
4
|
+
* Dependency graph:
|
|
5
|
+
* ResearchAgent ─┐
|
|
6
|
+
* StrategyAgent ├── SynthesisAgent (all three run in parallel)
|
|
7
|
+
* DesignAgent ─┘
|
|
8
|
+
*
|
|
9
|
+
* All three parallel agents are fully independent. SynthesisAgent
|
|
10
|
+
* waits for all three and combines their outputs into a final deliverable.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* const graph = createResearchGraph(
|
|
14
|
+
* { research: "agent-uuid-1", strategy: "agent-uuid-2",
|
|
15
|
+
* design: "agent-uuid-3", synthesis: "agent-uuid-4" },
|
|
16
|
+
* "Design a distributed caching strategy for the platform"
|
|
17
|
+
* )
|
|
18
|
+
* await scheduler.execute(graph, { projectId, coordinatorId })
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { TaskGraph } from "../TaskGraph"
|
|
22
|
+
import type { TaskNodeConfig } from "../TaskNode"
|
|
23
|
+
|
|
24
|
+
export interface ResearchAgentIds {
|
|
25
|
+
research: string
|
|
26
|
+
strategy: string
|
|
27
|
+
design: string
|
|
28
|
+
synthesis: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function createResearchGraph(
|
|
32
|
+
agentIds: ResearchAgentIds,
|
|
33
|
+
topic: string,
|
|
34
|
+
options: {
|
|
35
|
+
researchTimeout?: number
|
|
36
|
+
strategyTimeout?: number
|
|
37
|
+
designTimeout?: number
|
|
38
|
+
synthesisTimeout?: number
|
|
39
|
+
} = {}
|
|
40
|
+
): TaskGraph {
|
|
41
|
+
const nodes: TaskNodeConfig[] = [
|
|
42
|
+
{
|
|
43
|
+
id: "research",
|
|
44
|
+
agentId: agentIds.research,
|
|
45
|
+
name: "ResearchAgent",
|
|
46
|
+
taskDescription:
|
|
47
|
+
`Research the following topic using available knowledge bases and sources: "${topic}".` +
|
|
48
|
+
` Output: { findings: string[], sources: string[], keyInsights: string[] }.`,
|
|
49
|
+
deps: [],
|
|
50
|
+
timeout: options.researchTimeout ?? 120_000,
|
|
51
|
+
maxRetries: 1,
|
|
52
|
+
priority: 8,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: "strategy",
|
|
56
|
+
agentId: agentIds.strategy,
|
|
57
|
+
name: "StrategyAgent",
|
|
58
|
+
taskDescription:
|
|
59
|
+
`Design a strategic framework or approach for: "${topic}".` +
|
|
60
|
+
` Work independently — you will NOT have the research findings yet.` +
|
|
61
|
+
` Output: { approach: string, phases: string[], risks: string[], successMetrics: string[] }.`,
|
|
62
|
+
deps: [],
|
|
63
|
+
timeout: options.strategyTimeout ?? 90_000,
|
|
64
|
+
maxRetries: 1,
|
|
65
|
+
priority: 8,
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: "design",
|
|
69
|
+
agentId: agentIds.design,
|
|
70
|
+
name: "DesignAgent",
|
|
71
|
+
taskDescription:
|
|
72
|
+
`Design the structure or architecture for: "${topic}".` +
|
|
73
|
+
` Work independently — focus on structure, not content.` +
|
|
74
|
+
` Output: { structure: string, components: string[], diagram: string (ASCII or Mermaid) }.`,
|
|
75
|
+
deps: [],
|
|
76
|
+
timeout: options.designTimeout ?? 90_000,
|
|
77
|
+
maxRetries: 1,
|
|
78
|
+
priority: 8,
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
id: "synthesis",
|
|
82
|
+
agentId: agentIds.synthesis,
|
|
83
|
+
name: "SynthesisAgent",
|
|
84
|
+
taskDescription:
|
|
85
|
+
`Synthesize the research findings, strategic framework, and design structure into a cohesive deliverable.` +
|
|
86
|
+
` The dependency context contains all three agents' outputs.` +
|
|
87
|
+
` Topic: "${topic}".` +
|
|
88
|
+
` Output a comprehensive, well-structured document that combines all inputs coherently.`,
|
|
89
|
+
deps: ["research", "strategy", "design"],
|
|
90
|
+
timeout: options.synthesisTimeout ?? 150_000,
|
|
91
|
+
maxRetries: 2,
|
|
92
|
+
priority: 0,
|
|
93
|
+
},
|
|
94
|
+
]
|
|
95
|
+
|
|
96
|
+
return new TaskGraph(nodes)
|
|
97
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ParallelStrategy — executes DAG nodes in parallel as slots become available
|
|
3
|
+
*
|
|
4
|
+
* Picks nodes from the READY queue in FIFO order.
|
|
5
|
+
* Nodes are launched immediately when a worker slot is available,
|
|
6
|
+
* otherwise they wait in the queue.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { TaskNode } from "../TaskNode"
|
|
10
|
+
|
|
11
|
+
export interface ExecutionStrategy {
|
|
12
|
+
pick(queue: TaskNode[]): TaskNode | undefined
|
|
13
|
+
/** Called once at graph start to allow strategy-level initialization */
|
|
14
|
+
initialize?(nodes: Map<string, TaskNode>): void
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class ParallelStrategy implements ExecutionStrategy {
|
|
18
|
+
pick(queue: TaskNode[]): TaskNode | undefined {
|
|
19
|
+
return queue.shift()
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PriorityStrategy — for research swarms
|
|
3
|
+
*
|
|
4
|
+
* Boosts the priority of nodes on the critical path so they run first
|
|
5
|
+
* when slots are limited. Within same effective priority, FIFO order applies.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { TaskNode } from "../TaskNode"
|
|
9
|
+
import { TaskGraph } from "../TaskGraph"
|
|
10
|
+
import type { ExecutionStrategy } from "./ParallelStrategy"
|
|
11
|
+
|
|
12
|
+
export class PriorityStrategy implements ExecutionStrategy {
|
|
13
|
+
private criticalPathSet = new Set<string>()
|
|
14
|
+
private readonly CRITICAL_BOOST = 1000
|
|
15
|
+
|
|
16
|
+
initialize(nodes: Map<string, TaskNode>): void {
|
|
17
|
+
// Build a temporary graph for critical path calculation
|
|
18
|
+
const configs = [...nodes.values()].map(n => ({
|
|
19
|
+
id: n.id,
|
|
20
|
+
agentId: n.agentId,
|
|
21
|
+
name: n.name,
|
|
22
|
+
taskDescription: n.taskDescription,
|
|
23
|
+
deps: n.deps,
|
|
24
|
+
timeout: n.timeout,
|
|
25
|
+
maxRetries: n.maxRetries,
|
|
26
|
+
priority: n.priority,
|
|
27
|
+
}))
|
|
28
|
+
const graph = new TaskGraph(configs)
|
|
29
|
+
for (const id of graph.getCriticalPath()) {
|
|
30
|
+
this.criticalPathSet.add(id)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
pick(queue: TaskNode[]): TaskNode | undefined {
|
|
35
|
+
if (queue.length === 0) return undefined
|
|
36
|
+
|
|
37
|
+
// Sort: critical path nodes first, then by node.priority desc, then FIFO (stable)
|
|
38
|
+
queue.sort((a, b) => {
|
|
39
|
+
const aBoost = this.criticalPathSet.has(a.id) ? this.CRITICAL_BOOST : 0
|
|
40
|
+
const bBoost = this.criticalPathSet.has(b.id) ? this.CRITICAL_BOOST : 0
|
|
41
|
+
return (b.priority + bBoost) - (a.priority + aBoost)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
return queue.shift()
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hive Scheduler Module
|
|
3
|
+
*
|
|
4
|
+
* Croner-based scheduling system for Hive.
|
|
5
|
+
* Supports recurring and one-shot cron jobs with SQLite persistence.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export { CronScheduler } from "./CronScheduler";
|
|
9
|
+
export { executeScheduledTask, createTaskHandler, notifyTaskCompletion, setSchedulerForCleanup } from "./integration";
|
|
10
|
+
export type {
|
|
11
|
+
CronJob,
|
|
12
|
+
TaskRun,
|
|
13
|
+
CreateCronJobInput,
|
|
14
|
+
UpdateCronJobInput,
|
|
15
|
+
CronJobStatus,
|
|
16
|
+
CronJobExecutionHandler,
|
|
17
|
+
CronJobExecutionResult,
|
|
18
|
+
TaskType,
|
|
19
|
+
TaskStatus,
|
|
20
|
+
TaskRunStatus,
|
|
21
|
+
CronerOptions,
|
|
22
|
+
} from "./types";
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hive Scheduler - Pipeline Integration
|
|
3
|
+
*
|
|
4
|
+
* Integrates cron jobs with the Hive agent pipeline.
|
|
5
|
+
* Converts cron jobs into system messages that flow through the agent system.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { CronJob, CronJobExecutionResult } from "./types";
|
|
9
|
+
import { logger } from "../utils/logger";
|
|
10
|
+
import { getDb } from "../storage/sqlite";
|
|
11
|
+
import { buildAgentLoop } from "../agent/agent-loop";
|
|
12
|
+
import { resolveAgentId } from "../storage/onboarding";
|
|
13
|
+
import { sendToUserChannel } from "../gateway/channel-notify";
|
|
14
|
+
import { addMessage } from "../agent/conversation-store";
|
|
15
|
+
import { resolveBestChannel } from "../tools/cron/index";
|
|
16
|
+
|
|
17
|
+
const log = logger.child("SchedulerIntegration");
|
|
18
|
+
|
|
19
|
+
let _scheduler: { runCleanup(): void } | null = null;
|
|
20
|
+
|
|
21
|
+
export function setSchedulerForCleanup(scheduler: { runCleanup(): void }): void {
|
|
22
|
+
_scheduler = scheduler;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Execute a cron job through the agent pipeline
|
|
27
|
+
*
|
|
28
|
+
* This handler:
|
|
29
|
+
* 1. Parses the job payload
|
|
30
|
+
* 2. Builds a system message with metadata including the `task` field as instruction
|
|
31
|
+
* 3. Routes to the target agent (or Coordinator if none specified)
|
|
32
|
+
* 4. Executes the tool if tool_name is specified
|
|
33
|
+
* 5. Returns the agent response
|
|
34
|
+
*/
|
|
35
|
+
export async function executeScheduledTask(job: CronJob): Promise<CronJobExecutionResult> {
|
|
36
|
+
log.info(`[execute] Processing job "${job.name}" (${job.id})`);
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
let payload: Record<string, unknown>;
|
|
40
|
+
try {
|
|
41
|
+
payload = JSON.parse(job.payload);
|
|
42
|
+
} catch (err) {
|
|
43
|
+
log.error(`[execute] Invalid payload JSON for job "${job.id}": ${(err as Error).message}`);
|
|
44
|
+
return { success: false, error: "Invalid payload JSON" };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const prompt = (payload.prompt || payload.message) as string | undefined;
|
|
48
|
+
if (!prompt && !payload._internal && !job.task) {
|
|
49
|
+
log.error(`[execute] Job "${job.id}" has no prompt, message, or task instruction`);
|
|
50
|
+
return { success: false, error: "Missing prompt, message, or task instruction" };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (payload._internal === true && (payload as any).action === "cleanup") {
|
|
54
|
+
if (_scheduler) {
|
|
55
|
+
_scheduler.runCleanup();
|
|
56
|
+
} else {
|
|
57
|
+
log.warn("[execute] Cleanup job fired but scheduler instance not available");
|
|
58
|
+
}
|
|
59
|
+
log.info("[execute] Cleanup job executed");
|
|
60
|
+
return { success: true, response: "Cleanup completed" };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Build message metadata
|
|
64
|
+
const metadata = {
|
|
65
|
+
source: "scheduler" as const,
|
|
66
|
+
task_id: job.id,
|
|
67
|
+
task_name: job.name,
|
|
68
|
+
channel: job.channel,
|
|
69
|
+
scheduled: true,
|
|
70
|
+
tool_name: job.tool_name || undefined,
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
let targetAgentId: string | null = job.agent_id || null;
|
|
74
|
+
|
|
75
|
+
if (!targetAgentId) {
|
|
76
|
+
targetAgentId = resolveAgentId(null);
|
|
77
|
+
log.debug(`[execute] No agent specified, routing to Coordinator: ${targetAgentId}`);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const db = getDb();
|
|
81
|
+
const user = db.query("SELECT id, timezone, language FROM users LIMIT 1").get() as {
|
|
82
|
+
id: string;
|
|
83
|
+
timezone: string;
|
|
84
|
+
language: string | null;
|
|
85
|
+
} | undefined;
|
|
86
|
+
|
|
87
|
+
const userTimezone = user?.timezone || "UTC";
|
|
88
|
+
const userLanguage = user?.language || "en";
|
|
89
|
+
|
|
90
|
+
const now = new Date();
|
|
91
|
+
const dateOptions: Intl.DateTimeFormatOptions = {
|
|
92
|
+
timeZone: userTimezone,
|
|
93
|
+
year: "numeric",
|
|
94
|
+
month: "long",
|
|
95
|
+
day: "numeric",
|
|
96
|
+
weekday: "long",
|
|
97
|
+
};
|
|
98
|
+
const timeOptions: Intl.DateTimeFormatOptions = {
|
|
99
|
+
timeZone: userTimezone,
|
|
100
|
+
hour: "2-digit",
|
|
101
|
+
minute: "2-digit",
|
|
102
|
+
second: "2-digit",
|
|
103
|
+
hour12: false,
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const fecha_usuario = new Intl.DateTimeFormat(userLanguage === "es" ? "es-ES" : "en-US", dateOptions).format(now);
|
|
107
|
+
const hora_usuario = new Intl.DateTimeFormat(userLanguage === "es" ? "es-ES" : "en-US", timeOptions).format(now);
|
|
108
|
+
|
|
109
|
+
// Build the full prompt with the `task` field as the primary instruction
|
|
110
|
+
const contextPrompt = `[SCHEDULED TASK]
|
|
111
|
+
Name: ${job.name}
|
|
112
|
+
Instruction: ${job.task}
|
|
113
|
+
Type: ${job.task_type}
|
|
114
|
+
Triggered at: ${hora_usuario} on ${fecha_usuario} (${userTimezone})
|
|
115
|
+
|
|
116
|
+
${prompt || `Execute tool: ${job.tool_name}`}`;
|
|
117
|
+
|
|
118
|
+
log.debug(`[execute] Sending to agent ${targetAgentId}: "${contextPrompt.slice(0, 100)}..."`);
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
const agentLoop = buildAgentLoop({ mcpManager: undefined });
|
|
122
|
+
|
|
123
|
+
const sessionId = `sched_${job.id}_${Date.now()}`;
|
|
124
|
+
|
|
125
|
+
const agentChannel = (job.channel && job.channel !== "system")
|
|
126
|
+
? job.channel
|
|
127
|
+
: resolveBestChannel(user?.id || "");
|
|
128
|
+
|
|
129
|
+
const messages = [{ role: "user", content: contextPrompt }];
|
|
130
|
+
const stream = agentLoop.stream({ messages }, {
|
|
131
|
+
configurable: {
|
|
132
|
+
thread_id: sessionId,
|
|
133
|
+
agent_id: targetAgentId || undefined,
|
|
134
|
+
channel: agentChannel,
|
|
135
|
+
user_id: user?.id || "",
|
|
136
|
+
system_prompt: undefined,
|
|
137
|
+
raw_user_message: contextPrompt,
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
let response = "";
|
|
142
|
+
let hasError = false;
|
|
143
|
+
|
|
144
|
+
for await (const chunk of stream) {
|
|
145
|
+
if (chunk.agent?.messages) {
|
|
146
|
+
const lastMsg = chunk.agent.messages[chunk.agent.messages.length - 1];
|
|
147
|
+
if (lastMsg?.content) {
|
|
148
|
+
response += lastMsg.content;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (chunk.tools?.messages) {
|
|
152
|
+
for (const msg of chunk.tools.messages) {
|
|
153
|
+
if (msg.content?.error) {
|
|
154
|
+
hasError = true;
|
|
155
|
+
response += ` [Tool error: ${JSON.stringify(msg.content)}]`;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (hasError && !response) {
|
|
162
|
+
throw new Error("Agent execution returned errors");
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
log.info(`[execute] Agent response received for job "${job.name}"`);
|
|
166
|
+
|
|
167
|
+
return {
|
|
168
|
+
success: true,
|
|
169
|
+
response: response || "Task executed successfully",
|
|
170
|
+
};
|
|
171
|
+
} catch (agentErr) {
|
|
172
|
+
log.error(`[execute] Agent execution failed: ${(agentErr as Error).message}`);
|
|
173
|
+
return {
|
|
174
|
+
success: false,
|
|
175
|
+
error: `Agent execution failed: ${(agentErr as Error).message}`,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
} catch (err) {
|
|
179
|
+
log.error(`[execute] Job execution failed: ${(err as Error).message}`);
|
|
180
|
+
return {
|
|
181
|
+
success: false,
|
|
182
|
+
error: (err as Error).message,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Send notification to user's channel after job execution
|
|
189
|
+
*/
|
|
190
|
+
export async function notifyTaskCompletion(
|
|
191
|
+
taskId: string,
|
|
192
|
+
taskName: string,
|
|
193
|
+
success: boolean,
|
|
194
|
+
response?: string,
|
|
195
|
+
error?: string
|
|
196
|
+
): Promise<void> {
|
|
197
|
+
const db = getDb();
|
|
198
|
+
|
|
199
|
+
const task = db.query(
|
|
200
|
+
"SELECT channel, agent_id FROM cron_jobs WHERE id = ?"
|
|
201
|
+
).get(taskId) as { channel: string; agent_id: string | null } | undefined;
|
|
202
|
+
|
|
203
|
+
if (!task) {
|
|
204
|
+
log.warn(`[notify] Job "${taskId}" not found`);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const userRow = db.query("SELECT id FROM users LIMIT 1").get() as { id: string } | undefined;
|
|
209
|
+
const userId = userRow?.id || "";
|
|
210
|
+
|
|
211
|
+
const explicitChannel = task.channel && task.channel !== "system" ? task.channel : undefined;
|
|
212
|
+
const notifyChannel = resolveBestChannel(userId, explicitChannel) || "webchat";
|
|
213
|
+
log.info(`[notifyTaskCompletion] task.channel=${task.channel} explicit=${explicitChannel} resolved=${notifyChannel}`);
|
|
214
|
+
|
|
215
|
+
const status = success ? "✅" : "❌";
|
|
216
|
+
const message = success
|
|
217
|
+
? `${status} Scheduled task "${taskName}" completed\n${response || ""}`
|
|
218
|
+
: `${status} Scheduled task "${taskName}" failed\n${error || ""}`;
|
|
219
|
+
|
|
220
|
+
log.info(`[notify] Sending notification to ${notifyChannel}: "${message.slice(0, 50)}..."`);
|
|
221
|
+
|
|
222
|
+
try {
|
|
223
|
+
addMessage(userId, "assistant", message, { channel: notifyChannel });
|
|
224
|
+
} catch (e) {
|
|
225
|
+
log.warn(`[notify] Failed to persist notification to DB: ${(e as Error).message}`);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
await sendToUserChannel(notifyChannel, userId, message);
|
|
229
|
+
log.info(`[notify] Notification sent to ${notifyChannel}`);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Create the job execution handler for CronScheduler
|
|
234
|
+
*/
|
|
235
|
+
export function createTaskHandler() {
|
|
236
|
+
return executeScheduledTask;
|
|
237
|
+
}
|