@johpaz/hive-sdk 0.1.4 → 0.1.6

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.
Files changed (278) hide show
  1. package/CHANGELOG.md +129 -0
  2. package/README.md +78 -23
  3. package/bun.lock +55 -29
  4. package/bunfig.toml +4 -2
  5. package/docs/API-AGENTS.md +78 -27
  6. package/docs/API-CONTEXT-COMPILER.md +31 -34
  7. package/docs/API-TOOLS-SKILLS-CHANNELS.md +58 -22
  8. package/docs/HIVE-HARNESS.md +1 -1
  9. package/docs/INDEX.md +4 -4
  10. package/docs/TEMPLATE-HIVE-APP.md +10 -10
  11. package/package.json +17 -12
  12. package/packages/cli/package.json +2 -2
  13. package/packages/cli/src/commands/create-app.test.ts +36 -7
  14. package/packages/cli/src/commands/init.ts +3 -3
  15. package/packages/cli/src/commands/run.ts +1 -1
  16. package/packages/cli/src/commands/test.ts +37 -25
  17. package/packages/cli/src/commands/trace.ts +30 -28
  18. package/packages/cli/templates/hive-app/.env.example +10 -2
  19. package/packages/cli/templates/hive-app/README.md +103 -0
  20. package/packages/cli/templates/hive-app/hive.config.ts +9 -3
  21. package/packages/cli/templates/hive-app/src/agents/coordinator.ts +8 -1
  22. package/packages/cli/templates/hive-app/src/main.ts +12 -19
  23. package/packages/core/package.json +13 -12
  24. package/packages/core/src/agent/acceptance-checks.ts +172 -0
  25. package/packages/core/src/agent/agent-catalog.ts +348 -0
  26. package/packages/core/src/agent/agent-loop.ts +1373 -0
  27. package/packages/core/src/agent/capability-search.ts +186 -0
  28. package/packages/core/src/agent/catalog-selector.ts +103 -0
  29. package/packages/core/src/agent/{Compaction.ts → compaction.ts} +86 -63
  30. package/packages/core/src/agent/context-compiler.ts +689 -0
  31. package/packages/core/src/agent/conversation-store.ts +381 -0
  32. package/packages/core/src/agent/curator.ts +276 -0
  33. package/packages/core/src/agent/delegation-runtime.ts +241 -0
  34. package/packages/core/src/agent/goal-runner.ts +323 -0
  35. package/packages/core/src/agent/index.ts +17 -12
  36. package/packages/core/src/agent/llm-client.ts +266 -0
  37. package/packages/core/src/agent/llm-providers/anthropic.ts +264 -0
  38. package/packages/core/src/agent/llm-providers/deepseek.ts +8 -0
  39. package/packages/core/src/agent/{providers → llm-providers}/gemini.ts +98 -60
  40. package/packages/core/src/agent/llm-providers/groq.ts +5 -0
  41. package/packages/core/src/agent/llm-providers/hiveagents.ts +253 -0
  42. package/packages/core/src/agent/{providers → llm-providers}/interface.ts +73 -13
  43. package/packages/core/src/agent/llm-providers/kimi.ts +8 -0
  44. package/packages/core/src/agent/llm-providers/minimax.ts +13 -0
  45. package/packages/core/src/agent/llm-providers/mistral.ts +5 -0
  46. package/packages/core/src/agent/llm-providers/modelscope.ts +5 -0
  47. package/packages/core/src/agent/llm-providers/nvidia.ts +5 -0
  48. package/packages/core/src/agent/{providers → llm-providers}/ollama.ts +31 -5
  49. package/packages/core/src/agent/llm-providers/openai-compat-base.ts +418 -0
  50. package/packages/core/src/agent/llm-providers/openai.ts +5 -0
  51. package/packages/core/src/agent/llm-providers/opencode-go.ts +9 -0
  52. package/packages/core/src/agent/llm-providers/openrouter.ts +5 -0
  53. package/packages/core/src/agent/llm-providers/qwen.ts +5 -0
  54. package/packages/core/src/agent/llm-providers/z-ai.ts +5 -0
  55. package/packages/core/src/agent/minimal-loadout.ts +47 -0
  56. package/packages/core/src/agent/playbook-selector.ts +119 -0
  57. package/packages/core/src/agent/{PromptBuilder.ts → prompt-builder.ts} +21 -22
  58. package/packages/core/src/{harness → agent}/proof-packet.ts +16 -21
  59. package/packages/core/src/agent/providers/index.ts +35 -16
  60. package/packages/core/src/agent/reflector.ts +320 -0
  61. package/packages/core/src/agent/routing-intent.ts +22 -0
  62. package/packages/core/src/{harness → agent}/run-epoch.ts +4 -3
  63. package/packages/core/src/{harness → agent}/run-store.ts +142 -81
  64. package/packages/core/src/agent/{Service.ts → service.ts} +37 -26
  65. package/packages/core/src/agent/skill-selector.ts +374 -0
  66. package/packages/core/src/agent/stuck-loop.ts +209 -0
  67. package/packages/core/src/agent/{selectors/ToolSelector.ts → tool-selector.ts} +188 -178
  68. package/packages/core/src/{ace/Tracer.ts → agent/tracer.ts} +37 -27
  69. package/packages/core/src/api/createAgent.test.ts +139 -27
  70. package/packages/core/src/api/createAgent.ts +232 -44
  71. package/packages/core/src/artifacts/store.ts +162 -0
  72. package/packages/core/src/canvas/canvas-manager.ts +161 -0
  73. package/packages/core/src/canvas/canvas.test.ts +8 -4
  74. package/packages/core/src/canvas/emitter.ts +131 -80
  75. package/packages/core/src/canvas/index.ts +1 -3
  76. package/packages/core/src/channels/base.ts +9 -1
  77. package/packages/core/src/channels/discord.ts +5 -4
  78. package/packages/core/src/channels/manager.ts +122 -30
  79. package/packages/core/src/channels/slack.ts +5 -4
  80. package/packages/core/src/channels/telegram.ts +36 -6
  81. package/packages/core/src/channels/webchat.ts +11 -10
  82. package/packages/core/src/channels/whatsapp.ts +23 -7
  83. package/packages/core/src/config/index.ts +13 -2
  84. package/packages/core/src/config/loader.ts +76 -29
  85. package/packages/core/src/ethics/EthicsGuard.test.ts +90 -36
  86. package/packages/core/src/ethics/EthicsGuard.ts +51 -47
  87. package/packages/core/src/events/agent-bus.ts +44 -68
  88. package/packages/core/src/events/channel-narration.ts +150 -0
  89. package/packages/core/src/events/narration.ts +82 -0
  90. package/packages/core/src/events/tool-narration.ts +62 -0
  91. package/packages/core/src/gateway/delegation-groups.ts +258 -0
  92. package/packages/core/src/{harness → gateway}/durable-queue.ts +102 -42
  93. package/packages/core/src/{harness → gateway}/job-store.ts +85 -48
  94. package/packages/core/src/gateway/lane-queue.ts +173 -0
  95. package/packages/core/src/gateway/notification-inbox.ts +57 -0
  96. package/packages/core/src/gateway/server.ts +1 -1
  97. package/packages/core/src/harness/index.ts +46 -27
  98. package/packages/core/src/index.ts +33 -27
  99. package/packages/core/src/mcp/hot-reload.ts +32 -23
  100. package/packages/core/src/mcp/index.ts +6 -3
  101. package/packages/core/src/mcp/singleton.ts +1 -4
  102. package/packages/core/src/mcp/tool-sync.ts +138 -0
  103. package/packages/core/src/memory/Scratchpad.test.ts +39 -20
  104. package/packages/core/src/memory/Scratchpad.ts +27 -34
  105. package/packages/core/src/multimodal/vision-service.ts +44 -38
  106. package/packages/core/src/resilience/retry.ts +95 -0
  107. package/packages/core/src/scheduler/CronScheduler.ts +334 -287
  108. package/packages/core/src/scheduler/index.ts +9 -7
  109. package/packages/core/src/scheduler/integration.ts +46 -26
  110. package/packages/core/src/scheduler/scheduler.test.ts +9 -13
  111. package/packages/core/src/scheduler/types.ts +7 -2
  112. package/packages/core/src/security/Pairing.ts +1 -1
  113. package/packages/core/src/skills/bundled/a2ui/a2ui_dashboard/SKILL.md +176 -0
  114. package/packages/core/src/skills/bundled/a2ui/a2ui_form/SKILL.md +202 -0
  115. package/packages/core/src/skills/bundled/a2ui/a2ui_interactive/SKILL.md +206 -0
  116. package/packages/core/src/skills/bundled/agents/agent_spawner/SKILL.md +173 -0
  117. package/packages/core/src/skills/bundled/agents/memory_manager/SKILL.md +143 -0
  118. package/packages/core/src/skills/bundled/agents/research_and_remember/SKILL.md +139 -0
  119. package/packages/core/src/skills/bundled/agents/task_orchestrator/SKILL.md +98 -0
  120. package/packages/core/src/skills/bundled/api/api_client/SKILL.md +132 -0
  121. package/packages/core/src/skills/bundled/cli/cli_pipeline/SKILL.md +135 -0
  122. package/packages/core/src/skills/bundled/cli/cli_safe_exec/SKILL.md +125 -0
  123. package/packages/core/src/skills/bundled/cli/software_engineering/SKILL.md +23 -0
  124. package/packages/core/src/skills/bundled/cron_manager/SKILL.md +188 -0
  125. package/packages/core/src/skills/bundled/cron_reminder/SKILL.md +112 -0
  126. package/packages/core/src/skills/bundled/filesystem/file_manager/SKILL.md +118 -0
  127. package/packages/core/src/skills/bundled/filesystem/file_read_and_summarize/SKILL.md +109 -0
  128. package/packages/core/src/skills/bundled/filesystem/file_writer/SKILL.md +129 -0
  129. package/packages/core/src/skills/bundled/filesystem/workspace_file_operator/SKILL.md +22 -0
  130. package/packages/core/src/skills/bundled/office/office_document_manager/SKILL.md +262 -0
  131. package/packages/core/src/skills/bundled/search_knowledge/capability_discovery/SKILL.md +75 -0
  132. package/packages/core/src/skills/bundled/web/browser_automate/SKILL.md +120 -0
  133. package/packages/core/src/skills/bundled/web/browser_scrape/SKILL.md +109 -0
  134. package/packages/core/src/skills/bundled/web/web_monitor/SKILL.md +127 -0
  135. package/packages/core/src/skills/bundled/web/web_research/SKILL.md +119 -0
  136. package/packages/core/src/skills/bundled-data.generated.ts +731 -2678
  137. package/packages/core/src/skills/skills.test.ts +52 -11
  138. package/packages/core/src/{harness → storage}/boot-id.ts +5 -2
  139. package/packages/core/src/storage/bootstrap.ts +151 -0
  140. package/packages/core/src/storage/causal-events.ts +84 -0
  141. package/packages/core/src/storage/collections.ts +680 -0
  142. package/packages/core/src/storage/crypto.ts +205 -74
  143. package/packages/core/src/{harness/db-helpers.ts → storage/hive.ts} +63 -7
  144. package/packages/core/src/storage/hivedb.ts +61 -0
  145. package/packages/core/src/storage/index.ts +111 -18
  146. package/packages/core/src/storage/model-id.ts +53 -0
  147. package/packages/core/src/storage/onboarding.ts +540 -972
  148. package/packages/core/src/storage/reconcile.ts +238 -0
  149. package/packages/core/src/storage/seed.ts +572 -406
  150. package/packages/core/src/storage/usage.ts +285 -225
  151. package/packages/core/src/storage/user-email.ts +11 -0
  152. package/packages/core/src/swarm/AgentExecutor.ts +1 -1
  153. package/packages/core/src/swarm/EventBridge.ts +1 -1
  154. package/packages/core/src/swarm/index.ts +12 -9
  155. package/packages/core/src/tool-runtime/index.ts +146 -23
  156. package/packages/core/src/tool-runtime/tool-worker.ts +2 -2
  157. package/packages/core/src/tool-runtime/worker-tools.ts +27 -0
  158. package/packages/core/src/{canvas/a2ui-tools.ts → tools/a2ui/index.ts} +17 -8
  159. package/packages/core/src/tools/agents/get-available-models.ts +36 -54
  160. package/packages/core/src/tools/agents/index.ts +784 -292
  161. package/packages/core/src/tools/api/api-request.test.ts +164 -0
  162. package/packages/core/src/tools/api/api-request.ts +174 -0
  163. package/packages/core/src/tools/api/index.ts +16 -0
  164. package/packages/core/src/tools/cli/index.ts +4 -0
  165. package/packages/core/src/tools/core/index.ts +281 -112
  166. package/packages/core/src/tools/cron/index.ts +121 -124
  167. package/packages/core/src/tools/index.ts +63 -78
  168. package/packages/core/src/tools/office/office-escribir-xlsx.ts +3 -1
  169. package/packages/core/src/tools/types.ts +3 -1
  170. package/packages/core/src/tools/web/artifact-inspect.ts +23 -0
  171. package/packages/core/src/tools/web/browser-backend.ts +129 -0
  172. package/packages/core/src/tools/web/browser-screenshot.ts +26 -5
  173. package/packages/core/src/tools/web/browser-service.ts +80 -35
  174. package/packages/core/src/tools/web/browser-type.ts +3 -8
  175. package/packages/core/src/tools/web/index.ts +4 -4
  176. package/packages/core/src/tools/web/webview-backend.ts +412 -0
  177. package/packages/core/src/voice/index.ts +89 -63
  178. package/packages/core/src/workers/agent.worker.ts +2 -2
  179. package/packages/core/src/workers/workers.test.ts +3 -10
  180. package/scripts/bump-version.ts +248 -0
  181. package/scripts/generate-skill-bundle.ts +108 -0
  182. package/test/acceptance-checks.test.ts +403 -0
  183. package/test/agent-loop-terminal-synthesis.test.ts +32 -0
  184. package/test/browser-backend.test.ts +308 -0
  185. package/test/catalog-agents-stay-enabled.test.ts +117 -0
  186. package/test/causal-events.test.ts +117 -0
  187. package/test/compaction.test.ts +105 -0
  188. package/test/context-compiler.test.ts +269 -0
  189. package/test/curator.test.ts +130 -0
  190. package/test/durable-queue.test.ts +114 -0
  191. package/test/harness-barrel.test.ts +64 -0
  192. package/test/hive-helpers.test.ts +130 -0
  193. package/test/hivedb-search.test.ts +189 -0
  194. package/test/internal-turns.test.ts +166 -0
  195. package/test/job-idempotency.test.ts +68 -0
  196. package/test/job-retry-backoff.test.ts +184 -0
  197. package/test/job-store.test.ts +381 -0
  198. package/test/llm-retry.test.ts +97 -0
  199. package/test/memory-perf.test.ts +774 -0
  200. package/test/minimal-loadout.test.ts +78 -0
  201. package/test/model-catalog.test.ts +105 -0
  202. package/test/preload.ts +12 -0
  203. package/test/reflector.test.ts +320 -0
  204. package/test/retention-cap.test.ts +91 -0
  205. package/test/retired-capabilities-pruned.test.ts +192 -0
  206. package/test/run-store.test.ts +355 -0
  207. package/test/scratchpad.test.ts +74 -0
  208. package/test/secrets-durability.test.ts +119 -0
  209. package/test/seed-model-reseed.test.ts +155 -0
  210. package/test/setup-agent-seed.test.ts +264 -0
  211. package/test/tool-inventory.test.ts +65 -0
  212. package/test/tool-runtime.test.ts +258 -0
  213. package/test/tool-selector-runtime-tools.test.ts +117 -0
  214. package/test/toon.test.ts +429 -0
  215. package/tsconfig.json +2 -0
  216. package/packages/core/src/ace/Curator.ts +0 -158
  217. package/packages/core/src/ace/Reflector.ts +0 -200
  218. package/packages/core/src/ace/index.ts +0 -4
  219. package/packages/core/src/agent/AgentRunner.ts +0 -711
  220. package/packages/core/src/agent/ContextCompiler.ts +0 -567
  221. package/packages/core/src/agent/ContextGuard.ts +0 -91
  222. package/packages/core/src/agent/ConversationStore.ts +0 -254
  223. package/packages/core/src/agent/Hooks.ts +0 -166
  224. package/packages/core/src/agent/StuckLoop.ts +0 -133
  225. package/packages/core/src/agent/providers/LLMClient.ts +0 -149
  226. package/packages/core/src/agent/providers/anthropic.ts +0 -212
  227. package/packages/core/src/agent/providers/openai-compat.ts +0 -231
  228. package/packages/core/src/agent/selectors/PlaybookSelector.ts +0 -121
  229. package/packages/core/src/agent/selectors/SkillSelector.ts +0 -322
  230. package/packages/core/src/agent/selectors/index.ts +0 -6
  231. package/packages/core/src/auth/auth.ts +0 -121
  232. package/packages/core/src/auth/index.ts +0 -1
  233. package/packages/core/src/canvas/CanvasManager.ts +0 -390
  234. package/packages/core/src/canvas/canvas-tools.ts +0 -448
  235. package/packages/core/src/harness/collections.ts +0 -98
  236. package/packages/core/src/harness/goal-verifier.ts +0 -141
  237. package/packages/core/src/harness/harness.test.ts +0 -236
  238. package/packages/core/src/harness/reconcile.ts +0 -149
  239. package/packages/core/src/mcp/MCPToolAdapter.ts +0 -176
  240. package/packages/core/src/multimodal/VisionService.ts +0 -293
  241. package/packages/core/src/scheduler/dag/AgentExecutor.ts +0 -53
  242. package/packages/core/src/scheduler/dag/DAGScheduler.ts +0 -250
  243. package/packages/core/src/scheduler/dag/EventBridge.ts +0 -122
  244. package/packages/core/src/scheduler/dag/TaskGraph.ts +0 -192
  245. package/packages/core/src/scheduler/dag/TaskNode.ts +0 -97
  246. package/packages/core/src/scheduler/dag/TaskResult.ts +0 -22
  247. package/packages/core/src/scheduler/dag/errors.ts +0 -37
  248. package/packages/core/src/scheduler/dag/index.ts +0 -26
  249. package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +0 -97
  250. package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +0 -21
  251. package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +0 -46
  252. package/packages/core/src/storage/HiveDBStorage.ts +0 -64
  253. package/packages/core/src/storage/SQLiteStorage.ts +0 -414
  254. package/packages/core/src/storage/hiveSeed.ts +0 -308
  255. package/packages/core/src/storage/hiveStorage.test.ts +0 -38
  256. package/packages/core/src/storage/schema.ts +0 -689
  257. package/packages/core/src/storage/storage.test.ts +0 -37
  258. package/packages/core/src/swarm/AgentBus.ts +0 -460
  259. package/packages/core/src/swarm/EventBus.ts +0 -169
  260. package/packages/core/src/swarm/WorkerPool.ts +0 -236
  261. package/packages/core/src/tools/bridge-events.ts +0 -26
  262. package/packages/core/src/tools/canvas/index.ts +0 -375
  263. package/packages/core/src/tools/codebridge/index.ts +0 -342
  264. package/packages/core/src/tools/meeting/index.ts +0 -353
  265. package/packages/core/src/tools/projects/index.ts +0 -37
  266. package/packages/core/src/tools/projects/project-create.ts +0 -94
  267. package/packages/core/src/tools/projects/project-done.ts +0 -66
  268. package/packages/core/src/tools/projects/project-fail.ts +0 -66
  269. package/packages/core/src/tools/projects/project-list.ts +0 -96
  270. package/packages/core/src/tools/projects/project-update.ts +0 -72
  271. package/packages/core/src/tools/projects/task-create.ts +0 -68
  272. package/packages/core/src/tools/projects/task-evaluate.ts +0 -93
  273. package/packages/core/src/tools/projects/task-update.ts +0 -93
  274. package/packages/core/src/tools/voice/index.ts +0 -104
  275. package/packages/core/src/tools/web/api-request.test.ts +0 -170
  276. package/packages/core/src/tools/web/api-request.ts +0 -239
  277. package/test/setup-db.ts +0 -216
  278. /package/packages/core/src/agent/{NativeTools.ts → native-tools.ts} +0 -0
