@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,467 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Compiler — Implementa las 4 estrategias de Context Engineering:
|
|
3
|
+
*
|
|
4
|
+
* 1. ESCRIBIR (Write) — Guardar información fuera del contexto:
|
|
5
|
+
* - Scratchpad: notas persistentes por conversación
|
|
6
|
+
* - Trazas de ejecución: registro en traces table
|
|
7
|
+
*
|
|
8
|
+
* 2. SELECCIONAR (Select) — Traer solo lo relevante:
|
|
9
|
+
* - Tool Loadout: máx 3-5 tools relevantes por turno
|
|
10
|
+
* - Playbook filtering: reglas ACE aplicables a esta tarea
|
|
11
|
+
* - Historial selectivo: resumen + mensajes recientes
|
|
12
|
+
*
|
|
13
|
+
* 3. COMPRIMIR (Compress) — Reducir tokens manteniendo información:
|
|
14
|
+
* - Compaction: resumir mensajes viejos
|
|
15
|
+
* - Tool result clearing: reemplazar resultados antiguos por resúmenes
|
|
16
|
+
*
|
|
17
|
+
* 4. AISLAR (Isolate) — Separar contextos por agente:
|
|
18
|
+
* - Cada worker recibe su propio contexto mínimo
|
|
19
|
+
* - El Coordinador ve el panorama completo
|
|
20
|
+
*
|
|
21
|
+
* TODOS los datos se formatean en TOON para ahorro de tokens.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { getDb } from "../storage/sqlite"
|
|
25
|
+
import { logger } from "../utils/logger"
|
|
26
|
+
import type { LLMMessage, LLMToolDef, ContentPart } from "./llm-client"
|
|
27
|
+
import type { MCPClientManager } from "@johpaz/hive-agents-mcp"
|
|
28
|
+
import { syncToolCatalogToFTS, mcpToolFullName } from "./tool-selector"
|
|
29
|
+
import { syncSkillsToFTS, getMinimalSkills, selectSkills, type SkillDescriptor } from "./skill-selector"
|
|
30
|
+
import { syncPlaybookToFTS } from "./playbook-selector"
|
|
31
|
+
import { getRecentMessages, getSummary, getScratchpad, toAPIMessages } from "./conversation-store"
|
|
32
|
+
import { formatContext, estimateTokens } from "../utils/toon"
|
|
33
|
+
import { buildSystemPromptWithProjects } from "./prompt-builder"
|
|
34
|
+
import { createAllTools } from "../tools/index.ts"
|
|
35
|
+
import { resolveUserId } from "../storage/onboarding"
|
|
36
|
+
import { getMCPManager as getSingletonMCPManager } from "../mcp/singleton"
|
|
37
|
+
import { syncMCPToolsToDB, syncMCPToolsToFTS } from "../mcp/tool-sync"
|
|
38
|
+
import { getUserDate, getUserTime } from "../utils/date"
|
|
39
|
+
|
|
40
|
+
const log = logger.child("context-compiler")
|
|
41
|
+
|
|
42
|
+
// Configuration constants
|
|
43
|
+
const KEEP_LAST_N_MESSAGES = 15 // Always keep last N messages (Strategy: SELECT) — increased because tool calls/results are now persisted
|
|
44
|
+
const DEFAULT_CONTEXT_WINDOW = 250000 // Default context window when model is unknown
|
|
45
|
+
const COMPACT_RATIO = 0.80 // Compact when estimated input exceeds 70% of context window
|
|
46
|
+
const MAX_SYSTEM_PROMPT_CHARS_CAP = 128000 // Hard cap for pathological prompts; normal budget is model-aware
|
|
47
|
+
|
|
48
|
+
// MINIMAL TOOL SET — fixed always-available tools
|
|
49
|
+
// The agent discovers the rest via search_knowledge
|
|
50
|
+
const MINIMAL_TOOLS = new Set([
|
|
51
|
+
"save_note",
|
|
52
|
+
"notify",
|
|
53
|
+
"report_progress",
|
|
54
|
+
"search_knowledge",
|
|
55
|
+
])
|
|
56
|
+
|
|
57
|
+
// MINIMAL SKILL SET — fixed always-available skills
|
|
58
|
+
// These skills are ALWAYS in context - the agent uses them to discover everything else
|
|
59
|
+
const MINIMAL_SKILL_NAMES = [
|
|
60
|
+
"busqueda_fts5", // Core: how to find tools, skills, MCP, playbook via search_knowledge
|
|
61
|
+
"memory_manager", // Persistent notes that survive context compression
|
|
62
|
+
"canvas_report", // Display results to users with charts, tables, cards
|
|
63
|
+
"task_orchestrator", // Agent coordination via notify
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
// ─── Types ─────────────────────────────────────────────────────────────────
|
|
67
|
+
|
|
68
|
+
// Simple tool interface for context compilation
|
|
69
|
+
export interface ContextTool {
|
|
70
|
+
name: string
|
|
71
|
+
description: string
|
|
72
|
+
parameters: Record<string, unknown>
|
|
73
|
+
execute?: (params: Record<string, unknown>) => Promise<unknown>
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface CompiledContext {
|
|
77
|
+
systemPrompt: string
|
|
78
|
+
messages: LLMMessage[]
|
|
79
|
+
tools: LLMToolDef[]
|
|
80
|
+
allTools: ContextTool[]
|
|
81
|
+
skills: SkillDescriptor[] // Skills loaded (minimal + discovered)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ─── Main compiler ─────────────────────────────────────────────────────────
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Compile context for agent execution implementing 4 strategies:
|
|
88
|
+
* 1. WRITE - Load scratchpad notes
|
|
89
|
+
* 2. SELECT - Tool loadout, playbook rules, selective history
|
|
90
|
+
* 3. COMPRESS - Use summaries, clear old tool results
|
|
91
|
+
* 4. ISOLATE - Worker gets minimal context
|
|
92
|
+
*/
|
|
93
|
+
export async function compileContext(opts: {
|
|
94
|
+
agentId: string
|
|
95
|
+
threadId: string
|
|
96
|
+
userId?: string
|
|
97
|
+
userMessage: string | ContentPart[]
|
|
98
|
+
channel?: string
|
|
99
|
+
isolated?: boolean
|
|
100
|
+
taskContext?: string | ContentPart[]
|
|
101
|
+
mcpManager?: MCPClientManager | null
|
|
102
|
+
}): Promise<CompiledContext> {
|
|
103
|
+
const db = getDb()
|
|
104
|
+
const { agentId, threadId, mcpManager, userMessage, isolated, taskContext } = opts
|
|
105
|
+
|
|
106
|
+
// Fallback: Get MCP Manager from singleton if not provided
|
|
107
|
+
const effectiveMcpManager = mcpManager ?? (() => {
|
|
108
|
+
const singletonMcp = getSingletonMCPManager()
|
|
109
|
+
if (singletonMcp) {
|
|
110
|
+
log.info(`[context-compiler] Using MCP Manager from singleton`)
|
|
111
|
+
return singletonMcp
|
|
112
|
+
}
|
|
113
|
+
return null
|
|
114
|
+
})()
|
|
115
|
+
|
|
116
|
+
// Resolve userId from database with priority: explicit param → channel identity → single user
|
|
117
|
+
const userId = opts.userId || resolveUserId({
|
|
118
|
+
threadId,
|
|
119
|
+
channel: opts.channel,
|
|
120
|
+
channelUserId: threadId
|
|
121
|
+
}) || threadId || ""
|
|
122
|
+
|
|
123
|
+
// [STEP-1] Load agent config
|
|
124
|
+
log.info(`[context-compiler] [STEP-1] Loading agent config for id=${agentId}`)
|
|
125
|
+
let agent: any
|
|
126
|
+
try {
|
|
127
|
+
agent = db.query<any, [string]>(
|
|
128
|
+
"SELECT * FROM agents WHERE id = ?"
|
|
129
|
+
).get(agentId)
|
|
130
|
+
} catch (err) {
|
|
131
|
+
log.error(`[context-compiler] [STEP-1] ❌ FAILED loading agent: ${JSON.stringify(err)}`)
|
|
132
|
+
throw err
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (!agent) {
|
|
136
|
+
throw new Error(`Agent not found: ${agentId}`)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const isWorker = agent.role === 'worker' || !!isolated
|
|
140
|
+
log.info(`[context-compiler] [STEP-1] ✅ Compiling for ${isWorker ? 'worker' : 'coordinator'} agent=${agent.name}`)
|
|
141
|
+
|
|
142
|
+
// Load model's context window for compaction decisions
|
|
143
|
+
let modelContextWindow = DEFAULT_CONTEXT_WINDOW
|
|
144
|
+
if (agent.model_id) {
|
|
145
|
+
try {
|
|
146
|
+
const mRow = db.query<any, [string]>("SELECT context_window FROM models WHERE id = ?").get(agent.model_id.replace(/^[^/]+\//, ''))
|
|
147
|
+
if (mRow?.context_window) modelContextWindow = mRow.context_window
|
|
148
|
+
} catch { /* use default */ }
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// [STEP-2] STRATEGY 1: WRITE — Load scratchpad (persistent notes)
|
|
152
|
+
log.info(`[context-compiler] [STEP-2] Loading scratchpad...`)
|
|
153
|
+
let scratchpadNotes: ReturnType<typeof getScratchpad> = []
|
|
154
|
+
try {
|
|
155
|
+
scratchpadNotes = getScratchpad(threadId)
|
|
156
|
+
log.info(`[context-compiler] [STEP-2] ✅ Loaded ${scratchpadNotes.length} scratchpad notes`)
|
|
157
|
+
} catch (err) {
|
|
158
|
+
log.error(`[context-compiler] [STEP-2] ❌ FAILED loading scratchpad: ${JSON.stringify(err)}`)
|
|
159
|
+
throw err
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// [STEP-3c] Load MCP tools (executors only — FTS sync happens here too)
|
|
163
|
+
log.info(`[context-compiler] [STEP-3c] Loading MCP tools...`)
|
|
164
|
+
const mcpToolExecutors: ContextTool[] = []
|
|
165
|
+
|
|
166
|
+
if (effectiveMcpManager) {
|
|
167
|
+
try {
|
|
168
|
+
const dbServers = db.query<any, []>(
|
|
169
|
+
"SELECT id, name, status FROM mcp_servers WHERE enabled = 1"
|
|
170
|
+
).all()
|
|
171
|
+
|
|
172
|
+
for (const server of dbServers) {
|
|
173
|
+
// Try ID first (normalized), then name
|
|
174
|
+
let serverTools = effectiveMcpManager.getServerTools(server.id)
|
|
175
|
+
if (!serverTools || serverTools.length === 0) {
|
|
176
|
+
serverTools = effectiveMcpManager.getServerTools(server.name)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (serverTools && serverTools.length > 0) {
|
|
180
|
+
log.info(`[context-compiler] [STEP-3c] Server ${server.name}: ${serverTools.length} tools`)
|
|
181
|
+
|
|
182
|
+
for (const mcpTool of serverTools) {
|
|
183
|
+
// Sanitized name valid for all LLM providers (no spaces, max 64 chars)
|
|
184
|
+
const fullName = mcpToolFullName(server.name, mcpTool.name)
|
|
185
|
+
|
|
186
|
+
// Executor for agent-loop (has the real call)
|
|
187
|
+
mcpToolExecutors.push({
|
|
188
|
+
name: fullName,
|
|
189
|
+
description: mcpTool.description || `Tool from ${server.name}`,
|
|
190
|
+
parameters: mcpTool.inputSchema || { type: "object", properties: {} },
|
|
191
|
+
execute: async (params: Record<string, unknown>) => {
|
|
192
|
+
// Return raw JS value — agent-loop will TOON-encode via formatToolResult.
|
|
193
|
+
// Never pre-stringify here: formatToolResult(string) double-encodes.
|
|
194
|
+
return await effectiveMcpManager.callTool(server.id, mcpTool.name, params)
|
|
195
|
+
},
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
}
|
|
199
|
+
} else {
|
|
200
|
+
log.warn(`[context-compiler] [STEP-3c] Server ${server.name} has no tools (not connected yet)`)
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
log.info(`[context-compiler] [STEP-3c] ✅ Loaded ${mcpToolExecutors.length} MCP tools`)
|
|
205
|
+
|
|
206
|
+
// Persist MCP tool definitions to DB for search_knowledge and FTS5 search
|
|
207
|
+
if (mcpToolExecutors.length > 0) {
|
|
208
|
+
try {
|
|
209
|
+
for (const server of dbServers) {
|
|
210
|
+
let serverTools = effectiveMcpManager!.getServerTools(server.id)
|
|
211
|
+
if (!serverTools || serverTools.length === 0) {
|
|
212
|
+
serverTools = effectiveMcpManager!.getServerTools(server.name)
|
|
213
|
+
}
|
|
214
|
+
if (serverTools && serverTools.length > 0) {
|
|
215
|
+
syncMCPToolsToDB(server.id || server.name, server.name, serverTools)
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
await syncMCPToolsToFTS();
|
|
219
|
+
log.info(`[context-compiler] [STEP-3c] ✅ Persisted MCP tools to DB + FTS5`)
|
|
220
|
+
} catch (syncErr) {
|
|
221
|
+
log.warn(`[context-compiler] [STEP-3c] ⚠️ Failed to persist MCP tools to DB: ${(syncErr as Error).message}`)
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
} catch (err) {
|
|
225
|
+
log.error(`[context-compiler] [STEP-3c] ❌ Failed: ${(err as Error).message}`)
|
|
226
|
+
}
|
|
227
|
+
} else {
|
|
228
|
+
log.info(`[context-compiler] [STEP-3c] ⚠️ No MCP manager, skipping MCP tools`)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// [STEP-4] Minimal tool set — agent discovers the rest via search_knowledge
|
|
232
|
+
log.info(`[context-compiler] [STEP-4] Building minimal tool set`)
|
|
233
|
+
|
|
234
|
+
// [STEP-8] Combine native tools + MCP executors loaded in STEP-3c
|
|
235
|
+
const config = { tools: {} }
|
|
236
|
+
const allNativeTools = createAllTools(config)
|
|
237
|
+
const nativeTools: ContextTool[] = allNativeTools.map(t => ({
|
|
238
|
+
name: t.name,
|
|
239
|
+
description: t.description || "",
|
|
240
|
+
parameters: t.parameters as any,
|
|
241
|
+
execute: t.execute,
|
|
242
|
+
}))
|
|
243
|
+
|
|
244
|
+
const allTools = [...nativeTools, ...mcpToolExecutors]
|
|
245
|
+
|
|
246
|
+
// Only native minimal tools in LLM context
|
|
247
|
+
// MCP tools are discovered dynamically via search_knowledge(type="mcp")
|
|
248
|
+
const filteredNativeTools: ContextTool[] = nativeTools.filter(t => MINIMAL_TOOLS.has(t.name))
|
|
249
|
+
|
|
250
|
+
const nativeToolsForLLM: LLMToolDef[] = filteredNativeTools.map(t => ({
|
|
251
|
+
type: "function" as const,
|
|
252
|
+
function: {
|
|
253
|
+
name: t.name,
|
|
254
|
+
description: t.description,
|
|
255
|
+
parameters: t.parameters,
|
|
256
|
+
},
|
|
257
|
+
}))
|
|
258
|
+
|
|
259
|
+
const toolsForLLM: LLMToolDef[] = nativeToolsForLLM
|
|
260
|
+
|
|
261
|
+
log.info(`[context-compiler] [STEP-4] Minimal native tool set: ${filteredNativeTools.length} tools`)
|
|
262
|
+
log.info(`[context-compiler] [STEP-4b] MCP tools available via search_knowledge: ${mcpToolExecutors.length} (not injected)`)
|
|
263
|
+
log.info(`[context-compiler] [STEP-8] ✅ Combined tools: ${allTools.length} total executors, ${toolsForLLM.length} in LLM context`)
|
|
264
|
+
|
|
265
|
+
// [STEP-8b] STRATEGY 2: SELECT — Skill Loadout (minimal + discovered)
|
|
266
|
+
log.info(`[context-compiler] [STEP-8b] Building skill loadout...`)
|
|
267
|
+
let minimalSkills: SkillDescriptor[] = []
|
|
268
|
+
let discoveredSkills: SkillDescriptor[] = []
|
|
269
|
+
|
|
270
|
+
try {
|
|
271
|
+
// Load minimal skills (always available)
|
|
272
|
+
minimalSkills = getMinimalSkills()
|
|
273
|
+
log.info(`[context-compiler] [STEP-8b] ✅ Loaded ${minimalSkills.length} minimal skills`)
|
|
274
|
+
|
|
275
|
+
// Discover additional skills via FTS5 (coordinator only)
|
|
276
|
+
if (!isWorker) {
|
|
277
|
+
const inputForSkills = taskContext || userMessage
|
|
278
|
+
const textMessage = typeof inputForSkills === "string"
|
|
279
|
+
? inputForSkills
|
|
280
|
+
: Array.isArray(inputForSkills)
|
|
281
|
+
? inputForSkills.filter(p => p.type === "text").map(p => (p as any).text).join("\n")
|
|
282
|
+
: String(inputForSkills)
|
|
283
|
+
discoveredSkills = selectSkills(textMessage)
|
|
284
|
+
log.info(`[context-compiler] [STEP-8b] ✅ Discovered ${discoveredSkills.length} additional skills via FTS5`)
|
|
285
|
+
}
|
|
286
|
+
} catch (err) {
|
|
287
|
+
log.warn(`[context-compiler] [STEP-8b] ⚠️ Skill loadout failed: ${(err as Error).message}`)
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Combine skills (minimal + discovered, avoiding duplicates)
|
|
291
|
+
const skillMap = new Map<string, SkillDescriptor>()
|
|
292
|
+
for (const skill of minimalSkills) {
|
|
293
|
+
skillMap.set(skill.name, skill)
|
|
294
|
+
}
|
|
295
|
+
for (const skill of discoveredSkills) {
|
|
296
|
+
if (!skillMap.has(skill.name)) {
|
|
297
|
+
skillMap.set(skill.name, skill)
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
const allSkills = Array.from(skillMap.values())
|
|
301
|
+
|
|
302
|
+
// [STEP-9] STRATEGY 3: COMPRESS — Load history with compaction
|
|
303
|
+
log.info(`[context-compiler] [STEP-9] Loading conversation history...`)
|
|
304
|
+
let recentMessages: ReturnType<typeof getRecentMessages> = []
|
|
305
|
+
try {
|
|
306
|
+
recentMessages = getRecentMessages(threadId, KEEP_LAST_N_MESSAGES)
|
|
307
|
+
log.info(`[context-compiler] [STEP-9] ✅ Loaded ${recentMessages.length} recent messages`)
|
|
308
|
+
} catch (err) {
|
|
309
|
+
log.error(`[context-compiler] [STEP-9] ❌ FAILED loading history: ${JSON.stringify(err)}`)
|
|
310
|
+
throw err
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Check if we need to use summary (conversation is long)
|
|
314
|
+
let summary: ReturnType<typeof getSummary> = null
|
|
315
|
+
try {
|
|
316
|
+
summary = getSummary(threadId)
|
|
317
|
+
} catch (err) {
|
|
318
|
+
log.error(`[context-compiler] [STEP-9b] ❌ FAILED loading summary: ${JSON.stringify(err)}`)
|
|
319
|
+
throw err
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const totalTokens = recentMessages.reduce((sum, m) => sum + estimateTokens(m.content), 0)
|
|
323
|
+
|
|
324
|
+
let messages: LLMMessage[]
|
|
325
|
+
|
|
326
|
+
const compactThreshold = Math.floor(modelContextWindow * COMPACT_RATIO)
|
|
327
|
+
if (summary && totalTokens > compactThreshold) {
|
|
328
|
+
// Use summary + recent messages (Strategy: COMPRESS)
|
|
329
|
+
messages = [
|
|
330
|
+
{ role: "system", content: `[Conversation Summary]: ${summary.summary}` },
|
|
331
|
+
...toAPIMessages(recentMessages),
|
|
332
|
+
]
|
|
333
|
+
log.info(`[context-compiler] [STEP-9c] Using summary (${summary.messages_covered} messages compressed)`)
|
|
334
|
+
} else {
|
|
335
|
+
// Conversation is short enough, use all recent messages
|
|
336
|
+
messages = toAPIMessages(recentMessages)
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// [STEP-10] STRATEGY 4: ISOLATE — Build context based on agent role
|
|
340
|
+
log.info(`[context-compiler] [STEP-10] Building system prompt...`)
|
|
341
|
+
let systemPrompt: string
|
|
342
|
+
try {
|
|
343
|
+
systemPrompt = await buildSystemPromptWithProjects({ agentId, userId })
|
|
344
|
+
log.info(`[context-compiler] [STEP-10] ✅ System prompt built (${systemPrompt.length} chars)`)
|
|
345
|
+
} catch (err) {
|
|
346
|
+
log.error(`[context-compiler] [STEP-10] ❌ FAILED building system prompt: ${JSON.stringify(err)}`)
|
|
347
|
+
throw err
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// [STEP-10b] Inject current date/time (ENTORNO ACTUAL)
|
|
351
|
+
const userRow = db.query<any, [string]>(
|
|
352
|
+
"SELECT timezone FROM users WHERE id = ?"
|
|
353
|
+
).get(userId)
|
|
354
|
+
const userTimezone = userRow?.timezone || "UTC"
|
|
355
|
+
const now = new Date()
|
|
356
|
+
const fecha = getUserDate(userTimezone, now)
|
|
357
|
+
const hora = getUserTime(userTimezone, now)
|
|
358
|
+
const workspaceLine = agent.workspace ? `\n**Workspace**: ${agent.workspace} (usa SIEMPRE este path como basePath en herramientas de filesystem)` : ""
|
|
359
|
+
systemPrompt += `\n\n# ENTORNO ACTUAL\n**Fecha**: ${fecha}\n**Hora**: ${hora}\n**Zona horaria**: ${userTimezone}${workspaceLine}\n`
|
|
360
|
+
log.info(`[context-compiler] [STEP-10b] ✅ Injected current date/time: ${fecha} ${hora} (${userTimezone})`)
|
|
361
|
+
|
|
362
|
+
// Inject scratchpad (Strategy: WRITE) — usando TOON para ahorro de tokens
|
|
363
|
+
if (scratchpadNotes.length > 0) {
|
|
364
|
+
const scratchpadData: Record<string, string> = {}
|
|
365
|
+
for (const n of scratchpadNotes) {
|
|
366
|
+
scratchpadData[n.key] = n.value
|
|
367
|
+
}
|
|
368
|
+
// TOON comprime el formato clave-valor
|
|
369
|
+
const scratchpadContent = formatContext(scratchpadData)
|
|
370
|
+
systemPrompt += `\n\n# SCRATCHPAD (Persistent Notes)\n${scratchpadContent}\n`
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// Dynamic tool discovery instruction (coordinator only)
|
|
374
|
+
// Note: MCP tools are already available directly, no search needed
|
|
375
|
+
if (!isWorker) {
|
|
376
|
+
// Build minimal tools documentation from filtered native tools
|
|
377
|
+
const minimalToolsDocs = filteredNativeTools
|
|
378
|
+
.filter(t => MINIMAL_TOOLS.has(t.name))
|
|
379
|
+
.map(t => `- **${t.name}**: ${t.description || "Herramienta nativa"}`)
|
|
380
|
+
.join("\n")
|
|
381
|
+
|
|
382
|
+
systemPrompt += `\n\n# HERRAMIENTAS SIEMPRE DISPONIBLES\n` +
|
|
383
|
+
`${minimalToolsDocs}\n\n` +
|
|
384
|
+
`## Delegación a workers\n` +
|
|
385
|
+
`Los workers arrancan con estas mismas 4 herramientas mínimas.\n` +
|
|
386
|
+
`**Antes de delegar**, usá \`search_knowledge(type="tools", query="<tarea>")\` para identificar qué tools necesita el worker e incluirlas en la instrucción de \`task_delegate\`.\n`
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
// Inject available skills (minimal + discovered)
|
|
390
|
+
if (allSkills.length > 0) {
|
|
391
|
+
// Minimal skills: inject full body (always-loaded instructions)
|
|
392
|
+
const minimalWithBody = allSkills.filter(s => MINIMAL_SKILL_NAMES.includes(s.name) && s.body)
|
|
393
|
+
if (minimalWithBody.length > 0) {
|
|
394
|
+
let minimalSection = `\n\n# SKILLS SIEMPRE ACTIVAS\n`
|
|
395
|
+
for (const skill of minimalWithBody) {
|
|
396
|
+
minimalSection += `\n## ${skill.name}\n${skill.body}\n`
|
|
397
|
+
}
|
|
398
|
+
systemPrompt += minimalSection
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Discovered skills: list only (body arrives via agent-loop when tools are injected)
|
|
402
|
+
const discoveredOnly = allSkills.filter(s => !MINIMAL_SKILL_NAMES.includes(s.name))
|
|
403
|
+
if (discoveredOnly.length > 0) {
|
|
404
|
+
let discoveredSection = `\n\n# SKILLS DESCUBIERTAS (relevantes para esta tarea)\n`
|
|
405
|
+
for (const skill of discoveredOnly) {
|
|
406
|
+
const desc = skill.description ? ` — ${skill.description}` : ""
|
|
407
|
+
discoveredSection += `- **${skill.name}**${desc}\n`
|
|
408
|
+
}
|
|
409
|
+
systemPrompt += discoveredSection
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
log.info(`[context-compiler] [STEP-10d] Injected ${minimalWithBody.length} minimal skill bodies + ${discoveredOnly.length} discovered skills`)
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// For isolated workers, add task context + tool discovery instruction
|
|
418
|
+
if (isWorker && opts.taskContext) {
|
|
419
|
+
systemPrompt += `\n\n# HERRAMIENTAS DISPONIBLES\n` +
|
|
420
|
+
`Arrancas con herramientas básicas. Si tu tarea requiere herramientas adicionales (web_search, fs_read, browser_navigate, etc.):\n` +
|
|
421
|
+
`1. Usá \`search_knowledge(type="tools", query="<herramienta o tarea>")\` para encontrarlas.\n` +
|
|
422
|
+
`2. Las herramientas que encuentres estarán disponibles para usar inmediatamente.\n` +
|
|
423
|
+
`Si el coordinador te indicó herramientas específicas, buscalas primero con search_knowledge antes de ejecutar tu tarea.\n` +
|
|
424
|
+
`\n# CURRENT TASK\n${opts.taskContext}\n\nFocus ONLY on this task. Do not deviate.`
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// Truncate system prompt only when it exceeds a model-aware budget.
|
|
428
|
+
const maxSystemPromptChars = Math.min(
|
|
429
|
+
MAX_SYSTEM_PROMPT_CHARS_CAP,
|
|
430
|
+
Math.max(8000, Math.floor(modelContextWindow * COMPACT_RATIO * 4))
|
|
431
|
+
)
|
|
432
|
+
if (systemPrompt.length > maxSystemPromptChars) {
|
|
433
|
+
const originalLen = systemPrompt.length
|
|
434
|
+
systemPrompt = systemPrompt.substring(0, maxSystemPromptChars) +
|
|
435
|
+
`\n\n[... System prompt truncated (${originalLen} chars → ${maxSystemPromptChars} chars) ...]`
|
|
436
|
+
log.info(`[context-compiler] System prompt truncated: ${originalLen} → ${maxSystemPromptChars} chars`)
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
const estimatedSystemTokens = estimateTokens(systemPrompt)
|
|
440
|
+
const estimatedMsgTokens = messages.reduce((sum, m) => sum + estimateTokens(typeof m.content === 'string' ? m.content : JSON.stringify(m.content)), 0)
|
|
441
|
+
const estimatedToolTokens = toolsForLLM.reduce((sum, t) => sum + estimateTokens(JSON.stringify(t)), 0)
|
|
442
|
+
const estimatedTotal = estimatedSystemTokens + estimatedMsgTokens + estimatedToolTokens
|
|
443
|
+
const budgetPct = modelContextWindow > 0 ? Math.round((estimatedTotal / modelContextWindow) * 100) : 0
|
|
444
|
+
|
|
445
|
+
log.info(
|
|
446
|
+
`[context-compiler] ✅ DONE: ${allTools.length} total tools, ` +
|
|
447
|
+
`${toolsForLLM.length} selected tools, ${messages.length} messages, ` +
|
|
448
|
+
`${allSkills.length} skills, isolated=${isWorker}, ` +
|
|
449
|
+
`est.tokens: sys=${estimatedSystemTokens} msgs=${estimatedMsgTokens} tools=${estimatedToolTokens} ` +
|
|
450
|
+
`total=${estimatedTotal}/${modelContextWindow} (${budgetPct}%)`
|
|
451
|
+
)
|
|
452
|
+
|
|
453
|
+
return {
|
|
454
|
+
systemPrompt,
|
|
455
|
+
messages,
|
|
456
|
+
tools: toolsForLLM,
|
|
457
|
+
allTools,
|
|
458
|
+
skills: allSkills,
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
// Re-export sync functions for gateway/initializer
|
|
463
|
+
export {
|
|
464
|
+
syncToolCatalogToFTS as syncToolsToFTS,
|
|
465
|
+
syncSkillsToFTS,
|
|
466
|
+
syncPlaybookToFTS,
|
|
467
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { Config } from "../config/loader.ts";
|
|
2
|
+
import { logger } from "../utils/logger.ts";
|
|
3
|
+
import type { LLMMessage as Message } from "../agent/llm-client";
|
|
4
|
+
|
|
5
|
+
export interface ContextGuardResult {
|
|
6
|
+
canProceed: boolean;
|
|
7
|
+
currentTokens: number;
|
|
8
|
+
maxTokens: number;
|
|
9
|
+
utilizationPercent: number;
|
|
10
|
+
needsCompaction: boolean;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export class ContextGuard {
|
|
14
|
+
private config: Config;
|
|
15
|
+
private log = logger.child("context-guard");
|
|
16
|
+
|
|
17
|
+
constructor(config: Config) {
|
|
18
|
+
this.config = config;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
estimateTokens(messages: Message[]): number {
|
|
22
|
+
let total = 0;
|
|
23
|
+
|
|
24
|
+
for (const msg of messages) {
|
|
25
|
+
total += Math.ceil(msg.content.length / 4);
|
|
26
|
+
|
|
27
|
+
if (msg.name) {
|
|
28
|
+
total += Math.ceil(msg.name.length / 4);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (msg.tool_calls) {
|
|
32
|
+
for (const tc of msg.tool_calls) {
|
|
33
|
+
total += Math.ceil(tc.function.name.length / 4);
|
|
34
|
+
total += Math.ceil(tc.function.arguments.length / 4);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return total;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
check(messages: Message[], systemPrompt?: string): ContextGuardResult {
|
|
43
|
+
const maxTokens = this.config.agent?.context?.maxTokens || 128000;
|
|
44
|
+
const threshold = this.config.agent?.context?.compactionThreshold || 0.8;
|
|
45
|
+
|
|
46
|
+
let currentTokens = this.estimateTokens(messages);
|
|
47
|
+
|
|
48
|
+
if (systemPrompt) {
|
|
49
|
+
currentTokens += Math.ceil(systemPrompt.length / 4);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
currentTokens += 500;
|
|
53
|
+
|
|
54
|
+
const utilizationPercent = currentTokens / maxTokens;
|
|
55
|
+
const needsCompaction = utilizationPercent >= threshold;
|
|
56
|
+
const canProceed = currentTokens < maxTokens * 0.95;
|
|
57
|
+
|
|
58
|
+
this.log.debug(`Context check: ${currentTokens}/${maxTokens} tokens (${(utilizationPercent * 100).toFixed(1)}%)`);
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
canProceed,
|
|
62
|
+
currentTokens,
|
|
63
|
+
maxTokens,
|
|
64
|
+
utilizationPercent,
|
|
65
|
+
needsCompaction,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
shouldCompact(messages: Message[], systemPrompt?: string): boolean {
|
|
70
|
+
const result = this.check(messages, systemPrompt);
|
|
71
|
+
return result.needsCompaction;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
getRecommendedAction(messages: Message[], systemPrompt?: string): "proceed" | "compact" | "error" {
|
|
75
|
+
const result = this.check(messages, systemPrompt);
|
|
76
|
+
|
|
77
|
+
if (result.utilizationPercent >= 0.95) {
|
|
78
|
+
return "error";
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (result.needsCompaction) {
|
|
82
|
+
return "compact";
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return "proceed";
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function createContextGuard(config: Config): ContextGuard {
|
|
90
|
+
return new ContextGuard(config);
|
|
91
|
+
}
|