@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,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* office_leer_docx - Leer contenido de un archivo Word (.docx)
|
|
3
|
+
*
|
|
4
|
+
* @category office
|
|
5
|
+
* @seedId office_leer_docx
|
|
6
|
+
* @spanish leer word, abrir docx, extraer texto de word, contenido word
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Tool } from "../types.ts";
|
|
10
|
+
import { logger } from "../../utils/logger.ts";
|
|
11
|
+
import * as fs from "node:fs";
|
|
12
|
+
import * as path from "node:path";
|
|
13
|
+
|
|
14
|
+
const log = logger.child("office-leer-docx");
|
|
15
|
+
|
|
16
|
+
export const officeLeerDocxTool: Tool = {
|
|
17
|
+
name: "office_leer_docx",
|
|
18
|
+
description:
|
|
19
|
+
"Leer un archivo Word (.docx) y retornar el contenido de texto preservando párrafos y tablas. Spanish: leer word, abrir docx, extraer texto de word, contenido word",
|
|
20
|
+
parameters: {
|
|
21
|
+
type: "object",
|
|
22
|
+
properties: {
|
|
23
|
+
ruta: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "Ruta absoluta o relativa al archivo .docx",
|
|
26
|
+
},
|
|
27
|
+
incluir_tablas: {
|
|
28
|
+
type: "boolean",
|
|
29
|
+
description: "Incluir contenido de tablas en la extracción (default: true)",
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
required: ["ruta"],
|
|
33
|
+
},
|
|
34
|
+
execute: async (params: Record<string, unknown>) => {
|
|
35
|
+
const ruta = params.ruta as string;
|
|
36
|
+
const incluirTablas = (params.incluir_tablas as boolean) ?? true;
|
|
37
|
+
|
|
38
|
+
log.debug(`Leyendo DOCX: ${ruta}`);
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
const rutaAbsoluta = path.resolve(ruta);
|
|
42
|
+
if (!fs.existsSync(rutaAbsoluta)) {
|
|
43
|
+
return { ok: false, error: `Archivo no encontrado: ${rutaAbsoluta}` };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const mammoth = await import("mammoth");
|
|
47
|
+
const buffer = fs.readFileSync(rutaAbsoluta);
|
|
48
|
+
|
|
49
|
+
// Extraer texto plano
|
|
50
|
+
const resultadoTexto = await mammoth.extractRawText({ buffer });
|
|
51
|
+
|
|
52
|
+
// Extraer HTML para información de tablas si se requiere
|
|
53
|
+
let textoTablas: string | undefined;
|
|
54
|
+
if (incluirTablas) {
|
|
55
|
+
const resultadoHtml = await mammoth.convertToHtml({ buffer });
|
|
56
|
+
// Extraer contenido de tablas del HTML
|
|
57
|
+
const tablas = resultadoHtml.value.match(/<table[\s\S]*?<\/table>/gi) ?? [];
|
|
58
|
+
if (tablas.length > 0) {
|
|
59
|
+
textoTablas = tablas
|
|
60
|
+
.map((tabla, i) => {
|
|
61
|
+
// Limpiar tags HTML y extraer texto de celdas
|
|
62
|
+
const celdas = tabla.match(/<t[dh][^>]*>([\s\S]*?)<\/t[dh]>/gi) ?? [];
|
|
63
|
+
const textoCeldas = celdas
|
|
64
|
+
.map((celda) => celda.replace(/<[^>]+>/g, "").trim())
|
|
65
|
+
.filter(Boolean);
|
|
66
|
+
return `[Tabla ${i + 1}]\n${textoCeldas.join(" | ")}`;
|
|
67
|
+
})
|
|
68
|
+
.join("\n\n");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const advertencias = resultadoTexto.messages
|
|
73
|
+
.filter((m: any) => m.type === "warning")
|
|
74
|
+
.map((m: any) => m.message);
|
|
75
|
+
|
|
76
|
+
log.info(`DOCX leído: ${resultadoTexto.value.length} caracteres`);
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
ok: true,
|
|
80
|
+
ruta: rutaAbsoluta,
|
|
81
|
+
texto: resultadoTexto.value,
|
|
82
|
+
tablas: textoTablas,
|
|
83
|
+
advertencias: advertencias.length > 0 ? advertencias : undefined,
|
|
84
|
+
};
|
|
85
|
+
} catch (error) {
|
|
86
|
+
log.error(`Error leyendo DOCX: ${(error as Error).message}`);
|
|
87
|
+
return {
|
|
88
|
+
ok: false,
|
|
89
|
+
error: `No se pudo leer el archivo DOCX: ${(error as Error).message}`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* office_leer_pdf - Leer contenido de un archivo PDF
|
|
3
|
+
*
|
|
4
|
+
* @category office
|
|
5
|
+
* @seedId office_leer_pdf
|
|
6
|
+
* @spanish leer pdf, abrir pdf, extraer texto de pdf, contenido pdf
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Tool } from "../types.ts";
|
|
10
|
+
import { logger } from "../../utils/logger.ts";
|
|
11
|
+
import * as fs from "node:fs";
|
|
12
|
+
import * as path from "node:path";
|
|
13
|
+
|
|
14
|
+
const log = logger.child("office-leer-pdf");
|
|
15
|
+
|
|
16
|
+
export const officeLeerPdfTool: Tool = {
|
|
17
|
+
name: "office_leer_pdf",
|
|
18
|
+
description:
|
|
19
|
+
"Leer contenido de un archivo PDF y retornar texto plano con metadata. Spanish: leer pdf, abrir pdf, extraer texto de pdf, pdf a texto",
|
|
20
|
+
parameters: {
|
|
21
|
+
type: "object",
|
|
22
|
+
properties: {
|
|
23
|
+
ruta: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "Ruta absoluta o relativa al archivo PDF",
|
|
26
|
+
},
|
|
27
|
+
pagina_inicio: {
|
|
28
|
+
type: "number",
|
|
29
|
+
description: "Página desde la que empezar (1-indexed, default: 1)",
|
|
30
|
+
},
|
|
31
|
+
pagina_fin: {
|
|
32
|
+
type: "number",
|
|
33
|
+
description: "Última página a leer (default: todas las páginas)",
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
required: ["ruta"],
|
|
37
|
+
},
|
|
38
|
+
execute: async (params: Record<string, unknown>) => {
|
|
39
|
+
const ruta = params.ruta as string;
|
|
40
|
+
const paginaInicio = Math.max(1, (params.pagina_inicio as number) ?? 1);
|
|
41
|
+
const paginaFin = params.pagina_fin as number | undefined;
|
|
42
|
+
|
|
43
|
+
log.debug(`Leyendo PDF: ${ruta}`);
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
const rutaAbsoluta = path.resolve(ruta);
|
|
47
|
+
if (!fs.existsSync(rutaAbsoluta)) {
|
|
48
|
+
return { ok: false, error: `Archivo no encontrado: ${rutaAbsoluta}` };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const buffer = fs.readFileSync(rutaAbsoluta);
|
|
52
|
+
const uint8Array = new Uint8Array(buffer);
|
|
53
|
+
|
|
54
|
+
// Importar pdfjs-dist (compatible con Bun, sin worker)
|
|
55
|
+
const pdfjsLib = await import("pdfjs-dist/legacy/build/pdf.mjs" as any).catch(
|
|
56
|
+
() => import("pdfjs-dist" as any)
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
// Desactivar worker para entorno Node/Bun
|
|
60
|
+
const lib = pdfjsLib.default ?? pdfjsLib;
|
|
61
|
+
if (lib.GlobalWorkerOptions) {
|
|
62
|
+
lib.GlobalWorkerOptions.workerSrc = "";
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const doc = await lib.getDocument({ data: uint8Array, disableWorker: true }).promise;
|
|
66
|
+
const totalPaginas = doc.numPages;
|
|
67
|
+
|
|
68
|
+
// Metadata
|
|
69
|
+
let titulo: string | undefined;
|
|
70
|
+
try {
|
|
71
|
+
const meta = await doc.getMetadata();
|
|
72
|
+
titulo = (meta?.info as any)?.Title ?? undefined;
|
|
73
|
+
} catch {
|
|
74
|
+
// metadata opcional
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const inicio = paginaInicio;
|
|
78
|
+
const fin = paginaFin ? Math.min(paginaFin, totalPaginas) : totalPaginas;
|
|
79
|
+
|
|
80
|
+
const textosPorPagina: Array<{ pagina: number; texto: string }> = [];
|
|
81
|
+
|
|
82
|
+
for (let i = inicio; i <= fin; i++) {
|
|
83
|
+
const pagina = await doc.getPage(i);
|
|
84
|
+
const contenido = await pagina.getTextContent();
|
|
85
|
+
const texto = (contenido.items as any[])
|
|
86
|
+
.map((item: any) => item.str ?? "")
|
|
87
|
+
.join(" ")
|
|
88
|
+
.replace(/\s+/g, " ")
|
|
89
|
+
.trim();
|
|
90
|
+
textosPorPagina.push({ pagina: i, texto });
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const textoCompleto = textosPorPagina.map((p) => p.texto).join("\n\n");
|
|
94
|
+
|
|
95
|
+
log.info(`PDF leído: ${totalPaginas} páginas, ${textoCompleto.length} caracteres`);
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
ok: true,
|
|
99
|
+
ruta: rutaAbsoluta,
|
|
100
|
+
totalPaginas,
|
|
101
|
+
paginasLeidas: fin - inicio + 1,
|
|
102
|
+
titulo,
|
|
103
|
+
texto: textoCompleto,
|
|
104
|
+
paginas: textosPorPagina,
|
|
105
|
+
};
|
|
106
|
+
} catch (error) {
|
|
107
|
+
log.error(`Error leyendo PDF: ${(error as Error).message}`);
|
|
108
|
+
return {
|
|
109
|
+
ok: false,
|
|
110
|
+
error: `No se pudo leer el PDF: ${(error as Error).message}`,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* office_leer_pptx - Leer contenido de un archivo PowerPoint (.pptx)
|
|
3
|
+
*
|
|
4
|
+
* @category office
|
|
5
|
+
* @seedId office_leer_pptx
|
|
6
|
+
* @spanish leer powerpoint, abrir pptx, extraer texto de presentacion, contenido slides
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Tool } from "../types.ts";
|
|
10
|
+
import { logger } from "../../utils/logger.ts";
|
|
11
|
+
import * as fs from "node:fs";
|
|
12
|
+
import * as path from "node:path";
|
|
13
|
+
|
|
14
|
+
const log = logger.child("office-leer-pptx");
|
|
15
|
+
|
|
16
|
+
export const officeLeerPptxTool: Tool = {
|
|
17
|
+
name: "office_leer_pptx",
|
|
18
|
+
description:
|
|
19
|
+
"Leer un archivo PowerPoint (.pptx) y retornar el texto de cada diapositiva como array estructurado. Spanish: leer powerpoint, abrir pptx, extraer texto de presentacion, contenido slides",
|
|
20
|
+
parameters: {
|
|
21
|
+
type: "object",
|
|
22
|
+
properties: {
|
|
23
|
+
ruta: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "Ruta absoluta o relativa al archivo .pptx",
|
|
26
|
+
},
|
|
27
|
+
solo_diapositiva: {
|
|
28
|
+
type: "number",
|
|
29
|
+
description:
|
|
30
|
+
"Número de diapositiva específica a leer (1-indexed, default: todas)",
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
required: ["ruta"],
|
|
34
|
+
},
|
|
35
|
+
execute: async (params: Record<string, unknown>) => {
|
|
36
|
+
const ruta = params.ruta as string;
|
|
37
|
+
const soloSlide = params.solo_diapositiva as number | undefined;
|
|
38
|
+
|
|
39
|
+
log.debug(`Leyendo PPTX: ${ruta}`);
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
const rutaAbsoluta = path.resolve(ruta);
|
|
43
|
+
if (!fs.existsSync(rutaAbsoluta)) {
|
|
44
|
+
return { ok: false, error: `Archivo no encontrado: ${rutaAbsoluta}` };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const JSZip = (await import("jszip")).default;
|
|
48
|
+
const buffer = fs.readFileSync(rutaAbsoluta);
|
|
49
|
+
const zip = await JSZip.loadAsync(buffer);
|
|
50
|
+
|
|
51
|
+
// Encontrar todos los archivos de slides
|
|
52
|
+
const archivosSlides = Object.keys(zip.files)
|
|
53
|
+
.filter((nombre) => /^ppt\/slides\/slide\d+\.xml$/i.test(nombre))
|
|
54
|
+
.sort((a, b) => {
|
|
55
|
+
const numA = parseInt(a.match(/slide(\d+)/)?.[1] ?? "0");
|
|
56
|
+
const numB = parseInt(b.match(/slide(\d+)/)?.[1] ?? "0");
|
|
57
|
+
return numA - numB;
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const diapositivas: Array<{
|
|
61
|
+
numero: number;
|
|
62
|
+
titulo?: string;
|
|
63
|
+
texto: string;
|
|
64
|
+
fragmentos: string[];
|
|
65
|
+
}> = [];
|
|
66
|
+
|
|
67
|
+
for (let i = 0; i < archivosSlides.length; i++) {
|
|
68
|
+
const numeroSlide = i + 1;
|
|
69
|
+
|
|
70
|
+
if (soloSlide !== undefined && numeroSlide !== soloSlide) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const archivoSlide = archivosSlides[i];
|
|
75
|
+
const xmlContenido = await zip.files[archivoSlide].async("string");
|
|
76
|
+
|
|
77
|
+
// Extraer texto de elementos <a:t> (texto en slides de OOXML)
|
|
78
|
+
const fragmentos: string[] = [];
|
|
79
|
+
const regexTexto = /<a:t[^>]*>([\s\S]*?)<\/a:t>/g;
|
|
80
|
+
let match;
|
|
81
|
+
|
|
82
|
+
while ((match = regexTexto.exec(xmlContenido)) !== null) {
|
|
83
|
+
const texto = match[1]
|
|
84
|
+
.replace(/&/g, "&")
|
|
85
|
+
.replace(/</g, "<")
|
|
86
|
+
.replace(/>/g, ">")
|
|
87
|
+
.replace(/"/g, '"')
|
|
88
|
+
.replace(/'/g, "'")
|
|
89
|
+
.trim();
|
|
90
|
+
|
|
91
|
+
if (texto) {
|
|
92
|
+
fragmentos.push(texto);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Intentar extraer el título (elemento <p:sp> con tipo "title")
|
|
97
|
+
let titulo: string | undefined;
|
|
98
|
+
const regexTitulo =
|
|
99
|
+
/<p:ph[^>]*type="title"[^>]*\/>[\s\S]*?<a:t[^>]*>([\s\S]*?)<\/a:t>/;
|
|
100
|
+
const matchTitulo = regexTitulo.exec(xmlContenido);
|
|
101
|
+
if (matchTitulo) {
|
|
102
|
+
titulo = matchTitulo[1].trim();
|
|
103
|
+
} else if (fragmentos.length > 0) {
|
|
104
|
+
// Primer fragmento como título tentativo
|
|
105
|
+
titulo = fragmentos[0];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const texto = fragmentos.join(" ").replace(/\s+/g, " ").trim();
|
|
109
|
+
|
|
110
|
+
diapositivas.push({
|
|
111
|
+
numero: numeroSlide,
|
|
112
|
+
titulo,
|
|
113
|
+
texto,
|
|
114
|
+
fragmentos,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
log.info(
|
|
119
|
+
`PPTX leído: ${archivosSlides.length} slides totales, ${diapositivas.length} leídas`
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
return {
|
|
123
|
+
ok: true,
|
|
124
|
+
ruta: rutaAbsoluta,
|
|
125
|
+
totalDiapositivas: archivosSlides.length,
|
|
126
|
+
diapositivas,
|
|
127
|
+
};
|
|
128
|
+
} catch (error) {
|
|
129
|
+
log.error(`Error leyendo PPTX: ${(error as Error).message}`);
|
|
130
|
+
return {
|
|
131
|
+
ok: false,
|
|
132
|
+
error: `No se pudo leer el archivo PowerPoint: ${(error as Error).message}`,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* office_leer_xlsx - Leer un archivo Excel (.xlsx)
|
|
3
|
+
*
|
|
4
|
+
* @category office
|
|
5
|
+
* @seedId office_leer_xlsx
|
|
6
|
+
* @spanish leer excel, abrir xlsx, extraer datos de excel, hojas excel
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Tool } from "../types.ts";
|
|
10
|
+
import { logger } from "../../utils/logger.ts";
|
|
11
|
+
import * as fs from "node:fs";
|
|
12
|
+
import * as path from "node:path";
|
|
13
|
+
|
|
14
|
+
const log = logger.child("office-leer-xlsx");
|
|
15
|
+
|
|
16
|
+
export const officeLeerXlsxTool: Tool = {
|
|
17
|
+
name: "office_leer_xlsx",
|
|
18
|
+
description:
|
|
19
|
+
"Leer un archivo Excel (.xlsx) y retornar las hojas con sus datos como objetos JSON. Spanish: leer excel, abrir xlsx, extraer datos de excel, hojas excel",
|
|
20
|
+
parameters: {
|
|
21
|
+
type: "object",
|
|
22
|
+
properties: {
|
|
23
|
+
ruta: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "Ruta absoluta o relativa al archivo .xlsx",
|
|
26
|
+
},
|
|
27
|
+
hoja: {
|
|
28
|
+
type: "string",
|
|
29
|
+
description: "Nombre de hoja específica a leer (default: todas las hojas)",
|
|
30
|
+
},
|
|
31
|
+
incluir_encabezados: {
|
|
32
|
+
type: "boolean",
|
|
33
|
+
description:
|
|
34
|
+
"Usar primera fila como encabezados de columna (default: true)",
|
|
35
|
+
},
|
|
36
|
+
rango: {
|
|
37
|
+
type: "string",
|
|
38
|
+
description:
|
|
39
|
+
"Rango de celdas a leer en notación Excel (ej: 'A1:D10', default: toda la hoja)",
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
required: ["ruta"],
|
|
43
|
+
},
|
|
44
|
+
execute: async (params: Record<string, unknown>) => {
|
|
45
|
+
const ruta = params.ruta as string;
|
|
46
|
+
const hojaFiltro = params.hoja as string | undefined;
|
|
47
|
+
const incluirEncabezados = (params.incluir_encabezados as boolean) ?? true;
|
|
48
|
+
const rango = params.rango as string | undefined;
|
|
49
|
+
|
|
50
|
+
log.debug(`Leyendo XLSX: ${ruta}`);
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
const rutaAbsoluta = path.resolve(ruta);
|
|
54
|
+
if (!fs.existsSync(rutaAbsoluta)) {
|
|
55
|
+
return { ok: false, error: `Archivo no encontrado: ${rutaAbsoluta}` };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const XLSX = await import("xlsx");
|
|
59
|
+
const buffer = fs.readFileSync(rutaAbsoluta);
|
|
60
|
+
const workbook = XLSX.read(buffer, { type: "buffer" });
|
|
61
|
+
|
|
62
|
+
const nombresHojas = hojaFiltro
|
|
63
|
+
? [hojaFiltro]
|
|
64
|
+
: workbook.SheetNames;
|
|
65
|
+
|
|
66
|
+
const hojas: Record<string, any[]> = {};
|
|
67
|
+
|
|
68
|
+
for (const nombreHoja of nombresHojas) {
|
|
69
|
+
const hoja = workbook.Sheets[nombreHoja];
|
|
70
|
+
if (!hoja) {
|
|
71
|
+
log.warn(`Hoja '${nombreHoja}' no encontrada en el archivo`);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const opciones: any = {
|
|
76
|
+
header: incluirEncabezados ? 1 : 1,
|
|
77
|
+
defval: "",
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
if (rango) {
|
|
81
|
+
opciones.range = rango;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (incluirEncabezados) {
|
|
85
|
+
// La primera fila se usa como encabezados
|
|
86
|
+
hojas[nombreHoja] = XLSX.utils.sheet_to_json(hoja, {
|
|
87
|
+
defval: "",
|
|
88
|
+
range: rango,
|
|
89
|
+
});
|
|
90
|
+
} else {
|
|
91
|
+
// Devolver como array de arrays (sin encabezados)
|
|
92
|
+
hojas[nombreHoja] = XLSX.utils.sheet_to_json(hoja, {
|
|
93
|
+
header: 1,
|
|
94
|
+
defval: "",
|
|
95
|
+
range: rango,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const totalFilas = Object.values(hojas).reduce(
|
|
101
|
+
(acc, filas) => acc + filas.length,
|
|
102
|
+
0
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
log.info(
|
|
106
|
+
`XLSX leído: ${nombresHojas.length} hojas, ${totalFilas} filas totales`
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
ok: true,
|
|
111
|
+
ruta: rutaAbsoluta,
|
|
112
|
+
hojas: workbook.SheetNames,
|
|
113
|
+
datos: hojas,
|
|
114
|
+
totalFilas,
|
|
115
|
+
};
|
|
116
|
+
} catch (error) {
|
|
117
|
+
log.error(`Error leyendo XLSX: ${(error as Error).message}`);
|
|
118
|
+
return {
|
|
119
|
+
ok: false,
|
|
120
|
+
error: `No se pudo leer el archivo Excel: ${(error as Error).message}`,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Type Definitions
|
|
3
|
+
* Shared across all tool categories
|
|
4
|
+
*
|
|
5
|
+
* These types are used by all 52 native tools in Hive
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface Tool {
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
parameters: {
|
|
12
|
+
type: "object";
|
|
13
|
+
properties: Record<string, ToolParameter>;
|
|
14
|
+
required?: string[];
|
|
15
|
+
};
|
|
16
|
+
execute: (
|
|
17
|
+
params: Record<string, unknown>,
|
|
18
|
+
config?: any
|
|
19
|
+
) => Promise<string | object>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface ToolParameter {
|
|
23
|
+
type: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
enum?: string[];
|
|
26
|
+
items?: ToolParameter;
|
|
27
|
+
properties?: Record<string, ToolParameter>;
|
|
28
|
+
required?: string[];
|
|
29
|
+
minimum?: number;
|
|
30
|
+
maximum?: number;
|
|
31
|
+
additionalProperties?: boolean | ToolParameter;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface ToolResult {
|
|
35
|
+
ok: boolean;
|
|
36
|
+
result?: any;
|
|
37
|
+
error?: string;
|
|
38
|
+
hint?: string;
|
|
39
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice Tools - 2 tools
|
|
3
|
+
*
|
|
4
|
+
* @category voice
|
|
5
|
+
*/
|
|
6
|
+
import type { Tool } from "../types.ts";
|
|
7
|
+
import { logger } from "../../utils/logger.ts";
|
|
8
|
+
|
|
9
|
+
const log = logger.child("voice");
|
|
10
|
+
|
|
11
|
+
// ─── voice_transcribe ────────────────────────────────────────────────────────
|
|
12
|
+
|
|
13
|
+
export const voiceTranscribeTool: Tool = {
|
|
14
|
+
name: "voice_transcribe",
|
|
15
|
+
description: "Transcribe audio input to text. Spanish: transcribir audio, voz a texto, reconocimiento de voz",
|
|
16
|
+
parameters: {
|
|
17
|
+
type: "object",
|
|
18
|
+
properties: {
|
|
19
|
+
audio: {
|
|
20
|
+
type: "string",
|
|
21
|
+
description: "Audio file path or base64 encoded audio",
|
|
22
|
+
},
|
|
23
|
+
language: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "Language code (e.g., 'es', 'en'). Auto-detect if not specified.",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
required: ["audio"],
|
|
29
|
+
},
|
|
30
|
+
execute: async (params: Record<string, unknown>) => {
|
|
31
|
+
const audio = params.audio as string;
|
|
32
|
+
const language = (params.language as string) ?? "auto";
|
|
33
|
+
|
|
34
|
+
log.info(`Transcribing audio: ${audio.substring(0, 50)}...`);
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
// Placeholder implementation - real transcription would call STT API
|
|
38
|
+
return {
|
|
39
|
+
ok: true,
|
|
40
|
+
transcription: "[Transcription requires STT provider configuration]",
|
|
41
|
+
language: language,
|
|
42
|
+
duration: 0,
|
|
43
|
+
confidence: 0,
|
|
44
|
+
};
|
|
45
|
+
} catch (error) {
|
|
46
|
+
return {
|
|
47
|
+
ok: false,
|
|
48
|
+
error: `Failed to transcribe: ${(error as Error).message}`,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// ─── voice_speak ─────────────────────────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
export const voiceSpeakTool: Tool = {
|
|
57
|
+
name: "voice_speak",
|
|
58
|
+
description: "Convert text to synthesized speech output. Spanish: texto a voz, sintetizar, hablar, leer en voz alta",
|
|
59
|
+
parameters: {
|
|
60
|
+
type: "object",
|
|
61
|
+
properties: {
|
|
62
|
+
text: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "Text to convert to speech",
|
|
65
|
+
},
|
|
66
|
+
voice_id: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "Voice ID to use (provider-specific)",
|
|
69
|
+
},
|
|
70
|
+
language: {
|
|
71
|
+
type: "string",
|
|
72
|
+
description: "Language code (e.g., 'es', 'en')",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
required: ["text"],
|
|
76
|
+
},
|
|
77
|
+
execute: async (params: Record<string, unknown>) => {
|
|
78
|
+
const text = params.text as string;
|
|
79
|
+
const voiceId = (params.voice_id as string) ?? "default";
|
|
80
|
+
const language = (params.language as string) ?? "es";
|
|
81
|
+
|
|
82
|
+
log.info(`Synthesizing speech: ${text.substring(0, 50)}...`);
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
// Placeholder implementation - real TTS would call TTS API
|
|
86
|
+
return {
|
|
87
|
+
ok: true,
|
|
88
|
+
audio_url: "[TTS requires provider configuration]",
|
|
89
|
+
voice_id: voiceId,
|
|
90
|
+
language: language,
|
|
91
|
+
duration: 0,
|
|
92
|
+
};
|
|
93
|
+
} catch (error) {
|
|
94
|
+
return {
|
|
95
|
+
ok: false,
|
|
96
|
+
error: `Failed to synthesize speech: ${(error as Error).message}`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export function createTools(): Tool[] {
|
|
103
|
+
return [voiceTranscribeTool, voiceSpeakTool];
|
|
104
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* browser_click - Click on a web page element
|
|
3
|
+
*
|
|
4
|
+
* @category web
|
|
5
|
+
* @seedId browser_click
|
|
6
|
+
* @spanish hacer clic, botón, enlace, interactuar
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Tool } from "../types.ts";
|
|
10
|
+
import { logger } from "../../utils/logger.ts";
|
|
11
|
+
import { getBrowserService } from "./browser-service.ts";
|
|
12
|
+
|
|
13
|
+
const log = logger.child("browser-click");
|
|
14
|
+
|
|
15
|
+
export const browserClickTool: Tool = {
|
|
16
|
+
name: "browser_click",
|
|
17
|
+
description: "Click on a web page element. Spanish: hacer clic, botón, enlace, interactuar",
|
|
18
|
+
parameters: {
|
|
19
|
+
type: "object",
|
|
20
|
+
properties: {
|
|
21
|
+
selector: {
|
|
22
|
+
type: "string",
|
|
23
|
+
description: "CSS selector of the element to click",
|
|
24
|
+
},
|
|
25
|
+
url: {
|
|
26
|
+
type: "string",
|
|
27
|
+
description: "URL to navigate to before clicking (optional)",
|
|
28
|
+
},
|
|
29
|
+
timeout: {
|
|
30
|
+
type: "number",
|
|
31
|
+
description: "Timeout in milliseconds (default: 30000)",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
required: ["selector"],
|
|
35
|
+
},
|
|
36
|
+
execute: async (params: Record<string, unknown>) => {
|
|
37
|
+
const selector = params.selector as string;
|
|
38
|
+
const url = params.url as string | undefined;
|
|
39
|
+
const timeout = (params.timeout as number) ?? 30000;
|
|
40
|
+
|
|
41
|
+
const browserService = getBrowserService();
|
|
42
|
+
if (!browserService?.isAvailable()) {
|
|
43
|
+
log.warn("Browser not available");
|
|
44
|
+
return {
|
|
45
|
+
ok: false,
|
|
46
|
+
error: "Browser automation not available. Install Chrome/Chromium.",
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
log.info(`Clicking: ${selector}${url ? ` on ${url}` : ""}`);
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
const view = await browserService.getView();
|
|
54
|
+
if (!view) return { ok: false, error: "Browser automation not available. Install Chrome/Chromium." };
|
|
55
|
+
|
|
56
|
+
if (url) {
|
|
57
|
+
await view.navigate(url);
|
|
58
|
+
await Bun.sleep(500);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// click(selector) already waits for element actionability
|
|
62
|
+
await view.click(selector, { timeout });
|
|
63
|
+
|
|
64
|
+
const currentUrl = view.url;
|
|
65
|
+
log.info(`Click successful: ${selector} on ${currentUrl}`);
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
ok: true,
|
|
69
|
+
message: `Successfully clicked element: ${selector}`,
|
|
70
|
+
selector,
|
|
71
|
+
url: currentUrl,
|
|
72
|
+
};
|
|
73
|
+
} catch (error) {
|
|
74
|
+
log.error(`Click failed: ${(error as Error).message}`);
|
|
75
|
+
return { ok: false, error: `Failed to click: ${(error as Error).message}` };
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
};
|