@johpaz/hive-agents 0.0.38 → 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 (214) hide show
  1. package/README.md +18 -18
  2. package/dist/hive.js +3428 -2603
  3. package/dist/tool-worker.js +2085 -1820
  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-DGNLDXjR.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-CnMO1FN8.js → CanvasPage-Cvs5ctza.js} +7 -7
  10. package/dist/ui/assets/ChannelsPage-C5m_L7P9.js +8 -0
  11. package/dist/ui/{dist/assets/DashboardPage-VyXXp3U1.js → assets/DashboardPage-CztbRQdm.js} +2 -2
  12. package/dist/ui/assets/{LoginPage-DPj2s2Qq.js → LoginPage-OMsrx5oj.js} +1 -1
  13. package/dist/ui/assets/LogsPage-CcYYwjgF.js +1 -0
  14. package/dist/ui/{dist/assets/MeetingPage-2ky_hKiG.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-B-hDZUM2.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/{dist/assets/WebChatPage-BuGT2AL0.js → assets/WebChatPage-c-7S9jnT.js} +2 -2
  21. package/dist/ui/assets/accordion-DAbcVQCn.js +1 -0
  22. package/dist/ui/{dist/assets/alert-Bq6awLlW.js → assets/alert-D_2Y3qjL.js} +1 -1
  23. package/dist/ui/{dist/assets/alert-dialog-DQvltYmf.js → assets/alert-dialog-CpMxaNcu.js} +1 -1
  24. package/dist/ui/assets/{badge-DXUDdTed.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-bI9jImCS.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-Cg8zdT52.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-CrH0Jj3v.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/assets/{slider-CsiUDxc3.js → 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-DGNLDXjR.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-CnMO1FN8.js → CanvasPage-Cvs5ctza.js} +7 -7
  54. package/dist/ui/dist/assets/ChannelsPage-C5m_L7P9.js +8 -0
  55. package/dist/ui/{assets/DashboardPage-VyXXp3U1.js → dist/assets/DashboardPage-CztbRQdm.js} +2 -2
  56. package/dist/ui/dist/assets/{LoginPage-DPj2s2Qq.js → LoginPage-OMsrx5oj.js} +1 -1
  57. package/dist/ui/dist/assets/LogsPage-CcYYwjgF.js +1 -0
  58. package/dist/ui/{assets/MeetingPage-2ky_hKiG.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-B-hDZUM2.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/{assets/WebChatPage-BuGT2AL0.js → dist/assets/WebChatPage-c-7S9jnT.js} +2 -2
  65. package/dist/ui/dist/assets/accordion-DAbcVQCn.js +1 -0
  66. package/dist/ui/{assets/alert-Bq6awLlW.js → dist/assets/alert-D_2Y3qjL.js} +1 -1
  67. package/dist/ui/{assets/alert-dialog-DQvltYmf.js → dist/assets/alert-dialog-CpMxaNcu.js} +1 -1
  68. package/dist/ui/dist/assets/{badge-DXUDdTed.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-bI9jImCS.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-Cg8zdT52.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-CrH0Jj3v.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/dist/assets/{slider-CsiUDxc3.js → 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/llm-client.ts +4 -0
  105. package/packages/core/src/agent/llm-providers/anthropic.ts +23 -8
  106. package/packages/core/src/agent/llm-providers/interface.ts +5 -1
  107. package/packages/core/src/agent/llm-providers/minimax.ts +13 -0
  108. package/packages/core/src/agent/llm-providers/opencode-go.ts +9 -0
  109. package/packages/core/src/channels/whatsapp.ts +13 -1
  110. package/packages/core/src/config/loader.ts +7 -7
  111. package/packages/core/src/gateway/helpers/path.ts +2 -1
  112. package/packages/core/src/gateway/initializer.ts +4 -4
  113. package/packages/core/src/gateway/llm-local/downloader.ts +130 -11
  114. package/packages/core/src/gateway/llm-local/index.ts +2 -0
  115. package/packages/core/src/gateway/llm-local/models.ts +4 -3
  116. package/packages/core/src/gateway/router.ts +7 -5
  117. package/packages/core/src/gateway/routes/http-client.ts +16 -0
  118. package/packages/core/src/gateway/routes/llm-local.ts +51 -5
  119. package/packages/core/src/gateway/routes/providers.ts +43 -2
  120. package/packages/core/src/gateway/server.ts +11 -2
  121. package/packages/core/src/gateway/tts/src/install.ts +17 -9
  122. package/packages/core/src/storage/crypto.ts +152 -20
  123. package/packages/core/src/storage/migrate.ts +51 -18
  124. package/packages/core/src/storage/seed.ts +38 -2
  125. package/packages/core/src/tool-runtime/index.ts +22 -1
  126. package/packages/core/src/tools/api/api-request.ts +174 -0
  127. package/packages/core/src/tools/api/index.ts +16 -0
  128. package/packages/core/src/tools/index.ts +12 -0
  129. package/packages/core/src/tools/web/browser-click.ts +2 -2
  130. package/packages/core/src/tools/web/browser-extract.ts +22 -6
  131. package/packages/core/src/tools/web/browser-navigate.ts +34 -18
  132. package/packages/core/src/tools/web/browser-screenshot.ts +40 -8
  133. package/packages/core/src/tools/web/browser-script.ts +2 -2
  134. package/packages/core/src/tools/web/browser-service.ts +295 -341
  135. package/packages/core/src/tools/web/browser-type.ts +5 -10
  136. package/packages/core/src/tools/web/browser-wait.ts +2 -2
  137. package/packages/core/src/tools/web/index.ts +1 -1
  138. package/packages/core/src/utils/logger.ts +2 -1
  139. package/packages/mcp/src/manager.ts +2 -1
  140. package/packages/skills/src/bundled/api/api_client/SKILL.md +132 -0
  141. package/packages/skills/src/bundled-data.generated.ts +1274 -1217
  142. package/packages/skills/src/loader.ts +2 -1
  143. package/dist/ui/assets/AgentCreateForm-0oFbN3gj.js +0 -1
  144. package/dist/ui/assets/AgentDetailPage-BJ4L2fNJ.js +0 -1
  145. package/dist/ui/assets/AgentNewPage-B3n0LUck.js +0 -1
  146. package/dist/ui/assets/ChannelsPage-fbF8K4MR.js +0 -8
  147. package/dist/ui/assets/LogsPage-B2lY9maY.js +0 -1
  148. package/dist/ui/assets/ProvidersPage-CEyUM2tD.js +0 -1
  149. package/dist/ui/assets/SettingsPage-eO0i3g8p.js +0 -9
  150. package/dist/ui/assets/SetupPage-ByYqTELb.js +0 -1
  151. package/dist/ui/assets/accordion-C5d5Rm5z.js +0 -1
  152. package/dist/ui/assets/globe-DeCQTCDJ.js +0 -1
  153. package/dist/ui/assets/index-B2fCYtTS.css +0 -2
  154. package/dist/ui/assets/index-CQ7fn00w.js +0 -116
  155. package/dist/ui/assets/progress-BherYzY6.js +0 -1
  156. package/dist/ui/assets/scroll-area-DkeyX32e.js +0 -1
  157. package/dist/ui/assets/send-B0H5SEIE.js +0 -1
  158. package/dist/ui/assets/switch-BDwN8RYV.js +0 -1
  159. package/dist/ui/assets/table-CSc8ubon.js +0 -1
  160. package/dist/ui/assets/textarea-CXgXWKrT.js +0 -1
  161. package/dist/ui/assets/useProviders-CnlC_qCS.js +0 -1
  162. package/dist/ui/dist/assets/AgentCreateForm-0oFbN3gj.js +0 -1
  163. package/dist/ui/dist/assets/AgentDetailPage-BJ4L2fNJ.js +0 -1
  164. package/dist/ui/dist/assets/AgentNewPage-B3n0LUck.js +0 -1
  165. package/dist/ui/dist/assets/ChannelsPage-fbF8K4MR.js +0 -8
  166. package/dist/ui/dist/assets/LogsPage-B2lY9maY.js +0 -1
  167. package/dist/ui/dist/assets/ProvidersPage-CEyUM2tD.js +0 -1
  168. package/dist/ui/dist/assets/SettingsPage-eO0i3g8p.js +0 -9
  169. package/dist/ui/dist/assets/SetupPage-ByYqTELb.js +0 -1
  170. package/dist/ui/dist/assets/accordion-C5d5Rm5z.js +0 -1
  171. package/dist/ui/dist/assets/globe-DeCQTCDJ.js +0 -1
  172. package/dist/ui/dist/assets/index-B2fCYtTS.css +0 -2
  173. package/dist/ui/dist/assets/index-CQ7fn00w.js +0 -116
  174. package/dist/ui/dist/assets/progress-BherYzY6.js +0 -1
  175. package/dist/ui/dist/assets/scroll-area-DkeyX32e.js +0 -1
  176. package/dist/ui/dist/assets/send-B0H5SEIE.js +0 -1
  177. package/dist/ui/dist/assets/switch-BDwN8RYV.js +0 -1
  178. package/dist/ui/dist/assets/table-CSc8ubon.js +0 -1
  179. package/dist/ui/dist/assets/textarea-CXgXWKrT.js +0 -1
  180. package/dist/ui/dist/assets/useProviders-CnlC_qCS.js +0 -1
  181. /package/dist/ui/assets/{card-CNf6BS2e.js → card-CXAm46at.js} +0 -0
  182. /package/dist/ui/assets/{cpu-Cdgc_B1K.js → cpu-DSpPVLAz.js} +0 -0
  183. /package/dist/ui/assets/{download-C3ifGMjJ.js → download-D9ZyUZZR.js} +0 -0
  184. /package/dist/ui/assets/{external-link-BvxYeTP1.js → external-link-CHPbUorN.js} +0 -0
  185. /package/dist/ui/assets/{eye-DqNTU_GD.js → eye-epHJZ_nQ.js} +0 -0
  186. /package/dist/ui/assets/{file-text-BT_9S9SM.js → file-text-BEjEmgby.js} +0 -0
  187. /package/dist/ui/assets/{folder-open-BhH8y9ac.js → folder-open-iQMHVEqS.js} +0 -0
  188. /package/dist/ui/assets/{format-GVHeOyWI.js → format-oFACFaca.js} +0 -0
  189. /package/dist/ui/assets/{gateway-url-COCbW0IR.js → gateway-url-iG-C6Agn.js} +0 -0
  190. /package/dist/ui/assets/{gauge-D_TMa4i9.js → gauge-D0_GMEcq.js} +0 -0
  191. /package/dist/ui/assets/{settings-Ds4SqD8s.js → settings-CcMGI1iU.js} +0 -0
  192. /package/dist/ui/assets/{sparkles-yUEb-7oH.js → sparkles-D6fx8JC5.js} +0 -0
  193. /package/dist/ui/assets/{trash-2-CNjMkoq6.js → trash-2-BHRa5ft9.js} +0 -0
  194. /package/dist/ui/assets/{triangle-alert-C9Y8Ub4X.js → triangle-alert-D4nwAVbc.js} +0 -0
  195. /package/dist/ui/assets/{vendor-router-C9pIYwbJ.js → vendor-router-pCP7sjma.js} +0 -0
  196. /package/dist/ui/assets/{volume-2-CeSXNDv4.js → volume-2-B6tkRy2u.js} +0 -0
  197. /package/dist/ui/assets/{zap-hlXjpSeA.js → zap-QO7iWMRg.js} +0 -0
  198. /package/dist/ui/dist/assets/{card-CNf6BS2e.js → card-CXAm46at.js} +0 -0
  199. /package/dist/ui/dist/assets/{cpu-Cdgc_B1K.js → cpu-DSpPVLAz.js} +0 -0
  200. /package/dist/ui/dist/assets/{download-C3ifGMjJ.js → download-D9ZyUZZR.js} +0 -0
  201. /package/dist/ui/dist/assets/{external-link-BvxYeTP1.js → external-link-CHPbUorN.js} +0 -0
  202. /package/dist/ui/dist/assets/{eye-DqNTU_GD.js → eye-epHJZ_nQ.js} +0 -0
  203. /package/dist/ui/dist/assets/{file-text-BT_9S9SM.js → file-text-BEjEmgby.js} +0 -0
  204. /package/dist/ui/dist/assets/{folder-open-BhH8y9ac.js → folder-open-iQMHVEqS.js} +0 -0
  205. /package/dist/ui/dist/assets/{format-GVHeOyWI.js → format-oFACFaca.js} +0 -0
  206. /package/dist/ui/dist/assets/{gateway-url-COCbW0IR.js → gateway-url-iG-C6Agn.js} +0 -0
  207. /package/dist/ui/dist/assets/{gauge-D_TMa4i9.js → gauge-D0_GMEcq.js} +0 -0
  208. /package/dist/ui/dist/assets/{settings-Ds4SqD8s.js → settings-CcMGI1iU.js} +0 -0
  209. /package/dist/ui/dist/assets/{sparkles-yUEb-7oH.js → sparkles-D6fx8JC5.js} +0 -0
  210. /package/dist/ui/dist/assets/{trash-2-CNjMkoq6.js → trash-2-BHRa5ft9.js} +0 -0
  211. /package/dist/ui/dist/assets/{triangle-alert-C9Y8Ub4X.js → triangle-alert-D4nwAVbc.js} +0 -0
  212. /package/dist/ui/dist/assets/{vendor-router-C9pIYwbJ.js → vendor-router-pCP7sjma.js} +0 -0
  213. /package/dist/ui/dist/assets/{volume-2-CeSXNDv4.js → volume-2-B6tkRy2u.js} +0 -0
  214. /package/dist/ui/dist/assets/{zap-hlXjpSeA.js → zap-QO7iWMRg.js} +0 -0
@@ -0,0 +1,16 @@
1
+ /**
2
+ * API Tools - HTTP client for REST APIs (curl-like)
3
+ *
4
+ * Makes requests to external APIs with full control over method, headers, body.
5
+ */
6
+
7
+ import type { Tool } from "../types.ts";
8
+ import { apiRequestTool } from "./api-request.ts";
9
+
10
+ export function createTools(): Tool[] {
11
+ return [
12
+ apiRequestTool,
13
+ ];
14
+ }
15
+
16
+ export { apiRequestTool } from "./api-request.ts";
@@ -38,6 +38,9 @@ import * as office from "./office/index.ts";
38
38
  // Meeting (4)
39
39
  import * as meeting from "./meeting/index.ts";
40
40
 
41
+ // API (1) - HTTP client for REST APIs
42
+ import * as api from "./api/index.ts";
43
+
41
44
  /**
42
45
  * Creates all tools with proper configuration
43
46
  */
@@ -72,6 +75,9 @@ export function createAllTools(config: Config): Tool[] {
72
75
 
73
76
  // MEETING (4)
74
77
  ...meeting.createTools(),
78
+
79
+ // API (1)
80
+ ...api.createTools(),
75
81
  ];
76
82
  }
77
83
 
@@ -100,6 +106,8 @@ export function createToolsByCategory(category: string, config: Config): Tool[]
100
106
  return office.createTools();
101
107
  case "meeting":
102
108
  return meeting.createTools();
109
+ case "api":
110
+ return api.createTools();
103
111
  default:
104
112
  return [];
105
113
  }
@@ -195,3 +203,7 @@ export {
195
203
  officeLeerPptxTool,
196
204
  officeEscribirPptxTool,
197
205
  } from "./office/index.ts";
206
+
207
+ export {
208
+ apiRequestTool,
209
+ } from "./api/index.ts";
@@ -43,7 +43,7 @@ export const browserClickTool: Tool = {
43
43
  log.warn("Browser not available");
44
44
  return {
45
45
  ok: false,
46
- error: "Browser automation not available. Install Chrome/Chromium.",
46
+ error: "Browser automation not available. Install agent-browser.",
47
47
  };
48
48
  }
49
49
 
@@ -51,7 +51,7 @@ export const browserClickTool: Tool = {
51
51
 
52
52
  try {
53
53
  const view = await browserService.getView();
54
- if (!view) return { ok: false, error: "Browser automation not available. Install Chrome/Chromium." };
54
+ if (!view) return { ok: false, error: "Browser automation not available. Install agent-browser." };
55
55
 
56
56
  if (url) {
57
57
  await view.navigate(url);
@@ -14,7 +14,7 @@ const log = logger.child("browser-extract");
14
14
 
15
15
  export const browserExtractTool: Tool = {
16
16
  name: "browser_extract",
17
- description: "Extract text, links, or structured data from page using CSS selectors or XPath. Spanish: extraer datos, obtener información, scraping, selectores",
17
+ description: "Extract text, links, or structured data from page using CSS selectors or XPath. For general page overview without specific selectors, returns compact accessibility snapshot. Spanish: extraer datos, obtener información, scraping, selectores",
18
18
  parameters: {
19
19
  type: "object",
20
20
  properties: {
@@ -24,7 +24,7 @@ export const browserExtractTool: Tool = {
24
24
  },
25
25
  selector: {
26
26
  type: "string",
27
- description: "CSS selector or XPath (prefix with 'xpath:') to match elements",
27
+ description: "CSS selector or XPath (prefix with 'xpath:') to match elements. Use 'body' or omit for compact accessibility snapshot.",
28
28
  },
29
29
  attribute: {
30
30
  type: "string",
@@ -43,7 +43,7 @@ export const browserExtractTool: Tool = {
43
43
  },
44
44
  execute: async (params: Record<string, unknown>) => {
45
45
  const url = params.url as string | undefined;
46
- const selector = params.selector as string;
46
+ const selector = (params.selector as string) || "body";
47
47
  const attribute = (params.attribute as string) ?? "text";
48
48
  const all = (params.all as boolean) ?? true;
49
49
  const timeout = (params.timeout as number) ?? 30000;
@@ -53,7 +53,7 @@ export const browserExtractTool: 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,13 +61,30 @@ export const browserExtractTool: 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
+ const currentUrl = view.url;
72
+
73
+ // If selector is broad (body, html, *, :root) and attribute is text, return compact snapshot
74
+ const isBroadSelector = ["body", "html", "*", ":root", "document"].includes(selector.toLowerCase());
75
+ if (isBroadSelector && attribute === "text") {
76
+ const snapshot = await view.snapshot({ compact: true, depth: 3 });
77
+ log.info(`Snapshot extracted from ${currentUrl} (${snapshot.length} chars)`);
78
+ return {
79
+ ok: true,
80
+ url: currentUrl,
81
+ selector,
82
+ attribute: "snapshot",
83
+ count: 1,
84
+ data: [snapshot],
85
+ };
86
+ }
87
+
71
88
  const isXPath = selector.startsWith("xpath:");
72
89
  const actualSelector = isXPath ? selector.slice(6) : selector;
73
90
 
@@ -117,7 +134,6 @@ export const browserExtractTool: Tool = {
117
134
  })()
118
135
  `) as string[];
119
136
 
120
- const currentUrl = view.url;
121
137
  log.info(`Extracted ${extracted.length} element(s) from ${currentUrl}`);
122
138
 
123
139
  return {
@@ -14,7 +14,7 @@ const log = logger.child("browser-navigate");
14
14
 
15
15
  export const browserNavigateTool: Tool = {
16
16
  name: "browser_navigate",
17
- description: "Navigate browser to URL, get rendered page content (supports JS). Spanish: navegar a url, abrir página, sitio web",
17
+ description: "Navigate browser to URL, get rendered page content (supports JS). Returns compact accessibility tree with element refs (@e1, @e2) for interaction. Spanish: navegar a url, abrir página, sitio web",
18
18
  parameters: {
19
19
  type: "object",
20
20
  properties: {
@@ -30,6 +30,11 @@ export const browserNavigateTool: Tool = {
30
30
  type: "number",
31
31
  description: "Timeout in milliseconds (default: 30000)",
32
32
  },
33
+ mode: {
34
+ type: "string",
35
+ enum: ["snapshot", "text"],
36
+ description: "Content mode: 'snapshot' (compact accessibility tree with refs, default) or 'text' (full innerText). Use 'text' only if you need all readable text.",
37
+ },
33
38
  },
34
39
  required: ["url"],
35
40
  },
@@ -37,21 +42,22 @@ export const browserNavigateTool: Tool = {
37
42
  const url = params.url as string;
38
43
  const waitFor = params.waitFor as string | undefined;
39
44
  const timeout = (params.timeout as number) ?? 30000;
45
+ const mode = (params.mode as string) ?? "snapshot";
40
46
 
41
47
  const browserService = getBrowserService();
42
48
  if (!browserService?.isAvailable()) {
43
49
  log.warn("Browser not available");
44
50
  return {
45
51
  ok: false,
46
- error: "Browser automation not available. Install Chrome/Chromium.",
52
+ error: "Browser automation not available. Install agent-browser.",
47
53
  };
48
54
  }
49
55
 
50
- log.info(`Navigating: ${url}${waitFor ? ` (waiting for: ${waitFor})` : ""}`);
56
+ log.info(`Navigating: ${url}${waitFor ? ` (waiting for: ${waitFor})` : ""} [mode=${mode}]`);
51
57
 
52
58
  try {
53
59
  const view = await browserService.getView();
54
- if (!view) return { ok: false, error: "Browser automation not available. Install Chrome/Chromium." };
60
+ if (!view) return { ok: false, error: "Browser automation not available. Install agent-browser." };
55
61
 
56
62
  await view.navigate(url);
57
63
 
@@ -67,28 +73,38 @@ export const browserNavigateTool: Tool = {
67
73
  }
68
74
 
69
75
  const finalUrl = view.url;
76
+ let content: string;
77
+ let contentType: string;
70
78
 
71
- // Extraer texto limpio del DOM
72
- const content = await view.evaluate(`
73
- (() => {
74
- try {
75
- document.querySelectorAll("script, style, noscript, meta, link, iframe").forEach(el => el.remove());
76
- let text = document.body?.innerText || document.documentElement?.innerText || "";
77
- text = text.replace(/\\s+/g, " ").trim();
78
- return text.slice(0, 50000);
79
- } catch (e) {
80
- return "Error extracting content: " + e.message;
81
- }
82
- })()
83
- `) as string;
79
+ if (mode === "text") {
80
+ // Full innerText (legacy mode, heavy)
81
+ content = await view.evaluate(`
82
+ (() => {
83
+ try {
84
+ document.querySelectorAll("script, style, noscript, meta, link, iframe").forEach(el => el.remove());
85
+ let text = document.body?.innerText || document.documentElement?.innerText || "";
86
+ text = text.replace(/\\s+/g, " ").trim();
87
+ return text.slice(0, 50000);
88
+ } catch (e) {
89
+ return "Error extracting content: " + e.message;
90
+ }
91
+ })()
92
+ `) as string;
93
+ contentType = "text";
94
+ } else {
95
+ // Default: compact accessibility snapshot with refs
96
+ content = await view.snapshot({ compact: true, depth: 3 });
97
+ contentType = "snapshot";
98
+ }
84
99
 
85
- log.info(`Navigation successful: ${finalUrl} (${content.length} chars)`);
100
+ log.info(`Navigation successful: ${finalUrl} (${content.length} chars, ${contentType})`);
86
101
 
87
102
  return {
88
103
  ok: true,
89
104
  url,
90
105
  finalUrl,
91
106
  content,
107
+ contentType,
92
108
  length: content.length,
93
109
  };
94
110
  } catch (error) {
@@ -12,9 +12,12 @@ import { getBrowserService, screenshotElement } from "./browser-service.ts";
12
12
 
13
13
  const log = logger.child("browser-screenshot");
14
14
 
15
+ // Default viewport for screenshots — keeps base64 small (~30-60KB vs ~300KB)
16
+ const DEFAULT_VIEWPORT = { width: 1280, height: 720 };
17
+
15
18
  export const browserScreenshotTool: Tool = {
16
19
  name: "browser_screenshot",
17
- description: "Take screenshot of current browser page. Spanish: captura de pantalla, screenshot, imagen de página",
20
+ description: "Take screenshot of current browser page. Returns JPEG by default for smaller size. Spanish: captura de pantalla, screenshot, imagen de página",
18
21
  parameters: {
19
22
  type: "object",
20
23
  properties: {
@@ -30,6 +33,23 @@ export const browserScreenshotTool: Tool = {
30
33
  type: "string",
31
34
  description: "CSS selector of specific element to screenshot (optional)",
32
35
  },
36
+ format: {
37
+ type: "string",
38
+ enum: ["jpeg", "png"],
39
+ description: "Image format: jpeg (default, smaller) or png (lossless, larger)",
40
+ },
41
+ quality: {
42
+ type: "number",
43
+ description: "JPEG quality 0-100 (default: 80). Ignored for PNG.",
44
+ },
45
+ width: {
46
+ type: "number",
47
+ description: "Viewport width in pixels (default: 1280). Smaller = smaller file.",
48
+ },
49
+ height: {
50
+ type: "number",
51
+ description: "Viewport height in pixels (default: 720). Smaller = smaller file.",
52
+ },
33
53
  },
34
54
  required: [],
35
55
  },
@@ -37,47 +57,59 @@ export const browserScreenshotTool: Tool = {
37
57
  const url = params.url as string | undefined;
38
58
  const fullPage = (params.fullPage as boolean) ?? false;
39
59
  const selector = params.selector as string | undefined;
60
+ const format = (params.format as string) ?? "jpeg";
61
+ const quality = (params.quality as number) ?? 80;
62
+ const width = (params.width as number) ?? DEFAULT_VIEWPORT.width;
63
+ const height = (params.height as number) ?? DEFAULT_VIEWPORT.height;
40
64
 
41
65
  const browserService = getBrowserService();
42
66
  if (!browserService?.isAvailable()) {
43
67
  log.warn("Browser not available");
44
68
  return {
45
69
  ok: false,
46
- error: "Browser automation not available. Install Chrome/Chromium.",
70
+ error: "Browser automation not available. Install agent-browser.",
47
71
  };
48
72
  }
49
73
 
50
- log.info(`Taking screenshot${url ? ` of: ${url}` : ""}${selector ? ` (element: ${selector})` : ""}`);
74
+ log.info(`Taking screenshot${url ? ` of: ${url}` : ""}${selector ? ` (element: ${selector})` : ""} [${format} ${width}x${height}]`);
51
75
 
52
76
  try {
53
77
  const view = await browserService.getView();
54
- if (!view) return { ok: false, error: "Browser automation not available. Install Chrome/Chromium." };
78
+ if (!view) return { ok: false, error: "Browser automation not available. Install agent-browser." };
55
79
 
56
80
  if (url) {
57
81
  await view.navigate(url);
58
82
  await Bun.sleep(500);
59
83
  }
60
84
 
85
+ // Resize viewport before screenshot to keep image small
86
+ await view.resize(width, height);
87
+ await Bun.sleep(200);
88
+
61
89
  let screenshot: string;
62
90
 
63
91
  if (selector) {
64
92
  screenshot = await screenshotElement(view, selector);
65
93
  } else {
66
- screenshot = await view.screenshot({ encoding: "base64", format: "png" });
94
+ screenshot = await view.screenshot({
95
+ encoding: "base64",
96
+ format: format as "jpeg" | "png" | "webp",
97
+ quality: format === "jpeg" ? quality : undefined,
98
+ });
67
99
  }
68
100
 
69
101
  const currentUrl = view.url;
70
- log.info(`Screenshot captured: ${currentUrl} (${screenshot.length} base64 chars)`);
102
+ log.info(`Screenshot captured: ${currentUrl} (${screenshot.length} base64 chars, ${format})`);
71
103
 
72
104
  return {
73
105
  ok: true,
74
106
  url: currentUrl,
75
107
  screenshot,
76
- format: "png",
108
+ format,
77
109
  encoding: "base64",
78
110
  fullPage,
79
111
  selector,
80
- viewport: { width: 1280, height: 800 },
112
+ viewport: { width, height },
81
113
  };
82
114
  } catch (error) {
83
115
  log.error(`Screenshot failed: ${(error as Error).message}`);
@@ -43,7 +43,7 @@ export const browserScriptTool: Tool = {
43
43
  log.warn("Browser not available");
44
44
  return {
45
45
  ok: false,
46
- error: "Browser automation not available. Install Chrome/Chromium.",
46
+ error: "Browser automation not available. Install agent-browser.",
47
47
  };
48
48
  }
49
49
 
@@ -51,7 +51,7 @@ export const browserScriptTool: Tool = {
51
51
 
52
52
  try {
53
53
  const view = await browserService.getView();
54
- if (!view) return { ok: false, error: "Browser automation not available. Install Chrome/Chromium." };
54
+ if (!view) return { ok: false, error: "Browser automation not available. Install agent-browser." };
55
55
 
56
56
  if (url) {
57
57
  await view.navigate(url);