@johpaz/hive-sdk 0.1.4 → 0.1.5
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/CHANGELOG.md +97 -0
- package/README.md +78 -23
- package/bunfig.toml +4 -2
- package/docs/API-AGENTS.md +78 -27
- package/docs/API-CONTEXT-COMPILER.md +31 -34
- package/docs/API-TOOLS-SKILLS-CHANNELS.md +58 -22
- package/docs/HIVE-HARNESS.md +1 -1
- package/docs/INDEX.md +4 -4
- package/docs/TEMPLATE-HIVE-APP.md +10 -10
- package/package.json +9 -4
- package/packages/cli/package.json +2 -2
- package/packages/cli/src/commands/create-app.test.ts +36 -7
- package/packages/cli/src/commands/init.ts +3 -3
- package/packages/cli/src/commands/run.ts +1 -1
- package/packages/cli/src/commands/test.ts +37 -25
- package/packages/cli/src/commands/trace.ts +30 -28
- package/packages/cli/templates/hive-app/.env.example +10 -2
- package/packages/cli/templates/hive-app/README.md +103 -0
- package/packages/cli/templates/hive-app/hive.config.ts +9 -3
- package/packages/cli/templates/hive-app/src/agents/coordinator.ts +8 -1
- package/packages/cli/templates/hive-app/src/main.ts +12 -19
- package/packages/core/package.json +5 -4
- package/packages/core/src/agent/acceptance-checks.ts +166 -0
- package/packages/core/src/agent/agent-catalog.ts +348 -0
- package/packages/core/src/agent/agent-loop.ts +1373 -0
- package/packages/core/src/agent/capability-search.ts +186 -0
- package/packages/core/src/agent/catalog-selector.ts +103 -0
- package/packages/core/src/agent/{Compaction.ts → compaction.ts} +86 -63
- package/packages/core/src/agent/context-compiler.ts +689 -0
- package/packages/core/src/agent/conversation-store.ts +381 -0
- package/packages/core/src/agent/curator.ts +276 -0
- package/packages/core/src/agent/delegation-runtime.ts +241 -0
- package/packages/core/src/agent/goal-runner.ts +323 -0
- package/packages/core/src/agent/index.ts +17 -12
- package/packages/core/src/agent/llm-client.ts +266 -0
- package/packages/core/src/agent/llm-providers/anthropic.ts +264 -0
- package/packages/core/src/agent/llm-providers/deepseek.ts +8 -0
- package/packages/core/src/agent/{providers → llm-providers}/gemini.ts +98 -60
- package/packages/core/src/agent/llm-providers/groq.ts +5 -0
- package/packages/core/src/agent/llm-providers/hiveagents.ts +253 -0
- package/packages/core/src/agent/{providers → llm-providers}/interface.ts +73 -13
- package/packages/core/src/agent/llm-providers/kimi.ts +8 -0
- package/packages/core/src/agent/llm-providers/minimax.ts +13 -0
- package/packages/core/src/agent/llm-providers/mistral.ts +5 -0
- package/packages/core/src/agent/llm-providers/modelscope.ts +5 -0
- package/packages/core/src/agent/llm-providers/nvidia.ts +5 -0
- package/packages/core/src/agent/{providers → llm-providers}/ollama.ts +31 -5
- package/packages/core/src/agent/llm-providers/openai-compat-base.ts +418 -0
- package/packages/core/src/agent/llm-providers/openai.ts +5 -0
- package/packages/core/src/agent/llm-providers/opencode-go.ts +9 -0
- package/packages/core/src/agent/llm-providers/openrouter.ts +5 -0
- package/packages/core/src/agent/llm-providers/qwen.ts +5 -0
- package/packages/core/src/agent/llm-providers/z-ai.ts +5 -0
- package/packages/core/src/agent/minimal-loadout.ts +47 -0
- package/packages/core/src/agent/playbook-selector.ts +119 -0
- package/packages/core/src/agent/{PromptBuilder.ts → prompt-builder.ts} +21 -22
- package/packages/core/src/{harness → agent}/proof-packet.ts +16 -21
- package/packages/core/src/agent/providers/index.ts +35 -16
- package/packages/core/src/agent/reflector.ts +320 -0
- package/packages/core/src/agent/routing-intent.ts +22 -0
- package/packages/core/src/{harness → agent}/run-epoch.ts +4 -3
- package/packages/core/src/{harness → agent}/run-store.ts +142 -81
- package/packages/core/src/agent/{Service.ts → service.ts} +37 -26
- package/packages/core/src/agent/skill-selector.ts +374 -0
- package/packages/core/src/agent/stuck-loop.ts +209 -0
- package/packages/core/src/agent/{selectors/ToolSelector.ts → tool-selector.ts} +188 -178
- package/packages/core/src/{ace/Tracer.ts → agent/tracer.ts} +37 -27
- package/packages/core/src/api/createAgent.test.ts +139 -27
- package/packages/core/src/api/createAgent.ts +232 -44
- package/packages/core/src/artifacts/store.ts +162 -0
- package/packages/core/src/canvas/canvas-manager.ts +161 -0
- package/packages/core/src/canvas/canvas.test.ts +8 -4
- package/packages/core/src/canvas/emitter.ts +131 -80
- package/packages/core/src/canvas/index.ts +1 -3
- package/packages/core/src/channels/base.ts +9 -1
- package/packages/core/src/channels/discord.ts +5 -4
- package/packages/core/src/channels/manager.ts +122 -30
- package/packages/core/src/channels/slack.ts +5 -4
- package/packages/core/src/channels/telegram.ts +36 -6
- package/packages/core/src/channels/webchat.ts +11 -10
- package/packages/core/src/channels/whatsapp.ts +23 -7
- package/packages/core/src/config/index.ts +13 -2
- package/packages/core/src/config/loader.ts +71 -29
- package/packages/core/src/ethics/EthicsGuard.test.ts +90 -36
- package/packages/core/src/ethics/EthicsGuard.ts +51 -47
- package/packages/core/src/events/agent-bus.ts +44 -68
- package/packages/core/src/events/channel-narration.ts +150 -0
- package/packages/core/src/events/narration.ts +82 -0
- package/packages/core/src/events/tool-narration.ts +62 -0
- package/packages/core/src/gateway/delegation-groups.ts +258 -0
- package/packages/core/src/{harness → gateway}/durable-queue.ts +102 -42
- package/packages/core/src/{harness → gateway}/job-store.ts +85 -48
- package/packages/core/src/gateway/lane-queue.ts +173 -0
- package/packages/core/src/gateway/notification-inbox.ts +57 -0
- package/packages/core/src/gateway/server.ts +1 -1
- package/packages/core/src/harness/index.ts +46 -27
- package/packages/core/src/index.ts +33 -27
- package/packages/core/src/mcp/hot-reload.ts +32 -23
- package/packages/core/src/mcp/index.ts +6 -3
- package/packages/core/src/mcp/singleton.ts +1 -4
- package/packages/core/src/mcp/tool-sync.ts +138 -0
- package/packages/core/src/memory/Scratchpad.test.ts +39 -20
- package/packages/core/src/memory/Scratchpad.ts +27 -34
- package/packages/core/src/multimodal/vision-service.ts +44 -38
- package/packages/core/src/resilience/retry.ts +95 -0
- package/packages/core/src/scheduler/CronScheduler.ts +334 -287
- package/packages/core/src/scheduler/index.ts +9 -7
- package/packages/core/src/scheduler/integration.ts +46 -26
- package/packages/core/src/scheduler/scheduler.test.ts +9 -13
- package/packages/core/src/scheduler/types.ts +7 -2
- package/packages/core/src/security/Pairing.ts +1 -1
- package/packages/core/src/skills/bundled/a2ui/a2ui_dashboard/SKILL.md +176 -0
- package/packages/core/src/skills/bundled/a2ui/a2ui_form/SKILL.md +202 -0
- package/packages/core/src/skills/bundled/a2ui/a2ui_interactive/SKILL.md +206 -0
- package/packages/core/src/skills/bundled/agents/agent_spawner/SKILL.md +173 -0
- package/packages/core/src/skills/bundled/agents/memory_manager/SKILL.md +143 -0
- package/packages/core/src/skills/bundled/agents/research_and_remember/SKILL.md +139 -0
- package/packages/core/src/skills/bundled/agents/task_orchestrator/SKILL.md +98 -0
- package/packages/core/src/skills/bundled/api/api_client/SKILL.md +132 -0
- package/packages/core/src/skills/bundled/cli/cli_pipeline/SKILL.md +135 -0
- package/packages/core/src/skills/bundled/cli/cli_safe_exec/SKILL.md +125 -0
- package/packages/core/src/skills/bundled/cli/software_engineering/SKILL.md +23 -0
- package/packages/core/src/skills/bundled/cron_manager/SKILL.md +188 -0
- package/packages/core/src/skills/bundled/cron_reminder/SKILL.md +112 -0
- package/packages/core/src/skills/bundled/filesystem/file_manager/SKILL.md +118 -0
- package/packages/core/src/skills/bundled/filesystem/file_read_and_summarize/SKILL.md +109 -0
- package/packages/core/src/skills/bundled/filesystem/file_writer/SKILL.md +129 -0
- package/packages/core/src/skills/bundled/filesystem/workspace_file_operator/SKILL.md +22 -0
- package/packages/core/src/skills/bundled/office/office_document_manager/SKILL.md +262 -0
- package/packages/core/src/skills/bundled/search_knowledge/capability_discovery/SKILL.md +75 -0
- package/packages/core/src/skills/bundled/web/browser_automate/SKILL.md +120 -0
- package/packages/core/src/skills/bundled/web/browser_scrape/SKILL.md +109 -0
- package/packages/core/src/skills/bundled/web/web_monitor/SKILL.md +127 -0
- package/packages/core/src/skills/bundled/web/web_research/SKILL.md +119 -0
- package/packages/core/src/skills/bundled-data.generated.ts +731 -2678
- package/packages/core/src/skills/skills.test.ts +52 -11
- package/packages/core/src/{harness → storage}/boot-id.ts +5 -2
- package/packages/core/src/storage/bootstrap.ts +151 -0
- package/packages/core/src/storage/causal-events.ts +84 -0
- package/packages/core/src/storage/collections.ts +680 -0
- package/packages/core/src/storage/crypto.ts +205 -74
- package/packages/core/src/{harness/db-helpers.ts → storage/hive.ts} +63 -7
- package/packages/core/src/storage/hivedb.ts +61 -0
- package/packages/core/src/storage/index.ts +111 -18
- package/packages/core/src/storage/model-id.ts +53 -0
- package/packages/core/src/storage/onboarding.ts +540 -972
- package/packages/core/src/storage/reconcile.ts +238 -0
- package/packages/core/src/storage/seed.ts +572 -406
- package/packages/core/src/storage/usage.ts +285 -225
- package/packages/core/src/storage/user-email.ts +11 -0
- package/packages/core/src/swarm/AgentExecutor.ts +1 -1
- package/packages/core/src/swarm/EventBridge.ts +1 -1
- package/packages/core/src/swarm/index.ts +12 -9
- package/packages/core/src/tool-runtime/index.ts +146 -23
- package/packages/core/src/tool-runtime/tool-worker.ts +2 -2
- package/packages/core/src/tool-runtime/worker-tools.ts +27 -0
- package/packages/core/src/{canvas/a2ui-tools.ts → tools/a2ui/index.ts} +17 -8
- package/packages/core/src/tools/agents/get-available-models.ts +36 -54
- package/packages/core/src/tools/agents/index.ts +784 -292
- package/packages/core/src/tools/api/api-request.test.ts +164 -0
- package/packages/core/src/tools/api/api-request.ts +174 -0
- package/packages/core/src/tools/api/index.ts +16 -0
- package/packages/core/src/tools/cli/index.ts +4 -0
- package/packages/core/src/tools/core/index.ts +281 -112
- package/packages/core/src/tools/cron/index.ts +121 -124
- package/packages/core/src/tools/index.ts +63 -78
- package/packages/core/src/tools/office/office-escribir-xlsx.ts +3 -1
- package/packages/core/src/tools/types.ts +3 -1
- package/packages/core/src/tools/web/artifact-inspect.ts +23 -0
- package/packages/core/src/tools/web/browser-screenshot.ts +26 -5
- package/packages/core/src/tools/web/browser-service.ts +5 -0
- package/packages/core/src/tools/web/browser-type.ts +3 -8
- package/packages/core/src/tools/web/index.ts +4 -4
- package/packages/core/src/voice/index.ts +89 -63
- package/packages/core/src/workers/agent.worker.ts +2 -2
- package/packages/core/src/workers/workers.test.ts +3 -10
- package/scripts/bump-version.ts +248 -0
- package/scripts/generate-skill-bundle.ts +108 -0
- package/test/agent-loop-terminal-synthesis.test.ts +32 -0
- package/test/catalog-agents-stay-enabled.test.ts +117 -0
- package/test/causal-events.test.ts +117 -0
- package/test/compaction.test.ts +105 -0
- package/test/context-compiler.test.ts +269 -0
- package/test/curator.test.ts +130 -0
- package/test/durable-queue.test.ts +114 -0
- package/test/harness-barrel.test.ts +64 -0
- package/test/hive-helpers.test.ts +130 -0
- package/test/hivedb-search.test.ts +189 -0
- package/test/internal-turns.test.ts +166 -0
- package/test/job-idempotency.test.ts +68 -0
- package/test/job-retry-backoff.test.ts +184 -0
- package/test/job-store.test.ts +381 -0
- package/test/llm-retry.test.ts +97 -0
- package/test/memory-perf.test.ts +774 -0
- package/test/minimal-loadout.test.ts +78 -0
- package/test/model-catalog.test.ts +105 -0
- package/test/preload.ts +12 -0
- package/test/reflector.test.ts +320 -0
- package/test/retention-cap.test.ts +91 -0
- package/test/retired-capabilities-pruned.test.ts +192 -0
- package/test/run-store.test.ts +355 -0
- package/test/scratchpad.test.ts +74 -0
- package/test/secrets-durability.test.ts +119 -0
- package/test/seed-model-reseed.test.ts +155 -0
- package/test/setup-agent-seed.test.ts +264 -0
- package/test/tool-inventory.test.ts +65 -0
- package/test/tool-runtime.test.ts +258 -0
- package/test/toon.test.ts +429 -0
- package/tsconfig.json +2 -0
- package/packages/core/src/ace/Curator.ts +0 -158
- package/packages/core/src/ace/Reflector.ts +0 -200
- package/packages/core/src/ace/index.ts +0 -4
- package/packages/core/src/agent/AgentRunner.ts +0 -711
- package/packages/core/src/agent/ContextCompiler.ts +0 -567
- package/packages/core/src/agent/ContextGuard.ts +0 -91
- package/packages/core/src/agent/ConversationStore.ts +0 -254
- package/packages/core/src/agent/Hooks.ts +0 -166
- package/packages/core/src/agent/StuckLoop.ts +0 -133
- package/packages/core/src/agent/providers/LLMClient.ts +0 -149
- package/packages/core/src/agent/providers/anthropic.ts +0 -212
- package/packages/core/src/agent/providers/openai-compat.ts +0 -231
- package/packages/core/src/agent/selectors/PlaybookSelector.ts +0 -121
- package/packages/core/src/agent/selectors/SkillSelector.ts +0 -322
- package/packages/core/src/agent/selectors/index.ts +0 -6
- package/packages/core/src/auth/auth.ts +0 -121
- package/packages/core/src/auth/index.ts +0 -1
- package/packages/core/src/canvas/CanvasManager.ts +0 -390
- package/packages/core/src/canvas/canvas-tools.ts +0 -448
- package/packages/core/src/harness/collections.ts +0 -98
- package/packages/core/src/harness/goal-verifier.ts +0 -141
- package/packages/core/src/harness/harness.test.ts +0 -236
- package/packages/core/src/harness/reconcile.ts +0 -149
- package/packages/core/src/mcp/MCPToolAdapter.ts +0 -176
- package/packages/core/src/multimodal/VisionService.ts +0 -293
- package/packages/core/src/scheduler/dag/AgentExecutor.ts +0 -53
- package/packages/core/src/scheduler/dag/DAGScheduler.ts +0 -250
- package/packages/core/src/scheduler/dag/EventBridge.ts +0 -122
- package/packages/core/src/scheduler/dag/TaskGraph.ts +0 -192
- package/packages/core/src/scheduler/dag/TaskNode.ts +0 -97
- package/packages/core/src/scheduler/dag/TaskResult.ts +0 -22
- package/packages/core/src/scheduler/dag/errors.ts +0 -37
- package/packages/core/src/scheduler/dag/index.ts +0 -26
- package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +0 -97
- package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +0 -21
- package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +0 -46
- package/packages/core/src/storage/HiveDBStorage.ts +0 -64
- package/packages/core/src/storage/SQLiteStorage.ts +0 -414
- package/packages/core/src/storage/hiveSeed.ts +0 -308
- package/packages/core/src/storage/hiveStorage.test.ts +0 -38
- package/packages/core/src/storage/schema.ts +0 -689
- package/packages/core/src/storage/storage.test.ts +0 -37
- package/packages/core/src/swarm/AgentBus.ts +0 -460
- package/packages/core/src/swarm/EventBus.ts +0 -169
- package/packages/core/src/swarm/WorkerPool.ts +0 -236
- package/packages/core/src/tools/bridge-events.ts +0 -26
- package/packages/core/src/tools/canvas/index.ts +0 -375
- package/packages/core/src/tools/codebridge/index.ts +0 -342
- package/packages/core/src/tools/meeting/index.ts +0 -353
- 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/voice/index.ts +0 -104
- package/packages/core/src/tools/web/api-request.test.ts +0 -170
- package/packages/core/src/tools/web/api-request.ts +0 -239
- package/test/setup-db.ts +0 -216
- /package/packages/core/src/agent/{NativeTools.ts → native-tools.ts} +0 -0
package/docs/HIVE-HARNESS.md
CHANGED
|
@@ -7,7 +7,7 @@ packets. It's what lets a host app (a `hive-app`, or a production service like
|
|
|
7
7
|
Hive Cloud) survive a process restart mid-task without losing work or
|
|
8
8
|
double-executing a tool call.
|
|
9
9
|
|
|
10
|
-
It is deliberately **not** wired into
|
|
10
|
+
It is deliberately **not** wired into the agent loop automatically, and it has
|
|
11
11
|
no built-in notion of "chat" vs "project task" vs any other app-specific job
|
|
12
12
|
type — job `type` and run `kind` are plain strings. The host app defines its
|
|
13
13
|
own vocabulary and registers executors for it. This is the same infrastructure
|
package/docs/INDEX.md
CHANGED
|
@@ -41,7 +41,7 @@ const tool = defineTool({
|
|
|
41
41
|
const agent = await createAgent({
|
|
42
42
|
name: "asistente",
|
|
43
43
|
provider: "openai",
|
|
44
|
-
model: "gpt-
|
|
44
|
+
model: "gpt-5.6-luna",
|
|
45
45
|
tools: [tool],
|
|
46
46
|
});
|
|
47
47
|
|
|
@@ -97,7 +97,7 @@ packages/
|
|
|
97
97
|
│ ├── api/ # createAgent(), Agent interface
|
|
98
98
|
│ ├── agent/ # AgentLoop, ContextCompiler, ConversationStore
|
|
99
99
|
│ │ ├── providers/ # LLM providers (OpenAI, Anthropic, Gemini, Ollama)
|
|
100
|
-
│ │ └──
|
|
100
|
+
│ │ └── tool-selector.ts, skill-selector.ts, playbook-selector.ts (BM25 sobre HiveDB)
|
|
101
101
|
│ ├── tools/ # 70+ built-in tools + ToolRegistry + ToolExecutor
|
|
102
102
|
│ ├── skills/ # SkillLoader, defineSkill()
|
|
103
103
|
│ ├── swarm/ # DAGScheduler, TaskGraph, WorkerPool
|
|
@@ -105,7 +105,7 @@ packages/
|
|
|
105
105
|
│ ├── gateway/ # HTTP/WebSocket server (Bun.serve)
|
|
106
106
|
│ ├── channels/ # Telegram, Discord, WhatsApp, Slack, Webchat
|
|
107
107
|
│ ├── mcp/ # MCPClientManager + transports (SSE, WS, STDIO)
|
|
108
|
-
│ ├── storage/ #
|
|
108
|
+
│ ├── storage/ # HiveDB (colecciones + BM25)
|
|
109
109
|
│ ├── canvas/ # CanvasManager + A2UI emitter
|
|
110
110
|
│ ├── scheduler/ # CronScheduler + DAG execution
|
|
111
111
|
│ ├── tool-runtime/ # Bun Worker pool para ejecución paralela de tools
|
|
@@ -137,7 +137,7 @@ packages/
|
|
|
137
137
|
Unidad de ejecución con configuración, contexto y ciclo de ejecución.
|
|
138
138
|
|
|
139
139
|
### Tool
|
|
140
|
-
Función invocable por el agente. Definida con `defineTool()`, seleccionada
|
|
140
|
+
Función invocable por el agente. Definida con `defineTool()`, seleccionada por búsqueda BM25.
|
|
141
141
|
|
|
142
142
|
### Skill
|
|
143
143
|
Composición de tools con triggers semánticos. Definida con `defineSkill()`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Template `hive-app` — Documentación Completa
|
|
2
2
|
|
|
3
|
-
El template `hive-app` genera una **aplicación harness completa** lista para ejecutar. Incluye gateway HTTP/WebSocket, agente coordinador, configuración de canales, base de datos
|
|
3
|
+
El template `hive-app` genera una **aplicación harness completa** lista para ejecutar. Incluye gateway HTTP/WebSocket, agente coordinador, configuración de canales, base de datos HiveDB, y deployment con Docker.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -97,7 +97,7 @@ export default {
|
|
|
97
97
|
| `channels.discord.enabled` | `boolean` | `false` | Bot de Discord |
|
|
98
98
|
| `channels.whatsapp.enabled` | `boolean` | `false` | Bot de WhatsApp |
|
|
99
99
|
| `channels.slack.enabled` | `boolean` | `false` | Bot de Slack |
|
|
100
|
-
| `database.path` | `string` | `"./data/hive
|
|
100
|
+
| `database.path` | `string` | `"./data/hive"` | Ruta de la base de datos HiveDB |
|
|
101
101
|
|
|
102
102
|
---
|
|
103
103
|
|
|
@@ -105,7 +105,7 @@ export default {
|
|
|
105
105
|
|
|
106
106
|
Entry point de la aplicación. Realiza:
|
|
107
107
|
|
|
108
|
-
1. Inicializa la base de datos (`
|
|
108
|
+
1. Inicializa la base de datos (`ensureHiveDb`, que además siembra el catálogo)
|
|
109
109
|
2. Crea el agente coordinador (`createAgent`)
|
|
110
110
|
3. Inicializa el ChannelManager
|
|
111
111
|
4. Arranca el gateway (`startGateway`)
|
|
@@ -115,7 +115,7 @@ Entry point de la aplicación. Realiza:
|
|
|
115
115
|
import {
|
|
116
116
|
createAgent,
|
|
117
117
|
startGateway,
|
|
118
|
-
|
|
118
|
+
ensureHiveDb,
|
|
119
119
|
ChannelManager,
|
|
120
120
|
logger,
|
|
121
121
|
} from "@johpaz/hive-sdk";
|
|
@@ -126,12 +126,12 @@ const log = logger.child("app");
|
|
|
126
126
|
async function main() {
|
|
127
127
|
log.info(`Starting my-hive...`);
|
|
128
128
|
|
|
129
|
-
await
|
|
129
|
+
await ensureHiveDb();
|
|
130
130
|
|
|
131
131
|
const agent = await createAgent({
|
|
132
132
|
name: "coordinator",
|
|
133
133
|
provider: "openai",
|
|
134
|
-
model: "gpt-
|
|
134
|
+
model: "gpt-5.6-luna",
|
|
135
135
|
systemPrompt: "You are a helpful AI assistant...",
|
|
136
136
|
});
|
|
137
137
|
|
|
@@ -160,7 +160,7 @@ Puedes cambiar el `provider`, `model`, y `systemPrompt`:
|
|
|
160
160
|
```typescript
|
|
161
161
|
const agent = await createAgent({
|
|
162
162
|
name: "coordinator",
|
|
163
|
-
provider: "anthropic", //
|
|
163
|
+
provider: "anthropic", // cualquiera de los 16 del catálogo
|
|
164
164
|
model: "claude-3-5-sonnet-20241022",
|
|
165
165
|
systemPrompt: "Tu system prompt personalizado...",
|
|
166
166
|
});
|
|
@@ -183,7 +183,7 @@ const searchTool = defineTool({
|
|
|
183
183
|
const agent = await createAgent({
|
|
184
184
|
name: "coordinator",
|
|
185
185
|
provider: "openai",
|
|
186
|
-
model: "gpt-
|
|
186
|
+
model: "gpt-5.6-luna",
|
|
187
187
|
tools: [searchTool],
|
|
188
188
|
});
|
|
189
189
|
```
|
|
@@ -200,7 +200,7 @@ import { createAgent } from "@johpaz/hive-sdk";
|
|
|
200
200
|
export const coordinatorAgent = await createAgent({
|
|
201
201
|
name: "coordinator",
|
|
202
202
|
provider: "openai",
|
|
203
|
-
model: "gpt-
|
|
203
|
+
model: "gpt-5.6-luna",
|
|
204
204
|
systemPrompt: "You are the coordinator agent...",
|
|
205
205
|
});
|
|
206
206
|
```
|
|
@@ -278,7 +278,7 @@ LOG_LEVEL=info
|
|
|
278
278
|
|----------|-----------|-------------|
|
|
279
279
|
| `HIVE_HOST` | No | Host del gateway |
|
|
280
280
|
| `HIVE_PORT` | No | Puerto del gateway |
|
|
281
|
-
| `
|
|
281
|
+
| `HIVE_HOME` | No | Directorio de datos (HiveDB en `<HIVE_HOME>/data`) |
|
|
282
282
|
| `OPENAI_API_KEY` | Sí* | API key de OpenAI |
|
|
283
283
|
| `ANTHROPIC_API_KEY` | Sí* | API key de Anthropic |
|
|
284
284
|
| `GOOGLE_API_KEY` | Sí* | API key de Gemini |
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@johpaz/hive-sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
|
+
"private": false,
|
|
4
5
|
"description": "Hive SDK — The Agent Harness SDK. Build, deploy, and scale AI agent applications with multi-channel support, context engineering, and swarm orchestration.",
|
|
5
6
|
"license": "MIT",
|
|
6
7
|
"homepage": "https://github.com/johpaz/hive-sdk#readme",
|
|
@@ -31,14 +32,15 @@
|
|
|
31
32
|
".": "./packages/core/src/index.ts",
|
|
32
33
|
"./agent": "./packages/core/src/agent/index.ts",
|
|
33
34
|
"./agent/providers": "./packages/core/src/agent/providers/index.ts",
|
|
34
|
-
"./agent/selectors": "./packages/core/src/agent/selectors/index.ts",
|
|
35
35
|
"./tools": "./packages/core/src/tools/index.ts",
|
|
36
36
|
"./skills": "./packages/core/src/skills/index.ts",
|
|
37
37
|
"./storage": "./packages/core/src/storage/index.ts",
|
|
38
38
|
"./swarm": "./packages/core/src/swarm/index.ts",
|
|
39
39
|
"./swarm/strategies": "./packages/core/src/swarm/strategies/index.ts",
|
|
40
40
|
"./swarm/presets": "./packages/core/src/swarm/presets/index.ts",
|
|
41
|
-
"./
|
|
41
|
+
"./scheduler": "./packages/core/src/scheduler/index.ts",
|
|
42
|
+
"./workers": "./packages/core/src/workers/index.ts",
|
|
43
|
+
"./events": "./packages/core/src/events/event-bus.ts",
|
|
42
44
|
"./ethics": "./packages/core/src/ethics/index.ts",
|
|
43
45
|
"./canvas": "./packages/core/src/canvas/index.ts",
|
|
44
46
|
"./config": "./packages/core/src/config/index.ts",
|
|
@@ -63,8 +65,11 @@
|
|
|
63
65
|
],
|
|
64
66
|
"scripts": {
|
|
65
67
|
"build": "bun run typecheck",
|
|
66
|
-
"typecheck": "tsc --
|
|
68
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
67
69
|
"test": "bun test",
|
|
70
|
+
"skills:bundle": "bun scripts/generate-skill-bundle.ts",
|
|
71
|
+
"version:set": "bun scripts/bump-version.ts",
|
|
72
|
+
"release": "bun scripts/bump-version.ts --push",
|
|
68
73
|
"prepublish": "echo 'No build needed - Bun runs TypeScript directly'"
|
|
69
74
|
},
|
|
70
75
|
"dependencies": {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hive/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Hive CLI — init, run, test, trace",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
|
-
"
|
|
8
|
+
"hives": "./src/index.ts"
|
|
9
9
|
},
|
|
10
10
|
"main": "./src/index.ts",
|
|
11
11
|
"exports": {
|
|
@@ -31,10 +31,24 @@ describe("hive create-app", () => {
|
|
|
31
31
|
expect(existsSync(join(TEST_DIR, "docker-compose.yml"))).toBe(true);
|
|
32
32
|
expect(existsSync(join(TEST_DIR, ".env.example"))).toBe(true);
|
|
33
33
|
expect(existsSync(join(TEST_DIR, ".gitignore"))).toBe(true);
|
|
34
|
+
// Sin README el que corre `hives create-app` queda sin una sola instrucción.
|
|
35
|
+
expect(existsSync(join(TEST_DIR, "README.md"))).toBe(true);
|
|
34
36
|
expect(existsSync(join(TEST_DIR, "src", "main.ts"))).toBe(true);
|
|
35
37
|
expect(existsSync(join(TEST_DIR, "src", "agents", "coordinator.ts"))).toBe(true);
|
|
36
38
|
});
|
|
37
39
|
|
|
40
|
+
it("el README del scaffold lleva el nombre de la app y arranca con los pasos", async () => {
|
|
41
|
+
const { copyTemplate } = await import("./create-app-utils.ts");
|
|
42
|
+
|
|
43
|
+
copyTemplate(TEST_DIR, { "{{APP_NAME}}": "mi-app" });
|
|
44
|
+
|
|
45
|
+
const readme = readFileSync(join(TEST_DIR, "README.md"), "utf-8");
|
|
46
|
+
expect(readme).toContain("# mi-app");
|
|
47
|
+
expect(readme).not.toContain("{{APP_NAME}}");
|
|
48
|
+
expect(readme).toContain("bun install");
|
|
49
|
+
expect(readme).toContain("bun run dev");
|
|
50
|
+
});
|
|
51
|
+
|
|
38
52
|
it("replaces {{APP_NAME}} placeholder in all files", async () => {
|
|
39
53
|
const { copyTemplate } = await import("./create-app-utils.ts");
|
|
40
54
|
|
|
@@ -43,8 +57,10 @@ describe("hive create-app", () => {
|
|
|
43
57
|
const packageJson = readFileSync(join(TEST_DIR, "package.json"), "utf-8");
|
|
44
58
|
expect(packageJson).toContain('"name": "my-awesome-app"');
|
|
45
59
|
|
|
60
|
+
// `Config` no tiene una clave `name`, así que el nombre de la app sólo se
|
|
61
|
+
// sustituye en el comentario de cabecera y en package.json.
|
|
46
62
|
const config = readFileSync(join(TEST_DIR, "hive.config.ts"), "utf-8");
|
|
47
|
-
expect(config).toContain(
|
|
63
|
+
expect(config).toContain("my-awesome-app");
|
|
48
64
|
|
|
49
65
|
const main = readFileSync(join(TEST_DIR, "src", "main.ts"), "utf-8");
|
|
50
66
|
expect(main).toContain("Starting my-awesome-app...");
|
|
@@ -80,7 +96,11 @@ describe("hive create-app", () => {
|
|
|
80
96
|
expect(config).toContain("discord: { enabled: false }");
|
|
81
97
|
expect(config).toContain("whatsapp: { enabled: false }");
|
|
82
98
|
expect(config).toContain("slack: { enabled: false }");
|
|
83
|
-
|
|
99
|
+
// HiveDB no se configura por `hive.config.ts`: la ruta sale de HIVE_HOME /
|
|
100
|
+
// HIVE_DB_PATH. Una clave `database` acá rompería el `satisfies Config`.
|
|
101
|
+
expect(config).not.toContain("database:");
|
|
102
|
+
expect(config).not.toContain("hive.db");
|
|
103
|
+
expect(config).toContain("satisfies Config");
|
|
84
104
|
});
|
|
85
105
|
|
|
86
106
|
it("generates main.ts with all required imports", async () => {
|
|
@@ -91,15 +111,21 @@ describe("hive create-app", () => {
|
|
|
91
111
|
const main = readFileSync(join(TEST_DIR, "src", "main.ts"), "utf-8");
|
|
92
112
|
|
|
93
113
|
expect(main).toContain('from "@johpaz/hive-sdk"');
|
|
94
|
-
expect(main).toContain("createAgent");
|
|
95
114
|
expect(main).toContain("startGateway");
|
|
96
|
-
|
|
115
|
+
// `initializeDatabase()` desapareció con la capa SQLite: `ensureHiveDb()`
|
|
116
|
+
// abre HiveDB, crea los índices y siembra el catálogo en un solo paso.
|
|
117
|
+
expect(main).toContain("ensureHiveDb");
|
|
118
|
+
expect(main).not.toContain("initializeDatabase");
|
|
97
119
|
expect(main).toContain("ChannelManager");
|
|
98
120
|
expect(main).toContain("logger");
|
|
99
121
|
expect(main).toContain('import config from "../hive.config.ts"');
|
|
100
|
-
expect(main).toContain("await
|
|
122
|
+
expect(main).toContain("await ensureHiveDb()");
|
|
101
123
|
expect(main).toContain('await startGateway({');
|
|
102
124
|
expect(main).toContain('process.on("SIGINT"');
|
|
125
|
+
// El coordinador se define una sola vez, en su módulo, y main.ts lo usa —
|
|
126
|
+
// antes el template creaba uno propio y dejaba coordinator.ts huérfano.
|
|
127
|
+
expect(main).toContain('from "./agents/coordinator.ts"');
|
|
128
|
+
expect(main).toContain("agentId: coordinatorAgent.id");
|
|
103
129
|
});
|
|
104
130
|
|
|
105
131
|
it("generates coordinator agent with correct config", async () => {
|
|
@@ -112,7 +138,10 @@ describe("hive create-app", () => {
|
|
|
112
138
|
expect(agent).toContain('import { createAgent } from "@johpaz/hive-sdk"');
|
|
113
139
|
expect(agent).toContain('name: "coordinator"');
|
|
114
140
|
expect(agent).toContain('provider: "openai"');
|
|
115
|
-
|
|
141
|
+
// El modelo del scaffold tiene que existir en SEED_DATA.models, o el primer
|
|
142
|
+
// `bun run dev` de un usuario nuevo muere con "no está en el catálogo".
|
|
143
|
+
expect(agent).toContain('model: "gpt-5.6-luna"');
|
|
144
|
+
expect(agent).toContain("export const coordinatorAgent");
|
|
116
145
|
});
|
|
117
146
|
|
|
118
147
|
it("generates docker-compose.yml with correct ports", async () => {
|
|
@@ -139,7 +168,7 @@ describe("hive create-app", () => {
|
|
|
139
168
|
|
|
140
169
|
expect(env).toContain("HIVE_HOST=");
|
|
141
170
|
expect(env).toContain("HIVE_PORT=");
|
|
142
|
-
expect(env).toContain("
|
|
171
|
+
expect(env).toContain("HIVE_HOME=");
|
|
143
172
|
expect(env).toContain("OPENAI_API_KEY=");
|
|
144
173
|
expect(env).toContain("ANTHROPIC_API_KEY=");
|
|
145
174
|
expect(env).toContain("GOOGLE_API_KEY=");
|
|
@@ -9,12 +9,12 @@ const HIVE_CONFIG = `{
|
|
|
9
9
|
"version": "0.1.0",
|
|
10
10
|
"type": "module",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@hive
|
|
12
|
+
"@johpaz/hive-sdk": "latest"
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
`;
|
|
16
16
|
|
|
17
|
-
const HIVE_AGENT_TS = `import { createAgent, defineTool } from "@hive
|
|
17
|
+
const HIVE_AGENT_TS = `import { createAgent, defineTool } from "@johpaz/hive-sdk";
|
|
18
18
|
|
|
19
19
|
const myTool = defineTool({
|
|
20
20
|
name: "hello",
|
|
@@ -26,7 +26,7 @@ const myTool = defineTool({
|
|
|
26
26
|
|
|
27
27
|
const agent = await createAgent({
|
|
28
28
|
name: "my-agent",
|
|
29
|
-
model: "gpt-
|
|
29
|
+
model: "gpt-5.6-luna",
|
|
30
30
|
provider: "openai",
|
|
31
31
|
tools: [myTool],
|
|
32
32
|
});
|
|
@@ -10,7 +10,7 @@ async function runCommand() {
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
console.log(`Running agent from ${agentFile}...`);
|
|
13
|
-
const { createAgent } = await import("@hive
|
|
13
|
+
const { createAgent } = await import("@johpaz/hive-sdk");
|
|
14
14
|
const agentModule = await import(agentFile);
|
|
15
15
|
|
|
16
16
|
if (agentModule.agent) {
|
|
@@ -1,42 +1,54 @@
|
|
|
1
1
|
export {};
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `hives test` — corre los tests del proyecto del usuario.
|
|
5
|
+
*
|
|
6
|
+
* Antes hacía glob sobre `packages/core/src/**` — rutas del repo del SDK, no del
|
|
7
|
+
* proyecto donde se ejecuta el comando, así que en la práctica no encontraba
|
|
8
|
+
* nada. Ahora busca en `src/` y `test(s)/` del cwd.
|
|
9
|
+
*/
|
|
2
10
|
async function testCommand() {
|
|
3
11
|
const filter = process.argv[3];
|
|
4
12
|
|
|
5
13
|
console.log("Hive Test Runner\n");
|
|
6
14
|
|
|
7
|
-
const {
|
|
8
|
-
await
|
|
15
|
+
const { ensureHiveDb } = await import("@johpaz/hive-sdk");
|
|
16
|
+
await ensureHiveDb();
|
|
9
17
|
|
|
10
18
|
const { Glob } = await import("bun");
|
|
11
|
-
const
|
|
12
|
-
|
|
19
|
+
const patterns = ["src/**/*.{test,spec}.ts", "test/**/*.{test,spec}.ts", "tests/**/*.{test,spec}.ts"];
|
|
20
|
+
|
|
21
|
+
const seen = new Set<string>();
|
|
22
|
+
for (const pattern of patterns) {
|
|
23
|
+
for (const file of new Glob(pattern).scanSync({ cwd: process.cwd(), absolute: true })) {
|
|
24
|
+
seen.add(file);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
13
27
|
|
|
14
|
-
const tests = filter
|
|
15
|
-
? testFiles.filter((f: string) => f.includes(filter))
|
|
16
|
-
: testFiles;
|
|
28
|
+
const tests = [...seen].filter((f) => !filter || f.includes(filter)).sort();
|
|
17
29
|
|
|
18
30
|
if (tests.length === 0) {
|
|
19
|
-
console.log("No tests found
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
let passed = 0;
|
|
23
|
-
let failed = 0;
|
|
24
|
-
|
|
25
|
-
for (const test of tests as string[]) {
|
|
26
|
-
try {
|
|
27
|
-
await import(test);
|
|
28
|
-
console.log(` ✓ ${test.split("/").pop()}`);
|
|
29
|
-
passed++;
|
|
30
|
-
} catch (err) {
|
|
31
|
-
console.error(` ✗ ${test.split("/").pop()}: ${(err as Error).message}`);
|
|
32
|
-
failed++;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
31
|
+
console.log("No tests found under src/, test/ or tests/.");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
35
34
|
|
|
36
|
-
|
|
35
|
+
console.log(`Found ${tests.length} test(s)\n`);
|
|
36
|
+
let passed = 0;
|
|
37
|
+
let failed = 0;
|
|
38
|
+
|
|
39
|
+
for (const test of tests) {
|
|
40
|
+
try {
|
|
41
|
+
await import(test);
|
|
42
|
+
console.log(` ✓ ${test.split("/").pop()}`);
|
|
43
|
+
passed++;
|
|
44
|
+
} catch (err) {
|
|
45
|
+
console.error(` ✗ ${test.split("/").pop()}: ${(err as Error).message}`);
|
|
46
|
+
failed++;
|
|
47
|
+
}
|
|
37
48
|
}
|
|
38
49
|
|
|
39
|
-
|
|
50
|
+
console.log(`\n${passed} passed, ${failed} failed`);
|
|
51
|
+
if (failed > 0) process.exitCode = 1;
|
|
40
52
|
}
|
|
41
53
|
|
|
42
54
|
testCommand();
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
export {};
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `hives trace` — últimas ejecuciones registradas por el ACE Tracer.
|
|
5
|
+
*
|
|
6
|
+
* Los traces pasaron de una tabla SQLite a la colección `traces` de HiveDB en
|
|
7
|
+
* 0.1.5, así que esto ya no es una query SQL.
|
|
8
|
+
*/
|
|
2
9
|
async function traceCommand() {
|
|
3
|
-
const {
|
|
4
|
-
const { getDb } = await import("@hive/core/storage");
|
|
10
|
+
const { ensureHiveDb, col } = await import("@johpaz/hive-sdk");
|
|
5
11
|
|
|
6
|
-
await
|
|
7
|
-
const db = getDb();
|
|
12
|
+
await ensureHiveDb();
|
|
8
13
|
|
|
9
14
|
const limit = parseInt(process.argv[3] || "20", 10);
|
|
10
15
|
|
|
@@ -12,43 +17,40 @@ async function traceCommand() {
|
|
|
12
17
|
console.log("─".repeat(80));
|
|
13
18
|
|
|
14
19
|
try {
|
|
15
|
-
const
|
|
16
|
-
.query(
|
|
17
|
-
`SELECT id, agent_id, model, tool_calls, duration_ms, tokens_used, created_at
|
|
18
|
-
FROM traces
|
|
19
|
-
ORDER BY created_at DESC
|
|
20
|
-
LIMIT ?`
|
|
21
|
-
)
|
|
22
|
-
.all(limit) as Array<{
|
|
23
|
-
id: string;
|
|
20
|
+
const tracesCol = await col<{
|
|
24
21
|
agent_id: string;
|
|
25
22
|
model: string;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
provider?: string;
|
|
24
|
+
tool_calls?: string | null;
|
|
25
|
+
duration_ms?: number;
|
|
26
|
+
tokens_used?: number;
|
|
27
|
+
created_at: number;
|
|
28
|
+
}>("traces");
|
|
29
|
+
|
|
30
|
+
const rows = (await tracesCol.scan({}))
|
|
31
|
+
.sort((a, b) => b.doc.created_at - a.doc.created_at)
|
|
32
|
+
.slice(0, limit);
|
|
31
33
|
|
|
32
34
|
if (rows.length === 0) {
|
|
33
|
-
console.log("No traces found.");
|
|
35
|
+
console.log("No traces found (run the agent first).");
|
|
34
36
|
return;
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
for (const row of rows) {
|
|
38
40
|
console.log(`ID: ${row.id}`);
|
|
39
|
-
console.log(`Agent: ${row.agent_id}`);
|
|
40
|
-
console.log(`Model: ${row.model}`);
|
|
41
|
-
console.log(`Duration: ${row.duration_ms}ms`);
|
|
42
|
-
console.log(`Tokens: ${row.tokens_used}`);
|
|
43
|
-
console.log(`Time: ${row.created_at}`);
|
|
44
|
-
if (row.tool_calls) {
|
|
45
|
-
const tools = JSON.parse(row.tool_calls);
|
|
46
|
-
console.log(`Tools: ${Array.isArray(tools) ? tools.join(", ") : row.tool_calls}`);
|
|
41
|
+
console.log(`Agent: ${row.doc.agent_id}`);
|
|
42
|
+
console.log(`Model: ${row.doc.provider ? `${row.doc.provider}/` : ""}${row.doc.model}`);
|
|
43
|
+
console.log(`Duration: ${row.doc.duration_ms ?? 0}ms`);
|
|
44
|
+
console.log(`Tokens: ${row.doc.tokens_used ?? 0}`);
|
|
45
|
+
console.log(`Time: ${new Date(row.doc.created_at).toISOString()}`);
|
|
46
|
+
if (row.doc.tool_calls) {
|
|
47
|
+
const tools = JSON.parse(row.doc.tool_calls);
|
|
48
|
+
console.log(`Tools: ${Array.isArray(tools) ? tools.join(", ") : row.doc.tool_calls}`);
|
|
47
49
|
}
|
|
48
50
|
console.log("─".repeat(80));
|
|
49
51
|
}
|
|
50
52
|
} catch (err) {
|
|
51
|
-
console.
|
|
53
|
+
console.error(`No se pudieron leer los traces: ${(err as Error).message}`);
|
|
52
54
|
}
|
|
53
55
|
}
|
|
54
56
|
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
# Hive Harness Configuration
|
|
2
2
|
HIVE_HOST=127.0.0.1
|
|
3
3
|
HIVE_PORT=18790
|
|
4
|
-
HIVE_DATA_DIR=./data
|
|
5
4
|
|
|
6
|
-
#
|
|
5
|
+
# Directorio de datos. HiveDB vive en <HIVE_HOME>/data.
|
|
6
|
+
HIVE_HOME=./.hive
|
|
7
|
+
# Ruta explícita de la base (opcional). ":memory:" para una base efímera.
|
|
8
|
+
# HIVE_DB_PATH=
|
|
9
|
+
|
|
10
|
+
# LLM Providers — <PROVIDER>_API_KEY, en mayúsculas y con el id del provider.
|
|
11
|
+
# La clave también se puede cargar cifrada en la base desde la app.
|
|
7
12
|
OPENAI_API_KEY=sk-...
|
|
8
13
|
ANTHROPIC_API_KEY=sk-ant-...
|
|
9
14
|
GOOGLE_API_KEY=...
|
|
15
|
+
# MODELSCOPE_API_KEY=ms-...
|
|
16
|
+
# NVIDIA_API_KEY=nvapi-...
|
|
17
|
+
# OPENROUTER_API_KEY=sk-or-...
|
|
10
18
|
|
|
11
19
|
# Channels (enable as needed)
|
|
12
20
|
TELEGRAM_BOT_TOKEN=
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# {{APP_NAME}}
|
|
2
|
+
|
|
3
|
+
Aplicación de agentes construida sobre [`@johpaz/hive-sdk`](https://www.npmjs.com/package/@johpaz/hive-sdk).
|
|
4
|
+
|
|
5
|
+
## Arrancar
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
bun install
|
|
9
|
+
cp .env.example .env # cargá al menos una API key
|
|
10
|
+
bun run dev
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
El gateway queda en `http://127.0.0.1:18790`. Probalo:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
curl -X POST http://127.0.0.1:18790/chat \
|
|
17
|
+
-H "Content-Type: application/json" \
|
|
18
|
+
-d '{"message":"Hola","threadId":"t1"}'
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Estructura
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
src/
|
|
25
|
+
main.ts # arranque: base de datos, canales y gateway
|
|
26
|
+
agents/coordinator.ts # el agente principal
|
|
27
|
+
hive.config.ts # gateway, canales y logging
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
`main.ts` llama a `ensureHiveDb()`, que abre HiveDB, crea los índices y siembra
|
|
31
|
+
el catálogo de providers y modelos. Es idempotente: correrlo en cada arranque es
|
|
32
|
+
justamente cómo se actualiza el catálogo.
|
|
33
|
+
|
|
34
|
+
## Cambiar de modelo
|
|
35
|
+
|
|
36
|
+
En `src/agents/coordinator.ts`. `provider` y `model` tienen que existir en el
|
|
37
|
+
catálogo sembrado, o `createAgent` lanza avisando cuál falta:
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
export const coordinatorAgent = await createAgent({
|
|
41
|
+
name: "coordinator",
|
|
42
|
+
provider: "anthropic",
|
|
43
|
+
model: "claude-opus-5",
|
|
44
|
+
systemPrompt: "...",
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Hay 18 providers y 106 modelos disponibles. La API key sale de la variable
|
|
49
|
+
`<PROVIDER>_API_KEY` (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `MODELSCOPE_API_KEY`…).
|
|
50
|
+
|
|
51
|
+
## Agregar una tool
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
import { createAgent, defineTool } from "@johpaz/hive-sdk";
|
|
55
|
+
import { z } from "zod";
|
|
56
|
+
|
|
57
|
+
const clima = defineTool({
|
|
58
|
+
name: "get_weather",
|
|
59
|
+
description: "Consulta el clima de una ciudad. Sinónimos: tiempo, temperatura",
|
|
60
|
+
schema: z.object({ city: z.string().describe("la ciudad") }),
|
|
61
|
+
execute: async ({ city }) => `Soleado en ${city}`,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
export const coordinatorAgent = await createAgent({
|
|
65
|
+
name: "coordinator",
|
|
66
|
+
provider: "anthropic",
|
|
67
|
+
model: "claude-opus-5",
|
|
68
|
+
tools: [clima],
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Dos cosas que conviene saber sobre cómo el agente usa las tools:
|
|
73
|
+
|
|
74
|
+
- El **`description` es lo que la hace encontrable**. El agente arranca con un
|
|
75
|
+
loadout mínimo y descubre el resto buscando por capacidad, así que poner
|
|
76
|
+
sinónimos en la descripción es lo que hace que aparezca cuando corresponde.
|
|
77
|
+
- El **`schema` de Zod se traduce a los parámetros que ve el modelo**. Sin
|
|
78
|
+
schema, la tool se le ofrece sin argumentos.
|
|
79
|
+
|
|
80
|
+
## Comandos
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
bun run dev # desarrollo
|
|
84
|
+
bun run start # producción
|
|
85
|
+
hives add-tool <nombre> # scaffold de una tool
|
|
86
|
+
hives add-skill <nombre> # scaffold de una skill
|
|
87
|
+
hives trace # últimas ejecuciones del agente
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Datos
|
|
91
|
+
|
|
92
|
+
HiveDB vive en `<HIVE_HOME>/data` (por defecto `./.hive/data`). Para una base
|
|
93
|
+
efímera —tests— usá `HIVE_DB_PATH=":memory:"`.
|
|
94
|
+
|
|
95
|
+
## Docker
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
docker compose up -d
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Documentación
|
|
102
|
+
|
|
103
|
+
[github.com/johpaz/hive-sdk](https://github.com/johpaz/hive-sdk#readme)
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import type { Config } from "@johpaz/hive-sdk";
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Configuración de {{APP_NAME}}.
|
|
5
|
+
*
|
|
6
|
+
* La ruta de la base no se configura acá: HiveDB vive en `<HIVE_HOME>/data`, o
|
|
7
|
+
* en `HIVE_DB_PATH` si lo definís. Usá `HIVE_DB_PATH=":memory:"` para una base
|
|
8
|
+
* efímera (tests).
|
|
9
|
+
*/
|
|
3
10
|
export default {
|
|
4
|
-
name: "{{APP_NAME}}",
|
|
5
11
|
gateway: {
|
|
6
12
|
host: process.env.HIVE_HOST ?? "127.0.0.1",
|
|
7
13
|
port: Number(process.env.HIVE_PORT ?? 18790),
|
|
@@ -13,7 +19,7 @@ export default {
|
|
|
13
19
|
whatsapp: { enabled: false },
|
|
14
20
|
slack: { enabled: false },
|
|
15
21
|
},
|
|
16
|
-
|
|
17
|
-
|
|
22
|
+
logging: {
|
|
23
|
+
level: (process.env.LOG_LEVEL as "debug" | "info" | "warn" | "error") ?? "info",
|
|
18
24
|
},
|
|
19
25
|
} satisfies Config;
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { createAgent } from "@johpaz/hive-sdk";
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* El coordinador de la app.
|
|
5
|
+
*
|
|
6
|
+
* `provider` y `model` tienen que existir en el catálogo sembrado (ver
|
|
7
|
+
* `SEED_DATA.models`): `createAgent` los valida y los persiste en la fila del
|
|
8
|
+
* agente, que es de donde el loop resuelve a qué modelo llamar.
|
|
9
|
+
*/
|
|
3
10
|
export const coordinatorAgent = await createAgent({
|
|
4
11
|
name: "coordinator",
|
|
5
12
|
provider: "openai",
|
|
6
|
-
model: "gpt-
|
|
13
|
+
model: "gpt-5.6-luna",
|
|
7
14
|
systemPrompt:
|
|
8
15
|
"You are the coordinator agent. You orchestrate tasks, answer questions, and delegate to specialized agents when needed.",
|
|
9
16
|
});
|