@johpaz/hive-agents 0.0.37 → 0.0.39

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 (223) hide show
  1. package/README.md +18 -18
  2. package/dist/hive.js +3529 -2702
  3. package/dist/tool-worker.js +2110 -1856
  4. package/dist/ui/assets/AgentCreateForm-BTCzFbca.js +1 -0
  5. package/dist/ui/assets/AgentDetailPage-o27TRSVw.js +1 -0
  6. package/dist/ui/assets/AgentNewPage-400cCpYt.js +1 -0
  7. package/dist/ui/{dist/assets/AgentsPage-YvSgWRiw.js → assets/AgentsPage-C-GSRk-N.js} +5 -5
  8. package/dist/ui/assets/ApiClientPage-BOTpz6oP.js +3 -0
  9. package/dist/ui/assets/{CanvasPage-DtMwGvxf.js → CanvasPage-Cvs5ctza.js} +7 -7
  10. package/dist/ui/assets/ChannelsPage-C5m_L7P9.js +8 -0
  11. package/dist/ui/{dist/assets/DashboardPage-ghl1ZguH.js → assets/DashboardPage-CztbRQdm.js} +2 -2
  12. package/dist/ui/assets/{LoginPage-CAmSI9Vy.js → LoginPage-OMsrx5oj.js} +1 -1
  13. package/dist/ui/assets/LogsPage-CcYYwjgF.js +1 -0
  14. package/dist/ui/{dist/assets/MeetingPage-WjjGOqqU.js → assets/MeetingPage-CrKVAfe6.js} +1 -1
  15. package/dist/ui/assets/{NotFound-BMeQSGcG.js → NotFound-GbAJDgoD.js} +1 -1
  16. package/dist/ui/assets/ProvidersPage-uqPcZUSV.js +1 -0
  17. package/dist/ui/{dist/assets/RecoverPage-DpW3l-yv.js → assets/RecoverPage-CwB2ByCU.js} +1 -1
  18. package/dist/ui/assets/SettingsPage-DKLlye0z.js +9 -0
  19. package/dist/ui/assets/SetupPage-DOVh1ldK.js +1 -0
  20. package/dist/ui/assets/WebChatPage-c-7S9jnT.js +16 -0
  21. package/dist/ui/assets/accordion-DAbcVQCn.js +1 -0
  22. package/dist/ui/{dist/assets/alert-C-NE-P3s.js → assets/alert-D_2Y3qjL.js} +1 -1
  23. package/dist/ui/{dist/assets/alert-dialog-C5mzbHdP.js → assets/alert-dialog-CpMxaNcu.js} +1 -1
  24. package/dist/ui/assets/{badge-ChpACfWO.js → badge-CxTPR6_t.js} +1 -1
  25. package/dist/ui/assets/bell-8BqRYmzf.js +1 -0
  26. package/dist/ui/assets/circle-x-Bv6WrUJo.js +1 -0
  27. package/dist/ui/assets/copy-dU94ZGsi.js +1 -0
  28. package/dist/ui/{dist/assets/dialog-QnZ0ad8O.js → assets/dialog-DfS3idb3.js} +1 -1
  29. package/dist/ui/{dist/assets/dropdown-menu-BK-CO3Od.js → assets/dropdown-menu-BdCbAW1z.js} +1 -1
  30. package/dist/ui/assets/{es-NQNoaWDx.js → es-Cz5h9_84.js} +1 -1
  31. package/dist/ui/assets/index-CmGm_r89.js +116 -0
  32. package/dist/ui/assets/index-T7HgphSn.css +2 -0
  33. package/dist/ui/{dist/assets/label-D2H1IR_J.js → assets/label-byJkqOYq.js} +1 -1
  34. package/dist/ui/assets/progress-Dtz-Mzys.js +1 -0
  35. package/dist/ui/assets/scroll-area-BXtLsE9E.js +1 -0
  36. package/dist/ui/assets/search-BGmPJ-6L.js +1 -0
  37. package/dist/ui/assets/select-Cl16QYa_.js +1 -0
  38. package/dist/ui/assets/send-BuQcUO-R.js +1 -0
  39. package/dist/ui/assets/shield-C-05qB-2.js +1 -0
  40. package/dist/ui/{dist/assets/slider-CsiUDxc3.js → assets/slider-D2I0qven.js} +1 -1
  41. package/dist/ui/assets/switch-h2SfQX4B.js +1 -0
  42. package/dist/ui/assets/table-CVkIRJKK.js +1 -0
  43. package/dist/ui/assets/tabs-C619jxbO.js +1 -0
  44. package/dist/ui/assets/textarea-wvA-FDjO.js +1 -0
  45. package/dist/ui/assets/useProviders-eEri6BAc.js +1 -0
  46. package/dist/ui/{dist/assets/vendor-radix-cw1bQaVC.js → assets/vendor-radix-D6rA7xKY.js} +4 -4
  47. package/dist/ui/assets/{vendor-react-D4s9E-zj.js → vendor-react-BU5iQU4f.js} +1 -1
  48. package/dist/ui/dist/assets/AgentCreateForm-BTCzFbca.js +1 -0
  49. package/dist/ui/dist/assets/AgentDetailPage-o27TRSVw.js +1 -0
  50. package/dist/ui/dist/assets/AgentNewPage-400cCpYt.js +1 -0
  51. package/dist/ui/{assets/AgentsPage-YvSgWRiw.js → dist/assets/AgentsPage-C-GSRk-N.js} +5 -5
  52. package/dist/ui/dist/assets/ApiClientPage-BOTpz6oP.js +3 -0
  53. package/dist/ui/dist/assets/{CanvasPage-DtMwGvxf.js → CanvasPage-Cvs5ctza.js} +7 -7
  54. package/dist/ui/dist/assets/ChannelsPage-C5m_L7P9.js +8 -0
  55. package/dist/ui/{assets/DashboardPage-ghl1ZguH.js → dist/assets/DashboardPage-CztbRQdm.js} +2 -2
  56. package/dist/ui/dist/assets/{LoginPage-CAmSI9Vy.js → LoginPage-OMsrx5oj.js} +1 -1
  57. package/dist/ui/dist/assets/LogsPage-CcYYwjgF.js +1 -0
  58. package/dist/ui/{assets/MeetingPage-WjjGOqqU.js → dist/assets/MeetingPage-CrKVAfe6.js} +1 -1
  59. package/dist/ui/dist/assets/{NotFound-BMeQSGcG.js → NotFound-GbAJDgoD.js} +1 -1
  60. package/dist/ui/dist/assets/ProvidersPage-uqPcZUSV.js +1 -0
  61. package/dist/ui/{assets/RecoverPage-DpW3l-yv.js → dist/assets/RecoverPage-CwB2ByCU.js} +1 -1
  62. package/dist/ui/dist/assets/SettingsPage-DKLlye0z.js +9 -0
  63. package/dist/ui/dist/assets/SetupPage-DOVh1ldK.js +1 -0
  64. package/dist/ui/dist/assets/WebChatPage-c-7S9jnT.js +16 -0
  65. package/dist/ui/dist/assets/accordion-DAbcVQCn.js +1 -0
  66. package/dist/ui/{assets/alert-C-NE-P3s.js → dist/assets/alert-D_2Y3qjL.js} +1 -1
  67. package/dist/ui/{assets/alert-dialog-C5mzbHdP.js → dist/assets/alert-dialog-CpMxaNcu.js} +1 -1
  68. package/dist/ui/dist/assets/{badge-ChpACfWO.js → badge-CxTPR6_t.js} +1 -1
  69. package/dist/ui/dist/assets/bell-8BqRYmzf.js +1 -0
  70. package/dist/ui/dist/assets/circle-x-Bv6WrUJo.js +1 -0
  71. package/dist/ui/dist/assets/copy-dU94ZGsi.js +1 -0
  72. package/dist/ui/{assets/dialog-QnZ0ad8O.js → dist/assets/dialog-DfS3idb3.js} +1 -1
  73. package/dist/ui/{assets/dropdown-menu-BK-CO3Od.js → dist/assets/dropdown-menu-BdCbAW1z.js} +1 -1
  74. package/dist/ui/dist/assets/{es-NQNoaWDx.js → es-Cz5h9_84.js} +1 -1
  75. package/dist/ui/dist/assets/index-CmGm_r89.js +116 -0
  76. package/dist/ui/dist/assets/index-T7HgphSn.css +2 -0
  77. package/dist/ui/{assets/label-D2H1IR_J.js → dist/assets/label-byJkqOYq.js} +1 -1
  78. package/dist/ui/dist/assets/progress-Dtz-Mzys.js +1 -0
  79. package/dist/ui/dist/assets/scroll-area-BXtLsE9E.js +1 -0
  80. package/dist/ui/dist/assets/search-BGmPJ-6L.js +1 -0
  81. package/dist/ui/dist/assets/select-Cl16QYa_.js +1 -0
  82. package/dist/ui/dist/assets/send-BuQcUO-R.js +1 -0
  83. package/dist/ui/dist/assets/shield-C-05qB-2.js +1 -0
  84. package/dist/ui/{assets/slider-CsiUDxc3.js → dist/assets/slider-D2I0qven.js} +1 -1
  85. package/dist/ui/dist/assets/switch-h2SfQX4B.js +1 -0
  86. package/dist/ui/dist/assets/table-CVkIRJKK.js +1 -0
  87. package/dist/ui/dist/assets/tabs-C619jxbO.js +1 -0
  88. package/dist/ui/dist/assets/textarea-wvA-FDjO.js +1 -0
  89. package/dist/ui/dist/assets/useProviders-eEri6BAc.js +1 -0
  90. package/dist/ui/{assets/vendor-radix-cw1bQaVC.js → dist/assets/vendor-radix-D6rA7xKY.js} +4 -4
  91. package/dist/ui/dist/assets/{vendor-react-D4s9E-zj.js → vendor-react-BU5iQU4f.js} +1 -1
  92. package/dist/ui/dist/index.html +6 -6
  93. package/dist/ui/index.html +6 -6
  94. package/package.json +1 -1
  95. package/packages/cli/src/adapters/binary.ts +8 -4
  96. package/packages/cli/src/adapters/bun-global.ts +5 -1
  97. package/packages/cli/src/adapters/config.ts +4 -3
  98. package/packages/cli/src/adapters/docker.ts +2 -1
  99. package/packages/cli/src/commands/gateway.ts +123 -9
  100. package/packages/cli/src/commands/logs.ts +2 -1
  101. package/packages/cli/src/commands/onboard.ts +1 -1
  102. package/packages/cli/src/commands/sessions.ts +2 -1
  103. package/packages/cli/src/commands/skills.ts +2 -1
  104. package/packages/core/src/agent/agent-loop.ts +4 -14
  105. package/packages/core/src/agent/context-compiler.ts +1 -1
  106. package/packages/core/src/agent/conversation-store.ts +4 -5
  107. package/packages/core/src/agent/llm-client.ts +4 -0
  108. package/packages/core/src/agent/llm-providers/anthropic.ts +23 -8
  109. package/packages/core/src/agent/llm-providers/interface.ts +5 -1
  110. package/packages/core/src/agent/llm-providers/minimax.ts +13 -0
  111. package/packages/core/src/agent/llm-providers/opencode-go.ts +9 -0
  112. package/packages/core/src/agent/providers/index.ts +3 -4
  113. package/packages/core/src/agent/tool-selector.ts +3 -4
  114. package/packages/core/src/channels/whatsapp.ts +13 -1
  115. package/packages/core/src/config/loader.ts +7 -7
  116. package/packages/core/src/gateway/helpers/path.ts +2 -1
  117. package/packages/core/src/gateway/initializer.ts +4 -4
  118. package/packages/core/src/gateway/llm-local/downloader.ts +130 -11
  119. package/packages/core/src/gateway/llm-local/index.ts +2 -0
  120. package/packages/core/src/gateway/llm-local/models.ts +4 -3
  121. package/packages/core/src/gateway/resolver.ts +5 -1
  122. package/packages/core/src/gateway/router.ts +7 -5
  123. package/packages/core/src/gateway/routes/chat.ts +16 -16
  124. package/packages/core/src/gateway/routes/http-client.ts +16 -0
  125. package/packages/core/src/gateway/routes/llm-local.ts +51 -5
  126. package/packages/core/src/gateway/routes/providers.ts +43 -2
  127. package/packages/core/src/gateway/server.ts +55 -47
  128. package/packages/core/src/gateway/tts/src/install.ts +17 -9
  129. package/packages/core/src/storage/crypto.ts +152 -20
  130. package/packages/core/src/storage/migrate.ts +51 -18
  131. package/packages/core/src/storage/seed.ts +77 -35
  132. package/packages/core/src/tool-runtime/index.ts +42 -1
  133. package/packages/core/src/tools/api/api-request.ts +174 -0
  134. package/packages/core/src/tools/api/index.ts +16 -0
  135. package/packages/core/src/tools/index.ts +12 -0
  136. package/packages/core/src/tools/web/browser-click.ts +2 -2
  137. package/packages/core/src/tools/web/browser-extract.ts +22 -6
  138. package/packages/core/src/tools/web/browser-navigate.ts +34 -18
  139. package/packages/core/src/tools/web/browser-screenshot.ts +40 -8
  140. package/packages/core/src/tools/web/browser-script.ts +2 -2
  141. package/packages/core/src/tools/web/browser-service.ts +295 -341
  142. package/packages/core/src/tools/web/browser-type.ts +5 -10
  143. package/packages/core/src/tools/web/browser-wait.ts +2 -2
  144. package/packages/core/src/tools/web/index.ts +1 -1
  145. package/packages/core/src/utils/logger.ts +2 -1
  146. package/packages/mcp/src/manager.ts +2 -1
  147. package/packages/skills/src/bundled/api/api_client/SKILL.md +132 -0
  148. package/packages/skills/src/bundled-data.generated.ts +1274 -1217
  149. package/packages/skills/src/loader.ts +2 -1
  150. package/dist/ui/assets/AgentCreateForm-tJZv9FZC.js +0 -1
  151. package/dist/ui/assets/AgentDetailPage-Du-mRcAX.js +0 -1
  152. package/dist/ui/assets/AgentNewPage-DIFYd_Ys.js +0 -1
  153. package/dist/ui/assets/ChannelsPage-BdBXWHjj.js +0 -8
  154. package/dist/ui/assets/LogsPage-DAPBHkwK.js +0 -1
  155. package/dist/ui/assets/ProvidersPage-Ct6HsAi1.js +0 -1
  156. package/dist/ui/assets/SettingsPage-DBJ7_E6C.js +0 -9
  157. package/dist/ui/assets/SetupPage-DKmLVUaj.js +0 -1
  158. package/dist/ui/assets/WebChatPage-CVRcKept.js +0 -16
  159. package/dist/ui/assets/accordion-C5d5Rm5z.js +0 -1
  160. package/dist/ui/assets/globe-DeCQTCDJ.js +0 -1
  161. package/dist/ui/assets/index-B2fCYtTS.css +0 -2
  162. package/dist/ui/assets/index-DMCjjdqf.js +0 -116
  163. package/dist/ui/assets/progress-BherYzY6.js +0 -1
  164. package/dist/ui/assets/scroll-area-DkeyX32e.js +0 -1
  165. package/dist/ui/assets/send-B0H5SEIE.js +0 -1
  166. package/dist/ui/assets/switch-BDwN8RYV.js +0 -1
  167. package/dist/ui/assets/table-CSc8ubon.js +0 -1
  168. package/dist/ui/assets/textarea-CXgXWKrT.js +0 -1
  169. package/dist/ui/assets/useProviders-C6_QHsEi.js +0 -1
  170. package/dist/ui/dist/assets/AgentCreateForm-tJZv9FZC.js +0 -1
  171. package/dist/ui/dist/assets/AgentDetailPage-Du-mRcAX.js +0 -1
  172. package/dist/ui/dist/assets/AgentNewPage-DIFYd_Ys.js +0 -1
  173. package/dist/ui/dist/assets/ChannelsPage-BdBXWHjj.js +0 -8
  174. package/dist/ui/dist/assets/LogsPage-DAPBHkwK.js +0 -1
  175. package/dist/ui/dist/assets/ProvidersPage-Ct6HsAi1.js +0 -1
  176. package/dist/ui/dist/assets/SettingsPage-DBJ7_E6C.js +0 -9
  177. package/dist/ui/dist/assets/SetupPage-DKmLVUaj.js +0 -1
  178. package/dist/ui/dist/assets/WebChatPage-CVRcKept.js +0 -16
  179. package/dist/ui/dist/assets/accordion-C5d5Rm5z.js +0 -1
  180. package/dist/ui/dist/assets/globe-DeCQTCDJ.js +0 -1
  181. package/dist/ui/dist/assets/index-B2fCYtTS.css +0 -2
  182. package/dist/ui/dist/assets/index-DMCjjdqf.js +0 -116
  183. package/dist/ui/dist/assets/progress-BherYzY6.js +0 -1
  184. package/dist/ui/dist/assets/scroll-area-DkeyX32e.js +0 -1
  185. package/dist/ui/dist/assets/send-B0H5SEIE.js +0 -1
  186. package/dist/ui/dist/assets/switch-BDwN8RYV.js +0 -1
  187. package/dist/ui/dist/assets/table-CSc8ubon.js +0 -1
  188. package/dist/ui/dist/assets/textarea-CXgXWKrT.js +0 -1
  189. package/dist/ui/dist/assets/useProviders-C6_QHsEi.js +0 -1
  190. /package/dist/ui/assets/{card-CNf6BS2e.js → card-CXAm46at.js} +0 -0
  191. /package/dist/ui/assets/{cpu-Cdgc_B1K.js → cpu-DSpPVLAz.js} +0 -0
  192. /package/dist/ui/assets/{download-C3ifGMjJ.js → download-D9ZyUZZR.js} +0 -0
  193. /package/dist/ui/assets/{external-link-BvxYeTP1.js → external-link-CHPbUorN.js} +0 -0
  194. /package/dist/ui/assets/{eye-DqNTU_GD.js → eye-epHJZ_nQ.js} +0 -0
  195. /package/dist/ui/assets/{file-text-BT_9S9SM.js → file-text-BEjEmgby.js} +0 -0
  196. /package/dist/ui/assets/{folder-open-BhH8y9ac.js → folder-open-iQMHVEqS.js} +0 -0
  197. /package/dist/ui/assets/{format-GVHeOyWI.js → format-oFACFaca.js} +0 -0
  198. /package/dist/ui/assets/{gateway-url-COCbW0IR.js → gateway-url-iG-C6Agn.js} +0 -0
  199. /package/dist/ui/assets/{gauge-D_TMa4i9.js → gauge-D0_GMEcq.js} +0 -0
  200. /package/dist/ui/assets/{settings-Ds4SqD8s.js → settings-CcMGI1iU.js} +0 -0
  201. /package/dist/ui/assets/{sparkles-yUEb-7oH.js → sparkles-D6fx8JC5.js} +0 -0
  202. /package/dist/ui/assets/{trash-2-CNjMkoq6.js → trash-2-BHRa5ft9.js} +0 -0
  203. /package/dist/ui/assets/{triangle-alert-C9Y8Ub4X.js → triangle-alert-D4nwAVbc.js} +0 -0
  204. /package/dist/ui/assets/{vendor-router-C9pIYwbJ.js → vendor-router-pCP7sjma.js} +0 -0
  205. /package/dist/ui/assets/{volume-2-CeSXNDv4.js → volume-2-B6tkRy2u.js} +0 -0
  206. /package/dist/ui/assets/{zap-hlXjpSeA.js → zap-QO7iWMRg.js} +0 -0
  207. /package/dist/ui/dist/assets/{card-CNf6BS2e.js → card-CXAm46at.js} +0 -0
  208. /package/dist/ui/dist/assets/{cpu-Cdgc_B1K.js → cpu-DSpPVLAz.js} +0 -0
  209. /package/dist/ui/dist/assets/{download-C3ifGMjJ.js → download-D9ZyUZZR.js} +0 -0
  210. /package/dist/ui/dist/assets/{external-link-BvxYeTP1.js → external-link-CHPbUorN.js} +0 -0
  211. /package/dist/ui/dist/assets/{eye-DqNTU_GD.js → eye-epHJZ_nQ.js} +0 -0
  212. /package/dist/ui/dist/assets/{file-text-BT_9S9SM.js → file-text-BEjEmgby.js} +0 -0
  213. /package/dist/ui/dist/assets/{folder-open-BhH8y9ac.js → folder-open-iQMHVEqS.js} +0 -0
  214. /package/dist/ui/dist/assets/{format-GVHeOyWI.js → format-oFACFaca.js} +0 -0
  215. /package/dist/ui/dist/assets/{gateway-url-COCbW0IR.js → gateway-url-iG-C6Agn.js} +0 -0
  216. /package/dist/ui/dist/assets/{gauge-D_TMa4i9.js → gauge-D0_GMEcq.js} +0 -0
  217. /package/dist/ui/dist/assets/{settings-Ds4SqD8s.js → settings-CcMGI1iU.js} +0 -0
  218. /package/dist/ui/dist/assets/{sparkles-yUEb-7oH.js → sparkles-D6fx8JC5.js} +0 -0
  219. /package/dist/ui/dist/assets/{trash-2-CNjMkoq6.js → trash-2-BHRa5ft9.js} +0 -0
  220. /package/dist/ui/dist/assets/{triangle-alert-C9Y8Ub4X.js → triangle-alert-D4nwAVbc.js} +0 -0
  221. /package/dist/ui/dist/assets/{vendor-router-C9pIYwbJ.js → vendor-router-pCP7sjma.js} +0 -0
  222. /package/dist/ui/dist/assets/{volume-2-CeSXNDv4.js → volume-2-B6tkRy2u.js} +0 -0
  223. /package/dist/ui/dist/assets/{zap-hlXjpSeA.js → zap-QO7iWMRg.js} +0 -0