@@ -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('name: "my-awesome-app"');
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
- expect(config).toContain('path: process.env.HIVE_DATA_DIR ?? "./data/hive.db"');
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
- expect(main).toContain("initializeDatabase");
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 initializeDatabase()");
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
- expect(agent).toContain('model: "gpt-4o-mini"');
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("HIVE_DATA_DIR=");
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/core": "latest"
12
+ "@johpaz/hive-sdk": "latest"
13
13
  }
14
14
  }
15
15
  `;
16
16
 
17
- const HIVE_AGENT_TS = `import { createAgent, defineTool } from "@hive/core";
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-4o",
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/core");
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 { initializeDatabase, dbService } = await import("@hive/core");
8
- await initializeDatabase();
15
+ const { ensureHiveDb } = await import("@johpaz/hive-sdk");
16
+ await ensureHiveDb();
9
17
 
10
18
  const { Glob } = await import("bun");
11
- const glob = new Glob("packages/core/src/**/*.{test,spec}.ts");
12
- const testFiles = Array.from(glob.scanSync({ cwd: process.cwd(), absolute: true }));
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
- } else {
21
- console.log(`Found ${tests.length} test(s)\n`);
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
- console.log(`\n${passed} passed, ${failed} failed`);
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
- dbService.close();
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 { initializeDatabase } = await import("@hive/core");
4
- const { getDb } = await import("@hive/core/storage");
10
+ const { ensureHiveDb, col } = await import("@johpaz/hive-sdk");
5
11
 
6
- await initializeDatabase();
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 rows = db
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
- tool_calls: string;
27
- duration_ms: number;
28
- tokens_used: number;
29
- created_at: string;
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.log("No traces table found (run the agent first).");
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
- # LLM Providers
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
- database: {
17
- path: process.env.HIVE_DATA_DIR ?? "./data/hive.db",
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-4o-mini",
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
  });
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env bun
2
2
 
