@johpaz/hive 1.7.2 → 1.7.3
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 +178 -36
- package/dist/hive.js +315124 -0
- package/package.json +11 -3
- package/packages/core/src/index.ts +0 -1
- package/.dockerignore +0 -9
- package/CONTRIBUTING.md +0 -44
- package/Dockerfile +0 -67
- package/docker-compose.yml +0 -19
- package/packages/cli/package.json +0 -28
- package/packages/cli/src/commands/agent-run.ts +0 -168
- package/packages/cli/src/commands/agents.ts +0 -398
- package/packages/cli/src/commands/chat.ts +0 -142
- package/packages/cli/src/commands/config.ts +0 -50
- package/packages/cli/src/commands/cron.ts +0 -161
- package/packages/cli/src/commands/dev.ts +0 -95
- package/packages/cli/src/commands/doctor.ts +0 -133
- package/packages/cli/src/commands/gateway.ts +0 -422
- package/packages/cli/src/commands/logs.ts +0 -57
- package/packages/cli/src/commands/mcp.ts +0 -175
- package/packages/cli/src/commands/message.ts +0 -77
- package/packages/cli/src/commands/onboard.ts +0 -1696
- package/packages/cli/src/commands/security.ts +0 -144
- package/packages/cli/src/commands/service.ts +0 -50
- package/packages/cli/src/commands/sessions.ts +0 -116
- package/packages/cli/src/commands/skills.ts +0 -187
- package/packages/cli/src/commands/update.ts +0 -25
- package/packages/cli/src/index.ts +0 -190
- package/packages/cli/src/utils/token.ts +0 -6
- package/packages/code-bridge/README.md +0 -78
- package/packages/code-bridge/package.json +0 -18
- package/packages/code-bridge/src/index.ts +0 -95
- package/packages/code-bridge/src/process-manager.ts +0 -212
- package/packages/code-bridge/src/schemas.ts +0 -133
- package/packages/core/package.json +0 -55
- package/packages/core/src/agent/agent-loop.ts +0 -520
- package/packages/core/src/agent/compaction.ts +0 -183
- package/packages/core/src/agent/context-compiler.ts +0 -544
- package/packages/core/src/agent/context-guard.ts +0 -91
- package/packages/core/src/agent/conversation-store.ts +0 -193
- package/packages/core/src/agent/curator.ts +0 -158
- package/packages/core/src/agent/hooks.ts +0 -166
- package/packages/core/src/agent/llm-client.ts +0 -503
- package/packages/core/src/agent/native-tools.ts +0 -31
- package/packages/core/src/agent/playbook-selector.ts +0 -143
- package/packages/core/src/agent/prompt-builder.ts +0 -167
- package/packages/core/src/agent/providers/index.ts +0 -186
- package/packages/core/src/agent/providers.ts +0 -1
- package/packages/core/src/agent/reflector.ts +0 -200
- package/packages/core/src/agent/service.ts +0 -266
- package/packages/core/src/agent/skill-selector.ts +0 -413
- package/packages/core/src/agent/stuck-loop.ts +0 -133
- package/packages/core/src/agent/tool-selector.ts +0 -623
- package/packages/core/src/agent/tracer.ts +0 -102
- package/packages/core/src/canvas/canvas-manager.ts +0 -319
- package/packages/core/src/canvas/canvas-tools.ts +0 -420
- package/packages/core/src/canvas/emitter.ts +0 -119
- package/packages/core/src/canvas/index.ts +0 -2
- package/packages/core/src/channels/base.ts +0 -140
- package/packages/core/src/channels/discord.ts +0 -260
- package/packages/core/src/channels/index.ts +0 -7
- package/packages/core/src/channels/manager.ts +0 -383
- package/packages/core/src/channels/slack.ts +0 -287
- package/packages/core/src/channels/telegram.ts +0 -552
- package/packages/core/src/channels/webchat.ts +0 -139
- package/packages/core/src/channels/whatsapp.ts +0 -375
- package/packages/core/src/config/index.ts +0 -12
- package/packages/core/src/config/loader.ts +0 -529
- package/packages/core/src/events/agent-bus.ts +0 -460
- package/packages/core/src/events/event-bus.ts +0 -169
- package/packages/core/src/gateway/helpers/cors.ts +0 -32
- package/packages/core/src/gateway/helpers/index.ts +0 -4
- package/packages/core/src/gateway/helpers/narration.ts +0 -60
- package/packages/core/src/gateway/helpers/path.ts +0 -13
- package/packages/core/src/gateway/helpers/redact.ts +0 -61
- package/packages/core/src/gateway/index.ts +0 -5
- package/packages/core/src/gateway/initializer.ts +0 -332
- package/packages/core/src/gateway/lane-queue.ts +0 -169
- package/packages/core/src/gateway/resolver.ts +0 -108
- package/packages/core/src/gateway/router.ts +0 -124
- package/packages/core/src/gateway/routes/agents.ts +0 -187
- package/packages/core/src/gateway/routes/channels.ts +0 -203
- package/packages/core/src/gateway/routes/chat.ts +0 -241
- package/packages/core/src/gateway/routes/config.ts +0 -12
- package/packages/core/src/gateway/routes/cron.ts +0 -42
- package/packages/core/src/gateway/routes/ethics.ts +0 -46
- package/packages/core/src/gateway/routes/mcp.ts +0 -346
- package/packages/core/src/gateway/routes/models.ts +0 -93
- package/packages/core/src/gateway/routes/projects.ts +0 -179
- package/packages/core/src/gateway/routes/providers.ts +0 -192
- package/packages/core/src/gateway/routes/setup.ts +0 -267
- package/packages/core/src/gateway/routes/skills.ts +0 -70
- package/packages/core/src/gateway/routes/system.ts +0 -165
- package/packages/core/src/gateway/routes/tasks.ts +0 -44
- package/packages/core/src/gateway/routes/tools.ts +0 -35
- package/packages/core/src/gateway/routes/users.ts +0 -118
- package/packages/core/src/gateway/routes/voice.ts +0 -73
- package/packages/core/src/gateway/routes/workspace.ts +0 -281
- package/packages/core/src/gateway/server.ts +0 -1978
- package/packages/core/src/gateway/session.ts +0 -95
- package/packages/core/src/gateway/slash-commands.ts +0 -193
- package/packages/core/src/heartbeat/index.ts +0 -157
- package/packages/core/src/mcp/hot-reload.ts +0 -213
- package/packages/core/src/mcp/singleton.ts +0 -21
- package/packages/core/src/memory/index.ts +0 -1
- package/packages/core/src/memory/notes.ts +0 -68
- package/packages/core/src/plugins/api.ts +0 -128
- package/packages/core/src/plugins/index.ts +0 -2
- package/packages/core/src/plugins/loader.ts +0 -365
- package/packages/core/src/resilience/circuit-breaker.ts +0 -225
- package/packages/core/src/security/google-chat.ts +0 -269
- package/packages/core/src/security/index.ts +0 -192
- package/packages/core/src/security/pairing.ts +0 -250
- package/packages/core/src/security/rate-limit.ts +0 -270
- package/packages/core/src/security/signal.ts +0 -321
- package/packages/core/src/state/store.ts +0 -312
- package/packages/core/src/storage/crypto.ts +0 -101
- package/packages/core/src/storage/onboarding.ts +0 -1609
- package/packages/core/src/storage/schema.ts +0 -567
- package/packages/core/src/storage/seed.ts +0 -608
- package/packages/core/src/storage/sqlite.ts +0 -363
- package/packages/core/src/storage/usage.ts +0 -270
- package/packages/core/src/tools/agents/index.ts +0 -607
- package/packages/core/src/tools/bridge-events.ts +0 -26
- package/packages/core/src/tools/canvas/index.ts +0 -281
- package/packages/core/src/tools/cli/index.ts +0 -142
- package/packages/core/src/tools/codebridge/index.ts +0 -179
- package/packages/core/src/tools/core/index.ts +0 -257
- package/packages/core/src/tools/cron/index.ts +0 -373
- package/packages/core/src/tools/filesystem/fs-delete.ts +0 -78
- package/packages/core/src/tools/filesystem/fs-edit.ts +0 -106
- package/packages/core/src/tools/filesystem/fs-exists.ts +0 -63
- package/packages/core/src/tools/filesystem/fs-glob.ts +0 -108
- package/packages/core/src/tools/filesystem/fs-list.ts +0 -129
- package/packages/core/src/tools/filesystem/fs-read.ts +0 -72
- package/packages/core/src/tools/filesystem/fs-write.ts +0 -67
- package/packages/core/src/tools/filesystem/index.ts +0 -34
- package/packages/core/src/tools/filesystem/workspace-guard.ts +0 -62
- package/packages/core/src/tools/index.ts +0 -197
- package/packages/core/src/tools/projects/index.ts +0 -37
- package/packages/core/src/tools/projects/project-create.ts +0 -94
- package/packages/core/src/tools/projects/project-done.ts +0 -66
- package/packages/core/src/tools/projects/project-fail.ts +0 -66
- package/packages/core/src/tools/projects/project-list.ts +0 -96
- package/packages/core/src/tools/projects/project-update.ts +0 -72
- package/packages/core/src/tools/projects/task-create.ts +0 -68
- package/packages/core/src/tools/projects/task-evaluate.ts +0 -93
- package/packages/core/src/tools/projects/task-update.ts +0 -93
- package/packages/core/src/tools/search-knowledge/search-knowledge.ts +0 -155
- package/packages/core/src/tools/types.ts +0 -39
- package/packages/core/src/tools/voice/index.ts +0 -104
- package/packages/core/src/tools/web/browser-click.ts +0 -54
- package/packages/core/src/tools/web/browser-navigate.ts +0 -84
- package/packages/core/src/tools/web/browser-screenshot.ts +0 -54
- package/packages/core/src/tools/web/browser-type.ts +0 -60
- package/packages/core/src/tools/web/index.ts +0 -31
- package/packages/core/src/tools/web/web-fetch.ts +0 -78
- package/packages/core/src/tools/web/web-search.ts +0 -123
- package/packages/core/src/utils/benchmark.ts +0 -80
- package/packages/core/src/utils/crypto.ts +0 -73
- package/packages/core/src/utils/date.ts +0 -42
- package/packages/core/src/utils/index.ts +0 -5
- package/packages/core/src/utils/logger.ts +0 -389
- package/packages/core/src/utils/retry.ts +0 -70
- package/packages/core/src/utils/toon.ts +0 -356
- package/packages/core/src/voice/index.ts +0 -583
- package/packages/hive-ui/README.md +0 -52
- package/packages/hive-ui/components.json +0 -20
- package/packages/hive-ui/index.html +0 -30
- package/packages/hive-ui/package.json +0 -90
- package/packages/hive-ui/public/favicon.ico +0 -0
- package/packages/hive-ui/public/placeholder.svg +0 -1
- package/packages/hive-ui/src/App.tsx +0 -115
- package/packages/hive-ui/src/components/CronJobsPanel.tsx +0 -200
- package/packages/hive-ui/src/components/NavLink.tsx +0 -34
- package/packages/hive-ui/src/components/NotesPanel.tsx +0 -79
- package/packages/hive-ui/src/components/SystemMonitor.tsx +0 -270
- package/packages/hive-ui/src/components/UsageStatsPanel.tsx +0 -334
- package/packages/hive-ui/src/components/WelcomeDialog.tsx +0 -279
- package/packages/hive-ui/src/components/ui/accordion.tsx +0 -52
- package/packages/hive-ui/src/components/ui/alert-dialog.tsx +0 -104
- package/packages/hive-ui/src/components/ui/alert.tsx +0 -45
- package/packages/hive-ui/src/components/ui/aspect-ratio.tsx +0 -5
- package/packages/hive-ui/src/components/ui/avatar.tsx +0 -38
- package/packages/hive-ui/src/components/ui/badge.tsx +0 -29
- package/packages/hive-ui/src/components/ui/bee-loader.tsx +0 -68
- package/packages/hive-ui/src/components/ui/breadcrumb.tsx +0 -90
- package/packages/hive-ui/src/components/ui/button.tsx +0 -47
- package/packages/hive-ui/src/components/ui/calendar.tsx +0 -54
- package/packages/hive-ui/src/components/ui/card.tsx +0 -45
- package/packages/hive-ui/src/components/ui/carousel.tsx +0 -224
- package/packages/hive-ui/src/components/ui/chart.tsx +0 -303
- package/packages/hive-ui/src/components/ui/checkbox.tsx +0 -26
- package/packages/hive-ui/src/components/ui/collapsible.tsx +0 -9
- package/packages/hive-ui/src/components/ui/command.tsx +0 -133
- package/packages/hive-ui/src/components/ui/context-menu.tsx +0 -178
- package/packages/hive-ui/src/components/ui/dialog.tsx +0 -95
- package/packages/hive-ui/src/components/ui/drawer.tsx +0 -87
- package/packages/hive-ui/src/components/ui/dropdown-menu.tsx +0 -179
- package/packages/hive-ui/src/components/ui/form.tsx +0 -129
- package/packages/hive-ui/src/components/ui/hover-card.tsx +0 -27
- package/packages/hive-ui/src/components/ui/input-otp.tsx +0 -61
- package/packages/hive-ui/src/components/ui/input.tsx +0 -22
- package/packages/hive-ui/src/components/ui/label.tsx +0 -17
- package/packages/hive-ui/src/components/ui/menubar.tsx +0 -207
- package/packages/hive-ui/src/components/ui/navigation-menu.tsx +0 -120
- package/packages/hive-ui/src/components/ui/pagination.tsx +0 -80
- package/packages/hive-ui/src/components/ui/popover.tsx +0 -29
- package/packages/hive-ui/src/components/ui/progress.tsx +0 -23
- package/packages/hive-ui/src/components/ui/radio-group.tsx +0 -36
- package/packages/hive-ui/src/components/ui/resizable.tsx +0 -37
- package/packages/hive-ui/src/components/ui/scroll-area.tsx +0 -38
- package/packages/hive-ui/src/components/ui/select.tsx +0 -143
- package/packages/hive-ui/src/components/ui/separator.tsx +0 -20
- package/packages/hive-ui/src/components/ui/sheet.tsx +0 -107
- package/packages/hive-ui/src/components/ui/sidebar.tsx +0 -636
- package/packages/hive-ui/src/components/ui/skeleton.tsx +0 -7
- package/packages/hive-ui/src/components/ui/slider.tsx +0 -23
- package/packages/hive-ui/src/components/ui/sonner.tsx +0 -27
- package/packages/hive-ui/src/components/ui/switch.tsx +0 -27
- package/packages/hive-ui/src/components/ui/table.tsx +0 -72
- package/packages/hive-ui/src/components/ui/tabs.tsx +0 -53
- package/packages/hive-ui/src/components/ui/textarea.tsx +0 -21
- package/packages/hive-ui/src/components/ui/toast.tsx +0 -111
- package/packages/hive-ui/src/components/ui/toaster.tsx +0 -24
- package/packages/hive-ui/src/components/ui/toggle-group.tsx +0 -49
- package/packages/hive-ui/src/components/ui/toggle.tsx +0 -37
- package/packages/hive-ui/src/components/ui/tooltip.tsx +0 -28
- package/packages/hive-ui/src/components/ui/use-toast.ts +0 -3
- package/packages/hive-ui/src/hooks/use-mobile.tsx +0 -19
- package/packages/hive-ui/src/hooks/use-toast.ts +0 -186
- package/packages/hive-ui/src/hooks/useAgentConfig.ts +0 -25
- package/packages/hive-ui/src/hooks/useAgents.ts +0 -38
- package/packages/hive-ui/src/hooks/useBridge.ts +0 -38
- package/packages/hive-ui/src/hooks/useCanvas.ts +0 -24
- package/packages/hive-ui/src/hooks/useChannels.ts +0 -2
- package/packages/hive-ui/src/hooks/useEthics.ts +0 -51
- package/packages/hive-ui/src/hooks/useProviders.ts +0 -14
- package/packages/hive-ui/src/hooks/useTheme.ts +0 -29
- package/packages/hive-ui/src/hooks/useUserConfig.ts +0 -17
- package/packages/hive-ui/src/hooks/useWebSocket.ts +0 -12
- package/packages/hive-ui/src/index.css +0 -620
- package/packages/hive-ui/src/lib/api.ts +0 -100
- package/packages/hive-ui/src/lib/constants.ts +0 -6
- package/packages/hive-ui/src/lib/models.ts +0 -64
- package/packages/hive-ui/src/lib/swal.ts +0 -30
- package/packages/hive-ui/src/lib/utils.ts +0 -6
- package/packages/hive-ui/src/lib/websocket.ts +0 -7
- package/packages/hive-ui/src/main.tsx +0 -5
- package/packages/hive-ui/src/modules/agent-config/details/AgentDetailsEditor.tsx +0 -524
- package/packages/hive-ui/src/modules/agent-config/ethics/EthicsConflictDetector.tsx +0 -18
- package/packages/hive-ui/src/modules/agent-config/ethics/EthicsEditor.tsx +0 -19
- package/packages/hive-ui/src/modules/agent-config/ethics/EthicsRulesList.tsx +0 -36
- package/packages/hive-ui/src/modules/agent-config/ethics/EthicsTemplateGallery.tsx +0 -361
- package/packages/hive-ui/src/modules/agent-config/ethics/index.ts +0 -4
- package/packages/hive-ui/src/modules/agent-config/index.ts +0 -6
- package/packages/hive-ui/src/modules/agent-config/mcp/MCPServerAdd.tsx +0 -322
- package/packages/hive-ui/src/modules/agent-config/mcp/MCPServerCard.tsx +0 -93
- package/packages/hive-ui/src/modules/agent-config/mcp/MCPServerConfig.tsx +0 -427
- package/packages/hive-ui/src/modules/agent-config/mcp/MCPServerList.tsx +0 -85
- package/packages/hive-ui/src/modules/agent-config/mcp/MCPToolExplorer.tsx +0 -79
- package/packages/hive-ui/src/modules/agent-config/mcp/index.ts +0 -5
- package/packages/hive-ui/src/modules/agent-config/shared/ConfigEditorLayout.tsx +0 -30
- package/packages/hive-ui/src/modules/agent-config/shared/ConfigExporter.tsx +0 -26
- package/packages/hive-ui/src/modules/agent-config/shared/ConfigImporter.tsx +0 -25
- package/packages/hive-ui/src/modules/agent-config/shared/DiffViewer.tsx +0 -31
- package/packages/hive-ui/src/modules/agent-config/shared/MarkdownEditor.tsx +0 -32
- package/packages/hive-ui/src/modules/agent-config/shared/SaveStatusIndicator.tsx +0 -23
- package/packages/hive-ui/src/modules/agent-config/shared/ValidationPanel.tsx +0 -36
- package/packages/hive-ui/src/modules/agent-config/shared/index.ts +0 -7
- package/packages/hive-ui/src/modules/agent-config/skills/SkillCard.tsx +0 -81
- package/packages/hive-ui/src/modules/agent-config/skills/SkillConfigEditor.tsx +0 -22
- package/packages/hive-ui/src/modules/agent-config/skills/SkillCreator.tsx +0 -60
- package/packages/hive-ui/src/modules/agent-config/skills/SkillInstaller.tsx +0 -23
- package/packages/hive-ui/src/modules/agent-config/skills/SkillList.tsx +0 -72
- package/packages/hive-ui/src/modules/agent-config/skills/SkillsTab.tsx +0 -202
- package/packages/hive-ui/src/modules/agent-config/skills/index.ts +0 -5
- package/packages/hive-ui/src/modules/agent-config/tools/ToolCard.tsx +0 -27
- package/packages/hive-ui/src/modules/agent-config/tools/ToolConfigPanel.tsx +0 -22
- package/packages/hive-ui/src/modules/agent-config/tools/ToolManager.tsx +0 -266
- package/packages/hive-ui/src/modules/agent-config/tools/ToolPermissions.tsx +0 -287
- package/packages/hive-ui/src/modules/agent-config/tools/ToolRegistry.tsx +0 -84
- package/packages/hive-ui/src/modules/agent-config/tools/ToolUsageStats.tsx +0 -52
- package/packages/hive-ui/src/modules/agent-config/tools/index.ts +0 -4
- package/packages/hive-ui/src/modules/agent-config/user/ActiveAgentsList.tsx +0 -109
- package/packages/hive-ui/src/modules/agent-config/user/GlobalConfigOverview.tsx +0 -119
- package/packages/hive-ui/src/modules/agent-config/user/UserMemoryManager.tsx +0 -54
- package/packages/hive-ui/src/modules/agent-config/user/UserPreferencesForm.tsx +0 -163
- package/packages/hive-ui/src/modules/agent-config/user/UserProfileEditor.tsx +0 -261
- package/packages/hive-ui/src/modules/agent-config/user/index.ts +0 -3
- package/packages/hive-ui/src/modules/agents/AgentActivityLog.tsx +0 -25
- package/packages/hive-ui/src/modules/agents/AgentCard.tsx +0 -305
- package/packages/hive-ui/src/modules/agents/AgentCreateForm.tsx +0 -446
- package/packages/hive-ui/src/modules/agents/AgentDetail.tsx +0 -28
- package/packages/hive-ui/src/modules/agents/AgentInternalCard.tsx +0 -162
- package/packages/hive-ui/src/modules/agents/AgentList.tsx +0 -29
- package/packages/hive-ui/src/modules/agents/AgentStatusBadge.tsx +0 -34
- package/packages/hive-ui/src/modules/agents/ModelSelector.tsx +0 -151
- package/packages/hive-ui/src/modules/bridge/BridgeLogViewer.tsx +0 -61
- package/packages/hive-ui/src/modules/bridge/BridgeProcessList.tsx +0 -77
- package/packages/hive-ui/src/modules/bridge/BridgeStatus.tsx +0 -23
- package/packages/hive-ui/src/modules/bridge/BridgeTerminal.tsx +0 -7
- package/packages/hive-ui/src/modules/canvas/CanvasButton.tsx +0 -3
- package/packages/hive-ui/src/modules/canvas/CanvasChart.tsx +0 -3
- package/packages/hive-ui/src/modules/canvas/CanvasComponentMap.tsx +0 -605
- package/packages/hive-ui/src/modules/canvas/CanvasContainer.tsx +0 -360
- package/packages/hive-ui/src/modules/canvas/CanvasForm.tsx +0 -3
- package/packages/hive-ui/src/modules/canvas/CanvasMarkdown.tsx +0 -3
- package/packages/hive-ui/src/modules/canvas/CanvasTable.tsx +0 -3
- package/packages/hive-ui/src/modules/canvas/ComponentRenderer.tsx +0 -30
- package/packages/hive-ui/src/modules/canvas/DynamicRenderer.tsx +0 -3
- package/packages/hive-ui/src/modules/channels/available/AvailableChannelsGrid.tsx +0 -89
- package/packages/hive-ui/src/modules/channels/available/ChannelAuthForm.tsx +0 -33
- package/packages/hive-ui/src/modules/channels/available/ChannelSetupWizard.tsx +0 -48
- package/packages/hive-ui/src/modules/channels/available/ChannelTestConnection.tsx +0 -37
- package/packages/hive-ui/src/modules/channels/available/ChannelTypeCard.tsx +0 -30
- package/packages/hive-ui/src/modules/channels/available/ChannelWebhookConfig.tsx +0 -30
- package/packages/hive-ui/src/modules/channels/available/index.ts +0 -6
- package/packages/hive-ui/src/modules/channels/connected/ChannelCard.tsx +0 -95
- package/packages/hive-ui/src/modules/channels/connected/ChannelConfigPanel.tsx +0 -260
- package/packages/hive-ui/src/modules/channels/connected/ChannelDisconnectButton.tsx +0 -21
- package/packages/hive-ui/src/modules/channels/connected/ChannelLogsViewer.tsx +0 -42
- package/packages/hive-ui/src/modules/channels/connected/ChannelQRCode.tsx +0 -32
- package/packages/hive-ui/src/modules/channels/connected/ChannelReconnectButton.tsx +0 -16
- package/packages/hive-ui/src/modules/channels/connected/ChannelStatusBadge.tsx +0 -26
- package/packages/hive-ui/src/modules/channels/connected/ConnectedChannelsList.tsx +0 -40
- package/packages/hive-ui/src/modules/channels/connected/index.ts +0 -8
- package/packages/hive-ui/src/modules/channels/shared/ChannelCard.tsx +0 -84
- package/packages/hive-ui/src/modules/channels/shared/ChannelConfigDialog.tsx +0 -279
- package/packages/hive-ui/src/modules/channels/shared/ChannelIcon.tsx +0 -40
- package/packages/hive-ui/src/modules/channels/shared/ChannelStats.tsx +0 -37
- package/packages/hive-ui/src/modules/channels/shared/ChannelTypeBadge.tsx +0 -23
- package/packages/hive-ui/src/modules/channels/shared/ConnectionHealthIndicator.tsx +0 -20
- package/packages/hive-ui/src/modules/channels/shared/MessagePreview.tsx +0 -19
- package/packages/hive-ui/src/modules/channels/shared/index.ts +0 -5
- package/packages/hive-ui/src/modules/chat/ChatContainer.tsx +0 -268
- package/packages/hive-ui/src/modules/chat/ChatHistory.tsx +0 -101
- package/packages/hive-ui/src/modules/chat/ChatInput.tsx +0 -108
- package/packages/hive-ui/src/modules/chat/ChatMessage.tsx +0 -137
- package/packages/hive-ui/src/modules/chat/ThinkingIndicator.tsx +0 -10
- package/packages/hive-ui/src/modules/layout/AppLayout.tsx +0 -45
- package/packages/hive-ui/src/modules/layout/ConnectionStatus.tsx +0 -19
- package/packages/hive-ui/src/modules/layout/Header.tsx +0 -20
- package/packages/hive-ui/src/modules/layout/HiveSidebar.tsx +0 -173
- package/packages/hive-ui/src/modules/layout/ThemeToggle.tsx +0 -18
- package/packages/hive-ui/src/modules/providers/ProviderCard.tsx +0 -319
- package/packages/hive-ui/src/modules/providers/ProviderConfigForm.tsx +0 -146
- package/packages/hive-ui/src/modules/providers/ProviderFailoverConfig.tsx +0 -110
- package/packages/hive-ui/src/modules/providers/ProviderList.tsx +0 -33
- package/packages/hive-ui/src/modules/providers/ProviderStatusIndicator.tsx +0 -23
- package/packages/hive-ui/src/modules/providers/configs/ProviderAPIKeyManager.tsx +0 -39
- package/packages/hive-ui/src/modules/providers/configs/ProviderEndpointConfig.tsx +0 -27
- package/packages/hive-ui/src/modules/providers/configs/ProviderRateLimits.tsx +0 -37
- package/packages/hive-ui/src/modules/providers/configs/ProviderRetryPolicy.tsx +0 -46
- package/packages/hive-ui/src/modules/providers/configs/index.ts +0 -4
- package/packages/hive-ui/src/modules/providers/index.ts +0 -5
- package/packages/hive-ui/src/modules/providers/models/ModelBenchmarkBadge.tsx +0 -21
- package/packages/hive-ui/src/modules/providers/models/ModelCapabilities.tsx +0 -44
- package/packages/hive-ui/src/modules/providers/models/ModelCard.tsx +0 -36
- package/packages/hive-ui/src/modules/providers/models/ModelComparisonTable.tsx +0 -47
- package/packages/hive-ui/src/modules/providers/models/ModelList.tsx +0 -51
- package/packages/hive-ui/src/modules/providers/models/ModelPricingInfo.tsx +0 -17
- package/packages/hive-ui/src/modules/providers/models/ModelSelector.tsx +0 -32
- package/packages/hive-ui/src/modules/providers/models/index.ts +0 -7
- package/packages/hive-ui/src/pages/AgentDetailPage.tsx +0 -74
- package/packages/hive-ui/src/pages/AgentNewPage.tsx +0 -5
- package/packages/hive-ui/src/pages/AgentsPage.tsx +0 -147
- package/packages/hive-ui/src/pages/BridgePage.tsx +0 -83
- package/packages/hive-ui/src/pages/CanvasPage.tsx +0 -32
- package/packages/hive-ui/src/pages/ChannelsPage.tsx +0 -176
- package/packages/hive-ui/src/pages/DashboardPage.tsx +0 -321
- package/packages/hive-ui/src/pages/Index.tsx +0 -14
- package/packages/hive-ui/src/pages/LogsPage.tsx +0 -252
- package/packages/hive-ui/src/pages/NotFound.tsx +0 -24
- package/packages/hive-ui/src/pages/ProjectsPage.tsx +0 -241
- package/packages/hive-ui/src/pages/ProvidersPage.tsx +0 -111
- package/packages/hive-ui/src/pages/SettingsPage.tsx +0 -147
- package/packages/hive-ui/src/pages/SetupPage.tsx +0 -1177
- package/packages/hive-ui/src/pages/WebChatPage.tsx +0 -15
- package/packages/hive-ui/src/stores/agentConfigStore.ts +0 -32
- package/packages/hive-ui/src/stores/agentStore.ts +0 -5
- package/packages/hive-ui/src/stores/bridgeStore.ts +0 -237
- package/packages/hive-ui/src/stores/canvasStore.ts +0 -250
- package/packages/hive-ui/src/stores/channelStore.ts +0 -5
- package/packages/hive-ui/src/stores/chatStore.ts +0 -42
- package/packages/hive-ui/src/stores/ethicsStore.ts +0 -141
- package/packages/hive-ui/src/stores/mcpStore.ts +0 -5
- package/packages/hive-ui/src/stores/modelStore.ts +0 -2
- package/packages/hive-ui/src/stores/projectsStore.ts +0 -141
- package/packages/hive-ui/src/stores/providerStore.ts +0 -2
- package/packages/hive-ui/src/stores/skillStore.ts +0 -5
- package/packages/hive-ui/src/stores/toolStore.ts +0 -5
- package/packages/hive-ui/src/stores/useGlobalConfigStore.ts +0 -937
- package/packages/hive-ui/src/stores/useLoaderStore.ts +0 -21
- package/packages/hive-ui/src/stores/useNotesAndCronsStore.ts +0 -144
- package/packages/hive-ui/src/stores/useWebSocketStore.ts +0 -152
- package/packages/hive-ui/src/stores/useWelcomeStore.ts +0 -37
- package/packages/hive-ui/src/stores/userConfigStore.ts +0 -23
- package/packages/hive-ui/src/stores/userStore.ts +0 -82
- package/packages/hive-ui/src/test/setup.ts +0 -15
- package/packages/hive-ui/src/types/agent-config.ts +0 -33
- package/packages/hive-ui/src/types/agent.ts +0 -65
- package/packages/hive-ui/src/types/bridge.ts +0 -27
- package/packages/hive-ui/src/types/canvas.ts +0 -76
- package/packages/hive-ui/src/types/channels.ts +0 -109
- package/packages/hive-ui/src/types/chat.ts +0 -25
- package/packages/hive-ui/src/types/connections.ts +0 -17
- package/packages/hive-ui/src/types/ethics.ts +0 -41
- package/packages/hive-ui/src/types/index.ts +0 -15
- package/packages/hive-ui/src/types/mcp.ts +0 -36
- package/packages/hive-ui/src/types/notes-crons.ts +0 -31
- package/packages/hive-ui/src/types/providers.ts +0 -145
- package/packages/hive-ui/src/types/skill.ts +0 -12
- package/packages/hive-ui/src/types/tool.ts +0 -44
- package/packages/hive-ui/src/types/user.ts +0 -26
- package/packages/hive-ui/src/types/websocket.ts +0 -14
- package/packages/hive-ui/src/vite-env.d.ts +0 -1
- package/packages/mcp/package.json +0 -26
- package/packages/mcp/src/config.ts +0 -13
- package/packages/mcp/src/index.ts +0 -1
- package/packages/mcp/src/logger.ts +0 -42
- package/packages/mcp/src/manager.ts +0 -439
- package/packages/mcp/src/transports/index.ts +0 -67
- package/packages/mcp/src/transports/sse.ts +0 -241
- package/packages/mcp/src/transports/websocket.ts +0 -159
- package/packages/skills/package.json +0 -21
- package/packages/skills/src/index.ts +0 -1
- package/packages/skills/src/loader.ts +0 -346
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Chat API - Endpoint para enviar mensajes al coordinador
|
|
3
|
-
*
|
|
4
|
-
* POST /api/chat
|
|
5
|
-
* {
|
|
6
|
-
* "message": "Mensaje para el coordinador",
|
|
7
|
-
* "thread_id": "ID de sesión (opcional, se genera si no existe)",
|
|
8
|
-
* "channel": "canal (opcional, default: webchat)"
|
|
9
|
-
* }
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { getDb } from "../../storage/sqlite";
|
|
13
|
-
import { resolveUserId, resolveAgentId } from "../../storage/onboarding";
|
|
14
|
-
import { laneQueue } from "../lane-queue";
|
|
15
|
-
import { getRecentMessages } from "../../agent/conversation-store";
|
|
16
|
-
import { AgentRunner } from "../../agent/providers";
|
|
17
|
-
import { logger } from "../../utils/logger";
|
|
18
|
-
import { getUserDate, getUserTime } from "../../utils/date";
|
|
19
|
-
|
|
20
|
-
const log = logger.child("api:chat");
|
|
21
|
-
|
|
22
|
-
export interface ChatRequest {
|
|
23
|
-
message: string;
|
|
24
|
-
thread_id?: string;
|
|
25
|
-
channel?: string;
|
|
26
|
-
userId?: string;
|
|
27
|
-
agentId?: string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface ChatResponse {
|
|
31
|
-
success: boolean;
|
|
32
|
-
thread_id: string;
|
|
33
|
-
content?: string;
|
|
34
|
-
error?: string;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export async function handleChat(
|
|
38
|
-
req: Request,
|
|
39
|
-
addCorsHeaders: (res: Response, req: Request) => Response
|
|
40
|
-
): Promise<Response> {
|
|
41
|
-
try {
|
|
42
|
-
const body = await req.json();
|
|
43
|
-
const { message, thread_id, channel = "webchat", userId, agentId }: ChatRequest = body;
|
|
44
|
-
|
|
45
|
-
if (!message) {
|
|
46
|
-
return addCorsHeaders(
|
|
47
|
-
Response.json({
|
|
48
|
-
success: false,
|
|
49
|
-
error: "Message is required"
|
|
50
|
-
}, { status: 400 }),
|
|
51
|
-
req
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const db = getDb();
|
|
56
|
-
|
|
57
|
-
// Resolve user ID
|
|
58
|
-
const finalUserId = userId || resolveUserId({ channel }) || "default";
|
|
59
|
-
|
|
60
|
-
// Resolve agent ID (coordinator by default)
|
|
61
|
-
const finalAgentId = agentId || resolveAgentId(null) || "main";
|
|
62
|
-
|
|
63
|
-
// Generate or use provided thread_id
|
|
64
|
-
const threadId = thread_id || `${finalUserId}-${Date.now()}`;
|
|
65
|
-
|
|
66
|
-
log.info(`[chat] Processing message from user=${finalUserId} agent=${finalAgentId} thread=${threadId}`);
|
|
67
|
-
|
|
68
|
-
// Get user timezone for timestamp
|
|
69
|
-
const userRow = db.query<any, [string]>(
|
|
70
|
-
"SELECT timezone FROM users WHERE id = ?"
|
|
71
|
-
).get(finalUserId);
|
|
72
|
-
const userTimezone = userRow?.timezone || "UTC";
|
|
73
|
-
const now = new Date();
|
|
74
|
-
|
|
75
|
-
let exactTime: string;
|
|
76
|
-
try {
|
|
77
|
-
exactTime = now.toLocaleString("en-US", {
|
|
78
|
-
timeZone: userTimezone,
|
|
79
|
-
dateStyle: "full",
|
|
80
|
-
timeStyle: "long",
|
|
81
|
-
});
|
|
82
|
-
} catch (e) {
|
|
83
|
-
exactTime = now.toISOString();
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Format message with timestamp
|
|
87
|
-
const messageContent = `[Timestamp: ${exactTime} (${userTimezone})]\n${message}`;
|
|
88
|
-
|
|
89
|
-
// Get recent conversation history
|
|
90
|
-
const history = getRecentMessages(threadId, 50);
|
|
91
|
-
const messages = [
|
|
92
|
-
...history.map((row) => ({
|
|
93
|
-
role: row.role as "user" | "assistant" | "system",
|
|
94
|
-
content: row.content,
|
|
95
|
-
})),
|
|
96
|
-
{ role: "user" as const, content: messageContent }
|
|
97
|
-
];
|
|
98
|
-
|
|
99
|
-
// Get provider config from DB
|
|
100
|
-
const agent = db.query<any, [string]>(
|
|
101
|
-
"SELECT provider_id, model_id FROM agents WHERE id = ?"
|
|
102
|
-
).get(finalAgentId);
|
|
103
|
-
|
|
104
|
-
const provider = agent?.provider_id || "gemini";
|
|
105
|
-
|
|
106
|
-
// Create runner
|
|
107
|
-
const runner = new AgentRunner({} as any);
|
|
108
|
-
|
|
109
|
-
let responseContent = "";
|
|
110
|
-
let responseError: string | null = null;
|
|
111
|
-
|
|
112
|
-
// Enqueue in lane queue for processing
|
|
113
|
-
laneQueue.enqueue(threadId, async (_task, signal) => {
|
|
114
|
-
if (signal.aborted) return;
|
|
115
|
-
|
|
116
|
-
try {
|
|
117
|
-
log.info(`[chat] Generating response for thread ${threadId}...`);
|
|
118
|
-
|
|
119
|
-
const response = await runner.generate({
|
|
120
|
-
provider: provider as any,
|
|
121
|
-
messages,
|
|
122
|
-
rawUserMessage: message,
|
|
123
|
-
maxTokens: 4096,
|
|
124
|
-
maxSteps: 15,
|
|
125
|
-
threadId,
|
|
126
|
-
userId: finalUserId,
|
|
127
|
-
channel,
|
|
128
|
-
onStep: async (step) => {
|
|
129
|
-
if (step.type === "text" && step.message) {
|
|
130
|
-
log.debug(`[chat] Step: ${step.message.substring(0, 100)}`);
|
|
131
|
-
}
|
|
132
|
-
if (step.type === "tool_result" && step.message) {
|
|
133
|
-
log.debug(`[chat] Tool result: ${step.message.substring(0, 100)}`);
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
responseContent = response.content?.trim() || "Task completed.";
|
|
139
|
-
log.info(`[chat] Response generated: ${responseContent.substring(0, 100)}...`);
|
|
140
|
-
|
|
141
|
-
} catch (error) {
|
|
142
|
-
log.error(`[chat] Error for thread ${threadId}: ${(error as Error).message}`);
|
|
143
|
-
responseError = (error as Error).message;
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
// Wait for processing to complete (with timeout)
|
|
148
|
-
const startTime = Date.now();
|
|
149
|
-
const timeout = 120000; // 2 minutes timeout
|
|
150
|
-
|
|
151
|
-
while (!responseContent && !responseError) {
|
|
152
|
-
if (Date.now() - startTime > timeout) {
|
|
153
|
-
return addCorsHeaders(
|
|
154
|
-
Response.json({
|
|
155
|
-
success: false,
|
|
156
|
-
error: "Request timeout",
|
|
157
|
-
thread_id: threadId,
|
|
158
|
-
}, { status: 504 }),
|
|
159
|
-
req
|
|
160
|
-
);
|
|
161
|
-
}
|
|
162
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
if (responseError) {
|
|
166
|
-
return addCorsHeaders(
|
|
167
|
-
Response.json({
|
|
168
|
-
success: false,
|
|
169
|
-
error: responseError,
|
|
170
|
-
thread_id: threadId,
|
|
171
|
-
}, { status: 500 }),
|
|
172
|
-
req
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
return addCorsHeaders(
|
|
177
|
-
Response.json({
|
|
178
|
-
success: true,
|
|
179
|
-
thread_id: threadId,
|
|
180
|
-
content: responseContent,
|
|
181
|
-
}),
|
|
182
|
-
req
|
|
183
|
-
);
|
|
184
|
-
|
|
185
|
-
} catch (error) {
|
|
186
|
-
log.error(`[chat] Handler error: ${(error as Error).message}`);
|
|
187
|
-
return addCorsHeaders(
|
|
188
|
-
Response.json({
|
|
189
|
-
success: false,
|
|
190
|
-
error: (error as Error).message,
|
|
191
|
-
message: "Internal server error",
|
|
192
|
-
}, { status: 500 }),
|
|
193
|
-
req
|
|
194
|
-
);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// ── Original Chat API Functions ─────────────────────────────────────────────
|
|
199
|
-
|
|
200
|
-
export async function handleGetChatHistory(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
201
|
-
const url = new URL(req.url)
|
|
202
|
-
const threadId = url.searchParams.get("sessionId") || url.searchParams.get("threadId") || "default"
|
|
203
|
-
const limit = parseInt(url.searchParams.get("limit") || "50")
|
|
204
|
-
|
|
205
|
-
const messages = getDb().query(`
|
|
206
|
-
SELECT * FROM conversations
|
|
207
|
-
WHERE thread_id = ?
|
|
208
|
-
ORDER BY created_at DESC
|
|
209
|
-
LIMIT ?
|
|
210
|
-
`).all(threadId, limit) as Record<string, unknown>[]
|
|
211
|
-
|
|
212
|
-
return addCorsHeaders(Response.json({ messages: messages.reverse() }), req)
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
export async function handleGetCanvas(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
216
|
-
return addCorsHeaders(Response.json({ nodes: [], edges: [] }), req)
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
export async function handleGetNotes(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
220
|
-
const notes = getDb().query(`
|
|
221
|
-
SELECT * FROM scratchpad ORDER BY updated_at DESC LIMIT 50
|
|
222
|
-
`).all() as Record<string, unknown>[]
|
|
223
|
-
|
|
224
|
-
return addCorsHeaders(Response.json({ notes }), req)
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
export async function handleUpdateNote(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
228
|
-
const body = await req.json().catch(() => ({}))
|
|
229
|
-
const { threadId, content } = body
|
|
230
|
-
|
|
231
|
-
if (!threadId || !content) {
|
|
232
|
-
return addCorsHeaders(Response.json({ success: false, error: "threadId and content required" }), req)
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
getDb().query(`
|
|
236
|
-
INSERT OR REPLACE INTO scratchpad(thread_id, key, value, updated_at)
|
|
237
|
-
VALUES(?, 'note', ?, ?)
|
|
238
|
-
`).run(threadId, content, Math.floor(Date.now() / 1000))
|
|
239
|
-
|
|
240
|
-
return addCorsHeaders(Response.json({ success: true }), req)
|
|
241
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { Config } from "../../config/loader.ts";
|
|
2
|
-
import { getDb } from "../../storage/sqlite.ts";
|
|
3
|
-
import { decryptConfig } from "../../storage/crypto.ts";
|
|
4
|
-
import { redactConfig } from "../helpers/redact.ts";
|
|
5
|
-
|
|
6
|
-
export async function handleGetConfig(
|
|
7
|
-
req: Request,
|
|
8
|
-
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
9
|
-
config: Config
|
|
10
|
-
): Promise<Response> {
|
|
11
|
-
return addCorsHeaders(Response.json(redactConfig(config)), req);
|
|
12
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { getDb } from "../../storage/sqlite"
|
|
2
|
-
|
|
3
|
-
export async function handleGetCronJobs(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
4
|
-
const jobs = getDb().query(`
|
|
5
|
-
SELECT * FROM cron_jobs ORDER BY id ASC
|
|
6
|
-
`).all() as Record<string, unknown>[]
|
|
7
|
-
|
|
8
|
-
return addCorsHeaders(Response.json({ cronJobs: jobs }), req)
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export async function handleGetCronChannels(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
12
|
-
const channels = getDb().query(`
|
|
13
|
-
SELECT DISTINCT channel FROM user_channels WHERE channel IS NOT NULL
|
|
14
|
-
`).all() as Record<string, unknown>[]
|
|
15
|
-
|
|
16
|
-
return addCorsHeaders(Response.json({ channels: channels.map(c => c.channel) }), req)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export async function handleUpdateCronJob(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
20
|
-
const url = new URL(req.url)
|
|
21
|
-
const jobId = url.pathname.split("/").pop()
|
|
22
|
-
const body = await req.json().catch(() => ({}))
|
|
23
|
-
|
|
24
|
-
if (!jobId) {
|
|
25
|
-
return addCorsHeaders(new Response("Missing ID", { status: 400 }), req)
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const updates: string[] = []
|
|
29
|
-
const params: unknown[] = []
|
|
30
|
-
|
|
31
|
-
if (body.active !== undefined) {
|
|
32
|
-
updates.push("active = ?")
|
|
33
|
-
params.push(body.active ? 1 : 0)
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (updates.length > 0) {
|
|
37
|
-
params.push(jobId)
|
|
38
|
-
getDb().query(`UPDATE cron_jobs SET ${updates.join(", ")} WHERE id = ?`).run(...params as any[])
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return addCorsHeaders(Response.json({ ok: true }), req)
|
|
42
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { getDb } from "../../storage/sqlite"
|
|
2
|
-
|
|
3
|
-
export async function handleGetEthics(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
4
|
-
const ethics = getDb().query(`
|
|
5
|
-
SELECT id, name, description, content, active, enabled
|
|
6
|
-
FROM ethics
|
|
7
|
-
ORDER BY name
|
|
8
|
-
`).all() as Record<string, unknown>[]
|
|
9
|
-
|
|
10
|
-
return addCorsHeaders(Response.json({
|
|
11
|
-
ethics: ethics.map(e => ({
|
|
12
|
-
id: e.id,
|
|
13
|
-
name: e.name,
|
|
14
|
-
description: e.description,
|
|
15
|
-
content: e.content,
|
|
16
|
-
active: e.active === 1,
|
|
17
|
-
enabled: e.enabled === 1,
|
|
18
|
-
}))
|
|
19
|
-
}), req)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export async function handleActivateEthics(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
23
|
-
const body = await req.json().catch(() => ({}))
|
|
24
|
-
const { ethicsId, active } = body
|
|
25
|
-
|
|
26
|
-
if (!ethicsId) {
|
|
27
|
-
return addCorsHeaders(Response.json({ success: false, error: "ethicsId required" }), req)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
getDb().query(`UPDATE ethics SET active = ?, enabled = ? WHERE id = ?`).run(active ? 1 : 0, active ? 1 : 0, ethicsId)
|
|
31
|
-
|
|
32
|
-
return addCorsHeaders(Response.json({ success: true, ethicsId, active }), req)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export async function handleDeleteEthics(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
36
|
-
const url = new URL(req.url)
|
|
37
|
-
const id = url.pathname.split("/").pop()
|
|
38
|
-
|
|
39
|
-
if (!id) {
|
|
40
|
-
return addCorsHeaders(Response.json({ success: false, error: "id required" }), req)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
getDb().query("DELETE FROM ethics WHERE id = ?").run(id)
|
|
44
|
-
|
|
45
|
-
return addCorsHeaders(Response.json({ success: true }), req)
|
|
46
|
-
}
|
|
@@ -1,346 +0,0 @@
|
|
|
1
|
-
import { getDb } from "../../storage/sqlite.ts"
|
|
2
|
-
import { encryptConfig, decryptConfig } from "../../storage/crypto.ts"
|
|
3
|
-
import { logger } from "../../utils/logger.ts"
|
|
4
|
-
|
|
5
|
-
const mcpLog = logger.child("mcp:api")
|
|
6
|
-
|
|
7
|
-
export async function handleGetMcpServers(
|
|
8
|
-
req: Request,
|
|
9
|
-
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
10
|
-
mcpManager?: any
|
|
11
|
-
): Promise<Response> {
|
|
12
|
-
const db = getDb()
|
|
13
|
-
|
|
14
|
-
// Get real-time server status from MCP manager
|
|
15
|
-
const mcpServers = new Map<string, { status: string; tools: any[] }>()
|
|
16
|
-
if (mcpManager) {
|
|
17
|
-
try {
|
|
18
|
-
const servers = mcpManager.listServers?.() || []
|
|
19
|
-
mcpLog.info(`[GET] MCP Manager returned ${servers.length} servers:`, servers.map((s: any) => `${s.name}:${s.status}`))
|
|
20
|
-
for (const s of servers) {
|
|
21
|
-
mcpServers.set(s.name, {
|
|
22
|
-
status: s.status,
|
|
23
|
-
tools: s.tools || [],
|
|
24
|
-
})
|
|
25
|
-
}
|
|
26
|
-
} catch (e) {
|
|
27
|
-
mcpLog.warn(`Failed to get MCP servers: ${(e as Error).message}`)
|
|
28
|
-
}
|
|
29
|
-
} else {
|
|
30
|
-
mcpLog.warn(`[GET] No MCP Manager provided`)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// Get all servers from database
|
|
34
|
-
const dbServers = db.query(`
|
|
35
|
-
SELECT * FROM mcp_servers ORDER BY name
|
|
36
|
-
`).all() as Record<string, unknown>[]
|
|
37
|
-
|
|
38
|
-
// Combine DB info with real-time status from MCP manager
|
|
39
|
-
const allServers = dbServers.map(s => {
|
|
40
|
-
// Try to find matching server in MCP Manager (by name or normalized name)
|
|
41
|
-
const normalizedName = (s.name as string).toLowerCase().replace(/[^a-z0-9-]/g, '-')
|
|
42
|
-
const mcpServer = mcpServers.get(s.name as string) || mcpServers.get(normalizedName)
|
|
43
|
-
const isEnabled = s.enabled === 1
|
|
44
|
-
|
|
45
|
-
// Redact headers for safe UI display
|
|
46
|
-
let headers = undefined
|
|
47
|
-
if (s.headers_encrypted && s.headers_iv) {
|
|
48
|
-
try {
|
|
49
|
-
const decryptedHeaders = decryptConfig(s.headers_encrypted as string, s.headers_iv as string)
|
|
50
|
-
headers = Object.fromEntries(
|
|
51
|
-
Object.entries(decryptedHeaders).map(([k, v]) => [
|
|
52
|
-
k,
|
|
53
|
-
k.toLowerCase().includes("auth") ||
|
|
54
|
-
k.toLowerCase().includes("token") ||
|
|
55
|
-
k.toLowerCase().includes("key")
|
|
56
|
-
? `${(v as string).slice(0, 4)}••••••••`
|
|
57
|
-
: v,
|
|
58
|
-
])
|
|
59
|
-
)
|
|
60
|
-
} catch (e) {
|
|
61
|
-
mcpLog.error(`Failed to decrypt headers for ${s.name}: ${(e as Error).message}`)
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return {
|
|
66
|
-
name: s.name,
|
|
67
|
-
enabled: isEnabled,
|
|
68
|
-
status: mcpServer?.status || (isEnabled ? "disconnected" : "disconnected"),
|
|
69
|
-
config: {
|
|
70
|
-
transport: s.transport,
|
|
71
|
-
command: s.command,
|
|
72
|
-
args: s.args ? JSON.parse(s.args as string) : [],
|
|
73
|
-
url: s.url,
|
|
74
|
-
headers,
|
|
75
|
-
enabled: isEnabled
|
|
76
|
-
},
|
|
77
|
-
tools_count: mcpServer?.tools.length || s.tools_count || 0,
|
|
78
|
-
tools: mcpServer?.tools || [],
|
|
79
|
-
}
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
return addCorsHeaders(Response.json(allServers), req)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export async function handleCreateMcpServer(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
86
|
-
const body = await req.json().catch(() => ({}))
|
|
87
|
-
const db = getDb()
|
|
88
|
-
|
|
89
|
-
if (!body.name || !body.config) {
|
|
90
|
-
return addCorsHeaders(new Response("Missing name or config", { status: 400 }), req)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
mcpLog.info(`Creating MCP server: ${body.name}`)
|
|
94
|
-
|
|
95
|
-
// Generate unique ID (name-based for consistency)
|
|
96
|
-
const serverId = body.name.toLowerCase().replace(/[^a-z0-9-]/g, '-')
|
|
97
|
-
|
|
98
|
-
// Encrypt headers if present
|
|
99
|
-
let headersEncrypted: string | undefined
|
|
100
|
-
let headersIv: string | undefined
|
|
101
|
-
if (body.config.headers) {
|
|
102
|
-
const encrypted = encryptConfig(body.config.headers)
|
|
103
|
-
headersEncrypted = encrypted.encrypted
|
|
104
|
-
headersIv = encrypted.iv
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Save to database
|
|
108
|
-
db.query(`
|
|
109
|
-
INSERT INTO mcp_servers(id, name, transport, command, args, url, headers_encrypted, headers_iv, enabled, builtin, status)
|
|
110
|
-
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, 0, 'disconnected')
|
|
111
|
-
`).run(
|
|
112
|
-
serverId,
|
|
113
|
-
body.name,
|
|
114
|
-
body.config.transport || "stdio",
|
|
115
|
-
body.config.command || null,
|
|
116
|
-
body.config.args ? JSON.stringify(body.config.args) : null,
|
|
117
|
-
body.config.url || null,
|
|
118
|
-
headersEncrypted,
|
|
119
|
-
headersIv,
|
|
120
|
-
body.config.enabled !== false ? 1 : 0
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
return addCorsHeaders(Response.json({ success: true, id: serverId }), req)
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export async function handleDeleteMcpServer(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
127
|
-
const url = new URL(req.url)
|
|
128
|
-
// Extract server name from path: /api/mcp/servers/{name}
|
|
129
|
-
const parts = url.pathname.split("/").filter(Boolean)
|
|
130
|
-
const serverName = parts[parts.length - 1]
|
|
131
|
-
|
|
132
|
-
if (!serverName || serverName === "servers") {
|
|
133
|
-
return addCorsHeaders(Response.json({ success: false, error: "server name required" }), req)
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
getDb().query(`DELETE FROM mcp_servers WHERE id = ?`).run(serverName)
|
|
137
|
-
|
|
138
|
-
return addCorsHeaders(Response.json({ success: true }), req)
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
export async function handleUpdateMcpServer(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
142
|
-
const url = new URL(req.url)
|
|
143
|
-
// Extract server name from path: /api/mcp/servers/{name}
|
|
144
|
-
const parts = url.pathname.split("/").filter(Boolean)
|
|
145
|
-
const serverName = parts[parts.length - 1]
|
|
146
|
-
const body = await req.json().catch(() => ({}))
|
|
147
|
-
const db = getDb()
|
|
148
|
-
|
|
149
|
-
if (!serverName || serverName === "servers") {
|
|
150
|
-
return addCorsHeaders(new Response("Missing server name", { status: 400 }), req)
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
mcpLog.info(`Updating MCP server: ${serverName}`)
|
|
154
|
-
|
|
155
|
-
const updates: string[] = []
|
|
156
|
-
const params: unknown[] = []
|
|
157
|
-
|
|
158
|
-
if (body.name !== undefined) {
|
|
159
|
-
updates.push("name = ?")
|
|
160
|
-
params.push(body.name)
|
|
161
|
-
}
|
|
162
|
-
if (body.command !== undefined) {
|
|
163
|
-
updates.push("command = ?")
|
|
164
|
-
params.push(body.command)
|
|
165
|
-
}
|
|
166
|
-
if (body.args !== undefined) {
|
|
167
|
-
updates.push("args = ?")
|
|
168
|
-
params.push(JSON.stringify(body.args))
|
|
169
|
-
}
|
|
170
|
-
if (body.url !== undefined) {
|
|
171
|
-
updates.push("url = ?")
|
|
172
|
-
params.push(body.url)
|
|
173
|
-
}
|
|
174
|
-
if (body.enabled !== undefined) {
|
|
175
|
-
updates.push("enabled = ?")
|
|
176
|
-
params.push(body.enabled ? 1 : 0)
|
|
177
|
-
}
|
|
178
|
-
if (body.headers) {
|
|
179
|
-
const { encrypted, iv } = encryptConfig(body.headers)
|
|
180
|
-
updates.push("headers_encrypted = ?")
|
|
181
|
-
params.push(encrypted)
|
|
182
|
-
updates.push("headers_iv = ?")
|
|
183
|
-
params.push(iv)
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
if (updates.length > 0) {
|
|
187
|
-
params.push(serverName)
|
|
188
|
-
db.query(`UPDATE mcp_servers SET ${updates.join(", ")} WHERE id = ?`).run(...params as any[])
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
return addCorsHeaders(Response.json({ success: true }), req)
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
export async function handleStartMcpServer(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
|
|
195
|
-
const url = new URL(req.url)
|
|
196
|
-
const serverId = url.pathname.split("/").pop()
|
|
197
|
-
|
|
198
|
-
if (!serverId) {
|
|
199
|
-
return addCorsHeaders(Response.json({ success: false, error: "serverId required" }), req)
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
getDb().query(`UPDATE mcp_servers SET enabled = 1 WHERE id = ?`).run(serverId)
|
|
203
|
-
|
|
204
|
-
return addCorsHeaders(Response.json({ success: true, serverId, enabled: true }), req)
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
export async function handleGetMcpServerTools(
|
|
208
|
-
req: Request,
|
|
209
|
-
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
210
|
-
serverName: string,
|
|
211
|
-
mcpManager?: any
|
|
212
|
-
): Promise<Response> {
|
|
213
|
-
if (!mcpManager) {
|
|
214
|
-
return addCorsHeaders(Response.json([]), req)
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
const tools = mcpManager.getServerTools(serverName)
|
|
218
|
-
return addCorsHeaders(Response.json(tools), req)
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
export async function handleGetMcpServerDetail(
|
|
222
|
-
req: Request,
|
|
223
|
-
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
224
|
-
serverName: string,
|
|
225
|
-
mcpManager?: any
|
|
226
|
-
): Promise<Response> {
|
|
227
|
-
if (!mcpManager) {
|
|
228
|
-
return addCorsHeaders(new Response("MCP is disabled", { status: 404 }), req)
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const details = mcpManager.getServerDetails(serverName)
|
|
232
|
-
if (!details) {
|
|
233
|
-
return new Response("Server not found", { status: 404 })
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
return addCorsHeaders(Response.json(details), req)
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
export async function handleToggleMcpServer(
|
|
240
|
-
req: Request,
|
|
241
|
-
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
242
|
-
mcpId: string
|
|
243
|
-
): Promise<Response> {
|
|
244
|
-
const body = await req.json().catch(() => ({}))
|
|
245
|
-
const { active } = body
|
|
246
|
-
|
|
247
|
-
if (active === undefined) {
|
|
248
|
-
return addCorsHeaders(Response.json({ success: false, error: "Missing active field", message: "Falta el campo 'active'" }, { status: 400 }), req)
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
getDb().query(`UPDATE mcp_servers SET active = ?, enabled = ? WHERE id = ?`).run(active ? 1 : 0, active ? 1 : 0, mcpId)
|
|
252
|
-
|
|
253
|
-
return addCorsHeaders(Response.json({ success: true, active, message: active ? "Servidor MCP activado" : "Servidor MCP desactivado" }), req)
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
export async function handleMcpServerAction(
|
|
257
|
-
req: Request,
|
|
258
|
-
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
259
|
-
serverName: string,
|
|
260
|
-
action: "connect" | "disconnect",
|
|
261
|
-
mcpManager?: any
|
|
262
|
-
): Promise<Response> {
|
|
263
|
-
if (!mcpManager) {
|
|
264
|
-
return addCorsHeaders(new Response("MCP is disabled", { status: 404 }), req)
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
const db = getDb()
|
|
268
|
-
|
|
269
|
-
if (action === "connect") {
|
|
270
|
-
// Check if server exists and is enabled in DB
|
|
271
|
-
const dbServer = db.query(`SELECT * FROM mcp_servers WHERE name = ? AND enabled = 1`).get(serverName)
|
|
272
|
-
if (!dbServer) {
|
|
273
|
-
return new Response("Server not found or disabled", { status: 400 })
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
await mcpManager.connectServer(serverName)
|
|
277
|
-
|
|
278
|
-
// Update tools count after connection
|
|
279
|
-
const tools = mcpManager.getServerTools(serverName) || []
|
|
280
|
-
db.query(`UPDATE mcp_servers SET status = ?, tools_count = ? WHERE name = ?`).run("connected", tools.length, serverName)
|
|
281
|
-
|
|
282
|
-
return addCorsHeaders(Response.json({ success: true, tools_count: tools.length }), req)
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
if (action === "disconnect") {
|
|
286
|
-
await mcpManager.disconnectServer(serverName)
|
|
287
|
-
return addCorsHeaders(Response.json({ success: true }), req)
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
return addCorsHeaders(new Response("Invalid action", { status: 400 }), req)
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Get tools for a specific MCP server
|
|
295
|
-
*/
|
|
296
|
-
export async function handleGetMCPServerTools(
|
|
297
|
-
req: Request,
|
|
298
|
-
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
299
|
-
serverId: string
|
|
300
|
-
): Promise<Response> {
|
|
301
|
-
const db = getDb();
|
|
302
|
-
|
|
303
|
-
const tools = db.query(`
|
|
304
|
-
SELECT id, name, description, input_schema as inputSchema, enabled, active, created_at, updated_at
|
|
305
|
-
FROM tools_mcp
|
|
306
|
-
WHERE server_id = ?
|
|
307
|
-
ORDER BY name
|
|
308
|
-
`).all(serverId) as Record<string, unknown>[];
|
|
309
|
-
|
|
310
|
-
return addCorsHeaders(Response.json({ tools }), req);
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
/**
|
|
314
|
-
* Toggle MCP tool active state
|
|
315
|
-
*/
|
|
316
|
-
export async function handleToggleMCPTool(
|
|
317
|
-
req: Request,
|
|
318
|
-
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
319
|
-
toolId: string
|
|
320
|
-
): Promise<Response> {
|
|
321
|
-
const body = await req.json().catch(() => ({}));
|
|
322
|
-
const { active } = body;
|
|
323
|
-
|
|
324
|
-
if (active === undefined) {
|
|
325
|
-
return addCorsHeaders(Response.json({ success: false, error: "Missing active field" }, { status: 400 }), req);
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
const db = getDb();
|
|
329
|
-
db.query(`UPDATE tools_mcp SET active = ?, updated_at = unixepoch() WHERE id = ?`).run(active ? 1 : 0, toolId);
|
|
330
|
-
|
|
331
|
-
return addCorsHeaders(Response.json({ success: true, active, message: active ? "Herramienta MCP activada" : "Herramienta MCP desactivada" }), req);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* Delete MCP tool
|
|
336
|
-
*/
|
|
337
|
-
export async function handleDeleteMCPTool(
|
|
338
|
-
req: Request,
|
|
339
|
-
addCorsHeaders: (r: Response, req: Request) => Response,
|
|
340
|
-
toolId: string
|
|
341
|
-
): Promise<Response> {
|
|
342
|
-
const db = getDb();
|
|
343
|
-
db.query(`DELETE FROM tools_mcp WHERE id = ?`).run(toolId);
|
|
344
|
-
|
|
345
|
-
return addCorsHeaders(Response.json({ success: true, message: "Herramienta MCP eliminada" }), req);
|
|
346
|
-
}
|