@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
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Contribuir a Hive
|
|
2
|
+
|
|
3
|
+
¡Gracias por tu interés en contribuir a Hive! Este documento te ayuda a saber dónde hacer tu cambio.
|
|
4
|
+
|
|
5
|
+
## ¿Dónde hacer cambios?
|
|
6
|
+
|
|
7
|
+
| Tipo de cambio | Carpeta |
|
|
8
|
+
|---------------|---------|
|
|
9
|
+
| Canal nuevo (Telegram, Discord, WhatsApp, etc.) | `packages/core/src/channels` |
|
|
10
|
+
| Tool nueva (navegador, filesystem, etc.) | `packages/core/src/tools` |
|
|
11
|
+
| Skill nuevo (web_search, shell, memory, etc.) | `packages/core/src/skills` |
|
|
12
|
+
| MCP nuevo | `packages/core/src/mcp` |
|
|
13
|
+
| Mejora al CLI | `packages/cli/src` |
|
|
14
|
+
| Bug fix | Donde corresponda según el error |
|
|
15
|
+
|
|
16
|
+
## Proceso de Pull Request
|
|
17
|
+
|
|
18
|
+
1. **Fork** el repositorio
|
|
19
|
+
2. Crea una rama: `git checkout -b feature/mi-nueva-feature`
|
|
20
|
+
3. Haz tus cambios con pruebas si es posible
|
|
21
|
+
4. Asegúrate de que pasa el lint: `bun run lint`
|
|
22
|
+
5. Abre un PR describiendo tu cambio
|
|
23
|
+
|
|
24
|
+
Todos los cambios se revisan en un solo lugar. Un PR. Una revisión. Un merge.
|
|
25
|
+
|
|
26
|
+
## Ejecutar en desarrollo
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
bun install
|
|
30
|
+
bun run dev
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Commands disponibles
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
bun run dev # Modo desarrollo
|
|
37
|
+
bun run start # Iniciar gateway
|
|
38
|
+
bun run test # Ejecutar tests
|
|
39
|
+
bun run lint # Verificar tipos
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
¿Dudas? Únete a nuestro [Discord](https://discord.gg/hive) o abre un issue.
|
package/README.md
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
# Hive 🐝
|
|
2
|
+
|
|
3
|
+
> Tu colmena de agentes IA. Local-first. Multi-canal. Open source. Construido desde Colombia para el mundo.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@johpaz/hive)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
[](https://www.npmjs.com/package/@johpaz/hive)
|
|
8
|
+
[](https://github.com/johpaz/hive)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## ¿Qué es Hive?
|
|
13
|
+
|
|
14
|
+
Hive es un Gateway de IA Orquestado — un Enjambre de Agentes Especializados que trabajan juntos bajo la coordinación de un gateway central. A diferencia de un asistente personal único, Hive implementa una arquitectura de enjambre donde múltiples agentes especializados trabajan en equipo.
|
|
15
|
+
|
|
16
|
+
**El problema que resolvemos**: Necesitas un asistente de IA que funcione en múltiples canales (Telegram, Discord, WhatsApp), que pueda ejecutar tareas automáticamente, que respete tu privacidad con datos locales, y que sea extensible con herramientas propias.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Instalación
|
|
21
|
+
|
|
22
|
+
### Opción 1: npm (Recomendado para desarrolladores)
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install -g @johpaz/hive
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Luego ejecuta el asistente de configuración:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
hive onboard
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Opción 2: Binario standalone (Cero dependencias)
|
|
35
|
+
|
|
36
|
+
Descarga el binario para tu plataforma:
|
|
37
|
+
|
|
38
|
+
| Plataforma | Descarga | Permisos |
|
|
39
|
+
|------------|----------|----------|
|
|
40
|
+
| Windows x64 | [hive-v1.1.0-windows-x64.exe](https://github.com/johpaz/hive/releases/latest) | `chmod +x hive-v1.1.0-windows-x64.exe` |
|
|
41
|
+
| macOS Intel | [hive-v1.1.0-macos-x64](https://github.com/johpaz/hive/releases/latest) | `chmod +x hive-v1.1.0-macos-x64` |
|
|
42
|
+
| macOS Apple Silicon | [hive-v1.1.0-macos-arm64](https://github.com/johpaz/hive/releases/latest) | `chmod +x hive-v1.1.0-macos-arm64` |
|
|
43
|
+
| Linux x64 | [hive-v1.1.0-linux-x64](https://github.com/johpaz/hive/releases/latest) | `chmod +x hive-v1.1.0-linux-x64` |
|
|
44
|
+
| Linux ARM64 | [hive-v1.1.0-linux-arm64](https://github.com/johpaz/hive/releases/latest) | `chmod +x hive-v1.1.0-linux-arm64` |
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# Ejemplo para Linux:
|
|
48
|
+
curl -L -o hive https://github.com/johpaz/hive/releases/latest/download/hive-v1.1.0-linux-x64
|
|
49
|
+
chmod +x hive
|
|
50
|
+
./hive onboard
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Caso de uso USB (Portable)
|
|
54
|
+
|
|
55
|
+
Lleva tu agente contigo en una USB:
|
|
56
|
+
|
|
57
|
+
1. Descarga el binario de tu plataforma
|
|
58
|
+
2. Copia el binario a una USB
|
|
59
|
+
3. En cualquier equipo compatible, ejecuta:
|
|
60
|
+
```bash
|
|
61
|
+
./hive onboard
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Tu configuración y base de datos se guardan en `~/.hive`. Puedes copiar esa carpeta a tu USB y tener tu agente completo siempre contigo.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Los Cuatro Pilares
|
|
69
|
+
|
|
70
|
+
| Pilar | Descripción |
|
|
71
|
+
|-------|-------------|
|
|
72
|
+
| **Tools** | Herramientas nativas: navegador, sistema de archivos, cron, canvas. |
|
|
73
|
+
| **Skills** | Habilidades incluidas: búsqueda web, shell, memoria, HTTP client, file manager. |
|
|
74
|
+
| **MCP** | Compatible con Model Context Protocol para extender funcionalidades. |
|
|
75
|
+
| **Ética** | Límites claros definidos en ETHICS.md — tu agente siempre sabe qué puede y qué no puede hacer. |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Arquitectura técnica
|
|
80
|
+
|
|
81
|
+
Hive usa un **Native Agent Loop** propio — sin dependencias de LangGraph ni LangChain. Todo corre sobre Bun + SQLite con cero abstracciones intermedias.
|
|
82
|
+
|
|
83
|
+
### Loop principal
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
mensaje entrante
|
|
87
|
+
→ Context Compiler (compileContext)
|
|
88
|
+
→ callLLM()
|
|
89
|
+
→ [executeTool() → callLLM()]*
|
|
90
|
+
→ respuesta al usuario
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
### FASE 3 — Context Compiler
|
|
96
|
+
|
|
97
|
+
El Context Compiler es el componente central del motor. Se ejecuta antes de cada llamada al modelo y ensambla una "vista mínima" del contexto consultando SQLite directamente. Implementa cuatro estrategias de Context Engineering:
|
|
98
|
+
|
|
99
|
+
**3.1 — Selección de historial (SELECCIONAR)**
|
|
100
|
+
- Conversaciones cortas (< 20 mensajes): pasa todos los mensajes
|
|
101
|
+
- Conversaciones largas: usa el resumen de la tabla `summaries` + los últimos N mensajes recientes
|
|
102
|
+
- Nunca pasa la conversación cruda completa a modelos con ventana chica
|
|
103
|
+
|
|
104
|
+
**3.2 — Scratchpad (ESCRIBIR)**
|
|
105
|
+
- Carga las notas persistentes del thread actual desde la tabla `scratchpad`
|
|
106
|
+
- Las inyecta en el system prompt como "Información conocida sobre esta conversación"
|
|
107
|
+
- El agente puede escribir al scratchpad usando la tool `save_note(key, value)`
|
|
108
|
+
|
|
109
|
+
**3.3 — Playbook del ACE (SELECCIONAR)**
|
|
110
|
+
- Busca con FTS5 en la tabla `playbook` usando keywords del mensaje del usuario
|
|
111
|
+
- Inyecta máximo 5 reglas relevantes (`active=1`, `helpful_count > harmful_count`)
|
|
112
|
+
- Las reglas son aprendidas automáticamente por el Curator del ACE
|
|
113
|
+
|
|
114
|
+
**3.4 — Selección de tools en tres niveles (SELECCIONAR)**
|
|
115
|
+
|
|
116
|
+
| Nivel | Operación |
|
|
117
|
+
|-------|-----------|
|
|
118
|
+
| 1 — Catálogo | `collectNativeTools()` + tools de MCP activos |
|
|
119
|
+
| 2 — Agente | `filterToolsByAgent()` — filtra por `tools_json` del agente. `NULL` = todas permitidas |
|
|
120
|
+
| 3 — Turno | `selectToolLoadout()` — ALWAYS_INCLUDE + scoring por keywords del mensaje (máx. 20) |
|
|
121
|
+
|
|
122
|
+
El límite de 20 tools por turno es crítico para modelos locales con recursos limitados. Las tools del `ALWAYS_INCLUDE` siempre están disponibles sin consumir slots opcionales: `cron_add/list/remove/edit`, `project_create/task_create/task_update`, `read/write/edit`, `save_note`, `notify`, `report_progress`, `create_agent`.
|
|
123
|
+
|
|
124
|
+
**3.5 — Ética (capa constitucional)**
|
|
125
|
+
- Carga todas las reglas de la tabla `ethics` — sin filtrar, sin comprimir
|
|
126
|
+
- Siempre es el primer bloque del system prompt, en toda llamada al modelo
|
|
127
|
+
|
|
128
|
+
**Orden de ensamblaje del contexto:**
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
[system prompt]
|
|
132
|
+
1. Reglas de ética (completas, siempre)
|
|
133
|
+
2. Identidad del agente (agents.system_prompt + description)
|
|
134
|
+
3. Hive Capabilities Manifest (hive_capabilities table)
|
|
135
|
+
4. Perfil del usuario (users table)
|
|
136
|
+
5. Reglas del playbook relevantes (FTS5, máx. 5)
|
|
137
|
+
6. Notas del scratchpad (filtradas por thread_id)
|
|
138
|
+
7. Entorno (agent_id, thread_id, fecha/hora local)
|
|
139
|
+
|
|
140
|
+
[messages]
|
|
141
|
+
8. Resumen del historial (si la conversación es larga)
|
|
142
|
+
9. Mensajes recientes (últimos N)
|
|
143
|
+
|
|
144
|
+
[tools]
|
|
145
|
+
10. Tools filtradas en tres niveles
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
### FASE 4 — Proyectos, Tareas y Workers
|
|
151
|
+
|
|
152
|
+
El Coordinador puede descomponer problemas complejos en proyectos con tareas paralelas ejecutadas por workers autónomos.
|
|
153
|
+
|
|
154
|
+
**4.1 — Decisión simple vs proyecto**
|
|
155
|
+
|
|
156
|
+
El modelo decide en su system prompt:
|
|
157
|
+
- **Tarea simple** → el Coordinador la resuelve directamente o despacha a un worker existente
|
|
158
|
+
- **Tarea compleja** → crea un proyecto con subtareas y dependencias
|
|
159
|
+
|
|
160
|
+
**4.2 — Creación de proyecto y asignación de workers**
|
|
161
|
+
|
|
162
|
+
1. `project_create` — registra el objetivo del proyecto
|
|
163
|
+
2. `task_create` — crea cada subtarea con dependencias
|
|
164
|
+
3. `find_agent` — busca por FTS5 sobre `name+description` del agente vs la tarea
|
|
165
|
+
- Si existe un worker compatible → `assign_task`
|
|
166
|
+
- Si no → `create_agent` con system prompt y tools necesarios, luego `assign_task`
|
|
167
|
+
|
|
168
|
+
**4.3 — Ejecución respetando dependencias**
|
|
169
|
+
|
|
170
|
+
- Tareas sin dependencias (o con dependencias ya `completed`) se ejecutan primero
|
|
171
|
+
- Tareas independientes entre sí corren en paralelo (`Promise.all`)
|
|
172
|
+
- Si una tarea falla: el Coordinador puede reintentar, reasignar a otro agente, o marcar el proyecto como `failed`
|
|
173
|
+
|
|
174
|
+
**4.4 — Contexto aislado por worker (AISLAR)**
|
|
175
|
+
|
|
176
|
+
Cada worker recibe **solo** lo necesario para su tarea:
|
|
177
|
+
- Reglas de ética + su system prompt propio
|
|
178
|
+
- Descripción de la tarea asignada
|
|
179
|
+
- Resultados de las tareas de las que depende
|
|
180
|
+
|
|
181
|
+
El worker **no** recibe la conversación completa del usuario. Esto mantiene el contexto mínimo y evita contaminación entre agentes.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
### FASE 5 — ACE (Adaptive Context Engine)
|
|
186
|
+
|
|
187
|
+
El ACE convierte a Hive en un sistema que aprende automáticamente de sus propias ejecuciones.
|
|
188
|
+
|
|
189
|
+
**5.1 — Tracer (Generator)**
|
|
190
|
+
|
|
191
|
+
Después de cada ejecución se guarda automáticamente en la tabla `traces`:
|
|
192
|
+
- Qué agente, qué tool, qué recibió, qué produjo
|
|
193
|
+
- Si fue exitoso, cuánto tardó, cuántos tokens consumió
|
|
194
|
+
|
|
195
|
+
Pasivo — no agrega latencia al usuario.
|
|
196
|
+
|
|
197
|
+
**5.2 — Reflector (análisis periódico)**
|
|
198
|
+
|
|
199
|
+
Se ejecuta en segundo plano, nunca en el flujo del usuario:
|
|
200
|
+
- Trigger: cada 20 trazas nuevas, o por cron periódico
|
|
201
|
+
- Le pide al modelo que analice las trazas: patrones de éxito, fallos repetidos, oportunidades de mejora
|
|
202
|
+
- Guarda los insights en la tabla `reflections` (incluyendo `ethics_violation` con prioridad máxima)
|
|
203
|
+
|
|
204
|
+
**5.3 — Curator (playbook + poda de agentes)**
|
|
205
|
+
|
|
206
|
+
Transforma insights en reglas operativas:
|
|
207
|
+
- Si ya existe una regla similar → incrementa `helpful_count` o `harmful_count`
|
|
208
|
+
- Si es nueva → la inserta con `confidence` proporcional a cuántas trazas la respaldan
|
|
209
|
+
- Si `harmful_count > helpful_count` → marca la regla como `active=0`
|
|
210
|
+
- Si hay reglas duplicadas o contradictorias → fusiona o poda
|
|
211
|
+
|
|
212
|
+
Poda de agentes:
|
|
213
|
+
- Workers sin actividad por más de 14 días → `status='archived'`
|
|
214
|
+
- Workers con tasa de fallo alta → `archived` + regla en playbook explicando por qué fallaba
|
|
215
|
+
- Workers duplicados (skills similares) → archiva el menos exitoso
|
|
216
|
+
|
|
217
|
+
**Ciclo completo del ACE:**
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
Agentes ejecutan tareas
|
|
221
|
+
→ trazas en SQLite
|
|
222
|
+
→ Reflector analiza periódicamente
|
|
223
|
+
→ Curator actualiza playbook + poda agentes
|
|
224
|
+
→ Context Compiler inyecta reglas
|
|
225
|
+
→ Agentes ejecutan mejor la próxima vez
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
### FASE 6 — Compaction (compresión de historial)
|
|
231
|
+
|
|
232
|
+
Mantiene el contexto dentro del presupuesto de tokens del modelo.
|
|
233
|
+
|
|
234
|
+
**Compresión de conversación (COMPRIMIR)**
|
|
235
|
+
- Trigger: cuando el token count acumulado del thread supera el 60% de la ventana del modelo
|
|
236
|
+
- Toma todos los mensajes excepto los últimos 5
|
|
237
|
+
- El modelo los resume preservando: datos del usuario, decisiones tomadas, resultados de tools, contexto para continuar
|
|
238
|
+
- El resumen se guarda en la tabla `summaries`; los mensajes originales permanecen como historial
|
|
239
|
+
|
|
240
|
+
**Tool result clearing**
|
|
241
|
+
- Resultados de tools con más de N turnos de antigüedad → reemplazados por un resumen corto
|
|
242
|
+
- Reduce tokens sin perder el registro de que la tool se ejecutó
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
### Providers LLM soportados
|
|
247
|
+
|
|
248
|
+
Hive llama directamente a los SDKs oficiales de cada provider:
|
|
249
|
+
|
|
250
|
+
| Provider | SDK | Modelos ejemplo |
|
|
251
|
+
|----------|-----|-----------------|
|
|
252
|
+
| Google Gemini | `@google/genai` | gemini-2.5-flash, gemini-2.0-flash |
|
|
253
|
+
| Anthropic | `@anthropic-ai/sdk` | claude-sonnet-4-6, claude-opus-4-6 |
|
|
254
|
+
| OpenAI | `openai` | gpt-4o, gpt-4.1 |
|
|
255
|
+
| Groq | `openai` (compat) | llama-3.3-70b, mixtral-8x7b |
|
|
256
|
+
| Mistral | `openai` (compat) | mistral-large |
|
|
257
|
+
| DeepSeek | `openai` (compat) | deepseek-chat |
|
|
258
|
+
| Ollama | `openai` (compat) | llama3, qwen2.5, etc. |
|
|
259
|
+
| OpenRouter | `openai` (compat) | cualquier modelo de la plataforma |
|
|
260
|
+
|
|
261
|
+
### Onboarding → System Prompt
|
|
262
|
+
|
|
263
|
+
Al completar el onboarding, el campo `agents.system_prompt` se genera automáticamente con el nombre, descripción y tono del agente. El tono puede ser: `friendly`, `professional`, `direct` o `casual`.
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## Desarrollo
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
# Clonar el repo
|
|
271
|
+
git clone https://github.com/johpaz/hive.git
|
|
272
|
+
cd hive
|
|
273
|
+
|
|
274
|
+
# Instalar dependencias
|
|
275
|
+
bun install
|
|
276
|
+
|
|
277
|
+
# Modo desarrollo
|
|
278
|
+
bun run dev
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## Contribuir
|
|
284
|
+
|
|
285
|
+
¿Quieres agregar una nueva funcionalidad? Consulta [CONTRIBUTING.md](CONTRIBUTING.md) para saber exactamente dónde hacer tu cambio.
|
|
286
|
+
|
|
287
|
+
| Tipo de cambio | Ubicación |
|
|
288
|
+
|---------------|-----------|
|
|
289
|
+
| Canal nuevo | `packages/core/src/channels/` + registrar en `manager.ts` |
|
|
290
|
+
| Tool nativa | `packages/core/src/tools/` + registrar en `native-tools.ts` |
|
|
291
|
+
| Skill nueva | `packages/skills/src/` |
|
|
292
|
+
| MCP nuevo | `packages/core/src/mcp/` |
|
|
293
|
+
| Capability en el manifest | tabla `hive_capabilities` vía `seed.ts` |
|
|
294
|
+
| Mejora al CLI | `packages/cli/src/commands/` |
|
|
295
|
+
|
|
296
|
+
Todo en un PR. Una revisión. Un merge.
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Links
|
|
301
|
+
|
|
302
|
+
- 🌐 [hiveagents.io](https://hiveagents.io)
|
|
303
|
+
- 💬 [Discord](https://discord.gg/hive)
|
|
304
|
+
- 📱 [Telegram](https://t.me/hive_agents)
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## Licencia
|
|
309
|
+
|
|
310
|
+
MIT © 2024-2026 Hive Team — Construido con ❤️ desde Colombia
|
package/package.json
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@johpaz/hive",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Tu colmena de agentes IA. Local-first. Multi-canal. Open source. Construido desde Colombia para el mundo.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"hive": "packages/cli/src/index.ts"
|
|
7
|
+
},
|
|
8
|
+
"main": "packages/core/src/index.ts",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/johpaz/hive.git"
|
|
12
|
+
},
|
|
13
|
+
"keywords": [
|
|
14
|
+
"hive",
|
|
15
|
+
"agents",
|
|
16
|
+
"ai",
|
|
17
|
+
"llm",
|
|
18
|
+
"context-engine",
|
|
19
|
+
"local-first",
|
|
20
|
+
"multi-channel",
|
|
21
|
+
"telegram",
|
|
22
|
+
"discord",
|
|
23
|
+
"whatsapp",
|
|
24
|
+
"bun",
|
|
25
|
+
"sqlite",
|
|
26
|
+
"mcp",
|
|
27
|
+
"open-source",
|
|
28
|
+
"latam",
|
|
29
|
+
"colombia"
|
|
30
|
+
],
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"files": [
|
|
33
|
+
"packages/core/",
|
|
34
|
+
"packages/cli/",
|
|
35
|
+
"packages/mcp/",
|
|
36
|
+
"packages/skills/",
|
|
37
|
+
"packages/tools/",
|
|
38
|
+
"packages/code-bridge/",
|
|
39
|
+
"package.json",
|
|
40
|
+
"README.md",
|
|
41
|
+
"LICENSE",
|
|
42
|
+
"CONTRIBUTING.md"
|
|
43
|
+
],
|
|
44
|
+
"workspaces": [
|
|
45
|
+
"packages/*"
|
|
46
|
+
],
|
|
47
|
+
"scripts": {
|
|
48
|
+
"dev": "HIVE_HOME=$HOME/.hive-dev HIVE_DEV=true bun run packages/cli/src/index.ts dev",
|
|
49
|
+
"dev:keep": "HIVE_HOME=$HOME/.hive-dev HIVE_DEV=true HIVE_DEV_CLEAN=false bun run packages/cli/src/index.ts dev",
|
|
50
|
+
"start": "bun run packages/cli/src/index.ts start",
|
|
51
|
+
"test": "bun test",
|
|
52
|
+
"test:ci": "bun test --coverage",
|
|
53
|
+
"lint": "bunx tsc --noEmit",
|
|
54
|
+
"build": "echo 'No build needed - TypeScript is interpreted by Bun'",
|
|
55
|
+
"build:binaries": "bun run scripts/build-binaries.ts",
|
|
56
|
+
"bench": "bun run scripts/bench.ts",
|
|
57
|
+
"prepublishOnly": "bun run build",
|
|
58
|
+
"publish": "npm publish --access public"
|
|
59
|
+
},
|
|
60
|
+
"dependencies": {
|
|
61
|
+
"@ag-ui/core": "^0.0.46",
|
|
62
|
+
"@anthropic-ai/sdk": "^0.74.0",
|
|
63
|
+
"@clack/prompts": "^0.5.0",
|
|
64
|
+
"@google/genai": "^1.43.0",
|
|
65
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
66
|
+
"@sapphire/snowflake": "latest",
|
|
67
|
+
"@slack/bolt": "latest",
|
|
68
|
+
"@vitejs/plugin-react": "^5.1.4",
|
|
69
|
+
"@whiskeysockets/baileys": "latest",
|
|
70
|
+
"async-mutex": "^0.5.0",
|
|
71
|
+
"cron-parser": "^5.5.0",
|
|
72
|
+
"discord.js": "latest",
|
|
73
|
+
"grammy": "latest",
|
|
74
|
+
"groq-sdk": "^0.37.0",
|
|
75
|
+
"isomorphic-git": "^1.37.2",
|
|
76
|
+
"js-yaml": "^4.1.1",
|
|
77
|
+
"ollama": "^0.6.3",
|
|
78
|
+
"openai": "^6.18.0",
|
|
79
|
+
"qrcode-terminal": "latest",
|
|
80
|
+
"react-markdown": "^10.1.0",
|
|
81
|
+
"toon-format-parser": "^1.1.0",
|
|
82
|
+
"zod": "latest"
|
|
83
|
+
},
|
|
84
|
+
"devDependencies": {
|
|
85
|
+
"@types/bun": "latest",
|
|
86
|
+
"@types/js-yaml": "^4.0.9",
|
|
87
|
+
"@types/react": "^18.3.23",
|
|
88
|
+
"typescript": "latest"
|
|
89
|
+
},
|
|
90
|
+
"overrides": {
|
|
91
|
+
"vite": "^7.3.1"
|
|
92
|
+
},
|
|
93
|
+
"resolutions": {
|
|
94
|
+
"vite": "^7.3.1"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@johpaz/hive-cli",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"description": "Hive CLI — Command line interface for the Hive AI Gateway",
|
|
6
|
+
"bin": {
|
|
7
|
+
"hive": "src/index.ts"
|
|
8
|
+
},
|
|
9
|
+
"main": "./src/index.ts",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"files": [
|
|
12
|
+
"src/"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"test": "bun test"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@clack/prompts": "^",
|
|
19
|
+
"@johpaz/hive-core": "^1.1.0",
|
|
20
|
+
"@johpaz/hive-code-bridge": "^1.1.0",
|
|
21
|
+
"js-yaml": "latest",
|
|
22
|
+
"toon-format-parser": "^1.1.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"typescript": "latest",
|
|
26
|
+
"@types/bun": "latest"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { loadConfig } from "@johpaz/hive-core/config/loader";
|
|
3
|
+
|
|
4
|
+
function getGatewayUrl(config: any): string {
|
|
5
|
+
const gateway = config?.gateway;
|
|
6
|
+
const host = gateway?.host ?? "localhost";
|
|
7
|
+
const port = gateway?.port ?? 3000;
|
|
8
|
+
return `http://${host}:${port}`;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export async function agent(subcommand: string | undefined, args: string[]): Promise<void> {
|
|
12
|
+
switch (subcommand) {
|
|
13
|
+
case "run":
|
|
14
|
+
await agentRun(args);
|
|
15
|
+
break;
|
|
16
|
+
default:
|
|
17
|
+
console.log(`
|
|
18
|
+
Usage: hive agent <command>
|
|
19
|
+
|
|
20
|
+
Commands:
|
|
21
|
+
run --message <text> Ejecutar agente con mensaje
|
|
22
|
+
run --thinking <level> Nivel de razonamiento (low/medium/high)
|
|
23
|
+
run --wait Esperar respuesta completa
|
|
24
|
+
`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async function agentRun(args: string[]): Promise<void> {
|
|
29
|
+
const messageIndex = args.indexOf("--message");
|
|
30
|
+
const thinkingIndex = args.indexOf("--thinking");
|
|
31
|
+
const toolsIndex = args.indexOf("--tools");
|
|
32
|
+
const agentIndex = args.indexOf("--agent");
|
|
33
|
+
const waitIndex = args.indexOf("--wait");
|
|
34
|
+
|
|
35
|
+
if (messageIndex === -1) {
|
|
36
|
+
const msg = await p.text({
|
|
37
|
+
message: "Mensaje para el agente:",
|
|
38
|
+
placeholder: "Analiza el archivo README.md",
|
|
39
|
+
validate: (v) => (!v ? "El mensaje es requerido" : undefined),
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
if (p.isCancel(msg)) {
|
|
43
|
+
p.cancel("Cancelado");
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
args.push("--message", msg as string);
|
|
48
|
+
return agentRun(args);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const message = args[messageIndex + 1];
|
|
52
|
+
const thinking = thinkingIndex !== -1 ? args[thinkingIndex + 1] : "medium";
|
|
53
|
+
const tools = toolsIndex !== -1 ? args[toolsIndex + 1] : "all";
|
|
54
|
+
const agentId = agentIndex !== -1 ? args[agentIndex + 1] : "main";
|
|
55
|
+
const wait = waitIndex !== -1;
|
|
56
|
+
|
|
57
|
+
if (!message) {
|
|
58
|
+
console.log("❌ Mensaje requerido");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const config = loadConfig();
|
|
63
|
+
const gatewayUrl = getGatewayUrl(config);
|
|
64
|
+
|
|
65
|
+
const spinner = p.spinner();
|
|
66
|
+
spinner.start("Conectando con el agente...");
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
if (wait) {
|
|
70
|
+
await executeWithStream(gatewayUrl, { message, thinking, tools, agentId }, spinner);
|
|
71
|
+
} else {
|
|
72
|
+
await executeAsync(gatewayUrl, { message, thinking, tools, agentId }, spinner);
|
|
73
|
+
}
|
|
74
|
+
} catch (error) {
|
|
75
|
+
spinner.stop("Error");
|
|
76
|
+
console.log(`❌ ${(error as Error).message}`);
|
|
77
|
+
console.log(" ¿Está corriendo el Gateway? Ejecuta: hive start");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function executeWithStream(
|
|
82
|
+
gatewayUrl: string,
|
|
83
|
+
payload: { message: string; thinking: string; tools: string; agentId: string },
|
|
84
|
+
spinner: ReturnType<typeof p.spinner>
|
|
85
|
+
): Promise<void> {
|
|
86
|
+
const response = await fetch(`${gatewayUrl}/api/agent/execute`, {
|
|
87
|
+
method: "POST",
|
|
88
|
+
headers: { "Content-Type": "application/json" },
|
|
89
|
+
body: JSON.stringify({ ...payload, stream: true }),
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
if (!response.ok) {
|
|
93
|
+
throw new Error(`Error: ${response.statusText}`);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
spinner.stop("Conectado");
|
|
97
|
+
|
|
98
|
+
const reader = response.body?.getReader();
|
|
99
|
+
if (!reader) {
|
|
100
|
+
throw new Error("No se pudo obtener el stream");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const decoder = new TextDecoder();
|
|
104
|
+
let buffer = "";
|
|
105
|
+
let thinking = true;
|
|
106
|
+
|
|
107
|
+
process.stdout.write("\n");
|
|
108
|
+
|
|
109
|
+
while (true) {
|
|
110
|
+
const { done, value } = await reader.read();
|
|
111
|
+
if (done) break;
|
|
112
|
+
|
|
113
|
+
buffer += decoder.decode(value, { stream: true });
|
|
114
|
+
const lines = buffer.split("\n");
|
|
115
|
+
buffer = lines.pop() ?? "";
|
|
116
|
+
|
|
117
|
+
for (const line of lines) {
|
|
118
|
+
if (!line.trim() || !line.startsWith("data: ")) continue;
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
const data = JSON.parse(line.slice(6));
|
|
122
|
+
|
|
123
|
+
if (data.type === "thinking" && thinking) {
|
|
124
|
+
process.stdout.write(".");
|
|
125
|
+
} else if (data.type === "response") {
|
|
126
|
+
if (thinking) {
|
|
127
|
+
process.stdout.write("\n\n");
|
|
128
|
+
thinking = false;
|
|
129
|
+
}
|
|
130
|
+
process.stdout.write(data.content ?? "");
|
|
131
|
+
} else if (data.type === "tool_call") {
|
|
132
|
+
process.stdout.write(`\n[Tool: ${data.toolName}]`);
|
|
133
|
+
} else if (data.type === "complete") {
|
|
134
|
+
process.stdout.write("\n\n");
|
|
135
|
+
}
|
|
136
|
+
} catch {
|
|
137
|
+
// Ignore parse errors
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async function executeAsync(
|
|
144
|
+
gatewayUrl: string,
|
|
145
|
+
payload: { message: string; thinking: string; tools: string; agentId: string },
|
|
146
|
+
spinner: ReturnType<typeof p.spinner>
|
|
147
|
+
): Promise<void> {
|
|
148
|
+
const response = await fetch(`${gatewayUrl}/api/agent/execute`, {
|
|
149
|
+
method: "POST",
|
|
150
|
+
headers: { "Content-Type": "application/json" },
|
|
151
|
+
body: JSON.stringify({ ...payload, stream: false }),
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
if (!response.ok) {
|
|
155
|
+
throw new Error(`Error: ${response.statusText}`);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const result = await response.json() as { taskId?: string; success: boolean };
|
|
159
|
+
|
|
160
|
+
spinner.stop("Enviado");
|
|
161
|
+
|
|
162
|
+
if (result.taskId) {
|
|
163
|
+
console.log(`✓ Tarea enviada: ${result.taskId}`);
|
|
164
|
+
console.log(" Usa `hive tasks list` para ver el estado");
|
|
165
|
+
} else {
|
|
166
|
+
console.log("✓ Tarea enviada");
|
|
167
|
+
}
|
|
168
|
+
}
|