3
3
  import {
4
- createAgent,
5
4
  startGateway,
6
- initializeDatabase,
5
+ ensureHiveDb,
7
6
  ChannelManager,
8
- logger,
9
7
  loadConfig,
8
+ logger,
10
9
  } from "@johpaz/hive-sdk";
10
+ import { coordinatorAgent } from "./agents/coordinator.ts";
11
11
  import config from "../hive.config.ts";
12
12
 
13
13
  const log = logger.child("app");
@@ -15,29 +15,22 @@ const log = logger.child("app");
15
15
  async function main() {
16
16
  log.info(`Starting {{APP_NAME}}...`);
17
17
 
18
- // Initialize database
19
- await initializeDatabase();
20
-
21
- // Create the main agent
22
- const agent = await createAgent({
23
- name: "coordinator",
24
- provider: "openai",
25
- model: "gpt-4o-mini",
26
- systemPrompt:
27
- "You are a helpful AI assistant running in a Hive harness. You can use tools, manage tasks, and communicate across channels.",
28
- });
18
+ // Abre HiveDB, crea los índices y siembra el catálogo de providers y modelos.
19
+ // Es idempotente: correrlo en cada arranque es cómo se actualiza el catálogo.
20
+ await ensureHiveDb();
29
21
 
30
- log.info(`Agent ready: ${agent.name}`);
22
+ log.info(`Agent ready: ${coordinatorAgent.name}`);
31
23
 
32
- // Initialize channels
33
- const channelManager = new ChannelManager();
34
- // TODO: configure channels from hive.config.ts
24
+ // Initialize channels. `loadConfig()` mezcla los defaults del SDK con
25
+ // hive.config.ts y el entorno; `config` sólo tiene lo que declaraste vos.
26
+ const channelManager = new ChannelManager(await loadConfig());
27
+ await channelManager.initialize();
35
28
 
36
29
  // Start the gateway
37
30
  const gateway = await startGateway({
38
31
  host: config.gateway?.host,
39
32
  port: config.gateway?.port,
40
- agentId: "coordinator",
33
+ agentId: coordinatorAgent.id,
41
34
  });
42
35
 
43
36
  log.info(`{{APP_NAME}} is running at http://${gateway.hostname}:${gateway.port}`);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hive/core",
3
- "version": "0.1.4",
4
- "description": "Hive Core — Agentes AI con Context Engineering, FTS5, ACE, Swarm",
3
+ "version": "0.1.6",
4
+ "description": "Hive Core — runtime de agentes con context engineering, catálogo de modelos y HiveDB",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "main": "./src/index.ts",
@@ -10,14 +10,15 @@
10
10
  ".": "./src/index.ts",
11
11
  "./agent": "./src/agent/index.ts",
12
12
  "./agent/providers": "./src/agent/providers/index.ts",
13
- "./agent/selectors": "./src/agent/selectors/index.ts",
14
13
  "./tools": "./src/tools/index.ts",
15
14
  "./skills": "./src/skills/index.ts",
16
15
  "./storage": "./src/storage/index.ts",
17
16
  "./swarm": "./src/swarm/index.ts",
18
17
  "./swarm/strategies": "./src/swarm/strategies/index.ts",
19
18
  "./swarm/presets": "./src/swarm/presets/index.ts",
20
- "./ace": "./src/ace/index.ts",
19
+ "./scheduler": "./src/scheduler/index.ts",
20
+ "./workers": "./src/workers/index.ts",
21
+ "./events": "./src/events/event-bus.ts",
21
22
  "./ethics": "./src/ethics/index.ts",
22
23
  "./canvas": "./src/canvas/index.ts",
23
24
  "./config": "./src/config/index.ts",
@@ -36,16 +37,16 @@
36
37
  "@johpaz/hive-db": "^0.4.0",
37
38
  "@anthropic-ai/sdk": "^0.74.0",
38
39
  "@google/genai": "^1.43.0",
39
- "@modelcontextprotocol/sdk": "latest",
40
- "@sapphire/snowflake": "latest",
41
- "@slack/bolt": "latest",
42
- "@whiskeysockets/baileys": "latest",
40
+ "@modelcontextprotocol/sdk": "^1.26.0",
41
+ "@sapphire/snowflake": "^3.5.5",
42
+ "@slack/bolt": "^4.7.2",
43
+ "@whiskeysockets/baileys": "7.0.0-rc11",
43
44
  "async-mutex": "^0.5.0",
44
45
  "cron-parser": "^5.5.0",
45
46
  "croner": "^10.0.1",
46
- "discord.js": "latest",
47
+ "discord.js": "^14.26.4",
47
48
  "docx": "^9.6.1",
48
- "grammy": "latest",
49
+ "grammy": "^1.42.0",
49
50
  "groq-sdk": "^0.37.0",
50
51
  "jsonwebtoken": "^9.0.3",
51
52
  "jszip": "^3.10.1",
@@ -55,10 +56,10 @@
55
56
  "openai": "^6.18.0",
56
57
  "pdfjs-dist": "^5.6.205",
57
58
  "pptxgenjs": "^4.0.1",
58
- "qrcode-terminal": "latest",
59
+ "qrcode-terminal": "^0.12.0",
59
60
  "toon-format-parser": "^1.1.0",
60
61
  "xlsx": "^0.18.5",
61
- "zod": "latest"
62
+ "zod": "^4.4.3"
62
63
  },
63
64
  "devDependencies": {
64
65
  "@types/jsonwebtoken": "^9.0.10"