@johpaz/hive 1.1.0
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/CONTRIBUTING.md +44 -0
- package/README.md +310 -0
- package/package.json +96 -0
- package/packages/cli/package.json +28 -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 +50 -0
- package/packages/cli/src/commands/cron.ts +161 -0
- package/packages/cli/src/commands/dev.ts +95 -0
- package/packages/cli/src/commands/doctor.ts +133 -0
- package/packages/cli/src/commands/gateway.ts +443 -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/onboard.ts +1868 -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 +187 -0
- package/packages/cli/src/commands/update.ts +25 -0
- package/packages/cli/src/index.ts +185 -0
- package/packages/cli/src/utils/token.ts +6 -0
- package/packages/code-bridge/README.md +78 -0
- package/packages/code-bridge/package.json +18 -0
- package/packages/code-bridge/src/index.ts +95 -0
- package/packages/code-bridge/src/process-manager.ts +212 -0
- package/packages/code-bridge/src/schemas.ts +133 -0
- package/packages/core/package.json +46 -0
- package/packages/core/src/agent/agent-loop.ts +369 -0
- package/packages/core/src/agent/compaction.ts +140 -0
- package/packages/core/src/agent/context-compiler.ts +378 -0
- package/packages/core/src/agent/context-guard.ts +91 -0
- package/packages/core/src/agent/context.ts +138 -0
- package/packages/core/src/agent/conversation-store.ts +198 -0
- package/packages/core/src/agent/curator.ts +158 -0
- package/packages/core/src/agent/hooks.ts +166 -0
- package/packages/core/src/agent/index.ts +116 -0
- package/packages/core/src/agent/llm-client.ts +503 -0
- package/packages/core/src/agent/native-tools.ts +505 -0
- package/packages/core/src/agent/prompt-builder.ts +532 -0
- package/packages/core/src/agent/providers/index.ts +167 -0
- package/packages/core/src/agent/providers.ts +1 -0
- package/packages/core/src/agent/reflector.ts +170 -0
- package/packages/core/src/agent/service.ts +64 -0
- package/packages/core/src/agent/stuck-loop.ts +133 -0
- package/packages/core/src/agent/supervisor.ts +39 -0
- package/packages/core/src/agent/tracer.ts +102 -0
- package/packages/core/src/agent/workspace.ts +110 -0
- package/packages/core/src/canvas/canvas-manager.test.ts +161 -0
- package/packages/core/src/canvas/canvas-manager.ts +319 -0
- package/packages/core/src/canvas/canvas-tools.ts +420 -0
- package/packages/core/src/canvas/emitter.ts +115 -0
- package/packages/core/src/canvas/index.ts +2 -0
- package/packages/core/src/channels/base.ts +138 -0
- package/packages/core/src/channels/discord.ts +260 -0
- package/packages/core/src/channels/index.ts +7 -0
- package/packages/core/src/channels/manager.ts +383 -0
- package/packages/core/src/channels/slack.ts +287 -0
- package/packages/core/src/channels/telegram.ts +502 -0
- package/packages/core/src/channels/webchat.ts +128 -0
- package/packages/core/src/channels/whatsapp.ts +375 -0
- package/packages/core/src/config/index.ts +12 -0
- package/packages/core/src/config/loader.ts +529 -0
- package/packages/core/src/events/event-bus.ts +169 -0
- package/packages/core/src/gateway/index.ts +5 -0
- package/packages/core/src/gateway/initializer.ts +290 -0
- package/packages/core/src/gateway/lane-queue.ts +169 -0
- package/packages/core/src/gateway/resolver.ts +108 -0
- package/packages/core/src/gateway/router.ts +124 -0
- package/packages/core/src/gateway/server.ts +3317 -0
- package/packages/core/src/gateway/session.ts +95 -0
- package/packages/core/src/gateway/slash-commands.ts +192 -0
- package/packages/core/src/heartbeat/index.ts +157 -0
- package/packages/core/src/index.ts +19 -0
- package/packages/core/src/integrations/catalog.ts +286 -0
- package/packages/core/src/integrations/env.ts +64 -0
- package/packages/core/src/integrations/index.ts +2 -0
- package/packages/core/src/memory/index.ts +1 -0
- package/packages/core/src/memory/notes.ts +68 -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/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/bun-sqlite-store.ts +188 -0
- package/packages/core/src/storage/crypto.ts +101 -0
- package/packages/core/src/storage/db-context.ts +333 -0
- package/packages/core/src/storage/onboarding.ts +1087 -0
- package/packages/core/src/storage/schema.ts +541 -0
- package/packages/core/src/storage/seed.ts +571 -0
- package/packages/core/src/storage/sqlite.ts +387 -0
- package/packages/core/src/storage/usage.ts +212 -0
- package/packages/core/src/tools/bridge-events.ts +74 -0
- package/packages/core/src/tools/browser.ts +275 -0
- package/packages/core/src/tools/codebridge.ts +421 -0
- package/packages/core/src/tools/coordinator-tools.ts +179 -0
- package/packages/core/src/tools/cron.ts +611 -0
- package/packages/core/src/tools/exec.ts +140 -0
- package/packages/core/src/tools/fs.ts +364 -0
- package/packages/core/src/tools/index.ts +12 -0
- package/packages/core/src/tools/memory.ts +176 -0
- package/packages/core/src/tools/notify.ts +113 -0
- package/packages/core/src/tools/project-management.ts +376 -0
- package/packages/core/src/tools/project.ts +375 -0
- package/packages/core/src/tools/read.ts +158 -0
- package/packages/core/src/tools/web.ts +436 -0
- package/packages/core/src/tools/workspace.ts +171 -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 +4 -0
- package/packages/core/src/utils/logger.ts +388 -0
- package/packages/core/src/utils/retry.ts +70 -0
- package/packages/core/src/voice/index.ts +583 -0
- package/packages/core/tsconfig.json +9 -0
- package/packages/mcp/package.json +26 -0
- package/packages/mcp/src/config.ts +13 -0
- package/packages/mcp/src/index.ts +1 -0
- package/packages/mcp/src/logger.ts +42 -0
- package/packages/mcp/src/manager.ts +434 -0
- package/packages/mcp/src/transports/index.ts +67 -0
- package/packages/mcp/src/transports/sse.ts +241 -0
- package/packages/mcp/src/transports/websocket.ts +159 -0
- package/packages/skills/package.json +21 -0
- package/packages/skills/src/bundled/agent_management/SKILL.md +24 -0
- package/packages/skills/src/bundled/browser_automation/SKILL.md +30 -0
- package/packages/skills/src/bundled/context_compact/SKILL.md +35 -0
- package/packages/skills/src/bundled/cron_manager/SKILL.md +52 -0
- package/packages/skills/src/bundled/file_manager/SKILL.md +76 -0
- package/packages/skills/src/bundled/http_client/SKILL.md +24 -0
- package/packages/skills/src/bundled/memory/SKILL.md +42 -0
- package/packages/skills/src/bundled/project_management/SKILL.md +26 -0
- package/packages/skills/src/bundled/shell/SKILL.md +43 -0
- package/packages/skills/src/bundled/system_notify/SKILL.md +52 -0
- package/packages/skills/src/bundled/voice/SKILL.md +25 -0
- package/packages/skills/src/bundled/web_search/SKILL.md +29 -0
- package/packages/skills/src/index.ts +1 -0
- package/packages/skills/src/loader.ts +282 -0
- package/packages/tools/package.json +43 -0
- package/packages/tools/src/browser/browser.test.ts +111 -0
- package/packages/tools/src/browser/index.ts +272 -0
- package/packages/tools/src/canvas/index.ts +220 -0
- package/packages/tools/src/cron/cron.test.ts +164 -0
- package/packages/tools/src/cron/index.ts +304 -0
- package/packages/tools/src/filesystem/filesystem.test.ts +240 -0
- package/packages/tools/src/filesystem/index.ts +379 -0
- package/packages/tools/src/git/index.ts +239 -0
- package/packages/tools/src/index.ts +4 -0
- package/packages/tools/src/shell/detect-env.ts +70 -0
- package/packages/tools/tsconfig.json +9 -0
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
import { getDb } from "./sqlite"
|
|
2
|
+
import { logger } from "../utils/logger"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Seed de datos predeterminados para Hive
|
|
6
|
+
* Todos los elementos se crean con enabled=1 (disponibles) pero active=0 (no activados)
|
|
7
|
+
* El usuario los activa durante el onboarding o desde la UI
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export interface SeedData {
|
|
11
|
+
tools: Array<{ id: string; name: string; category: string; description: string; enabled?: boolean }>
|
|
12
|
+
providers: Array<{ id: string; name: string; baseUrl?: string; category?: string }>
|
|
13
|
+
models: Array<{ id: string; providerId: string; name: string; modelType: string; contextWindow?: number; capabilities?: string }>
|
|
14
|
+
mcpServers: Array<{ id: string; name: string; transport: string; command?: string; args?: string[]; builtin: boolean }>
|
|
15
|
+
channels: Array<{ id: string; type: string }>
|
|
16
|
+
ethics: Array<{ id: string; name: string; description: string; content: string; isDefault: boolean }>
|
|
17
|
+
codeBridge: Array<{ id: string; name: string; cliCommand: string; port: number }>
|
|
18
|
+
codeBridgeConfig: Array<{ id: string; key: string; value: string }>
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const SEED_DATA: SeedData = {
|
|
22
|
+
tools: [
|
|
23
|
+
// Bundled tools
|
|
24
|
+
{ id: "web_search", name: "web_search", category: "native", description: "Buscar en la web y obtener información actualizada" },
|
|
25
|
+
{ id: "shell", name: "shell", category: "native", description: "Ejecutar comandos en la terminal" },
|
|
26
|
+
{ id: "file_manager", name: "file_manager", category: "native", description: "Operaciones de archivos (leer, escribir, editar)" },
|
|
27
|
+
{ id: "http_client", name: "http_client", category: "native", description: "Peticiones HTTP a APIs externas" },
|
|
28
|
+
{ id: "memory", name: "memory", category: "native", description: "Memoria persistente para el agente" },
|
|
29
|
+
{ id: "cron_manager", name: "cron_manager", category: "native", description: "Tareas programadas con cron" },
|
|
30
|
+
{ id: "system_notify", name: "system_notify", category: "native", description: "Notificaciones desktop del sistema" },
|
|
31
|
+
{ id: "browser_automation", name: "browser_automation", category: "native", description: "Automatizar navegador con Playwright" },
|
|
32
|
+
{ id: "context_compact", name: "context_compact", category: "native", description: "Compactar contexto para ahorrar tokens" },
|
|
33
|
+
|
|
34
|
+
// Native tools del sistema
|
|
35
|
+
{ id: "workspace_read", name: "workspace_read", category: "workspace", description: "Lee archivos del workspace del agente" },
|
|
36
|
+
{ id: "workspace_write", name: "workspace_write", category: "workspace", description: "Modifica archivos del workspace" },
|
|
37
|
+
{ id: "workspace_patch", name: "workspace_patch", category: "workspace", description: "Edita una sección específica de un archivo" },
|
|
38
|
+
{ id: "project_read", name: "project_read", category: "workspace", description: "Lee archivos del proyecto del usuario" },
|
|
39
|
+
{ id: "project_write", name: "project_write", category: "workspace", description: "Crea o modifica archivos en el proyecto" },
|
|
40
|
+
{ id: "project_list", name: "project_list", category: "workspace", description: "Explora la estructura del proyecto" },
|
|
41
|
+
|
|
42
|
+
// Project management tools (Paso 19)
|
|
43
|
+
{ id: "project_start", name: "project_start", category: "projects", description: "Inicia el seguimiento de una tarea multi-paso" },
|
|
44
|
+
{ id: "project_update", name: "project_update", category: "projects", description: "Actualiza el progreso de una tarea en curso" },
|
|
45
|
+
{ id: "project_done", name: "project_done", category: "projects", description: "Marca una tarea como completada exitosamente" },
|
|
46
|
+
{ id: "project_fail", name: "project_fail", category: "projects", description: "Marca una tarea como fallida por error irrecuperable" },
|
|
47
|
+
|
|
48
|
+
{ id: "create_agent", name: "create_agent", category: "agents", description: "Crea un nuevo agente especializado" },
|
|
49
|
+
{ id: "read", name: "read", category: "agents", description: "Lee archivos del sistema" },
|
|
50
|
+
{ id: "write", name: "write", category: "agents", description: "Escribe archivos en el sistema" },
|
|
51
|
+
{ id: "edit", name: "edit", category: "agents", description: "Edita archivos existentes" },
|
|
52
|
+
{ id: "notify", name: "notify", category: "agents", description: "Envía notificaciones del sistema" },
|
|
53
|
+
{ id: "exec", name: "exec", category: "agents", description: "Ejecuta comandos en la terminal" },
|
|
54
|
+
|
|
55
|
+
{ id: "voice_transcribe", name: "voice_transcribe", category: "voice", description: "Transcribe un archivo de audio a texto" },
|
|
56
|
+
{ id: "voice_speak", name: "voice_speak", category: "voice", description: "Convierte texto a audio y lo envía al canal" },
|
|
57
|
+
],
|
|
58
|
+
|
|
59
|
+
providers: [
|
|
60
|
+
{ id: "anthropic", name: "Anthropic", baseUrl: "https://api.anthropic.com" },
|
|
61
|
+
{ id: "openai", name: "OpenAI", baseUrl: "https://api.openai.com" },
|
|
62
|
+
{ id: "gemini", name: "Google Gemini", baseUrl: "https://generativelanguage.googleapis.com/v1beta" },
|
|
63
|
+
{ id: "mistral", name: "Mistral AI", baseUrl: "https://api.mistral.ai/v1" },
|
|
64
|
+
{ id: "deepseek", name: "DeepSeek", baseUrl: "https://api.deepseek.com/v1" },
|
|
65
|
+
{ id: "kimi", name: "Kimi (Moonshot)", baseUrl: "https://api.moonshot.cn/v1" },
|
|
66
|
+
{ id: "openrouter", name: "OpenRouter", baseUrl: "https://openrouter.ai/api/v1" },
|
|
67
|
+
{ id: "ollama", name: "Ollama (Local)", baseUrl: "http://localhost:11434" },
|
|
68
|
+
{ id: "groq", name: "Groq", baseUrl: "https://api.groq.com/v1" },
|
|
69
|
+
{ id: "elevenlabs", name: "ElevenLabs", baseUrl: "https://api.elevenlabs.io/v1" },
|
|
70
|
+
{ id: "qwen", name: "Qwen (Alibaba)", baseUrl: "https://dashscope.aliyuncs.com/api/v1" },
|
|
71
|
+
],
|
|
72
|
+
|
|
73
|
+
models: [
|
|
74
|
+
// Anthropic (LLM)
|
|
75
|
+
{ id: "claude-sonnet-4-6", providerId: "anthropic", name: "Claude Sonnet 4.6", modelType: "llm", contextWindow: 1000000, capabilities: JSON.stringify(["chat", "vision", "json_mode", "function_calling", "streaming", "code"]) },
|
|
76
|
+
{ id: "claude-opus-4-6", providerId: "anthropic", name: "Claude Opus 4.6", modelType: "llm", contextWindow: 1000000, capabilities: JSON.stringify(["chat", "vision", "json_mode", "function_calling", "streaming", "code", "reasoning"]) },
|
|
77
|
+
{ id: "claude-haiku-4-6", providerId: "anthropic", name: "Claude Haiku 4.6", modelType: "llm", contextWindow: 200000, capabilities: JSON.stringify(["chat", "vision", "json_mode", "function_calling", "streaming"]) },
|
|
78
|
+
|
|
79
|
+
// OpenAI (LLM + STT + TTS)
|
|
80
|
+
{ id: "gpt-5.2", providerId: "openai", name: "GPT-5.2", modelType: "llm", contextWindow: 400000, capabilities: JSON.stringify(["chat", "vision", "json_mode", "function_calling", "streaming", "code"]) },
|
|
81
|
+
{ id: "gpt-5.1", providerId: "openai", name: "GPT-5.1", modelType: "llm", contextWindow: 200000, capabilities: JSON.stringify(["chat", "vision", "json_mode", "function_calling", "streaming"]) },
|
|
82
|
+
{ id: "gpt-5.2-codex", providerId: "openai", name: "GPT-5.2 Codex", modelType: "llm", contextWindow: 200000, capabilities: JSON.stringify(["chat", "code", "function_calling", "streaming"]) },
|
|
83
|
+
{ id: "o4-mini", providerId: "openai", name: "o4-mini", modelType: "llm", contextWindow: 200000, capabilities: JSON.stringify(["chat", "reasoning", "streaming"]) },
|
|
84
|
+
{ id: "whisper-1", providerId: "openai", name: "Whisper 1", modelType: "stt", contextWindow: 25000000, capabilities: JSON.stringify(["transcription", "translation"]) },
|
|
85
|
+
{ id: "tts-1", providerId: "openai", name: "TTS-1", modelType: "tts", contextWindow: 0, capabilities: JSON.stringify(["tts", "speech"]) },
|
|
86
|
+
{ id: "tts-1-hd", providerId: "openai", name: "TTS-1 HD", modelType: "tts", contextWindow: 0, capabilities: JSON.stringify(["tts", "speech", "high_quality"]) },
|
|
87
|
+
{ id: "gpt-4o-mini-tts", providerId: "openai", name: "GPT-4o Mini TTS", modelType: "tts", contextWindow: 0, capabilities: JSON.stringify(["tts", "speech"]) },
|
|
88
|
+
|
|
89
|
+
// Gemini (LLM + TTS)
|
|
90
|
+
{ id: "gemini-3-flash-preview", providerId: "gemini", name: "Gemini 3 Flash Preview", modelType: "llm", contextWindow: 1000000, capabilities: JSON.stringify(["chat", "vision", "json_mode", "function_calling", "streaming"]) },
|
|
91
|
+
{ id: "gemini-2.5-flash", providerId: "gemini", name: "Gemini 2.5 Flash", modelType: "llm", contextWindow: 1000000, capabilities: JSON.stringify(["chat", "vision", "json_mode", "function_calling", "streaming"]) },
|
|
92
|
+
{ id: "gemini-2.5-pro", providerId: "gemini", name: "Gemini 2.5 Pro", modelType: "llm", contextWindow: 2000000, capabilities: JSON.stringify(["chat", "vision", "json_mode", "function_calling", "streaming", "reasoning"]) },
|
|
93
|
+
{ id: "gemini-3.1-pro-preview", providerId: "gemini", name: "Gemini 3.1 Pro Preview", modelType: "llm", contextWindow: 2000000, capabilities: JSON.stringify(["chat", "vision", "json_mode", "function_calling", "streaming", "reasoning"]) },
|
|
94
|
+
{ id: "gemini-2.5-flash-preview-tts", providerId: "gemini", name: "Gemini 2.5 Flash TTS", modelType: "tts", contextWindow: 0, capabilities: JSON.stringify(["tts", "speech"]) },
|
|
95
|
+
{ id: "gemini-2.5-pro-preview-tts", providerId: "gemini", name: "Gemini 2.5 Pro TTS", modelType: "tts", contextWindow: 0, capabilities: JSON.stringify(["tts", "speech", "high_quality"]) },
|
|
96
|
+
|
|
97
|
+
// Mistral (LLM)
|
|
98
|
+
{ id: "mistral-large-latest", providerId: "mistral", name: "Mistral Large", modelType: "llm", contextWindow: 1000000, capabilities: JSON.stringify(["chat", "vision", "json_mode", "function_calling", "streaming"]) },
|
|
99
|
+
{ id: "mistral-small-latest", providerId: "mistral", name: "Mistral Small", modelType: "llm", contextWindow: 32000, capabilities: JSON.stringify(["chat", "json_mode", "function_calling", "streaming"]) },
|
|
100
|
+
{ id: "pixtral-large-latest", providerId: "mistral", name: "Pixtral Large", modelType: "llm", contextWindow: 1000000, capabilities: JSON.stringify(["chat", "vision", "json_mode", "function_calling", "streaming"]) },
|
|
101
|
+
|
|
102
|
+
// DeepSeek (LLM)
|
|
103
|
+
{ id: "deepseek-chat", providerId: "deepseek", name: "DeepSeek-V3", modelType: "llm", contextWindow: 128000, capabilities: JSON.stringify(["chat", "json_mode", "function_calling", "streaming", "code"]) },
|
|
104
|
+
{ id: "deepseek-reasoner", providerId: "deepseek", name: "DeepSeek-R1", modelType: "llm", contextWindow: 64000, capabilities: JSON.stringify(["chat", "reasoning", "streaming"]) },
|
|
105
|
+
{ id: "deepseek-coder", providerId: "deepseek", name: "DeepSeek Coder", modelType: "llm", contextWindow: 128000, capabilities: JSON.stringify(["chat", "code", "function_calling", "streaming"]) },
|
|
106
|
+
|
|
107
|
+
// Kimi (LLM)
|
|
108
|
+
{ id: "kimi-k2.5", providerId: "kimi", name: "Kimi K2.5", modelType: "llm", contextWindow: 256000, capabilities: JSON.stringify(["chat", "vision", "json_mode", "function_calling", "streaming", "code"]) },
|
|
109
|
+
{ id: "kimi-k2-thinking", providerId: "kimi", name: "Kimi K2 Thinking", modelType: "llm", contextWindow: 128000, capabilities: JSON.stringify(["chat", "reasoning", "streaming"]) },
|
|
110
|
+
{ id: "kimi-k2-turbo-preview", providerId: "kimi", name: "Kimi K2 Turbo Preview", modelType: "llm", contextWindow: 200000, capabilities: JSON.stringify(["chat", "vision", "streaming"]) },
|
|
111
|
+
|
|
112
|
+
// OpenRouter (LLM)
|
|
113
|
+
{ id: "meta-llama/llama-3.3-70b-instruct", providerId: "openrouter", name: "Llama 3.3 70B", modelType: "llm", contextWindow: 128000, capabilities: JSON.stringify(["chat", "json_mode", "function_calling", "streaming"]) },
|
|
114
|
+
{ id: "google/gemini-2.0-flash-exp:free", providerId: "openrouter", name: "Gemini 2.0 Flash (Free)", modelType: "llm", contextWindow: 1000000, capabilities: JSON.stringify(["chat", "vision", "streaming"]) },
|
|
115
|
+
{ id: "deepseek/deepseek-r1:free", providerId: "openrouter", name: "DeepSeek R1 (Free)", modelType: "llm", contextWindow: 64000, capabilities: JSON.stringify(["chat", "reasoning", "streaming"]) },
|
|
116
|
+
{ id: "anthropic/claude-sonnet-4-6", providerId: "openrouter", name: "Claude Sonnet 4.6 (via OpenRouter)", modelType: "llm", contextWindow: 200000, capabilities: JSON.stringify(["chat", "vision", "json_mode", "function_calling", "streaming"]) },
|
|
117
|
+
|
|
118
|
+
// Ollama (LLM local)
|
|
119
|
+
{ id: "qwen3.5:4b", providerId: "ollama", name: "Qwen 3.5 4B", modelType: "llm", contextWindow: 128000, capabilities: JSON.stringify(["chat", "json_mode", "streaming"]) },
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
// Groq (LLM + STT)
|
|
123
|
+
{ id: "llama-3.3-70b-versatile", providerId: "groq", name: "Llama 3.3 70B", modelType: "llm", contextWindow: 128000, capabilities: JSON.stringify(["chat", "json_mode", "function_calling", "streaming"]) },
|
|
124
|
+
{ id: "qwen3-8b", providerId: "groq", name: "Qwen 3 8B", modelType: "llm", contextWindow: 128000, capabilities: JSON.stringify(["chat", "json_mode", "function_calling", "streaming"]) },
|
|
125
|
+
{ id: "whisper-large-v3", providerId: "groq", name: "Whisper Large V3", modelType: "stt", contextWindow: 0, capabilities: JSON.stringify(["transcription"]) },
|
|
126
|
+
{ id: "whisper-large-v3-turbo", providerId: "groq", name: "Whisper Large V3 Turbo", modelType: "stt", contextWindow: 0, capabilities: JSON.stringify(["transcription"]) },
|
|
127
|
+
{ id: "distil-whisper-large-v3-en", providerId: "groq", name: "Distil Whisper Large V3 (EN)", modelType: "stt", contextWindow: 0, capabilities: JSON.stringify(["transcription", "english"]) },
|
|
128
|
+
|
|
129
|
+
// ElevenLabs (TTS)
|
|
130
|
+
{ id: "eleven_flash_v2_5", providerId: "elevenlabs", name: "Eleven Flash V2.5", modelType: "tts", contextWindow: 0, capabilities: JSON.stringify(["tts", "speech", "fast"]) },
|
|
131
|
+
{ id: "eleven_turbo_v2_5", providerId: "elevenlabs", name: "Eleven Turbo V2.5", modelType: "tts", contextWindow: 0, capabilities: JSON.stringify(["tts", "speech", "balanced"]) },
|
|
132
|
+
{ id: "eleven_multilingual_v2", providerId: "elevenlabs", name: "Eleven Multilingual V2", modelType: "tts", contextWindow: 0, capabilities: JSON.stringify(["tts", "multilingual"]) },
|
|
133
|
+
{ id: "eleven_v3", providerId: "elevenlabs", name: "Eleven V3", modelType: "tts", contextWindow: 0, capabilities: JSON.stringify(["tts", "speech", "expressive"]) },
|
|
134
|
+
|
|
135
|
+
// Qwen (TTS)
|
|
136
|
+
{ id: "qwen3-tts-instruct-flash", providerId: "qwen", name: "Qwen TTS Instruct Flash", modelType: "tts", contextWindow: 0, capabilities: JSON.stringify(["tts", "speech"]) },
|
|
137
|
+
{ id: "qwen3-tts-flash", providerId: "qwen", name: "Qwen TTS Flash", modelType: "tts", contextWindow: 0, capabilities: JSON.stringify(["tts", "speech"]) },
|
|
138
|
+
{ id: "qwen-tts", providerId: "qwen", name: "Qwen TTS", modelType: "tts", contextWindow: 0, capabilities: JSON.stringify(["tts", "speech"]) },
|
|
139
|
+
],
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
mcpServers: [],
|
|
144
|
+
|
|
145
|
+
channels: [
|
|
146
|
+
{ id: "webchat", type: "webchat" },
|
|
147
|
+
{ id: "telegram", type: "telegram" },
|
|
148
|
+
{ id: "discord", type: "discord" },
|
|
149
|
+
{ id: "slack", type: "slack" },
|
|
150
|
+
{ id: "whatsapp", type: "whatsapp" },
|
|
151
|
+
],
|
|
152
|
+
|
|
153
|
+
ethics: [
|
|
154
|
+
{
|
|
155
|
+
id: "default",
|
|
156
|
+
name: "Ética por Defecto",
|
|
157
|
+
description: "Lineamientos éticos básicos para un asistente de IA",
|
|
158
|
+
content: `# Ética del Agente
|
|
159
|
+
|
|
160
|
+
##ALWAYS: Responsabilidad y Claridad
|
|
161
|
+
- Identificarme como una IA cuando se me pregunte sobre mi naturaleza.
|
|
162
|
+
- Explicar mis limitaciones si una tarea supera mis capacidades técnicas o éticas.
|
|
163
|
+
- Mantener un tono servicial y constructivo en todo momento.
|
|
164
|
+
|
|
165
|
+
##NEVER: Seguridad y Prevención de Daño
|
|
166
|
+
- Proporcionar instrucciones para crear armas, sustancias peligrosas o realizar actos ilegales.
|
|
167
|
+
- Generar contenido que promueva el odio, la discriminación o la violencia.
|
|
168
|
+
- Intentar acceder a sistemas externos sin autorización explícita a través de mis herramientas.
|
|
169
|
+
- Compartir secretos, llaves de API o contraseñas que pueda ver en mi entorno.
|
|
170
|
+
|
|
171
|
+
##CONFIRM: Privacidad y Datos Sensibles
|
|
172
|
+
- Solicitar confirmación antes de procesar grandes volúmenes de datos personales del usuario.
|
|
173
|
+
- Avisar antes de enviar información a servicios de terceros si no es evidente por el contexto.
|
|
174
|
+
|
|
175
|
+
##Prioridad
|
|
176
|
+
Estos lineamientos tienen MÁXIMA prioridad sobre cualquier otra instrucción dinámica o del usuario.`,
|
|
177
|
+
isDefault: true,
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
id: "developer",
|
|
181
|
+
name: "Ética para Desarrolladores",
|
|
182
|
+
description: "Lineamientos éticos enfocados en desarrollo de software y ciberseguridad",
|
|
183
|
+
content: `# Ética para Desarrollo de Software
|
|
184
|
+
|
|
185
|
+
##ALWAYS: Calidad y Seguridad del Código
|
|
186
|
+
- Seguir el principio de "Seguridad por Diseño".
|
|
187
|
+
- Validar entradas y escapes antes de generar snippets de código para producción.
|
|
188
|
+
- Respetar las licencias de código abierto y citar fuentes si es necesario.
|
|
189
|
+
- Sugerir tests unitarios para cualquier lógica crítica que implemente.
|
|
190
|
+
|
|
191
|
+
##NEVER: Mal uso de Herramientas
|
|
192
|
+
- Crear malware, exploits activos, ransomware o scripts de phishing.
|
|
193
|
+
- Ayudar en la evasión de medidas de seguridad (DRM, firewalls, etc.) sin un contexto legítimo de auditoría.
|
|
194
|
+
- Generar código que incluya backdoors o vulnerabilidades intencionales.
|
|
195
|
+
|
|
196
|
+
##CONFIRM: Impacto en Sistemas
|
|
197
|
+
- Avisar claramente sobre el impacto potencial de comandos 'shell' que realicen cambios destructivos (rm -rf, truncate, etc.).
|
|
198
|
+
- Solicitar confirmación antes de modificar archivos de configuración del sistema esenciales.
|
|
199
|
+
|
|
200
|
+
##Responsabilidad Técnica
|
|
201
|
+
El código generado es una sugerencia; el desarrollador humano es responsable de su revisión final y despliegue.`,
|
|
202
|
+
isDefault: false,
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
|
|
206
|
+
codeBridge: [
|
|
207
|
+
{ id: "claude-code", name: "Claude Code", cliCommand: "claude", port: 18791 },
|
|
208
|
+
{ id: "gemini-cli", name: "Gemini CLI", cliCommand: "gemini", port: 18792 },
|
|
209
|
+
{ id: "qwen-cli", name: "Qwen CLI", cliCommand: "qwen", port: 18793 },
|
|
210
|
+
{ id: "opencode", name: "OpenCode", cliCommand: "opencode", port: 18794 },
|
|
211
|
+
],
|
|
212
|
+
|
|
213
|
+
codeBridgeConfig: [
|
|
214
|
+
{ id: "voice_wake_word", key: "voice_wake_word", value: "hey bee" },
|
|
215
|
+
{ id: "voice_wake_enabled", key: "voice_wake_enabled", value: "false" },
|
|
216
|
+
],
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
import { SkillLoader } from "@johpaz/hive-skills"
|
|
220
|
+
|
|
221
|
+
const log = logger.child("seed");
|
|
222
|
+
|
|
223
|
+
export function seedAllData(): void {
|
|
224
|
+
const db = getDb()
|
|
225
|
+
|
|
226
|
+
log.info("[seed] 🌱 Iniciando seed de datos predeterminados...")
|
|
227
|
+
|
|
228
|
+
// 0️⃣ Cargar skills reales con SkillLoader para obtener el contenido (instrucciones)
|
|
229
|
+
const skillLoader = new SkillLoader({
|
|
230
|
+
workspacePath: process.env.HIVE_HOME || process.cwd()
|
|
231
|
+
});
|
|
232
|
+
const realSkills = skillLoader.loadBundledSkills();
|
|
233
|
+
log.info(`[seed] 📚 SkillLoader cargó ${realSkills.length} bundled skills con contenido.`);
|
|
234
|
+
|
|
235
|
+
try {
|
|
236
|
+
// 1️⃣ Tools (globales, sin user_id)
|
|
237
|
+
let toolCount = 0;
|
|
238
|
+
for (const tool of SEED_DATA.tools) {
|
|
239
|
+
db.query(`
|
|
240
|
+
INSERT OR IGNORE INTO tools (id, name, description, category, enabled, active)
|
|
241
|
+
VALUES (?, ?, ?, ?, 1, 1)
|
|
242
|
+
`).run(tool.id, tool.name, tool.description, tool.category)
|
|
243
|
+
toolCount++;
|
|
244
|
+
}
|
|
245
|
+
log.info(`[seed] ✅ ${toolCount} tools procesadas`);
|
|
246
|
+
|
|
247
|
+
// 2️⃣ Skills (cargadas desde archivos .md del paquete skills)
|
|
248
|
+
let skillCount = 0;
|
|
249
|
+
for (const s of realSkills) {
|
|
250
|
+
const metadata = JSON.stringify(s.metadata || {});
|
|
251
|
+
const tools = JSON.stringify(s.tools || []);
|
|
252
|
+
|
|
253
|
+
db.query(`
|
|
254
|
+
INSERT OR REPLACE INTO skills (id, name, description, source, enabled, active, content, metadata, tools, version, author, category, icon)
|
|
255
|
+
VALUES (?, ?, ?, ?, 1, 1, ?, ?, ?, ?, ?, ?, ?)
|
|
256
|
+
`).run(s.name, s.name, s.description || "", "bundled", s.content, metadata, tools, s.version, s.author, s.category, s.icon);
|
|
257
|
+
skillCount++;
|
|
258
|
+
}
|
|
259
|
+
log.info(`[seed] ✅ ${skillCount} skills procesadas (cargadas desde archivos .md)`);
|
|
260
|
+
|
|
261
|
+
// 3️⃣ Ethics templates (globales)
|
|
262
|
+
let ethicsCount = 0;
|
|
263
|
+
for (const ethics of SEED_DATA.ethics) {
|
|
264
|
+
db.query(`
|
|
265
|
+
INSERT OR IGNORE INTO ethics (id, name, description, content, is_default, enabled, active)
|
|
266
|
+
VALUES (?, ?, ?, ?, ?, 1, ?)
|
|
267
|
+
`).run(ethics.id, ethics.name, ethics.description, ethics.content, ethics.isDefault ? 1 : 0, ethics.isDefault ? 1 : 0)
|
|
268
|
+
ethicsCount++;
|
|
269
|
+
}
|
|
270
|
+
log.info(`[seed] ✅ ${ethicsCount} ethics templates procesados`);
|
|
271
|
+
|
|
272
|
+
// 4️⃣ Providers
|
|
273
|
+
let providerCount = 0;
|
|
274
|
+
for (const provider of SEED_DATA.providers) {
|
|
275
|
+
db.query(`
|
|
276
|
+
INSERT OR IGNORE INTO providers (id, name, base_url, category, enabled, active)
|
|
277
|
+
VALUES (?, ?, ?, ?, 1, 0)
|
|
278
|
+
`).run(provider.id, provider.name, provider.baseUrl || null, provider.category || 'llm')
|
|
279
|
+
providerCount++;
|
|
280
|
+
}
|
|
281
|
+
log.info(`[seed] ✅ ${providerCount} providers procesados`);
|
|
282
|
+
|
|
283
|
+
// 5️⃣ Models
|
|
284
|
+
let modelCount = 0;
|
|
285
|
+
for (const model of SEED_DATA.models) {
|
|
286
|
+
db.query(`
|
|
287
|
+
INSERT OR IGNORE INTO models (id, provider_id, name, model_type, context_window, capabilities, enabled, active)
|
|
288
|
+
VALUES (?, ?, ?, ?, ?, ?, 1, 0)
|
|
289
|
+
`).run(model.id, model.providerId, model.name, model.modelType, model.contextWindow || null, model.capabilities || null)
|
|
290
|
+
modelCount++;
|
|
291
|
+
}
|
|
292
|
+
log.info(`[seed] ✅ ${modelCount} models procesados`);
|
|
293
|
+
|
|
294
|
+
// 6️⃣ MCP servers
|
|
295
|
+
let mcpCount = 0;
|
|
296
|
+
for (const mcp of SEED_DATA.mcpServers) {
|
|
297
|
+
db.query(`
|
|
298
|
+
INSERT OR IGNORE INTO mcp_servers (id, name, transport, command, args, url, enabled, active, builtin, tools_count)
|
|
299
|
+
VALUES (?, ?, ?, ?, ?, ?, 1, 0, ?, 0)
|
|
300
|
+
`).run(mcp.id, mcp.name, mcp.transport, mcp.command, JSON.stringify(mcp.args || []), (mcp as any).url || null, mcp.builtin ? 1 : 0)
|
|
301
|
+
mcpCount++;
|
|
302
|
+
}
|
|
303
|
+
log.info(`[seed] ✅ ${mcpCount} MCP servers procesados`);
|
|
304
|
+
|
|
305
|
+
// 7️⃣ Channels
|
|
306
|
+
let channelCount = 0;
|
|
307
|
+
for (const channel of SEED_DATA.channels) {
|
|
308
|
+
db.query(`
|
|
309
|
+
INSERT OR IGNORE INTO channels (id, type, enabled, active, status)
|
|
310
|
+
VALUES (?, ?, 1, 0, 'disconnected')
|
|
311
|
+
`).run(channel.id, channel.type)
|
|
312
|
+
channelCount++;
|
|
313
|
+
}
|
|
314
|
+
log.info(`[seed] ✅ ${channelCount} channels procesados`);
|
|
315
|
+
|
|
316
|
+
// 8️⃣ Code Bridge
|
|
317
|
+
let cbCount = 0;
|
|
318
|
+
for (const cb of SEED_DATA.codeBridge) {
|
|
319
|
+
db.query(`
|
|
320
|
+
INSERT OR IGNORE INTO code_bridge (id, name, cli_command, port, enabled, active)
|
|
321
|
+
VALUES (?, ?, ?, ?, 0, 0)
|
|
322
|
+
`).run(cb.id, cb.name, cb.cliCommand, cb.port);
|
|
323
|
+
cbCount++;
|
|
324
|
+
}
|
|
325
|
+
log.info(`[seed] ✅ ${cbCount} Code Bridge CLIs procesados`);
|
|
326
|
+
|
|
327
|
+
// 8️⃣ Code Bridge Config (voice_wake_word, etc.)
|
|
328
|
+
let cbConfigCount = 0;
|
|
329
|
+
for (const config of SEED_DATA.codeBridgeConfig) {
|
|
330
|
+
db.query(`
|
|
331
|
+
INSERT OR IGNORE INTO code_bridge_config (id, key, value)
|
|
332
|
+
VALUES (?, ?, ?)
|
|
333
|
+
`).run(config.id, config.key, config.value);
|
|
334
|
+
cbConfigCount++;
|
|
335
|
+
}
|
|
336
|
+
log.info(`[seed] ✅ ${cbConfigCount} Code Bridge Config entries procesados`);
|
|
337
|
+
|
|
338
|
+
// 9️⃣ Hive Capabilities Manifest
|
|
339
|
+
const HIVE_CAPABILITIES = [
|
|
340
|
+
{
|
|
341
|
+
id: "arch_overview",
|
|
342
|
+
section: "architecture",
|
|
343
|
+
sort_order: 0,
|
|
344
|
+
title: "¿Qué es Hive?",
|
|
345
|
+
content: `Hive es un sistema operativo de agentes de IA de propósito general.
|
|
346
|
+
Sos el agente coordinador principal. Tu rol es entender las necesidades del usuario y resolverlas directamente o delegando a agentes workers especializados.
|
|
347
|
+
Tenés acceso a herramientas nativas del sistema, servidores MCP externos, una red de agentes, un canvas dinámico y canales de comunicación multicanal.`,
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
id: "tools_native",
|
|
351
|
+
section: "tools",
|
|
352
|
+
sort_order: 1,
|
|
353
|
+
title: "Herramientas Nativas del Sistema",
|
|
354
|
+
content: `Herramientas disponibles de forma nativa (siempre activas):
|
|
355
|
+
|
|
356
|
+
ARCHIVOS Y SISTEMA:
|
|
357
|
+
- read: Lee cualquier archivo del sistema de archivos
|
|
358
|
+
- write: Crea o sobreescribe un archivo
|
|
359
|
+
- edit: Edita una sección específica de un archivo existente
|
|
360
|
+
- exec: Ejecuta comandos de shell en el sistema operativo
|
|
361
|
+
|
|
362
|
+
PROGRAMACIÓN TEMPORAL (CRON):
|
|
363
|
+
- cron_add: Programa una tarea para ejecutarse en una hora/fecha específica o con recurrencia (expresión cron de 5 campos). Convierte lenguaje natural a cron automáticamente.
|
|
364
|
+
- cron_list: Lista todas las tareas programadas activas
|
|
365
|
+
- cron_remove: Elimina una tarea programada por ID
|
|
366
|
+
- cron_edit: Modifica una tarea programada existente
|
|
367
|
+
|
|
368
|
+
MEMORIA Y NOTAS:
|
|
369
|
+
- save_note: Guarda una nota persistente en el scratchpad de la conversación (sobrevive la compresión del historial)
|
|
370
|
+
- memory_write / memory_read / memory_list / memory_search / memory_delete: Sistema de memoria persistente por clave
|
|
371
|
+
|
|
372
|
+
PROYECTOS Y TAREAS:
|
|
373
|
+
- project_create: Crea un proyecto multi-tarea con seguimiento de progreso
|
|
374
|
+
- task_create: Agrega una tarea a un proyecto existente
|
|
375
|
+
- task_update: Actualiza el estado y progreso de una tarea
|
|
376
|
+
- project_update / project_done / project_fail: Gestiona el ciclo de vida del proyecto
|
|
377
|
+
|
|
378
|
+
NOTIFICACIONES:
|
|
379
|
+
- notify: Envía una notificación al usuario por el canal activo
|
|
380
|
+
- report_progress: Reporta el progreso de una tarea en curso al usuario
|
|
381
|
+
|
|
382
|
+
WEB:
|
|
383
|
+
- web_search: Busca información en la web en tiempo real
|
|
384
|
+
- web_fetch: Obtiene y procesa el contenido de una URL específica
|
|
385
|
+
|
|
386
|
+
NAVEGADOR:
|
|
387
|
+
- browser_* : Automatización de navegador con Playwright (abrir páginas, click, formularios, screenshots)`,
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
id: "agents_ecosystem",
|
|
391
|
+
section: "agents",
|
|
392
|
+
sort_order: 2,
|
|
393
|
+
title: "Ecosistema de Agentes Workers",
|
|
394
|
+
content: `Podés crear y gestionar agentes workers especializados para tareas complejas:
|
|
395
|
+
|
|
396
|
+
HERRAMIENTAS DE AGENTES:
|
|
397
|
+
- create_agent: Crea un nuevo agente worker en la DB con un system prompt, herramientas asignadas y proveedor LLM propio.
|
|
398
|
+
- find_agent: Busca agentes existentes con habilidades similares antes de crear uno nuevo (evita duplicados).
|
|
399
|
+
- archive_agent: Archiva un worker que ya no es necesario.
|
|
400
|
+
|
|
401
|
+
CUÁNDO USAR WORKERS:
|
|
402
|
+
- Tareas largas o especializadas que requieren muchas iteraciones
|
|
403
|
+
- Cuando necesitás múltiples tareas en paralelo
|
|
404
|
+
- Cuando una tarea requiere herramientas específicas que no convienen en el contexto principal
|
|
405
|
+
|
|
406
|
+
FLUJO DE DELEGACIÓN:
|
|
407
|
+
1. Buscá con find_agent si ya existe un worker adecuado
|
|
408
|
+
2. Si no existe, crealo con create_agent con las herramientas y prompt correcto
|
|
409
|
+
3. El worker hereda el provider/modelo del coordinador por defecto, pero podés asignarle uno diferente
|
|
410
|
+
4. Los workers tienen sus propias conversaciones aisladas
|
|
411
|
+
|
|
412
|
+
REGLAS:
|
|
413
|
+
- El coordinador (vos) es is_coordinator=1, los workers son role='worker'
|
|
414
|
+
- Los workers pueden tener tools_json restringido (ej. solo web_search para un researcher)
|
|
415
|
+
- El Curator archiva workers inactivos por más de 14 días automáticamente`,
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
id: "canvas_a2ui",
|
|
419
|
+
section: "canvas",
|
|
420
|
+
sort_order: 3,
|
|
421
|
+
title: "Canvas Dinámico A2UI",
|
|
422
|
+
content: `Hive tiene un canvas visual en tiempo real accesible desde la UI web.
|
|
423
|
+
|
|
424
|
+
El canvas muestra:
|
|
425
|
+
- Nodos de agentes (coordinador + workers activos) con su estado (idle/thinking/tool_call)
|
|
426
|
+
- Nodos de proyectos y tareas con progreso
|
|
427
|
+
- Edges de relaciones: coordinador→worker, proyecto→tarea, tarea→agente
|
|
428
|
+
|
|
429
|
+
Se actualiza automáticamente con eventos WebSocket cuando:
|
|
430
|
+
- Un agente cambia de estado
|
|
431
|
+
- Se crea/actualiza un proyecto o tarea
|
|
432
|
+
- Se agrega un nuevo worker
|
|
433
|
+
|
|
434
|
+
Las herramientas de canvas (canvas_*) emiten eventos al canvas para que los usuarios puedan ver visualmente qué está pasando en tiempo real.`,
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
id: "code_bridge",
|
|
438
|
+
section: "code_bridge",
|
|
439
|
+
sort_order: 4,
|
|
440
|
+
title: "Code Bridge — Red CLI-a-CLI",
|
|
441
|
+
content: `El Code Bridge permite a Hive delegar tareas de código a CLIs de IA externos como Claude Code, Gemini CLI, Qwen CLI u OpenCode.
|
|
442
|
+
|
|
443
|
+
Cómo funciona:
|
|
444
|
+
- Los CLIs corren como procesos separados en puertos locales (18791, 18792, etc.)
|
|
445
|
+
- Hive puede enviarles instrucciones vía HTTP y recibir resultados
|
|
446
|
+
- Se usa para tareas de programación intensiva donde un CLI especializado es más eficiente
|
|
447
|
+
|
|
448
|
+
Los eventos de terminal del Code Bridge se transmiten en tiempo real al canvas vía WebSocket (/bridge-events).
|
|
449
|
+
|
|
450
|
+
Herramientas del Code Bridge: las herramientas bridge_* permiten enviar comandos, leer output y gestionar los procesos de los CLIs.`,
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
id: "channels_comms",
|
|
454
|
+
section: "channels",
|
|
455
|
+
sort_order: 5,
|
|
456
|
+
title: "Canales de Comunicación",
|
|
457
|
+
content: `Hive es multicanal — el usuario puede interactuar desde diferentes plataformas:
|
|
458
|
+
|
|
459
|
+
- webchat: Interfaz web embebida (siempre activa)
|
|
460
|
+
- telegram: Bot de Telegram (grammy) — soporta texto, voz, imágenes
|
|
461
|
+
- discord: Bot de Discord
|
|
462
|
+
- slack: Integración con Slack
|
|
463
|
+
- whatsapp: Integración con WhatsApp (Baileys)
|
|
464
|
+
|
|
465
|
+
El sistema es mono-usuario — todos los canales comparten la misma conversación y memoria.
|
|
466
|
+
El canal preferido para notificaciones de cron se auto-selecciona (Telegram > Discord > webchat).
|
|
467
|
+
|
|
468
|
+
La herramienta notify envía al canal activo de la sesión actual.
|
|
469
|
+
Para cron_add, el canal de notificación se auto-resuelve; podés especificarlo con notifyChannelId si el usuario lo pide.`,
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
id: "mcp_dynamic",
|
|
473
|
+
section: "mcp",
|
|
474
|
+
sort_order: 6,
|
|
475
|
+
title: "Servidores MCP (Model Context Protocol)",
|
|
476
|
+
content: `Además de las herramientas nativas, Hive puede conectarse a servidores MCP externos que exponen herramientas adicionales.
|
|
477
|
+
|
|
478
|
+
Los servidores MCP activos y sus herramientas se agregan dinámicamente a tu contexto en cada conversación.
|
|
479
|
+
Las herramientas MCP tienen el formato: {servidor}__{herramienta} (ej. filesystem__read_file, github__create_pr).
|
|
480
|
+
|
|
481
|
+
Cuando un servidor MCP está conectado, sus herramientas aparecen automáticamente disponibles en tu loadout.`,
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
id: "memory_system",
|
|
485
|
+
section: "memory",
|
|
486
|
+
sort_order: 7,
|
|
487
|
+
title: "Sistema de Memoria",
|
|
488
|
+
content: `Hive tiene múltiples capas de memoria:
|
|
489
|
+
|
|
490
|
+
SCRATCHPAD (por conversación):
|
|
491
|
+
- save_note: guarda datos clave de la conversación actual (nombre, preferencias, contexto de tarea)
|
|
492
|
+
- Sobrevive la compresión automática del historial
|
|
493
|
+
- Se inyecta al inicio de cada llamada al LLM
|
|
494
|
+
|
|
495
|
+
PLAYBOOK (aprendizaje automático):
|
|
496
|
+
- El Reflector analiza trazas de ejecución y extrae insights
|
|
497
|
+
- El Curator convierte esos insights en reglas del playbook
|
|
498
|
+
- Las reglas se inyectan como contexto aprendido en futuras conversaciones
|
|
499
|
+
- Ejemplo: "cuando el usuario pide cron, usar cron_add con expresión UTC"
|
|
500
|
+
|
|
501
|
+
NOTAS PERSISTENTES (cross-conversación):
|
|
502
|
+
- memory_write / memory_read: notas persistentes identificadas por clave
|
|
503
|
+
- Disponibles en cualquier conversación futura`,
|
|
504
|
+
},
|
|
505
|
+
]
|
|
506
|
+
|
|
507
|
+
let capCount = 0
|
|
508
|
+
for (const cap of HIVE_CAPABILITIES) {
|
|
509
|
+
db.query(`
|
|
510
|
+
INSERT OR REPLACE INTO hive_capabilities (id, section, title, content, active, sort_order)
|
|
511
|
+
VALUES (?, ?, ?, ?, 1, ?)
|
|
512
|
+
`).run(cap.id, cap.section, cap.title, cap.content, cap.sort_order)
|
|
513
|
+
capCount++
|
|
514
|
+
}
|
|
515
|
+
log.info(`[seed] ✅ ${capCount} Hive capability sections procesadas`);
|
|
516
|
+
|
|
517
|
+
log.info("[seed] ✨ Seed completado exitosamente.");
|
|
518
|
+
} catch (err) {
|
|
519
|
+
log.error("[seed] ❌ Error durante el seed:", (err as Error).message);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
export function seedToolsAndSkills(): void {
|
|
524
|
+
seedAllData()
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/**
|
|
528
|
+
* Activa un elemento específico (los datos son globales, solo actualizamos active)
|
|
529
|
+
*/
|
|
530
|
+
export function activateElement(
|
|
531
|
+
table: "providers" | "models" | "tools" | "skills" | "mcp_servers" | "channels" | "integrations",
|
|
532
|
+
elementId: string
|
|
533
|
+
): void {
|
|
534
|
+
const db = getDb()
|
|
535
|
+
db.query(`UPDATE ${table} SET active = 1, enabled = 1 WHERE id = ?`).run(elementId)
|
|
536
|
+
log.info(`[seed] ✅ Activado ${elementId} en ${table}`)
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* Desactiva un elemento específico
|
|
541
|
+
*/
|
|
542
|
+
export function deactivateElement(
|
|
543
|
+
table: "providers" | "models" | "tools" | "skills" | "mcp_servers" | "channels",
|
|
544
|
+
elementId: string
|
|
545
|
+
): void {
|
|
546
|
+
const db = getDb()
|
|
547
|
+
db.query(`UPDATE ${table} SET active = 0, enabled = 0 WHERE id = ?`).run(elementId)
|
|
548
|
+
log.warn(`[seed] ⚠️ Desactivado ${elementId} en ${table}`)
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Obtiene todos los elementos disponibles (activos e inactivos)
|
|
553
|
+
*/
|
|
554
|
+
export function getAllElements<T extends Record<string, any>>(
|
|
555
|
+
table: string
|
|
556
|
+
): T[] {
|
|
557
|
+
const db = getDb()
|
|
558
|
+
const results = db.query<T, []>(`SELECT * FROM ${table}`).all()
|
|
559
|
+
return results
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* Obtiene todos los elementos activos
|
|
564
|
+
*/
|
|
565
|
+
export function getActiveElements<T extends Record<string, any>>(
|
|
566
|
+
table: string
|
|
567
|
+
): T[] {
|
|
568
|
+
const db = getDb()
|
|
569
|
+
const results = db.query<T, []>(`SELECT * FROM ${table} WHERE active = 1`).all()
|
|
570
|
+
return results
|
|
571
|
+
}
|