@johpaz/hive-sdk 0.0.14 → 0.0.16

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 (257) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/README.md +280 -0
  3. package/docs/API-AGENTS.md +316 -0
  4. package/docs/API-CONTEXT-COMPILER.md +252 -0
  5. package/docs/API-DAG-SCHEDULER.md +273 -0
  6. package/docs/API-TOOLS-SKILLS-CHANNELS.md +350 -0
  7. package/docs/API-WORKERS-EVENTS.md +299 -0
  8. package/docs/INDEX.md +190 -0
  9. package/docs/README.md +161 -0
  10. package/docs/TEMPLATE-HIVE-APP.md +360 -0
  11. package/package.json +60 -104
  12. package/packages/cli/bin/hive +2 -0
  13. package/packages/cli/package.json +17 -0
  14. package/packages/cli/src/commands/add-skill.ts +42 -0
  15. package/packages/cli/src/commands/add-tool.ts +45 -0
  16. package/packages/cli/src/commands/add-worker.ts +49 -0
  17. package/packages/cli/src/commands/create-app-utils.ts +32 -0
  18. package/packages/cli/src/commands/create-app.test.ts +151 -0
  19. package/packages/cli/src/commands/create-app.ts +35 -0
  20. package/packages/cli/src/commands/init.ts +56 -0
  21. package/packages/cli/src/commands/run.ts +45 -0
  22. package/packages/cli/src/commands/test.ts +42 -0
  23. package/packages/cli/src/commands/trace.ts +55 -0
  24. package/packages/cli/src/index.ts +59 -0
  25. package/packages/cli/templates/hive-app/.env.example +17 -0
  26. package/packages/cli/templates/hive-app/docker-compose.yml +20 -0
  27. package/packages/cli/templates/hive-app/hive.config.ts +19 -0
  28. package/packages/cli/templates/hive-app/package.json +16 -0
  29. package/packages/cli/templates/hive-app/src/agents/coordinator.ts +9 -0
  30. package/packages/cli/templates/hive-app/src/main.ts +56 -0
  31. package/packages/core/package.json +58 -0
  32. package/packages/core/src/ace/Curator.ts +158 -0
  33. package/packages/core/src/ace/Reflector.ts +200 -0
  34. package/packages/core/src/ace/Tracer.ts +100 -0
  35. package/packages/core/src/ace/index.ts +4 -0
  36. package/packages/core/src/agent/AgentRunner.ts +699 -0
  37. package/packages/core/src/agent/Compaction.ts +221 -0
  38. package/packages/core/src/agent/ContextCompiler.ts +567 -0
  39. package/packages/core/src/agent/ContextGuard.ts +91 -0
  40. package/packages/core/src/agent/ConversationStore.ts +244 -0
  41. package/packages/core/src/agent/Hooks.ts +166 -0
  42. package/packages/core/src/agent/NativeTools.ts +31 -0
  43. package/packages/core/src/agent/PromptBuilder.ts +169 -0
  44. package/packages/core/src/agent/Service.ts +267 -0
  45. package/packages/core/src/agent/StuckLoop.ts +133 -0
  46. package/packages/core/src/agent/index.ts +12 -0
  47. package/packages/core/src/agent/providers/LLMClient.ts +149 -0
  48. package/packages/core/src/agent/providers/anthropic.ts +212 -0
  49. package/packages/core/src/agent/providers/gemini.ts +215 -0
  50. package/packages/core/src/agent/providers/index.ts +199 -0
  51. package/packages/core/src/agent/providers/interface.ts +195 -0
  52. package/packages/core/src/agent/providers/ollama.ts +175 -0
  53. package/packages/core/src/agent/providers/openai-compat.ts +231 -0
  54. package/packages/core/src/agent/selectors/PlaybookSelector.ts +147 -0
  55. package/packages/core/src/agent/selectors/SkillSelector.ts +478 -0
  56. package/packages/core/src/agent/selectors/ToolSelector.ts +577 -0
  57. package/packages/core/src/agent/selectors/index.ts +6 -0
  58. package/packages/core/src/api/createAgent.test.ts +48 -0
  59. package/packages/core/src/api/createAgent.ts +122 -0
  60. package/packages/core/src/api/index.ts +2 -0
  61. package/packages/core/src/auth/auth.ts +108 -0
  62. package/packages/core/src/auth/index.ts +1 -0
  63. package/packages/core/src/canvas/CanvasManager.ts +390 -0
  64. package/packages/core/src/canvas/a2ui-tools.ts +255 -0
  65. package/packages/core/src/canvas/canvas-tools.ts +448 -0
  66. package/packages/core/src/canvas/canvas.test.ts +32 -0
  67. package/packages/core/src/canvas/emitter.ts +149 -0
  68. package/packages/core/src/canvas/index.ts +3 -0
  69. package/packages/core/src/channels/base.ts +154 -0
  70. package/packages/core/src/channels/channels.test.ts +18 -0
  71. package/packages/core/src/channels/discord.ts +273 -0
  72. package/packages/core/src/channels/index.ts +7 -0
  73. package/packages/core/src/channels/manager.ts +450 -0
  74. package/packages/core/src/channels/slack.ts +323 -0
  75. package/packages/core/src/channels/telegram.ts +612 -0
  76. package/packages/core/src/channels/webchat.ts +139 -0
  77. package/packages/core/src/channels/whatsapp.ts +548 -0
  78. package/packages/core/src/config/index.ts +2 -0
  79. package/packages/core/src/config/loader.ts +554 -0
  80. package/packages/core/src/ethics/EthicsGuard.test.ts +54 -0
  81. package/packages/core/src/ethics/EthicsGuard.ts +66 -0
  82. package/packages/core/src/ethics/index.ts +2 -0
  83. package/packages/core/src/events/agent-bus.ts +460 -0
  84. package/packages/core/src/events/event-bus.ts +169 -0
  85. package/packages/core/src/gateway/channel-notify.ts +37 -0
  86. package/packages/core/src/gateway/gateway.test.ts +38 -0
  87. package/packages/core/src/gateway/index.ts +2 -0
  88. package/packages/core/src/gateway/server.ts +139 -0
  89. package/packages/core/src/heartbeat/index.ts +157 -0
  90. package/packages/core/src/index.ts +81 -0
  91. package/packages/core/src/mcp/MCPClient.ts +439 -0
  92. package/packages/core/src/mcp/MCPToolAdapter.ts +176 -0
  93. package/packages/core/src/mcp/config.ts +13 -0
  94. package/packages/core/src/mcp/hot-reload.ts +147 -0
  95. package/packages/core/src/mcp/index.ts +11 -0
  96. package/packages/core/src/mcp/logger.ts +42 -0
  97. package/packages/core/src/mcp/singleton.ts +21 -0
  98. package/packages/core/src/mcp/transports/index.ts +67 -0
  99. package/packages/core/src/mcp/transports/sse.ts +241 -0
  100. package/packages/core/src/mcp/transports/websocket.ts +159 -0
  101. package/packages/core/src/memory/Scratchpad.test.ts +47 -0
  102. package/packages/core/src/memory/Scratchpad.ts +37 -0
  103. package/packages/core/src/memory/Storage.ts +6 -0
  104. package/packages/core/src/memory/index.ts +2 -0
  105. package/packages/core/src/multimodal/VisionService.ts +293 -0
  106. package/packages/core/src/multimodal/index.ts +2 -0
  107. package/packages/core/src/multimodal/types.ts +28 -0
  108. package/packages/core/src/multimodal/vision-service.ts +283 -0
  109. package/packages/core/src/plugins/api.ts +128 -0
  110. package/packages/core/src/plugins/index.ts +2 -0
  111. package/packages/core/src/plugins/loader.ts +365 -0
  112. package/packages/core/src/resilience/circuit-breaker.ts +225 -0
  113. package/packages/core/src/scheduler/CronScheduler.ts +699 -0
  114. package/packages/core/src/scheduler/dag/AgentExecutor.ts +53 -0
  115. package/packages/core/src/scheduler/dag/DAGScheduler.ts +250 -0
  116. package/packages/core/src/scheduler/dag/EventBridge.ts +122 -0
  117. package/packages/core/src/scheduler/dag/TaskGraph.ts +192 -0
  118. package/packages/core/src/scheduler/dag/TaskNode.ts +97 -0
  119. package/packages/core/src/scheduler/dag/TaskResult.ts +22 -0
  120. package/packages/core/src/scheduler/dag/errors.ts +37 -0
  121. package/packages/core/src/scheduler/dag/index.ts +26 -0
  122. package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +97 -0
  123. package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +21 -0
  124. package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +46 -0
  125. package/packages/core/src/scheduler/index.ts +22 -0
  126. package/packages/core/src/scheduler/integration.ts +237 -0
  127. package/packages/core/src/scheduler/scheduler.test.ts +19 -0
  128. package/packages/core/src/scheduler/types.ts +164 -0
  129. package/packages/core/src/security/Pairing.ts +250 -0
  130. package/packages/core/src/security/RateLimit.ts +270 -0
  131. package/packages/core/src/security/google-chat.ts +269 -0
  132. package/packages/core/src/security/index.ts +192 -0
  133. package/packages/core/src/security/rate-limit.ts +270 -0
  134. package/packages/core/src/security/signal.ts +321 -0
  135. package/packages/core/src/skills/SkillLoader.ts +388 -0
  136. package/packages/core/src/skills/bundled-data.generated.ts +3332 -0
  137. package/packages/core/src/skills/defineSkill.ts +18 -0
  138. package/packages/core/src/skills/index.ts +4 -0
  139. package/packages/core/src/state/index.ts +2 -0
  140. package/packages/core/src/state/store.ts +312 -0
  141. package/packages/core/src/storage/SQLiteStorage.ts +407 -0
  142. package/packages/core/src/storage/crypto.ts +233 -0
  143. package/packages/core/src/storage/index.ts +10 -0
  144. package/packages/core/src/storage/onboarding.ts +1603 -0
  145. package/packages/core/src/storage/schema.ts +689 -0
  146. package/packages/core/src/storage/seed.ts +740 -0
  147. package/packages/core/src/storage/storage.test.ts +37 -0
  148. package/packages/core/src/storage/usage.ts +374 -0
  149. package/packages/core/src/swarm/AgentBus.ts +460 -0
  150. package/packages/core/src/swarm/AgentExecutor.ts +53 -0
  151. package/packages/core/src/swarm/Coordinator.ts +251 -0
  152. package/packages/core/src/swarm/EventBridge.ts +122 -0
  153. package/packages/core/src/swarm/EventBus.ts +169 -0
  154. package/packages/core/src/swarm/TaskGraph.ts +192 -0
  155. package/packages/core/src/swarm/TaskNode.ts +97 -0
  156. package/packages/core/src/swarm/TaskResult.ts +22 -0
  157. package/packages/core/src/swarm/WorkerPool.ts +236 -0
  158. package/packages/core/src/swarm/errors.ts +37 -0
  159. package/packages/core/src/swarm/index.ts +30 -0
  160. package/packages/core/src/swarm/presets/HiveLearnPreset.ts +99 -0
  161. package/packages/core/src/swarm/presets/ResearchPreset.ts +97 -0
  162. package/packages/core/src/swarm/presets/index.ts +4 -0
  163. package/packages/core/src/swarm/strategies/ParallelStrategy.ts +21 -0
  164. package/packages/core/src/swarm/strategies/PriorityStrategy.ts +46 -0
  165. package/packages/core/src/swarm/strategies/index.ts +3 -0
  166. package/packages/core/src/swarm/swarm.test.ts +24 -0
  167. package/packages/core/src/swarm/types.ts +164 -0
  168. package/packages/core/src/tool-runtime/index.ts +522 -0
  169. package/packages/core/src/tool-runtime/tool-runtime.test.ts +91 -0
  170. package/packages/core/src/tool-runtime/tool-worker.ts +125 -0
  171. package/packages/core/src/tools/ToolExecutor.ts +58 -0
  172. package/packages/core/src/tools/ToolRegistry.test.ts +98 -0
  173. package/packages/core/src/tools/ToolRegistry.ts +61 -0
  174. package/packages/core/src/tools/agents/get-available-models.ts +118 -0
  175. package/packages/core/src/tools/agents/index.ts +715 -0
  176. package/packages/core/src/tools/bridge-events.ts +26 -0
  177. package/packages/core/src/tools/canvas/index.ts +375 -0
  178. package/packages/core/src/tools/cli/index.ts +142 -0
  179. package/packages/core/src/tools/codebridge/index.ts +342 -0
  180. package/packages/core/src/tools/core/index.ts +476 -0
  181. package/packages/core/src/tools/cron/index.ts +626 -0
  182. package/packages/core/src/tools/filesystem/fs-delete.ts +78 -0
  183. package/packages/core/src/tools/filesystem/fs-edit.ts +106 -0
  184. package/packages/core/src/tools/filesystem/fs-exists.ts +63 -0
  185. package/packages/core/src/tools/filesystem/fs-glob.ts +108 -0
  186. package/packages/core/src/tools/filesystem/fs-list.ts +129 -0
  187. package/packages/core/src/tools/filesystem/fs-read.ts +72 -0
  188. package/packages/core/src/tools/filesystem/fs-write.ts +67 -0
  189. package/packages/core/src/tools/filesystem/index.ts +34 -0
  190. package/packages/core/src/tools/filesystem/workspace-guard.ts +62 -0
  191. package/packages/core/src/tools/index.ts +231 -0
  192. package/packages/core/src/tools/meeting/index.ts +363 -0
  193. package/packages/core/src/tools/office/index.ts +47 -0
  194. package/packages/core/src/tools/office/office-escribir-docx.ts +192 -0
  195. package/packages/core/src/tools/office/office-escribir-pdf.ts +172 -0
  196. package/packages/core/src/tools/office/office-escribir-pptx.ts +174 -0
  197. package/packages/core/src/tools/office/office-escribir-xlsx.ts +116 -0
  198. package/packages/core/src/tools/office/office-leer-docx.ts +93 -0
  199. package/packages/core/src/tools/office/office-leer-pdf.ts +114 -0
  200. package/packages/core/src/tools/office/office-leer-pptx.ts +136 -0
  201. package/packages/core/src/tools/office/office-leer-xlsx.ts +124 -0
  202. package/packages/core/src/tools/projects/index.ts +37 -0
  203. package/packages/core/src/tools/projects/project-create.ts +94 -0
  204. package/packages/core/src/tools/projects/project-done.ts +66 -0
  205. package/packages/core/src/tools/projects/project-fail.ts +66 -0
  206. package/packages/core/src/tools/projects/project-list.ts +96 -0
  207. package/packages/core/src/tools/projects/project-update.ts +72 -0
  208. package/packages/core/src/tools/projects/task-create.ts +68 -0
  209. package/packages/core/src/tools/projects/task-evaluate.ts +93 -0
  210. package/packages/core/src/tools/projects/task-update.ts +93 -0
  211. package/packages/core/src/tools/types.ts +39 -0
  212. package/packages/core/src/tools/voice/index.ts +104 -0
  213. package/packages/core/src/tools/web/browser-click.ts +78 -0
  214. package/packages/core/src/tools/web/browser-extract.ts +139 -0
  215. package/packages/core/src/tools/web/browser-navigate.ts +106 -0
  216. package/packages/core/src/tools/web/browser-screenshot.ts +87 -0
  217. package/packages/core/src/tools/web/browser-script.ts +88 -0
  218. package/packages/core/src/tools/web/browser-service.ts +554 -0
  219. package/packages/core/src/tools/web/browser-type.ts +101 -0
  220. package/packages/core/src/tools/web/browser-wait.ts +136 -0
  221. package/packages/core/src/tools/web/index.ts +41 -0
  222. package/packages/core/src/tools/web/web-fetch.ts +78 -0
  223. package/packages/core/src/tools/web/web-search.ts +123 -0
  224. package/packages/core/src/utils/benchmark.ts +80 -0
  225. package/packages/core/src/utils/crypto.ts +73 -0
  226. package/packages/core/src/utils/date.ts +42 -0
  227. package/packages/core/src/utils/index.ts +10 -0
  228. package/packages/core/src/utils/logger.ts +389 -0
  229. package/packages/core/src/utils/retry.ts +70 -0
  230. package/packages/core/src/utils/toon.ts +253 -0
  231. package/packages/core/src/voice/index.ts +643 -0
  232. package/packages/core/src/workers/WorkerPool.ts +167 -0
  233. package/packages/core/src/workers/agent.worker.ts +68 -0
  234. package/packages/core/src/workers/createWorker.ts +144 -0
  235. package/packages/core/src/workers/index.ts +5 -0
  236. package/packages/core/src/workers/workers.test.ts +48 -0
  237. package/test/setup-db.ts +216 -0
  238. package/tsconfig.json +40 -0
  239. package/src/agents.ts +0 -1
  240. package/src/canvas.ts +0 -1
  241. package/src/channels.ts +0 -1
  242. package/src/config.ts +0 -1
  243. package/src/events.ts +0 -1
  244. package/src/gateway.ts +0 -1
  245. package/src/index.ts +0 -304
  246. package/src/mcp.ts +0 -1
  247. package/src/multimodal.ts +0 -1
  248. package/src/scheduler.ts +0 -1
  249. package/src/security.ts +0 -1
  250. package/src/skills.ts +0 -1
  251. package/src/state.ts +0 -1
  252. package/src/storage.ts +0 -1
  253. package/src/tools.ts +0 -1
  254. package/src/tts.ts +0 -1
  255. package/src/types.ts +0 -82
  256. package/src/utils.ts +0 -1
  257. package/src/voice.ts +0 -1