@@ -53,7 +53,7 @@ export const browserTypeTool: Tool = {
53
53
  log.warn("Browser not available");
54
54
  return {
55
55
  ok: false,
56
- error: "Browser automation not available. Install Chrome/Chromium.",
56
+ error: "Browser automation not available. Install agent-browser.",
57
57
  };
58
58
  }
59
59
 
@@ -61,24 +61,19 @@ export const browserTypeTool: Tool = {
61
61
 
62
62
  try {
63
63
  const view = await browserService.getView();
64
- if (!view) return { ok: false, error: "Browser automation not available. Install Chrome/Chromium." };
64
+ if (!view) return { ok: false, error: "Browser automation not available. Install agent-browser." };
65
65
 
66
66
  if (url) {
67
67
  await view.navigate(url);
68
68
  await Bun.sleep(500);
69
69
  }
70
70
 
71
- // click(selector) waits for actionability then focuses the element
72
- await view.click(selector, { timeout });
73
-
74
71
  if (clear) {
75
- // Ctrl+A Backspace to clear existing content
76
- await view.press("a", { modifiers: ["Control"] });
77
- await view.press("Backspace");
72
+ await (view as any).fill(selector, text);
73
+ } else {
74
+ await (view as any).typeIn(selector, text);
78
75
  }
79
76
 
80
- await view.type(text);
81
-
82
77
  const currentUrl = view.url;
83
78
  log.info(`Type successful: "${text.substring(0, 50)}${text.length > 50 ? "..." : ""}" into ${selector}`);
84
79
 
@@ -54,7 +54,7 @@ export const browserWaitTool: Tool = {
54
54
  log.warn("Browser not available");
55
55
  return {
56
56
  ok: false,
57
- error: "Browser automation not available. Install Chrome/Chromium.",
57
+ error: "Browser automation not available. Install agent-browser.",
58
58
  };
59
59
  }
60
60
 
@@ -69,7 +69,7 @@ export const browserWaitTool: Tool = {
69
69
 
70
70
  try {
71
71
  const view = await browserService.getView();
72
- if (!view) return { ok: false, error: "Browser automation not available. Install Chrome/Chromium." };
72
+ if (!view) return { ok: false, error: "Browser automation not available. Install agent-browser." };
73
73
 
74
74
  if (url) {
75
75
  await view.navigate(url);
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Web Tools - Browser automation + Web utilities
3
3
  *
4
- * Browser tools use Puppeteer/Chromium (auto-managed).
4
+ * Browser tools use agent-browser (Rust CLI, auto-managed).
5
5
  */
6
6
 
7
7
  import type { Tool } from "../types.ts";
@@ -1,5 +1,6 @@
1
1
  import { mkdirSync, unlinkSync, renameSync, existsSync } from "node:fs";
2
2
  import * as path from "node:path";
3
+ import { homedir } from "node:os";
3
4
  import { getHiveDir, loadConfig } from "../config/loader.ts";
4
5
 
5
6
  export type LogLevel = "debug" | "info" | "warn" | "error";
@@ -81,7 +82,7 @@ const COLORS = {
81
82
 
82
83
  function expandPath(p: string): string {
83
84
  if (p.startsWith("~")) {
84
- return path.join(process.env.HOME || "", p.slice(1));
85
+ return path.join(homedir(), p.slice(1));
85
86
  }
86
87
  return p;
87
88
  }
@@ -3,6 +3,7 @@ import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
3
3
  import type { MCPConfig, MCPServerConfig } from "./config";
4
4
  import { logger, type LogHandler } from "./logger";
5
5
  import * as path from "node:path";
6
+ import { homedir } from "node:os";
6
7
  import {
7
8
  createTransport,
8
9
  type TransportType,
@@ -139,7 +140,7 @@ export class MCPClientManager {
139
140
 
140
141
  private expandPath(p: string): string {
141
142
  if (p.startsWith("~")) {
142
- return path.join(process.env.HOME ?? "", p.slice(1));
143
+ return path.join(homedir(), p.slice(1));
143
144
  }
144
145
  return p;
145
146
  }
@@ -0,0 +1,132 @@
1
+ ---
2
+ name: api_client
3
+ description: "Make HTTP requests to REST APIs using curl-like methods (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS)"
4
+ version: 1.0.0
5
+ author: Hive Team
6
+ icon: "🌐"
7
+ category: api
8
+ permissions:
9
+ - internet_access
10
+ dependencies: []
11
+ tools: [api_request]
12
+
13
+ # Structured skill fields
14
+ triggers:
15
+ - "llama a la api"
16
+ - "llama al api"
17
+ - "consume la api"
18
+ - "haz una petición"
19
+ - "haz un request"
20
+ - "envía un post"
21
+ - "envía un put"
22
+ - "envía un delete"
23
+ - "curl"
24
+ - "api request"
25
+ - "rest api"
26
+ - "endpoint"
27
+ - "webhook"
28
+ - "integrar con api"
29
+ - "conectar con api"
30
+ - "obtener datos de api"
31
+ - "enviar datos a api"
32
+
33
+ preferred_agents: []
34
+
35
+ steps:
36
+ - step: 1
37
+ action: api_request
38
+ instruction: "Call the API endpoint with the correct HTTP method, headers, and body. Always include Content-Type and Authorization if required by the API."
39
+ params:
40
+ method: "GET | POST | PUT | DELETE | PATCH"
41
+ url: "https://api.example.com/endpoint"
42
+ headers:
43
+ Content-Type: "application/json"
44
+ Authorization: "Bearer TOKEN_IF_NEEDED"
45
+ body: '{"key":"value"}'
46
+ output: api_response
47
+
48
+ - step: 2
49
+ action: validate
50
+ instruction: "Check the response status. If 2xx, extract and present the data. If 4xx/5xx, analyze the error and suggest fixes (missing auth, wrong payload, rate limit)."
51
+ output: validated_result
52
+
53
+ rules:
54
+ - "Always use api_request instead of web_fetch when you need custom headers, body, or non-GET methods"
55
+ - "Never expose API keys or tokens in the final response to the user — mention they are handled securely"
56
+ - "If the API returns JSON, parse and present it in a readable format (tables, lists, markdown)"
57
+ - "For paginated APIs, indicate if more pages exist and offer to fetch them"
58
+ - "Respect rate limits — if a 429 is returned, wait and retry or inform the user"
59
+ - "Always include the Content-Type header when sending a body (usually application/json)"
60
+ - "Use query_params object instead of manually appending to the URL"
61
+ - "If the user provides a curl command, translate it into api_request parameters"
62
+
63
+ output_format:
64
+ structure: markdown
65
+ sections:
66
+ - "summary"
67
+ - "request_details"
68
+ - "response_data"
69
+ - "next_steps"
70
+ max_length: "800 words unless user requests full raw response"
71
+
72
+ examples:
73
+ - user_input: "haz un get a https://api.github.com/users/octocat"
74
+ expected_behavior: "api_request({ method: 'GET', url: 'https://api.github.com/users/octocat' }) → parse JSON → show key fields"
75
+
76
+ - user_input: "envía un post a https://httpbin.org/post con {nombre: 'Juan'}"
77
+ expected_behavior: "api_request({ method: 'POST', url: 'https://httpbin.org/post', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({nombre:'Juan'}) }) → show response"
78
+
79
+ - user_input: "actualiza el recurso 123 en la API con {status: 'active'}"
80
+ expected_behavior: "api_request({ method: 'PUT', url: '.../123', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ...' }, body: JSON.stringify({status:'active'}) }) → confirm update"
81
+
82
+ - user_input: "curl -X DELETE https://api.example.com/items/456 -H 'Authorization: Bearer token123'"
83
+ expected_behavior: "Translate curl to api_request({ method: 'DELETE', url: 'https://api.example.com/items/456', headers: { 'Authorization': 'Bearer token123' } }) → confirm deletion"
84
+ ---
85
+
86
+ # API Client Skill
87
+
88
+ ## Cuándo se Activa
89
+
90
+ Esta skill se activa cuando el usuario necesita interactuar con una API REST: consultar datos, crear recursos, actualizar, eliminar, o cualquier operación HTTP.
91
+
92
+ ## Herramientas Disponibles
93
+
94
+ | Tool | Qué hace | Cuándo usarla |
95
+ |------|----------|---------------|
96
+ | `api_request` | Realiza peticiones HTTP completas (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS) con headers, body, query params y timeout | Siempre que necesites llamar un endpoint REST, webhook, o servicio externo |
97
+
98
+ ## Parámetros de api_request
99
+
100
+ - `method` (requerido): GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS
101
+ - `url` (requerido): URL completa del endpoint
102
+ - `headers` (opcional): objeto con headers HTTP. Ej: `{ "Authorization": "Bearer TOKEN", "Content-Type": "application/json" }`
103
+ - `body` (opcional): cuerpo de la petición como string. Para JSON, enviar JSON.stringify(objeto)
104
+ - `query_params` (opcional): parámetros de query que se codificarán automáticamente en la URL
105
+ - `timeout_ms` (opcional): timeout en ms. Default: 30000. Máx: 120000
106
+
107
+ ## Diferencia con web_fetch
108
+
109
+ - `web_fetch`: solo GET, sin headers custom, ideal para scraping de páginas web
110
+ - `api_request`: cualquier método HTTP, headers custom, body, query params — ideal para APIs REST
111
+
112
+ ## Workflow
113
+
114
+ 1. **Identificar endpoint y método** → Determinar URL, método, headers necesarios
115
+ 2. **Construir request** → `api_request({ method, url, headers, body })`
116
+ 3. **Validar respuesta** → Si 2xx: extraer datos. Si error: analizar y sugerir fix
117
+ 4. **Presentar resultados** → JSON parseado en formato legible, no crudo a menos que se pida
118
+
119
+ ## Mejores Prácticas
120
+
121
+ - Siempre enviar `Content-Type: application/json` cuando el body es JSON
122
+ - Usar `query_params` en lugar de append manual a la URL
123
+ - No exponer tokens/secrets en la respuesta final al usuario
124
+ - Si la API requiere auth, pedirla al usuario o usar variables de entorno
125
+ - Para errores 4xx, revisar: auth, formato del body, campos requeridos, rate limits
126
+
127
+ ## Errores a Evitar
128
+
129
+ - ❌ Usar web_fetch para POST/PUT/DELETE con headers
130
+ - ❌ Enviar objetos directamente en body (debe ser string)
131
+ - ❌ Olvidar Content-Type al enviar JSON
132
+ - ❌ Exponer API keys en la respuesta visible