@johpaz/hive-agents 0.0.35 → 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 +3127 -3104
- package/dist/ui/assets/{AgentCreateForm-B4eK7efF.js → AgentCreateForm-tJZv9FZC.js} +1 -1
- package/dist/ui/assets/{AgentDetailPage-BD2uoJWk.js → AgentDetailPage-Du-mRcAX.js} +1 -1
- package/dist/ui/assets/AgentNewPage-DIFYd_Ys.js +1 -0
- package/dist/ui/assets/{AgentsPage-4JUZXvkA.js → AgentsPage-YvSgWRiw.js} +6 -6
- package/dist/ui/assets/CanvasPage-DtMwGvxf.js +33 -0
- package/dist/ui/assets/{ChannelsPage-BUn7-nhV.js → ChannelsPage-BdBXWHjj.js} +1 -1
- package/dist/ui/assets/DashboardPage-ghl1ZguH.js +6 -0
- package/dist/ui/assets/{LoginPage-C8j_urUD.js → LoginPage-CAmSI9Vy.js} +1 -1
- package/dist/ui/assets/LogsPage-DAPBHkwK.js +1 -0
- package/dist/ui/assets/MeetingPage-WjjGOqqU.js +1 -0
- package/dist/ui/assets/{NotFound-Drh-sJPN.js → NotFound-BMeQSGcG.js} +1 -1
- package/dist/ui/assets/ProvidersPage-Ct6HsAi1.js +1 -0
- package/dist/ui/assets/{RecoverPage-DNb1Pr8h.js → RecoverPage-DpW3l-yv.js} +1 -1
- package/dist/ui/assets/SettingsPage-DBJ7_E6C.js +9 -0
- package/dist/ui/assets/SetupPage-DKmLVUaj.js +1 -0
- package/dist/ui/assets/{WebChatPage-R-YOwA4F.js → WebChatPage-CVRcKept.js} +2 -2
- package/dist/ui/assets/accordion-C5d5Rm5z.js +1 -0
- package/dist/ui/assets/{alert-U8FsgWi7.js → alert-C-NE-P3s.js} +1 -1
- package/dist/ui/assets/{alert-dialog-CRdMkkmk.js → alert-dialog-C5mzbHdP.js} +1 -1
- package/dist/ui/assets/{badge-Cli1jnH5.js → badge-ChpACfWO.js} +1 -1
- package/dist/ui/assets/chevron-up-BYhk0K2J.js +1 -0
- package/dist/ui/assets/{dialog-DQ3s-LuO.js → dialog-QnZ0ad8O.js} +1 -1
- package/dist/ui/assets/dropdown-menu-BK-CO3Od.js +1 -0
- package/dist/ui/assets/{es-DcMjrpbA.js → es-NQNoaWDx.js} +1 -1
- package/dist/ui/assets/index-B2fCYtTS.css +2 -0
- package/dist/ui/assets/index-DMCjjdqf.js +116 -0
- package/dist/ui/assets/{label-0BvGVXvZ.js → label-D2H1IR_J.js} +1 -1
- package/dist/ui/assets/progress-BherYzY6.js +1 -0
- package/dist/ui/assets/scroll-area-DkeyX32e.js +1 -0
- package/dist/ui/assets/{slider-D47dOrRa.js → slider-CsiUDxc3.js} +1 -1
- package/dist/ui/assets/switch-BDwN8RYV.js +1 -0
- package/dist/ui/assets/{table-DhowbNxQ.js → table-CSc8ubon.js} +1 -1
- package/dist/ui/assets/terminal-DN38Q456.js +1 -0
- package/dist/ui/assets/useProviders-C6_QHsEi.js +1 -0
- package/dist/ui/assets/{vendor-radix-JY4ncZrD.js → vendor-radix-cw1bQaVC.js} +4 -4
- package/dist/ui/assets/{vendor-react-CscwQerf.js → vendor-react-D4s9E-zj.js} +1 -1
- package/dist/ui/dist/assets/AgentCreateForm-tJZv9FZC.js +1 -0
- package/dist/ui/dist/assets/AgentDetailPage-Du-mRcAX.js +1 -0
- package/dist/ui/dist/assets/AgentNewPage-DIFYd_Ys.js +1 -0
- package/dist/ui/dist/assets/AgentsPage-YvSgWRiw.js +10 -0
- package/dist/ui/dist/assets/CanvasPage-DtMwGvxf.js +33 -0
- package/dist/ui/dist/assets/ChannelsPage-BdBXWHjj.js +8 -0
- package/dist/ui/dist/assets/DashboardPage-ghl1ZguH.js +6 -0
- package/dist/ui/dist/assets/LoginPage-CAmSI9Vy.js +1 -0
- package/dist/ui/dist/assets/LogsPage-DAPBHkwK.js +1 -0
- package/dist/ui/dist/assets/MeetingPage-WjjGOqqU.js +1 -0
- package/dist/ui/dist/assets/NotFound-BMeQSGcG.js +1 -0
- package/dist/ui/dist/assets/ProvidersPage-Ct6HsAi1.js +1 -0
- package/dist/ui/dist/assets/RecoverPage-DpW3l-yv.js +1 -0
- package/dist/ui/dist/assets/SettingsPage-DBJ7_E6C.js +9 -0
- package/dist/ui/dist/assets/SetupPage-DKmLVUaj.js +1 -0
- package/dist/ui/dist/assets/WebChatPage-CVRcKept.js +16 -0
- package/dist/ui/dist/assets/accordion-C5d5Rm5z.js +1 -0
- package/dist/ui/dist/assets/activity-c3pNngT_.js +1 -0
- package/dist/ui/dist/assets/alert-C-NE-P3s.js +1 -0
- package/dist/ui/dist/assets/alert-dialog-C5mzbHdP.js +1 -0
- package/dist/ui/dist/assets/arrow-left-CBcbX5EZ.js +1 -0
- package/dist/ui/dist/assets/badge-ChpACfWO.js +1 -0
- package/dist/ui/dist/assets/calendar-B-KZ9RQO.js +1 -0
- package/dist/ui/dist/assets/card-CNf6BS2e.js +1 -0
- package/dist/ui/dist/assets/chevron-left-D4U-5A27.js +1 -0
- package/dist/ui/dist/assets/chevron-right-CR4Skrf3.js +1 -0
- package/dist/ui/dist/assets/chevron-up-BYhk0K2J.js +1 -0
- package/dist/ui/dist/assets/circle-alert-CyHDwUj8.js +1 -0
- package/dist/ui/dist/assets/circle-check-Bb54Ebmu.js +1 -0
- package/dist/ui/dist/assets/cpu-Cdgc_B1K.js +1 -0
- package/dist/ui/dist/assets/dialog-QnZ0ad8O.js +1 -0
- package/dist/ui/dist/assets/download-C3ifGMjJ.js +1 -0
- package/dist/ui/dist/assets/dropdown-menu-BK-CO3Od.js +1 -0
- package/dist/ui/dist/assets/es-NQNoaWDx.js +1 -0
- package/dist/ui/dist/assets/external-link-BvxYeTP1.js +1 -0
- package/dist/ui/dist/assets/eye-DqNTU_GD.js +1 -0
- package/dist/ui/dist/assets/file-text-BT_9S9SM.js +1 -0
- package/dist/ui/dist/assets/folder-open-BhH8y9ac.js +1 -0
- package/dist/ui/dist/assets/format-GVHeOyWI.js +1 -0
- package/dist/ui/dist/assets/gateway-url-COCbW0IR.js +1 -0
- package/dist/ui/dist/assets/gauge-D_TMa4i9.js +1 -0
- package/dist/ui/dist/assets/globe-DeCQTCDJ.js +1 -0
- package/dist/ui/dist/assets/hexagon-DsGOUl-H.js +1 -0
- package/dist/ui/dist/assets/history-BSG-Ypqf.js +1 -0
- package/dist/ui/dist/assets/index-B2fCYtTS.css +2 -0
- package/dist/ui/dist/assets/index-DMCjjdqf.js +116 -0
- package/dist/ui/dist/assets/info-NwLoa2Mj.js +1 -0
- package/dist/ui/dist/assets/key-3EP0dhkT.js +1 -0
- package/dist/ui/dist/assets/label-D2H1IR_J.js +1 -0
- package/dist/ui/dist/assets/loader-circle-CZNax6kS.js +1 -0
- package/dist/ui/dist/assets/lock-Ei1_J-Nq.js +1 -0
- package/dist/ui/dist/assets/pause-BUqah9Bi.js +1 -0
- package/dist/ui/dist/assets/play-NcZ4swwL.js +1 -0
- package/dist/ui/dist/assets/plus-CX1xyhp5.js +1 -0
- package/dist/ui/dist/assets/progress-BherYzY6.js +1 -0
- package/dist/ui/dist/assets/refresh-cw-DaYdjQFk.js +1 -0
- package/dist/ui/dist/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
- package/dist/ui/dist/assets/save-CUdYyHNy.js +1 -0
- package/dist/ui/dist/assets/scroll-area-DkeyX32e.js +1 -0
- package/dist/ui/dist/assets/send-B0H5SEIE.js +1 -0
- package/dist/ui/dist/assets/settings-Ds4SqD8s.js +1 -0
- package/dist/ui/dist/assets/slider-CsiUDxc3.js +14 -0
- package/dist/ui/dist/assets/sparkles-yUEb-7oH.js +1 -0
- package/dist/ui/dist/assets/square-BD81nFtN.js +1 -0
- package/dist/ui/dist/assets/switch-BDwN8RYV.js +1 -0
- package/dist/ui/dist/assets/table-CSc8ubon.js +1 -0
- package/dist/ui/dist/assets/terminal-DN38Q456.js +1 -0
- package/dist/ui/dist/assets/textarea-CXgXWKrT.js +1 -0
- package/dist/ui/dist/assets/trash-2-CNjMkoq6.js +1 -0
- package/dist/ui/dist/assets/triangle-alert-C9Y8Ub4X.js +1 -0
- package/dist/ui/dist/assets/useProviders-C6_QHsEi.js +1 -0
- package/dist/ui/dist/assets/utils-3pnRFmFe.js +1 -0
- package/dist/ui/dist/assets/vendor-charts-Bu2lyBKP.js +65 -0
- package/dist/ui/dist/assets/vendor-query-DsWPbQdG.js +1 -0
- package/dist/ui/dist/assets/vendor-radix-cw1bQaVC.js +63 -0
- package/dist/ui/dist/assets/vendor-react-D4s9E-zj.js +1 -0
- package/dist/ui/dist/assets/vendor-router-C9pIYwbJ.js +3 -0
- package/dist/ui/dist/assets/volume-2-CeSXNDv4.js +1 -0
- package/dist/ui/dist/assets/zap-hlXjpSeA.js +1 -0
- package/dist/ui/dist/favicon.ico +0 -0
- package/dist/ui/dist/index.html +40 -0
- package/dist/ui/dist/placeholder.svg +1 -0
- package/dist/ui/index.html +6 -6
- package/package.json +137 -13
- package/packages/cli/src/adapters/binary.ts +461 -0
- package/packages/cli/src/adapters/bun-global.ts +378 -0
- package/packages/cli/src/adapters/config.ts +314 -0
- package/packages/cli/src/adapters/docker.ts +308 -0
- package/packages/cli/src/adapters/factory.ts +168 -0
- package/packages/cli/src/adapters/index.ts +80 -0
- package/packages/cli/src/adapters/types.ts +218 -0
- package/packages/cli/src/commands/agent-run.ts +168 -0
- package/packages/cli/src/commands/agents.ts +398 -0
- package/packages/cli/src/commands/chat.ts +142 -0
- package/packages/cli/src/commands/config.ts +49 -0
- package/packages/cli/src/commands/cron.ts +487 -0
- package/packages/cli/src/commands/dev.ts +58 -0
- package/packages/cli/src/commands/doctor.ts +320 -0
- package/packages/cli/src/commands/gateway.ts +719 -0
- package/packages/cli/src/commands/logs.ts +57 -0
- package/packages/cli/src/commands/mcp.ts +175 -0
- package/packages/cli/src/commands/message.ts +77 -0
- package/packages/cli/src/commands/migrate.ts +90 -0
- package/packages/cli/src/commands/onboard.ts +1656 -0
- package/packages/cli/src/commands/security.ts +144 -0
- package/packages/cli/src/commands/service.ts +50 -0
- package/packages/cli/src/commands/sessions.ts +116 -0
- package/packages/cli/src/commands/skills.ts +215 -0
- package/packages/cli/src/commands/update.ts +203 -0
- package/packages/cli/src/index.ts +210 -0
- package/packages/cli/src/ui-bundle.generated.ts +3 -0
- package/packages/cli/src/utils/token.ts +6 -0
- package/packages/core/src/agent/agent-loop.ts +691 -0
- package/packages/core/src/agent/compaction.ts +240 -0
- package/packages/core/src/agent/context-compiler.ts +467 -0
- package/packages/core/src/agent/context-guard.ts +91 -0
- package/packages/core/src/agent/conversation-store.ts +244 -0
- package/packages/core/src/agent/curator.ts +158 -0
- package/packages/core/src/agent/hooks.ts +166 -0
- package/packages/core/src/agent/llm-client.ts +167 -0
- package/packages/core/src/agent/llm-providers/anthropic.ts +212 -0
- package/packages/core/src/agent/llm-providers/deepseek.ts +8 -0
- package/packages/core/src/agent/llm-providers/gemini.ts +215 -0
- package/packages/core/src/agent/llm-providers/groq.ts +5 -0
- package/packages/core/src/agent/llm-providers/interface.ts +195 -0
- package/packages/core/src/agent/llm-providers/kimi.ts +8 -0
- package/packages/core/src/agent/llm-providers/local-llama.ts +37 -0
- package/packages/core/src/agent/llm-providers/mistral.ts +5 -0
- package/packages/core/src/agent/llm-providers/nvidia.ts +5 -0
- package/packages/core/src/agent/llm-providers/ollama.ts +175 -0
- package/packages/core/src/agent/llm-providers/openai-compat-base.ts +379 -0
- package/packages/core/src/agent/llm-providers/openai.ts +5 -0
- package/packages/core/src/agent/llm-providers/openrouter.ts +5 -0
- package/packages/core/src/agent/llm-providers/qwen.ts +5 -0
- package/packages/core/src/agent/native-tools.ts +31 -0
- package/packages/core/src/agent/playbook-selector.ts +147 -0
- package/packages/core/src/agent/prompt-builder.ts +169 -0
- package/packages/core/src/agent/providers/index.ts +204 -0
- package/packages/core/src/agent/providers.ts +1 -0
- package/packages/core/src/agent/reflector.ts +200 -0
- package/packages/core/src/agent/service.ts +267 -0
- package/packages/core/src/agent/skill-selector.ts +479 -0
- package/packages/core/src/agent/stuck-loop.ts +133 -0
- package/packages/core/src/agent/tool-selector.ts +569 -0
- package/packages/core/src/agent/tracer.ts +100 -0
- package/packages/core/src/auth/auth.ts +108 -0
- package/packages/core/src/auth/index.ts +1 -0
- package/packages/core/src/canvas/a2ui-tools.ts +255 -0
- package/packages/core/src/canvas/canvas-manager.ts +390 -0
- package/packages/core/src/canvas/canvas-tools.ts +448 -0
- package/packages/core/src/canvas/emitter.ts +149 -0
- package/packages/core/src/canvas/index.ts +3 -0
- package/packages/core/src/channels/base.ts +154 -0
- package/packages/core/src/channels/discord.ts +273 -0
- package/packages/core/src/channels/index.ts +7 -0
- package/packages/core/src/channels/manager.ts +450 -0
- package/packages/core/src/channels/slack.ts +323 -0
- package/packages/core/src/channels/telegram.ts +612 -0
- package/packages/core/src/channels/webchat.ts +139 -0
- package/packages/core/src/channels/whatsapp.ts +548 -0
- package/packages/core/src/config/index.ts +12 -0
- package/packages/core/src/config/loader.ts +569 -0
- package/packages/core/src/events/agent-bus.ts +460 -0
- package/packages/core/src/events/event-bus.ts +169 -0
- package/packages/core/src/gateway/channel-notify.ts +64 -0
- package/packages/core/src/gateway/helpers/cors.ts +32 -0
- package/packages/core/src/gateway/helpers/index.ts +4 -0
- package/packages/core/src/gateway/helpers/narration.ts +57 -0
- package/packages/core/src/gateway/helpers/path.ts +13 -0
- package/packages/core/src/gateway/helpers/redact.ts +61 -0
- package/packages/core/src/gateway/index.ts +5 -0
- package/packages/core/src/gateway/initializer.ts +363 -0
- package/packages/core/src/gateway/lane-queue.ts +169 -0
- package/packages/core/src/gateway/llm-local/client.ts +94 -0
- package/packages/core/src/gateway/llm-local/detector.ts +321 -0
- package/packages/core/src/gateway/llm-local/downloader.ts +216 -0
- package/packages/core/src/gateway/llm-local/index.ts +34 -0
- package/packages/core/src/gateway/llm-local/manager.ts +186 -0
- package/packages/core/src/gateway/llm-local/models.ts +149 -0
- package/packages/core/src/gateway/llm-local/server.ts +179 -0
- package/packages/core/src/gateway/resolver.ts +108 -0
- package/packages/core/src/gateway/router.ts +124 -0
- package/packages/core/src/gateway/routes/agents.ts +210 -0
- package/packages/core/src/gateway/routes/auth.ts +244 -0
- package/packages/core/src/gateway/routes/channels.ts +484 -0
- package/packages/core/src/gateway/routes/chat.ts +241 -0
- package/packages/core/src/gateway/routes/config.ts +12 -0
- package/packages/core/src/gateway/routes/cron-api.ts +544 -0
- package/packages/core/src/gateway/routes/ethics.ts +46 -0
- package/packages/core/src/gateway/routes/llm-local.ts +271 -0
- package/packages/core/src/gateway/routes/mcp.ts +319 -0
- package/packages/core/src/gateway/routes/meeting.ts +232 -0
- package/packages/core/src/gateway/routes/models.ts +163 -0
- package/packages/core/src/gateway/routes/multimodal.ts +93 -0
- package/packages/core/src/gateway/routes/providers.ts +220 -0
- package/packages/core/src/gateway/routes/setup.ts +441 -0
- package/packages/core/src/gateway/routes/skills.ts +115 -0
- package/packages/core/src/gateway/routes/system.ts +469 -0
- package/packages/core/src/gateway/routes/tasks.ts +44 -0
- package/packages/core/src/gateway/routes/tools.ts +59 -0
- package/packages/core/src/gateway/routes/tts-local.ts +388 -0
- package/packages/core/src/gateway/routes/users.ts +122 -0
- package/packages/core/src/gateway/routes/voice.ts +189 -0
- package/packages/core/src/gateway/routes/workspace.ts +281 -0
- package/packages/core/src/gateway/server.ts +2744 -0
- package/packages/core/src/gateway/session.ts +95 -0
- package/packages/core/src/gateway/slash-commands.ts +207 -0
- package/packages/core/src/gateway/tts/README.md +94 -0
- package/packages/core/src/gateway/tts/package.json +25 -0
- package/packages/core/src/gateway/tts/src/client.ts +59 -0
- package/packages/core/src/gateway/tts/src/detect.ts +42 -0
- package/packages/core/src/gateway/tts/src/index.ts +15 -0
- package/packages/core/src/gateway/tts/src/install.ts +129 -0
- package/packages/core/src/gateway/tts/src/models.ts +50 -0
- package/packages/core/src/gateway/tts/src/server.ts +252 -0
- package/packages/core/src/gateway/tts/voices/.gitkeep +0 -0
- package/packages/core/src/heartbeat/index.ts +157 -0
- package/packages/core/src/index.ts +56 -0
- package/packages/core/src/mcp/hot-reload.ts +148 -0
- package/packages/core/src/mcp/singleton.ts +21 -0
- package/packages/core/src/mcp/tool-sync.ts +176 -0
- package/packages/core/src/multimodal/index.ts +2 -0
- package/packages/core/src/multimodal/types.ts +28 -0
- package/packages/core/src/multimodal/vision-service.ts +283 -0
- package/packages/core/src/plugins/api.ts +128 -0
- package/packages/core/src/plugins/index.ts +2 -0
- package/packages/core/src/plugins/loader.ts +365 -0
- package/packages/core/src/resilience/circuit-breaker.ts +225 -0
- package/packages/core/src/scheduler/CronScheduler.ts +699 -0
- package/packages/core/src/scheduler/dag/AgentExecutor.ts +53 -0
- package/packages/core/src/scheduler/dag/DAGScheduler.ts +250 -0
- package/packages/core/src/scheduler/dag/EventBridge.ts +122 -0
- package/packages/core/src/scheduler/dag/TaskGraph.ts +192 -0
- package/packages/core/src/scheduler/dag/TaskNode.ts +97 -0
- package/packages/core/src/scheduler/dag/TaskResult.ts +22 -0
- package/packages/core/src/scheduler/dag/errors.ts +37 -0
- package/packages/core/src/scheduler/dag/index.ts +26 -0
- package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +97 -0
- package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +21 -0
- package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +46 -0
- package/packages/core/src/scheduler/index.ts +22 -0
- package/packages/core/src/scheduler/integration.ts +237 -0
- package/packages/core/src/scheduler/types.ts +164 -0
- package/packages/core/src/security/google-chat.ts +269 -0
- package/packages/core/src/security/index.ts +192 -0
- package/packages/core/src/security/pairing.ts +250 -0
- package/packages/core/src/security/rate-limit.ts +270 -0
- package/packages/core/src/security/signal.ts +321 -0
- package/packages/core/src/state/store.ts +312 -0
- package/packages/core/src/storage/crypto.ts +197 -0
- package/packages/core/src/storage/migrate.ts +147 -0
- package/packages/core/src/storage/onboarding.ts +1506 -0
- package/packages/core/src/storage/schema.ts +666 -0
- package/packages/core/src/storage/seed.ts +628 -0
- package/packages/core/src/storage/sqlite.ts +407 -0
- package/packages/core/src/storage/usage.ts +374 -0
- package/packages/core/src/tool-runtime/index.ts +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/AgentNewPage-GB-tVN50.js +0 -1
- package/dist/ui/assets/BridgePage-DDcDILKu.js +0 -1
- package/dist/ui/assets/CanvasPage-oOk2sGOD.js +0 -33
- package/dist/ui/assets/DashboardPage-DV_2qWYJ.js +0 -6
- package/dist/ui/assets/LogsPage-DayYjh01.js +0 -1
- package/dist/ui/assets/MeetingPage-C01uPuqj.js +0 -1
- package/dist/ui/assets/ProjectsPage-B8_am_Ib.js +0 -1
- package/dist/ui/assets/ProvidersPage-DBzi66e4.js +0 -1
- package/dist/ui/assets/SettingsPage-CFA_Tknl.js +0 -9
- package/dist/ui/assets/SetupPage-BrUWbhvT.js +0 -1
- package/dist/ui/assets/accordion-DdAEfIXR.js +0 -1
- package/dist/ui/assets/chevron-down-DIosfU_U.js +0 -1
- package/dist/ui/assets/chevron-up-CI-W21Fy.js +0 -1
- package/dist/ui/assets/circle-S0-ouLz-.js +0 -1
- package/dist/ui/assets/circle-minus-CE0iJrl8.js +0 -1
- package/dist/ui/assets/circle-x-jUJ5zZvQ.js +0 -1
- package/dist/ui/assets/dropdown-menu-C2CXM1VE.js +0 -1
- package/dist/ui/assets/index-BN0875JH.css +0 -2
- package/dist/ui/assets/index-CH6sBa3Q.js +0 -116
- package/dist/ui/assets/pencil-5VdSj-h5.js +0 -1
- package/dist/ui/assets/progress-JN30I5fF.js +0 -1
- package/dist/ui/assets/scroll-area-BQQPitM8.js +0 -1
- package/dist/ui/assets/search-ChPgnVKj.js +0 -1
- package/dist/ui/assets/switch-C7W2-KEx.js +0 -1
- package/dist/ui/assets/terminal-C-R5Fckz.js +0 -1
- package/dist/ui/assets/useProviders-TBnWn-Hq.js +0 -1
- /package/dist/ui/assets/{card-DFKnZ6ky.js → card-CNf6BS2e.js} +0 -0
- /package/dist/ui/assets/{circle-alert-KuAm2FWh.js → circle-alert-CyHDwUj8.js} +0 -0
- /package/dist/ui/assets/{circle-check-6Ard1-2z.js → circle-check-Bb54Ebmu.js} +0 -0
- /package/dist/ui/assets/{cpu-KDy6-FAI.js → cpu-Cdgc_B1K.js} +0 -0
- /package/dist/ui/assets/{download-Cjbk4Rek.js → download-C3ifGMjJ.js} +0 -0
- /package/dist/ui/assets/{external-link-HtrFM63g.js → external-link-BvxYeTP1.js} +0 -0
- /package/dist/ui/assets/{eye-D1dB40_o.js → eye-DqNTU_GD.js} +0 -0
- /package/dist/ui/assets/{file-text-CE58EfH0.js → file-text-BT_9S9SM.js} +0 -0
- /package/dist/ui/assets/{folder-open-DIPKeiI_.js → folder-open-BhH8y9ac.js} +0 -0
- /package/dist/ui/assets/{format-BwdV8bB5.js → format-GVHeOyWI.js} +0 -0
- /package/dist/ui/assets/{gateway-url-D5uj6Nxg.js → gateway-url-COCbW0IR.js} +0 -0
- /package/dist/ui/assets/{gauge-DmQmJHEg.js → gauge-D_TMa4i9.js} +0 -0
- /package/dist/ui/assets/{globe-_hUGxQF4.js → globe-DeCQTCDJ.js} +0 -0
- /package/dist/ui/assets/{hexagon-BaNGQlQj.js → hexagon-DsGOUl-H.js} +0 -0
- /package/dist/ui/assets/{history-BfZVGlZa.js → history-BSG-Ypqf.js} +0 -0
- /package/dist/ui/assets/{info-CBZ5-AlC.js → info-NwLoa2Mj.js} +0 -0
- /package/dist/ui/assets/{key-Bv5DdTPh.js → key-3EP0dhkT.js} +0 -0
- /package/dist/ui/assets/{loader-circle-C4hhXLgp.js → loader-circle-CZNax6kS.js} +0 -0
- /package/dist/ui/assets/{lock-CkZYexqw.js → lock-Ei1_J-Nq.js} +0 -0
- /package/dist/ui/assets/{pause-Bpy1_s7y.js → pause-BUqah9Bi.js} +0 -0
- /package/dist/ui/assets/{play-Cj4osqJZ.js → play-NcZ4swwL.js} +0 -0
- /package/dist/ui/assets/{plus-BQhgZN3A.js → plus-CX1xyhp5.js} +0 -0
- /package/dist/ui/assets/{refresh-cw-BfREHVQM.js → refresh-cw-DaYdjQFk.js} +0 -0
- /package/dist/ui/assets/{save-FFTD4dMp.js → save-CUdYyHNy.js} +0 -0
- /package/dist/ui/assets/{settings-BdHKUL92.js → settings-Ds4SqD8s.js} +0 -0
- /package/dist/ui/assets/{sparkles-r4uJbJAl.js → sparkles-yUEb-7oH.js} +0 -0
- /package/dist/ui/assets/{square-G7Hyufqm.js → square-BD81nFtN.js} +0 -0
- /package/dist/ui/assets/{textarea-5kyuD04X.js → textarea-CXgXWKrT.js} +0 -0
- /package/dist/ui/assets/{trash-2-DXVBRWfh.js → trash-2-CNjMkoq6.js} +0 -0
- /package/dist/ui/assets/{triangle-alert-Bu5seg9O.js → triangle-alert-C9Y8Ub4X.js} +0 -0
- /package/dist/ui/assets/{vendor-router-CCECILJ0.js → vendor-router-C9pIYwbJ.js} +0 -0
- /package/dist/ui/assets/{volume-2-s9DuS696.js → volume-2-CeSXNDv4.js} +0 -0
- /package/dist/ui/assets/{zap-BPHZzXKV.js → zap-hlXjpSeA.js} +0 -0
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
import { getDb } from "../../storage/sqlite"
|
|
2
|
+
import { storeChannelConfig, loadChannelConfig, deleteChannelSecrets } from "../../storage/crypto"
|
|
3
|
+
|
|
4
|
+
export async function handleGetChannels(
|
|
5
|
+
req: Request,
|
|
6
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
7
|
+
channelManager?: any
|
|
8
|
+
): Promise<Response> {
|
|
9
|
+
const channels = getDb().query(`
|
|
10
|
+
SELECT id, type, id as account_id, enabled, active, status, last_active,
|
|
11
|
+
voice_enabled, tts_enabled, stt_provider, tts_provider, tts_voice_id, step_delivery_mode,
|
|
12
|
+
vision_enabled, ocr_provider, vision_provider, vision_model_id
|
|
13
|
+
FROM channels
|
|
14
|
+
`).all() as Array<{
|
|
15
|
+
id: string;
|
|
16
|
+
type: string;
|
|
17
|
+
account_id: string;
|
|
18
|
+
enabled: number;
|
|
19
|
+
active: number;
|
|
20
|
+
status: string;
|
|
21
|
+
last_active: number | null;
|
|
22
|
+
voice_enabled: number;
|
|
23
|
+
tts_enabled: number;
|
|
24
|
+
stt_provider: string | null;
|
|
25
|
+
tts_provider: string | null;
|
|
26
|
+
tts_voice_id: string | null;
|
|
27
|
+
step_delivery_mode: string | null;
|
|
28
|
+
vision_enabled: number;
|
|
29
|
+
ocr_provider: string | null;
|
|
30
|
+
vision_provider: string | null;
|
|
31
|
+
vision_model_id: string | null;
|
|
32
|
+
}>
|
|
33
|
+
|
|
34
|
+
// Convert to format expected by UI (ConnectedChannel[])
|
|
35
|
+
// Overlay the live runtime status from channelManager so that channels like
|
|
36
|
+
// Telegram/Discord (which never write "connected" to the DB) show the correct state.
|
|
37
|
+
const formattedChannels = await Promise.all(channels.map(async c => {
|
|
38
|
+
let liveStatus: string = c.status;
|
|
39
|
+
if (channelManager && typeof channelManager.getChannelStatus === "function") {
|
|
40
|
+
const live = channelManager.getChannelStatus(c.type, c.id);
|
|
41
|
+
if (live && live.status !== "not_found") liveStatus = live.status;
|
|
42
|
+
}
|
|
43
|
+
const config = await loadChannelConfig(c.id);
|
|
44
|
+
const isConfigured = Object.keys(config).length > 0;
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
id: c.id,
|
|
48
|
+
type: c.type as ConnectedChannel["type"],
|
|
49
|
+
accountId: c.account_id,
|
|
50
|
+
enabled: c.enabled === 1,
|
|
51
|
+
active: c.active === 1,
|
|
52
|
+
status: liveStatus as ConnectedChannel["status"],
|
|
53
|
+
last_active: c.last_active ?? undefined,
|
|
54
|
+
voice_enabled: c.voice_enabled === 1,
|
|
55
|
+
tts_enabled: c.tts_enabled === 1,
|
|
56
|
+
stt_provider: c.stt_provider ?? undefined,
|
|
57
|
+
tts_provider: c.tts_provider ?? undefined,
|
|
58
|
+
tts_voice_id: c.tts_voice_id ?? undefined,
|
|
59
|
+
step_delivery_mode: c.step_delivery_mode ?? undefined,
|
|
60
|
+
vision_enabled: c.vision_enabled === 1,
|
|
61
|
+
ocr_provider: c.ocr_provider ?? undefined,
|
|
62
|
+
vision_provider: c.vision_provider ?? undefined,
|
|
63
|
+
vision_model_id: c.vision_model_id ?? undefined,
|
|
64
|
+
isConfigured,
|
|
65
|
+
};
|
|
66
|
+
}))
|
|
67
|
+
|
|
68
|
+
return addCorsHeaders(Response.json({ channels: formattedChannels }), req)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
type ConnectedChannel = {
|
|
72
|
+
id: string;
|
|
73
|
+
type: string;
|
|
74
|
+
accountId?: string;
|
|
75
|
+
enabled: boolean;
|
|
76
|
+
active: boolean;
|
|
77
|
+
status: string;
|
|
78
|
+
last_active?: number;
|
|
79
|
+
voice_enabled: boolean;
|
|
80
|
+
tts_enabled: boolean;
|
|
81
|
+
stt_provider?: string;
|
|
82
|
+
tts_provider?: string;
|
|
83
|
+
tts_voice_id?: string;
|
|
84
|
+
step_delivery_mode?: string;
|
|
85
|
+
vision_enabled: boolean;
|
|
86
|
+
ocr_provider?: string;
|
|
87
|
+
vision_provider?: string;
|
|
88
|
+
vision_model_id?: string;
|
|
89
|
+
isConfigured?: boolean;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export async function handleGetChannelConfig(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
93
|
+
const url = new URL(req.url)
|
|
94
|
+
const channelIdMatch = url.pathname.match(/^\/api\/channels\/([^/]+)$/)
|
|
95
|
+
|
|
96
|
+
if (!channelIdMatch) {
|
|
97
|
+
return addCorsHeaders(Response.json({ error: "Invalid path" }), req)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const channelId = channelIdMatch[1]
|
|
101
|
+
const config = getDb().query(`
|
|
102
|
+
SELECT * FROM user_channels WHERE channel = ?
|
|
103
|
+
`).all(channelId) as Record<string, unknown>[]
|
|
104
|
+
|
|
105
|
+
return addCorsHeaders(Response.json({ config }), req)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export async function handleActivateChannel(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
109
|
+
const body = await req.json().catch(() => ({}))
|
|
110
|
+
const { channel, config, accountId } = body
|
|
111
|
+
|
|
112
|
+
if (!channel) {
|
|
113
|
+
return addCorsHeaders(Response.json({ success: false, error: "channel required" }), req)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const userId = "default"
|
|
117
|
+
getDb().query(`
|
|
118
|
+
INSERT OR REPLACE INTO user_channels(user_id, channel, account_id, config, active)
|
|
119
|
+
VALUES(?, ?, ?, ?, 1)
|
|
120
|
+
`).run(userId, channel, accountId || null, JSON.stringify(config || {}))
|
|
121
|
+
|
|
122
|
+
return addCorsHeaders(Response.json({ success: true, channel }), req)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export async function handleDeactivateChannel(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
126
|
+
const url = new URL(req.url)
|
|
127
|
+
const parts = url.pathname.split("/")
|
|
128
|
+
const channel = parts[3]
|
|
129
|
+
const accountId = parts[4]
|
|
130
|
+
|
|
131
|
+
if (!channel) {
|
|
132
|
+
return addCorsHeaders(Response.json({ success: false, error: "channel required" }), req)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const userId = "default"
|
|
136
|
+
if (accountId) {
|
|
137
|
+
getDb().query(`DELETE FROM user_channels WHERE user_id = ? AND channel = ? AND account_id = ?`).run(userId, channel, accountId)
|
|
138
|
+
} else {
|
|
139
|
+
getDb().query(`DELETE FROM user_channels WHERE user_id = ? AND channel = ?`).run(userId, channel)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return addCorsHeaders(Response.json({ success: true }), req)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export async function handleCreateChannel(
|
|
146
|
+
req: Request,
|
|
147
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
148
|
+
channelManager?: any
|
|
149
|
+
): Promise<Response> {
|
|
150
|
+
const body = await req.json().catch(() => ({}));
|
|
151
|
+
const { type, config: channelConfig } = body;
|
|
152
|
+
|
|
153
|
+
if (!type) {
|
|
154
|
+
return addCorsHeaders(new Response("Missing type", { status: 400 }), req);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Reuse the existing seeded channel record (e.g. id="whatsapp") if it exists
|
|
158
|
+
// and has not been configured yet — avoids creating duplicate UUID entries.
|
|
159
|
+
// A seeded-but-unconfigured channel has no secret in the keychain yet.
|
|
160
|
+
const seededRows = getDb().query(
|
|
161
|
+
`SELECT id FROM channels WHERE type = ? LIMIT 10`
|
|
162
|
+
).all(type) as { id: string }[];
|
|
163
|
+
|
|
164
|
+
// Find a row with no config in keychain (unconfigured seed)
|
|
165
|
+
let seededId: string | null = null;
|
|
166
|
+
for (const row of seededRows) {
|
|
167
|
+
const existing = await loadChannelConfig(row.id);
|
|
168
|
+
if (Object.keys(existing).length === 0) {
|
|
169
|
+
seededId = row.id;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
let id: string;
|
|
175
|
+
if (seededId) {
|
|
176
|
+
id = seededId;
|
|
177
|
+
getDb().query(
|
|
178
|
+
`UPDATE channels SET enabled = 1, active = 1, status = 'connecting' WHERE id = ?`
|
|
179
|
+
).run(id);
|
|
180
|
+
} else {
|
|
181
|
+
const { randomUUID } = await import("crypto");
|
|
182
|
+
id = randomUUID();
|
|
183
|
+
getDb().query(`
|
|
184
|
+
INSERT INTO channels(id, type, enabled, active, status)
|
|
185
|
+
VALUES(?, ?, 1, 1, 'connecting')
|
|
186
|
+
`).run(id, type);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (channelConfig && Object.keys(channelConfig).length > 0) {
|
|
190
|
+
await storeChannelConfig(id, channelConfig);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (channelManager) {
|
|
194
|
+
channelManager.addChannel(type, id, channelConfig || {}).catch((err: Error) => {
|
|
195
|
+
console.error(`[channels] Failed to start ${type}:${id}:`, err.message);
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return addCorsHeaders(Response.json({ success: true, id, status: "connecting" }), req);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export async function handleReconnectChannel(
|
|
203
|
+
req: Request,
|
|
204
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
205
|
+
channelId: string,
|
|
206
|
+
channelManager?: any
|
|
207
|
+
): Promise<Response> {
|
|
208
|
+
const body = await req.json().catch(() => ({}));
|
|
209
|
+
const { config: newConfig } = body;
|
|
210
|
+
|
|
211
|
+
const row = getDb().query(`SELECT type FROM channels WHERE id = ?`).get(channelId) as {
|
|
212
|
+
type: string;
|
|
213
|
+
} | undefined;
|
|
214
|
+
|
|
215
|
+
if (!row) {
|
|
216
|
+
return addCorsHeaders(Response.json({ success: false, error: "Channel not found" }, { status: 404 }), req);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Update credentials if new config provided
|
|
220
|
+
if (newConfig && Object.keys(newConfig).length > 0) {
|
|
221
|
+
await storeChannelConfig(channelId, newConfig);
|
|
222
|
+
}
|
|
223
|
+
getDb().query(`UPDATE channels SET enabled = 1, active = 1, status = 'connecting' WHERE id = ?`)
|
|
224
|
+
.run(channelId);
|
|
225
|
+
|
|
226
|
+
if (channelManager) {
|
|
227
|
+
let config: Record<string, unknown> = {};
|
|
228
|
+
if (newConfig && Object.keys(newConfig).length > 0) {
|
|
229
|
+
config = newConfig;
|
|
230
|
+
} else {
|
|
231
|
+
config = await loadChannelConfig(channelId);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Remove old instance then start fresh — must be sequential to avoid race
|
|
235
|
+
// where removeChannel deletes the key AFTER addChannel already set it
|
|
236
|
+
;(async () => {
|
|
237
|
+
try { await channelManager.removeChannel(row.type, channelId); } catch { /* ignore */ }
|
|
238
|
+
try {
|
|
239
|
+
await channelManager.addChannel(row.type, channelId, config);
|
|
240
|
+
} catch (err: unknown) {
|
|
241
|
+
console.error(`[channels] Failed to reconnect ${row.type}:${channelId}:`, (err as Error).message);
|
|
242
|
+
}
|
|
243
|
+
})();
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return addCorsHeaders(Response.json({ success: true, status: "connecting" }), req);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export async function handleGetChannelStatus(
|
|
250
|
+
req: Request,
|
|
251
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
252
|
+
channelManager?: any
|
|
253
|
+
): Promise<Response> {
|
|
254
|
+
const url = new URL(req.url);
|
|
255
|
+
const match = url.pathname.match(/^\/api\/channels\/([^/]+)\/([^/]+)\/status$/);
|
|
256
|
+
if (!match) {
|
|
257
|
+
return addCorsHeaders(Response.json({ error: "Invalid path" }, { status: 400 }), req);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const [, type, id] = match;
|
|
261
|
+
|
|
262
|
+
if (!channelManager) {
|
|
263
|
+
return addCorsHeaders(Response.json({ status: "unknown" }), req);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const statusData = channelManager.getChannelStatus(type, id);
|
|
267
|
+
return addCorsHeaders(Response.json(statusData), req);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export async function handleGetChannelAccount(
|
|
271
|
+
req: Request,
|
|
272
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
273
|
+
name: string,
|
|
274
|
+
accountId: string
|
|
275
|
+
): Promise<Response> {
|
|
276
|
+
// This should read from the config file or database
|
|
277
|
+
// For now, return a placeholder - the actual implementation depends on config storage
|
|
278
|
+
return addCorsHeaders(Response.json({ name, accountId, config: {} }), req);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export async function handleUpdateChannelAccount(
|
|
282
|
+
req: Request,
|
|
283
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
284
|
+
name: string,
|
|
285
|
+
accountId: string,
|
|
286
|
+
channelManager?: any
|
|
287
|
+
): Promise<Response> {
|
|
288
|
+
const body = await req.json().catch(() => ({}));
|
|
289
|
+
if (!body.config) {
|
|
290
|
+
return new Response("Missing config", { status: 400 });
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Note: Channel config persistence should be handled by the caller
|
|
294
|
+
if (channelManager) {
|
|
295
|
+
await channelManager.removeChannel(name, accountId);
|
|
296
|
+
await channelManager.startChannel(name, accountId);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return addCorsHeaders(Response.json({ success: true }), req);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
export async function handleDeleteChannelAccount(
|
|
303
|
+
req: Request,
|
|
304
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
305
|
+
name: string,
|
|
306
|
+
accountId: string,
|
|
307
|
+
config?: any,
|
|
308
|
+
channelManager?: any
|
|
309
|
+
): Promise<Response> {
|
|
310
|
+
// Note: Config update should be handled by the caller
|
|
311
|
+
if (channelManager) {
|
|
312
|
+
await channelManager.removeChannel(name, accountId);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
return addCorsHeaders(Response.json({ success: true }), req);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
export async function handleChannelAction(
|
|
319
|
+
req: Request,
|
|
320
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
321
|
+
name: string,
|
|
322
|
+
accountId: string,
|
|
323
|
+
action: "start" | "stop",
|
|
324
|
+
channelManager?: any
|
|
325
|
+
): Promise<Response> {
|
|
326
|
+
try {
|
|
327
|
+
if (!channelManager) {
|
|
328
|
+
return addCorsHeaders(new Response("Channel manager not available", { status: 500 }), req);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (action === "start") {
|
|
332
|
+
await channelManager.startChannel(name, accountId);
|
|
333
|
+
} else {
|
|
334
|
+
await channelManager.stopChannel(name, accountId);
|
|
335
|
+
}
|
|
336
|
+
return addCorsHeaders(Response.json({ success: true }), req);
|
|
337
|
+
} catch (error) {
|
|
338
|
+
return addCorsHeaders(Response.json(
|
|
339
|
+
{ success: false, error: (error as Error).message },
|
|
340
|
+
{ status: 500 }
|
|
341
|
+
), req);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
export async function handleUpdateChannelSettings(
|
|
346
|
+
req: Request,
|
|
347
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
348
|
+
channelId: string
|
|
349
|
+
): Promise<Response> {
|
|
350
|
+
const body = await req.json().catch(() => ({})) as Record<string, unknown>;
|
|
351
|
+
const allowed = ["voice_enabled", "tts_enabled", "stt_provider", "tts_provider", "tts_voice_id", "step_delivery_mode", "vision_enabled", "ocr_provider", "vision_provider", "vision_model_id"] as const;
|
|
352
|
+
const updates: string[] = [];
|
|
353
|
+
const params: unknown[] = [];
|
|
354
|
+
|
|
355
|
+
for (const key of allowed) {
|
|
356
|
+
if (key in body) {
|
|
357
|
+
updates.push(`${key} = ?`);
|
|
358
|
+
params.push(typeof body[key] === "boolean" ? (body[key] ? 1 : 0) : body[key]);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Merge type-specific config into config_encrypted if body.config is provided
|
|
363
|
+
const newConfig = body.config as Record<string, unknown> | undefined;
|
|
364
|
+
if (newConfig && typeof newConfig === "object" && Object.keys(newConfig).length > 0) {
|
|
365
|
+
const exists = getDb().query(`SELECT id FROM channels WHERE id = ?`).get(channelId);
|
|
366
|
+
if (exists) {
|
|
367
|
+
const currentConfig = await loadChannelConfig(channelId);
|
|
368
|
+
await storeChannelConfig(channelId, { ...currentConfig, ...newConfig });
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (updates.length === 0) {
|
|
373
|
+
return addCorsHeaders(Response.json({ error: "No valid fields to update" }, { status: 400 }), req);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
params.push(channelId);
|
|
377
|
+
getDb().query(`UPDATE channels SET ${updates.join(", ")} WHERE id = ?`).run(...params as any[]);
|
|
378
|
+
|
|
379
|
+
return addCorsHeaders(Response.json({ success: true }), req);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export async function handleToggleChannel(
|
|
383
|
+
req: Request,
|
|
384
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
385
|
+
channelId: string
|
|
386
|
+
): Promise<Response> {
|
|
387
|
+
const body = await req.json().catch(() => ({}));
|
|
388
|
+
const { active } = body;
|
|
389
|
+
|
|
390
|
+
if (active === undefined) {
|
|
391
|
+
return addCorsHeaders(Response.json({ success: false, error: "Missing active field", message: "Falta el campo 'active'" }, { status: 400 }), req);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
getDb().query(`UPDATE channels SET active = ?, enabled = ? WHERE id = ?`).run(active ? 1 : 0, active ? 1 : 0, channelId);
|
|
395
|
+
|
|
396
|
+
return addCorsHeaders(Response.json({ success: true, active, message: active ? `Canal "${channelId}" activado` : `Canal "${channelId}" desactivado` }), req);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
export async function handleGetWhatsAppDetails(
|
|
400
|
+
req: Request,
|
|
401
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
402
|
+
channelId: string,
|
|
403
|
+
channelManager?: any
|
|
404
|
+
): Promise<Response> {
|
|
405
|
+
if (!channelManager) {
|
|
406
|
+
return addCorsHeaders(Response.json({ error: "Channel manager not available", status: 500 }), req);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
const details = channelManager.getWhatsAppDetails(channelId);
|
|
410
|
+
if (!details) {
|
|
411
|
+
return addCorsHeaders(Response.json({ error: "WhatsApp channel not found", status: 404 }), req);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
return addCorsHeaders(Response.json(details), req);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
export async function handleDisconnectWhatsApp(
|
|
418
|
+
req: Request,
|
|
419
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
420
|
+
channelId: string,
|
|
421
|
+
channelManager?: any
|
|
422
|
+
): Promise<Response> {
|
|
423
|
+
const body = await req.json().catch(() => ({}));
|
|
424
|
+
const { clearSession } = body;
|
|
425
|
+
|
|
426
|
+
if (!channelManager) {
|
|
427
|
+
return addCorsHeaders(Response.json({ success: false, error: "Channel manager not available", status: 500 }), req);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
const key = `whatsapp:${channelId}`;
|
|
431
|
+
const channel = channelManager.channels?.get?.(key);
|
|
432
|
+
|
|
433
|
+
if (!channel) {
|
|
434
|
+
return addCorsHeaders(Response.json({ success: false, error: "WhatsApp channel not found", status: 404 }), req);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
try {
|
|
438
|
+
if (typeof (channel as any).disconnect === "function") {
|
|
439
|
+
await (channel as any).disconnect(clearSession === true);
|
|
440
|
+
}
|
|
441
|
+
return addCorsHeaders(Response.json({ success: true }), req);
|
|
442
|
+
} catch (error) {
|
|
443
|
+
return addCorsHeaders(Response.json({ success: false, error: (error as Error).message }, { status: 500 }), req);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
export async function handleUpdateWhatsAppConfig(
|
|
448
|
+
req: Request,
|
|
449
|
+
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
450
|
+
channelId: string,
|
|
451
|
+
channelManager?: any
|
|
452
|
+
): Promise<Response> {
|
|
453
|
+
const body = await req.json().catch(() => ({}));
|
|
454
|
+
const { acceptGroups, reconnectMaxAttempts, reconnectBaseDelayMs, dmPolicy, selfMessagesOnly, allowFrom } = body;
|
|
455
|
+
|
|
456
|
+
// Read and decrypt the existing config, merge new values, then re-encrypt.
|
|
457
|
+
// These fields live inside config_encrypted — not as top-level columns.
|
|
458
|
+
const row = getDb().query(`SELECT config_encrypted, config_iv FROM channels WHERE id = ?`)
|
|
459
|
+
.get(channelId) as { config_encrypted: string | null; config_iv: string | null } | undefined;
|
|
460
|
+
|
|
461
|
+
if (!row) {
|
|
462
|
+
return addCorsHeaders(Response.json({ success: false, error: "Channel not found" }, { status: 404 }), req);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
const currentConfig = await loadChannelConfig(channelId);
|
|
466
|
+
const merged: Record<string, unknown> = { ...currentConfig };
|
|
467
|
+
if (acceptGroups !== undefined) merged.acceptGroups = Boolean(acceptGroups);
|
|
468
|
+
if (reconnectMaxAttempts !== undefined) merged.reconnectMaxAttempts = Number(reconnectMaxAttempts);
|
|
469
|
+
if (reconnectBaseDelayMs !== undefined) merged.reconnectBaseDelayMs = Number(reconnectBaseDelayMs);
|
|
470
|
+
if (dmPolicy !== undefined) merged.dmPolicy = dmPolicy;
|
|
471
|
+
if (selfMessagesOnly !== undefined) merged.selfMessagesOnly = Boolean(selfMessagesOnly);
|
|
472
|
+
if (allowFrom !== undefined) merged.allowFrom = Array.isArray(allowFrom) ? allowFrom : [];
|
|
473
|
+
await storeChannelConfig(channelId, merged);
|
|
474
|
+
|
|
475
|
+
// Restart the running channel so it picks up the new config immediately.
|
|
476
|
+
if (channelManager) {
|
|
477
|
+
try {
|
|
478
|
+
await channelManager.removeChannel("whatsapp", channelId);
|
|
479
|
+
await channelManager.addChannel("whatsapp", channelId, merged);
|
|
480
|
+
} catch { /* ignore restart errors */ }
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
return addCorsHeaders(Response.json({ success: true }), req);
|
|
484
|
+
}
|