package/package.json CHANGED
@@ -1,113 +1,69 @@
1
1
  {
2
2
  "name": "@johpaz/hive-sdk",
3
- "version": "0.0.14",
4
- "description": "Hive SDK — Crear agentes IA con todo incluido: agentes, tools, skills, MCP, TTS, canales, gateway y más.",
3
+ "version": "0.0.16",
4
+ "private": false,
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
- "type": "module",
7
- "scripts": {
8
- "build": "bun run --cwd ../.. build"
9
- },
10
- "main": "./src/index.ts",
11
- "module": "./src/index.ts",
12
- "types": "./src/index.ts",
13
- "exports": {
14
- ".": {
15
- "types": "./src/index.ts",
16
- "default": "./src/index.ts"
17
- },
18
- "./agents": {
19
- "types": "./src/agents.ts",
20
- "default": "./src/agents.ts"
21
- },
22
- "./tools": {
23
- "types": "./src/tools.ts",
24
- "default": "./src/tools.ts"
25
- },
26
- "./skills": {
27
- "types": "./src/skills.ts",
28
- "default": "./src/skills.ts"
29
- },
30
- "./mcp": {
31
- "types": "./src/mcp.ts",
32
- "default": "./src/mcp.ts"
33
- },
34
- "./tts": {
35
- "types": "./src/tts.ts",
36
- "default": "./src/tts.ts"
37
- },
38
- "./channels": {
39
- "types": "./src/channels.ts",
40
- "default": "./src/channels.ts"
41
- },
42
- "./storage": {
43
- "types": "./src/storage.ts",
44
- "default": "./src/storage.ts"
45
- },
46
- "./gateway": {
47
- "types": "./src/gateway.ts",
48
- "default": "./src/gateway.ts"
49
- },
50
- "./scheduler": {
51
- "types": "./src/scheduler.ts",
52
- "default": "./src/scheduler.ts"
53
- },
54
- "./events": {
55
- "types": "./src/events.ts",
56
- "default": "./src/events.ts"
57
- },
58
- "./state": {
59
- "types": "./src/state.ts",
60
- "default": "./src/state.ts"
61
- },
62
- "./security": {
63
- "types": "./src/security.ts",
64
- "default": "./src/security.ts"
65
- },
66
- "./config": {
67
- "types": "./src/config.ts",
68
- "default": "./src/config.ts"
69
- },
70
- "./canvas": {
71
- "types": "./src/canvas.ts",
72
- "default": "./src/canvas.ts"
73
- },
74
- "./voice": {
75
- "types": "./src/voice.ts",
76
- "default": "./src/voice.ts"
77
- },
78
- "./multimodal": {
79
- "types": "./src/multimodal.ts",
80
- "default": "./src/multimodal.ts"
81
- },
82
- "./utils": {
83
- "types": "./src/utils.ts",
84
- "default": "./src/utils.ts"
85
- },
86
- "./types": {
87
- "types": "./src/types.ts",
88
- "default": "./src/types.ts"
89
- }
7
+ "homepage": "https://github.com/johpaz/hive-sdk#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/johpaz/hive-sdk.git"
90
11
  },
91
- "peerDependencies": {
92
- "typescript": "6.0.2"
93
- },
94
- "peerDependenciesMeta": {
95
- "typescript": {
96
- "optional": true
97
- }
12
+ "bugs": {
13
+ "url": "https://github.com/johpaz/hive-sdk/issues"
98
14
  },
99
15
  "keywords": [
100
- "hive",
101
- "sdk",
102
- "agents",
103
16
  "ai",
17
+ "agent",
104
18
  "llm",
105
- "mcp",
106
- "tts",
19
+ "harness",
20
+ "context-engineering",
21
+ "fts5",
22
+ "swarm",
23
+ "ace",
24
+ "bun",
25
+ "langchain-alternative",
107
26
  "multi-channel",
108
- "telegram",
109
- "discord",
110
- "whatsapp",
111
- "slack"
112
- ]
113
- }
27
+ "gateway"
28
+ ],
29
+ "main": "./packages/core/src/index.ts",
30
+ "types": "./packages/core/src/index.ts",
31
+ "bin": {
32
+ "hive": "./packages/cli/bin/hive"
33
+ },
34
+ "workspaces": [
35
+ "packages/core",
36
+ "packages/cli"
37
+ ],
38
+ "scripts": {
39
+ "build": "bun run typecheck",
40
+ "typecheck": "tsc --build --force",
41
+ "test": "bun test",
42
+ "prepublish": "echo 'No build needed - Bun runs TypeScript directly'"
43
+ },
44
+ "dependencies": {
45
+ "@anthropic-ai/sdk": "^0.74.0",
46
+ "@google/genai": "^1.43.0",
47
+ "@modelcontextprotocol/sdk": "latest",
48
+ "@sapphire/snowflake": "latest",
49
+ "async-mutex": "^0.5.0",
50
+ "cron-parser": "^5.5.0",
51
+ "croner": "^10.0.1",
52
+ "docx": "^9.6.1",
53
+ "groq-sdk": "^0.37.0",
54
+ "jszip": "^3.10.1",
55
+ "pdf-lib": "^1.17.1",
56
+ "mammoth": "^1.12.0",
57
+ "ollama": "^0.6.3",
58
+ "openai": "^6.18.0",
59
+ "pdfjs-dist": "^5.6.205",
60
+ "pptxgenjs": "^4.0.1",
61
+ "toon-format-parser": "^1.1.0",
62
+ "xlsx": "^0.18.5",
63
+ "zod": "latest"
64
+ },
65
+ "devDependencies": {
66
+ "@types/bun": "^1.3.13",
67
+ "typescript": "6.0.2"
68
+ }
69
+ }
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import("../src/index.ts");
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@hive/cli",
3
+ "version": "0.0.15",
4
+ "description": "Hive CLI — init, run, test, trace",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "hive": "./src/index.ts"
9
+ },
10
+ "main": "./src/index.ts",
11
+ "exports": {
12
+ ".": "./src/index.ts"
13
+ },
14
+ "dependencies": {
15
+ "@hive/core": "workspace:*"
16
+ }
17
+ }
@@ -0,0 +1,42 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import * as process from "node:process";
4
+
5
+ async function runAddSkill() {
6
+ const skillName = process.argv[3];
7
+
8
+ if (!skillName) {
9
+ console.error("Usage: hive add-skill <name>");
10
+ process.exit(1);
11
+ }
12
+
13
+ const skillsDir = join(process.cwd(), "src", "skills");
14
+ const filePath = join(skillsDir, `${skillName}.ts`);
15
+
16
+ if (existsSync(filePath)) {
17
+ console.error(`Skill '${skillName}' already exists.`);
18
+ process.exit(1);
19
+ }
20
+
21
+ mkdirSync(skillsDir, { recursive: true });
22
+
23
+ const content = `import { defineSkill } from "@johpaz/hive-sdk";
24
+
25
+ export const ${skillName}Skill = defineSkill({
26
+ name: "${skillName}",
27
+ description: "Description of what ${skillName} skill does.",
28
+ steps: [
29
+ {
30
+ name: "step-1",
31
+ description: "First step of the skill",
32
+ tool: "notify",
33
+ },
34
+ ],
35
+ });
36
+ `;
37
+
38
+ writeFileSync(filePath, content);
39
+ console.log(`✅ Created skill: ${filePath}`);
40
+ }
41
+
42
+ runAddSkill();
@@ -0,0 +1,45 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import * as process from "node:process";
4
+
5
+ function toPascalCase(str: string): string {
6
+ return str.replace(/[-_](.)/g, (_, char) => char.toUpperCase()).replace(/^(.)/, (_, char) => char.toUpperCase());
7
+ }
8
+
9
+ async function runAddTool() {
10
+ const toolName = process.argv[3];
11
+
12
+ if (!toolName) {
13
+ console.error("Usage: hive add-tool <name>");
14
+ process.exit(1);
15
+ }
16
+
17
+ const toolsDir = join(process.cwd(), "src", "tools");
18
+ const filePath = join(toolsDir, `${toolName}.ts`);
19
+
20
+ if (existsSync(filePath)) {
21
+ console.error(`Tool '${toolName}' already exists.`);
22
+ process.exit(1);
23
+ }
24
+
25
+ mkdirSync(toolsDir, { recursive: true });
26
+
27
+ const className = toPascalCase(toolName) + "Tool";
28
+
29
+ const content = `import { defineTool } from "@johpaz/hive-sdk";
30
+
31
+ export const ${toolName} = defineTool({
32
+ name: "${toolName}",
33
+ description: "Description of what ${toolName} does.",
34
+ execute: async (args: { input: string }) => {
35
+ // TODO: implement tool logic
36
+ return { result: args.input };
37
+ },
38
+ });
39
+ `;
40
+
41
+ writeFileSync(filePath, content);
42
+ console.log(`✅ Created tool: ${filePath}`);
43
+ }
44
+
45
+ runAddTool();
@@ -0,0 +1,49 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import * as process from "node:process";
4
+
5
+ function toPascalCase(str: string): string {
6
+ return str.replace(/[-_](.)/g, (_, char) => char.toUpperCase()).replace(/^(.)/, (_, char) => char.toUpperCase());
7
+ }
8
+
9
+ async function runAddWorker() {
10
+ const workerName = process.argv[3];
11
+
12
+ if (!workerName) {
13
+ console.error("Usage: hive add-worker <name>");
14
+ process.exit(1);
15
+ }
16
+
17
+ const workersDir = join(process.cwd(), "src", "workers");
18
+ const filePath = join(workersDir, `${workerName}.worker.ts`);
19
+
20
+ if (existsSync(filePath)) {
21
+ console.error(`Worker '${workerName}' already exists.`);
22
+ process.exit(1);
23
+ }
24
+
25
+ mkdirSync(workersDir, { recursive: true });
26
+
27
+ const className = toPascalCase(workerName) + "Worker";
28
+
29
+ const content = `import { createWorker } from "@johpaz/hive-sdk";
30
+
31
+ export const ${workerName}Worker = createWorker({
32
+ name: "${workerName}",
33
+ systemPrompt: \`
34
+ You are the ${className} specialist.
35
+ You handle tasks related to ${workerName} with precision and expertise.
36
+ Always provide clear, actionable results.
37
+ \`,
38
+ });
39
+
40
+ // Example usage:
41
+ // const result = await ${workerName}Worker.run("Your task here");
42
+ // console.log(result);
43
+ `;
44
+
45
+ writeFileSync(filePath, content);
46
+ console.log(`Created worker: ${filePath}`);
47
+ }
48
+
49
+ runAddWorker();
@@ -0,0 +1,32 @@
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, statSync } from "node:fs";
2
+ import { join, dirname } from "node:path";
3
+
4
+ const TEMPLATE_DIR = join(import.meta.dir, "..", "..", "templates", "hive-app");
5
+
6
+ export function copyTemplate(dest: string, replacements: Record<string, string>) {
7
+ if (!existsSync(TEMPLATE_DIR)) {
8
+ throw new Error("Template not found: " + TEMPLATE_DIR);
9
+ }
10
+
11
+ copyDir(TEMPLATE_DIR, dest, replacements);
12
+ }
13
+
14
+ function copyDir(src: string, dest: string, replacements: Record<string, string>) {
15
+ for (const entry of readdirSync(src)) {
16
+ const srcPath = join(src, entry);
17
+ const destPath = join(dest, entry);
18
+ const stat = statSync(srcPath);
19
+
20
+ if (stat.isDirectory()) {
21
+ mkdirSync(destPath, { recursive: true });
22
+ copyDir(srcPath, destPath, replacements);
23
+ } else {
24
+ let content = readFileSync(srcPath, "utf-8");
25
+ for (const [key, value] of Object.entries(replacements)) {
26
+ content = content.replaceAll(key, value);
27
+ }
28
+ mkdirSync(dirname(destPath), { recursive: true });
29
+ writeFileSync(destPath, content);
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,151 @@
1
+ import { describe, expect, it, beforeEach, afterEach } from "bun:test";
2
+ import { existsSync, rmSync, readFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import * as process from "node:process";
5
+
6
+ const TEST_DIR = join(process.cwd(), "test-create-app-output");
7
+
8
+ describe("hive create-app", () => {
9
+ beforeEach(() => {
10
+ // Clean up before each test
11
+ if (existsSync(TEST_DIR)) {
12
+ rmSync(TEST_DIR, { recursive: true });
13
+ }
14
+ });
15
+
16
+ afterEach(() => {
17
+ // Clean up after each test
18
+ if (existsSync(TEST_DIR)) {
19
+ rmSync(TEST_DIR, { recursive: true });
20
+ }
21
+ });
22
+
23
+ it("generates a hive-app template with correct structure", async () => {
24
+ const { copyTemplate } = await import("./create-app-utils.ts");
25
+
26
+ copyTemplate(TEST_DIR, { "{{APP_NAME}}": "my-test-app" });
27
+
28
+ // Check all expected files exist
29
+ expect(existsSync(join(TEST_DIR, "package.json"))).toBe(true);
30
+ expect(existsSync(join(TEST_DIR, "hive.config.ts"))).toBe(true);
31
+ expect(existsSync(join(TEST_DIR, "docker-compose.yml"))).toBe(true);
32
+ expect(existsSync(join(TEST_DIR, ".env.example"))).toBe(true);
33
+ expect(existsSync(join(TEST_DIR, ".gitignore"))).toBe(true);
34
+ expect(existsSync(join(TEST_DIR, "src", "main.ts"))).toBe(true);
35
+ expect(existsSync(join(TEST_DIR, "src", "agents", "coordinator.ts"))).toBe(true);
36
+ });
37
+
38
+ it("replaces {{APP_NAME}} placeholder in all files", async () => {
39
+ const { copyTemplate } = await import("./create-app-utils.ts");
40
+
41
+ copyTemplate(TEST_DIR, { "{{APP_NAME}}": "my-awesome-app" });
42
+
43
+ const packageJson = readFileSync(join(TEST_DIR, "package.json"), "utf-8");
44
+ expect(packageJson).toContain('"name": "my-awesome-app"');
45
+
46
+ const config = readFileSync(join(TEST_DIR, "hive.config.ts"), "utf-8");
47
+ expect(config).toContain('name: "my-awesome-app"');
48
+
49
+ const main = readFileSync(join(TEST_DIR, "src", "main.ts"), "utf-8");
50
+ expect(main).toContain("Starting my-awesome-app...");
51
+ expect(main).toContain("my-awesome-app is running at");
52
+ });
53
+
54
+ it("generates valid package.json", async () => {
55
+ const { copyTemplate } = await import("./create-app-utils.ts");
56
+
57
+ copyTemplate(TEST_DIR, { "{{APP_NAME}}": "test-app" });
58
+
59
+ const packageJson = JSON.parse(readFileSync(join(TEST_DIR, "package.json"), "utf-8"));
60
+
61
+ expect(packageJson.name).toBe("test-app");
62
+ expect(packageJson.version).toBe("0.1.0");
63
+ expect(packageJson.type).toBe("module");
64
+ expect(packageJson.scripts.dev).toBe("bun run src/main.ts");
65
+ expect(packageJson.scripts.build).toBeDefined();
66
+ expect(packageJson.dependencies["@johpaz/hive-sdk"]).toBe("latest");
67
+ });
68
+
69
+ it("generates hive.config.ts with correct defaults", async () => {
70
+ const { copyTemplate } = await import("./create-app-utils.ts");
71
+
72
+ copyTemplate(TEST_DIR, { "{{APP_NAME}}": "config-test" });
73
+
74
+ const config = readFileSync(join(TEST_DIR, "hive.config.ts"), "utf-8");
75
+
76
+ expect(config).toContain('host: process.env.HIVE_HOST ?? "127.0.0.1"');
77
+ expect(config).toContain('port: Number(process.env.HIVE_PORT ?? 18790)');
78
+ expect(config).toContain("webchat: { enabled: true }");
79
+ expect(config).toContain("telegram: { enabled: false }");
80
+ expect(config).toContain("discord: { enabled: false }");
81
+ expect(config).toContain("whatsapp: { enabled: false }");
82
+ expect(config).toContain("slack: { enabled: false }");
83
+ expect(config).toContain('path: process.env.HIVE_DATA_DIR ?? "./data/hive.db"');
84
+ });
85
+
86
+ it("generates main.ts with all required imports", async () => {
87
+ const { copyTemplate } = await import("./create-app-utils.ts");
88
+
89
+ copyTemplate(TEST_DIR, { "{{APP_NAME}}": "main-test" });
90
+
91
+ const main = readFileSync(join(TEST_DIR, "src", "main.ts"), "utf-8");
92
+
93
+ expect(main).toContain('from "@johpaz/hive-sdk"');
94
+ expect(main).toContain("createAgent");
95
+ expect(main).toContain("startGateway");
96
+ expect(main).toContain("initializeDatabase");
97
+ expect(main).toContain("ChannelManager");
98
+ expect(main).toContain("logger");
99
+ expect(main).toContain('import config from "../hive.config.ts"');
100
+ expect(main).toContain("await initializeDatabase()");
101
+ expect(main).toContain('await startGateway({');
102
+ expect(main).toContain('process.on("SIGINT"');
103
+ });
104
+
105
+ it("generates coordinator agent with correct config", async () => {
106
+ const { copyTemplate } = await import("./create-app-utils.ts");
107
+
108
+ copyTemplate(TEST_DIR, { "{{APP_NAME}}": "agent-test" });
109
+
110
+ const agent = readFileSync(join(TEST_DIR, "src", "agents", "coordinator.ts"), "utf-8");
111
+
112
+ expect(agent).toContain('import { createAgent } from "@johpaz/hive-sdk"');
113
+ expect(agent).toContain('name: "coordinator"');
114
+ expect(agent).toContain('provider: "openai"');
115
+ expect(agent).toContain('model: "gpt-4o-mini"');
116
+ });
117
+
118
+ it("generates docker-compose.yml with correct ports", async () => {
119
+ const { copyTemplate } = await import("./create-app-utils.ts");
120
+
121
+ copyTemplate(TEST_DIR, { "{{APP_NAME}}": "docker-test" });
122
+
123
+ const docker = readFileSync(join(TEST_DIR, "docker-compose.yml"), "utf-8");
124
+
125
+ expect(docker).toContain('image: oven/bun:latest');
126
+ expect(docker).toContain('"${HIVE_PORT:-18790}:18790"');
127
+ expect(docker).toContain('HIVE_HOST=0.0.0.0');
128
+ expect(docker).toContain('HIVE_PORT=18790');
129
+ expect(docker).toContain('command: ["bun", "run", "src/main.ts"]');
130
+ expect(docker).toContain('restart: unless-stopped');
131
+ });
132
+
133
+ it("generates .env.example with all required variables", async () => {
134
+ const { copyTemplate } = await import("./create-app-utils.ts");
135
+
136
+ copyTemplate(TEST_DIR, { "{{APP_NAME}}": "env-test" });
137
+
138
+ const env = readFileSync(join(TEST_DIR, ".env.example"), "utf-8");
139
+
140
+ expect(env).toContain("HIVE_HOST=");
141
+ expect(env).toContain("HIVE_PORT=");
142
+ expect(env).toContain("HIVE_DATA_DIR=");
143
+ expect(env).toContain("OPENAI_API_KEY=");
144
+ expect(env).toContain("ANTHROPIC_API_KEY=");
145
+ expect(env).toContain("GOOGLE_API_KEY=");
146
+ expect(env).toContain("TELEGRAM_BOT_TOKEN=");
147
+ expect(env).toContain("DISCORD_BOT_TOKEN=");
148
+ expect(env).toContain("SLACK_BOT_TOKEN=");
149
+ expect(env).toContain("LOG_LEVEL=");
150
+ });
151
+ });
@@ -0,0 +1,35 @@
1
+ import { existsSync, mkdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import * as process from "node:process";
4
+ import { copyTemplate } from "./create-app-utils.ts";
5
+
6
+ async function runCreateApp() {
7
+ const appName = process.argv[3];
8
+
9
+ if (!appName) {
10
+ console.error("Usage: hive create-app <name>");
11
+ process.exit(1);
12
+ }
13
+
14
+ const targetDir = join(process.cwd(), appName);
15
+
16
+ if (existsSync(targetDir)) {
17
+ console.error(`Directory '${appName}' already exists.`);
18
+ process.exit(1);
19
+ }
20
+
21
+ console.log(`Creating Hive app '${appName}'...`);
22
+
23
+ copyTemplate(targetDir, {
24
+ "{{APP_NAME}}": appName,
25
+ });
26
+
27
+ console.log(`\n✅ Created ${appName} in ${targetDir}`);
28
+ console.log("\nNext steps:");
29
+ console.log(` cd ${appName}`);
30
+ console.log(" bun install");
31
+ console.log(" cp .env.example .env");
32
+ console.log(" bun run dev");
33
+ }
34
+
35
+ runCreateApp();
@@ -0,0 +1,56 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import * as process from "node:process";
4
+
5
+ const TEMPLATE_DIR = join(import.meta.dir, "..", "..", "templates");
6
+
7
+ const HIVE_CONFIG = `{
8
+ "name": "my-hive-agent",
9
+ "version": "0.1.0",
10
+ "type": "module",
11
+ "dependencies": {
12
+ "@hive/core": "latest"
13
+ }
14
+ }
15
+ `;
16
+
17
+ const HIVE_AGENT_TS = `import { createAgent, defineTool } from "@hive/core";
18
+
19
+ const myTool = defineTool({
20
+ name: "hello",
21
+ description: "Say hello",
22
+ execute: async (args: { name?: string }) => {
23
+ return { greeting: \`Hello, \${args.name ?? "world"}!\` };
24
+ },
25
+ });
26
+
27
+ const agent = await createAgent({
28
+ name: "my-agent",
29
+ model: "gpt-4o",
30
+ provider: "openai",
31
+ tools: [myTool],
32
+ });
33
+
34
+ console.log("Agent ready:", agent.name);
35
+ `;
36
+
37
+ async function runInit() {
38
+ const targetDir = process.argv[3] || process.cwd();
39
+
40
+ if (existsSync(join(targetDir, "hive.json"))) {
41
+ console.error("A hive project already exists in this directory.");
42
+ process.exit(1);
43
+ }
44
+
45
+ writeFileSync(join(targetDir, "hive.json"), HIVE_CONFIG.trim());
46
+ writeFileSync(join(targetDir, "hive.agent.ts"), HIVE_AGENT_TS.trim());
47
+
48
+ console.log(`\nInitialized Hive project in ${targetDir}`);
49
+ console.log("\nFiles created:");
50
+ console.log(" hive.json - Project configuration");
51
+ console.log(" hive.agent.ts - Agent definition");
52
+ console.log("\nNext steps:");
53
+ console.log(" Run: hive run");
54
+ }
55
+
56
+ runInit();
@@ -0,0 +1,45 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ async function runCommand() {
5
+ const agentFile = findAgentFile();
6
+ if (!agentFile) {
7
+ console.error("No hive.agent.ts or hive.agent.js found in current directory.");
8
+ console.error("Run 'hive init' to create one.");
9
+ process.exit(1);
10
+ }
11
+
12
+ console.log(`Running agent from ${agentFile}...`);
13
+ const { createAgent } = await import("@hive/core");
14
+ const agentModule = await import(agentFile);
15
+
16
+ if (agentModule.agent) {
17
+ const input = process.argv[3] || process.env.HIVE_INPUT || "Hello!";
18
+ console.log(`\n--- Agent: ${agentModule.agent.name} ---`);
19
+ console.log(`Input: ${input}\n`);
20
+
21
+ for await (const event of agentModule.agent.chat(input)) {
22
+ if (event.type === "text") {
23
+ process.stdout.write(event.content);
24
+ } else if (event.type === "tool_call") {
25
+ console.log(`\n[Tool: ${event.name}]`);
26
+ }
27
+ }
28
+ console.log("\n--- Done ---");
29
+ } else {
30
+ console.error("Agent module does not export an 'agent' instance.");
31
+ process.exit(1);
32
+ }
33
+ }
34
+
35
+ function findAgentFile(): string | null {
36
+ const candidates = ["hive.agent.ts", "hive.agent.js", "agent.ts", "agent.js"];
37
+ const cwd = process.cwd();
38
+ for (const name of candidates) {
39
+ const full = join(cwd, name);
40
+ if (existsSync(full)) return full;
41
+ }
42
+ return null;
43
+ }
44
+
45
+ runCommand();