@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.
- package/README.md +18 -18
- package/dist/hive.js +3428 -2603
- package/dist/tool-worker.js +2085 -1820
- package/dist/ui/assets/AgentCreateForm-BTCzFbca.js +1 -0
- package/dist/ui/assets/AgentDetailPage-o27TRSVw.js +1 -0
- package/dist/ui/assets/AgentNewPage-400cCpYt.js +1 -0
- package/dist/ui/{dist/assets/AgentsPage-DGNLDXjR.js → assets/AgentsPage-C-GSRk-N.js} +5 -5
- package/dist/ui/assets/ApiClientPage-BOTpz6oP.js +3 -0
- package/dist/ui/assets/{CanvasPage-CnMO1FN8.js → CanvasPage-Cvs5ctza.js} +7 -7
- package/dist/ui/assets/ChannelsPage-C5m_L7P9.js +8 -0
- package/dist/ui/{dist/assets/DashboardPage-VyXXp3U1.js → assets/DashboardPage-CztbRQdm.js} +2 -2
- package/dist/ui/assets/{LoginPage-DPj2s2Qq.js → LoginPage-OMsrx5oj.js} +1 -1
- package/dist/ui/assets/LogsPage-CcYYwjgF.js +1 -0
- package/dist/ui/{dist/assets/MeetingPage-2ky_hKiG.js → assets/MeetingPage-CrKVAfe6.js} +1 -1
- package/dist/ui/assets/{NotFound-BMeQSGcG.js → NotFound-GbAJDgoD.js} +1 -1
- package/dist/ui/assets/ProvidersPage-uqPcZUSV.js +1 -0
- package/dist/ui/{dist/assets/RecoverPage-B-hDZUM2.js → assets/RecoverPage-CwB2ByCU.js} +1 -1
- package/dist/ui/assets/SettingsPage-DKLlye0z.js +9 -0
- package/dist/ui/assets/SetupPage-DOVh1ldK.js +1 -0
- package/dist/ui/{dist/assets/WebChatPage-BuGT2AL0.js → assets/WebChatPage-c-7S9jnT.js} +2 -2
- package/dist/ui/assets/accordion-DAbcVQCn.js +1 -0
- package/dist/ui/{dist/assets/alert-Bq6awLlW.js → assets/alert-D_2Y3qjL.js} +1 -1
- package/dist/ui/{dist/assets/alert-dialog-DQvltYmf.js → assets/alert-dialog-CpMxaNcu.js} +1 -1
- package/dist/ui/assets/{badge-DXUDdTed.js → badge-CxTPR6_t.js} +1 -1
- package/dist/ui/assets/bell-8BqRYmzf.js +1 -0
- package/dist/ui/assets/circle-x-Bv6WrUJo.js +1 -0
- package/dist/ui/assets/copy-dU94ZGsi.js +1 -0
- package/dist/ui/{dist/assets/dialog-bI9jImCS.js → assets/dialog-DfS3idb3.js} +1 -1
- package/dist/ui/{dist/assets/dropdown-menu-BK-CO3Od.js → assets/dropdown-menu-BdCbAW1z.js} +1 -1
- package/dist/ui/assets/{es-Cg8zdT52.js → es-Cz5h9_84.js} +1 -1
- package/dist/ui/assets/index-CmGm_r89.js +116 -0
- package/dist/ui/assets/index-T7HgphSn.css +2 -0
- package/dist/ui/{dist/assets/label-CrH0Jj3v.js → assets/label-byJkqOYq.js} +1 -1
- package/dist/ui/assets/progress-Dtz-Mzys.js +1 -0
- package/dist/ui/assets/scroll-area-BXtLsE9E.js +1 -0
- package/dist/ui/assets/search-BGmPJ-6L.js +1 -0
- package/dist/ui/assets/select-Cl16QYa_.js +1 -0
- package/dist/ui/assets/send-BuQcUO-R.js +1 -0
- package/dist/ui/assets/shield-C-05qB-2.js +1 -0
- package/dist/ui/assets/{slider-CsiUDxc3.js → slider-D2I0qven.js} +1 -1
- package/dist/ui/assets/switch-h2SfQX4B.js +1 -0
- package/dist/ui/assets/table-CVkIRJKK.js +1 -0
- package/dist/ui/assets/tabs-C619jxbO.js +1 -0
- package/dist/ui/assets/textarea-wvA-FDjO.js +1 -0
- package/dist/ui/assets/useProviders-eEri6BAc.js +1 -0
- package/dist/ui/{dist/assets/vendor-radix-cw1bQaVC.js → assets/vendor-radix-D6rA7xKY.js} +4 -4
- package/dist/ui/assets/{vendor-react-D4s9E-zj.js → vendor-react-BU5iQU4f.js} +1 -1
- package/dist/ui/dist/assets/AgentCreateForm-BTCzFbca.js +1 -0
- package/dist/ui/dist/assets/AgentDetailPage-o27TRSVw.js +1 -0
- package/dist/ui/dist/assets/AgentNewPage-400cCpYt.js +1 -0
- package/dist/ui/{assets/AgentsPage-DGNLDXjR.js → dist/assets/AgentsPage-C-GSRk-N.js} +5 -5
- package/dist/ui/dist/assets/ApiClientPage-BOTpz6oP.js +3 -0
- package/dist/ui/dist/assets/{CanvasPage-CnMO1FN8.js → CanvasPage-Cvs5ctza.js} +7 -7
- package/dist/ui/dist/assets/ChannelsPage-C5m_L7P9.js +8 -0
- package/dist/ui/{assets/DashboardPage-VyXXp3U1.js → dist/assets/DashboardPage-CztbRQdm.js} +2 -2
- package/dist/ui/dist/assets/{LoginPage-DPj2s2Qq.js → LoginPage-OMsrx5oj.js} +1 -1
- package/dist/ui/dist/assets/LogsPage-CcYYwjgF.js +1 -0
- package/dist/ui/{assets/MeetingPage-2ky_hKiG.js → dist/assets/MeetingPage-CrKVAfe6.js} +1 -1
- package/dist/ui/dist/assets/{NotFound-BMeQSGcG.js → NotFound-GbAJDgoD.js} +1 -1
- package/dist/ui/dist/assets/ProvidersPage-uqPcZUSV.js +1 -0
- package/dist/ui/{assets/RecoverPage-B-hDZUM2.js → dist/assets/RecoverPage-CwB2ByCU.js} +1 -1
- package/dist/ui/dist/assets/SettingsPage-DKLlye0z.js +9 -0
- package/dist/ui/dist/assets/SetupPage-DOVh1ldK.js +1 -0
- package/dist/ui/{assets/WebChatPage-BuGT2AL0.js → dist/assets/WebChatPage-c-7S9jnT.js} +2 -2
- package/dist/ui/dist/assets/accordion-DAbcVQCn.js +1 -0
- package/dist/ui/{assets/alert-Bq6awLlW.js → dist/assets/alert-D_2Y3qjL.js} +1 -1
- package/dist/ui/{assets/alert-dialog-DQvltYmf.js → dist/assets/alert-dialog-CpMxaNcu.js} +1 -1
- package/dist/ui/dist/assets/{badge-DXUDdTed.js → badge-CxTPR6_t.js} +1 -1
- package/dist/ui/dist/assets/bell-8BqRYmzf.js +1 -0
- package/dist/ui/dist/assets/circle-x-Bv6WrUJo.js +1 -0
- package/dist/ui/dist/assets/copy-dU94ZGsi.js +1 -0
- package/dist/ui/{assets/dialog-bI9jImCS.js → dist/assets/dialog-DfS3idb3.js} +1 -1
- package/dist/ui/{assets/dropdown-menu-BK-CO3Od.js → dist/assets/dropdown-menu-BdCbAW1z.js} +1 -1
- package/dist/ui/dist/assets/{es-Cg8zdT52.js → es-Cz5h9_84.js} +1 -1
- package/dist/ui/dist/assets/index-CmGm_r89.js +116 -0
- package/dist/ui/dist/assets/index-T7HgphSn.css +2 -0
- package/dist/ui/{assets/label-CrH0Jj3v.js → dist/assets/label-byJkqOYq.js} +1 -1
- package/dist/ui/dist/assets/progress-Dtz-Mzys.js +1 -0
- package/dist/ui/dist/assets/scroll-area-BXtLsE9E.js +1 -0
- package/dist/ui/dist/assets/search-BGmPJ-6L.js +1 -0
- package/dist/ui/dist/assets/select-Cl16QYa_.js +1 -0
- package/dist/ui/dist/assets/send-BuQcUO-R.js +1 -0
- package/dist/ui/dist/assets/shield-C-05qB-2.js +1 -0
- package/dist/ui/dist/assets/{slider-CsiUDxc3.js → slider-D2I0qven.js} +1 -1
- package/dist/ui/dist/assets/switch-h2SfQX4B.js +1 -0
- package/dist/ui/dist/assets/table-CVkIRJKK.js +1 -0
- package/dist/ui/dist/assets/tabs-C619jxbO.js +1 -0
- package/dist/ui/dist/assets/textarea-wvA-FDjO.js +1 -0
- package/dist/ui/dist/assets/useProviders-eEri6BAc.js +1 -0
- package/dist/ui/{assets/vendor-radix-cw1bQaVC.js → dist/assets/vendor-radix-D6rA7xKY.js} +4 -4
- package/dist/ui/dist/assets/{vendor-react-D4s9E-zj.js → vendor-react-BU5iQU4f.js} +1 -1
- package/dist/ui/dist/index.html +6 -6
- package/dist/ui/index.html +6 -6
- package/package.json +1 -1
- package/packages/cli/src/adapters/binary.ts +8 -4
- package/packages/cli/src/adapters/bun-global.ts +5 -1
- package/packages/cli/src/adapters/config.ts +4 -3
- package/packages/cli/src/adapters/docker.ts +2 -1
- package/packages/cli/src/commands/gateway.ts +123 -9
- package/packages/cli/src/commands/logs.ts +2 -1
- package/packages/cli/src/commands/onboard.ts +1 -1
- package/packages/cli/src/commands/sessions.ts +2 -1
- package/packages/cli/src/commands/skills.ts +2 -1
- package/packages/core/src/agent/llm-client.ts +4 -0
- package/packages/core/src/agent/llm-providers/anthropic.ts +23 -8
- package/packages/core/src/agent/llm-providers/interface.ts +5 -1
- package/packages/core/src/agent/llm-providers/minimax.ts +13 -0
- package/packages/core/src/agent/llm-providers/opencode-go.ts +9 -0
- package/packages/core/src/channels/whatsapp.ts +13 -1
- package/packages/core/src/config/loader.ts +7 -7
- package/packages/core/src/gateway/helpers/path.ts +2 -1
- package/packages/core/src/gateway/initializer.ts +4 -4
- package/packages/core/src/gateway/llm-local/downloader.ts +130 -11
- package/packages/core/src/gateway/llm-local/index.ts +2 -0
- package/packages/core/src/gateway/llm-local/models.ts +4 -3
- package/packages/core/src/gateway/router.ts +7 -5
- package/packages/core/src/gateway/routes/http-client.ts +16 -0
- package/packages/core/src/gateway/routes/llm-local.ts +51 -5
- package/packages/core/src/gateway/routes/providers.ts +43 -2
- package/packages/core/src/gateway/server.ts +11 -2
- package/packages/core/src/gateway/tts/src/install.ts +17 -9
- package/packages/core/src/storage/crypto.ts +152 -20
- package/packages/core/src/storage/migrate.ts +51 -18
- package/packages/core/src/storage/seed.ts +38 -2
- package/packages/core/src/tool-runtime/index.ts +22 -1
- package/packages/core/src/tools/api/api-request.ts +174 -0
- package/packages/core/src/tools/api/index.ts +16 -0
- package/packages/core/src/tools/index.ts +12 -0
- package/packages/core/src/tools/web/browser-click.ts +2 -2
- package/packages/core/src/tools/web/browser-extract.ts +22 -6
- package/packages/core/src/tools/web/browser-navigate.ts +34 -18
- package/packages/core/src/tools/web/browser-screenshot.ts +40 -8
- package/packages/core/src/tools/web/browser-script.ts +2 -2
- package/packages/core/src/tools/web/browser-service.ts +295 -341
- package/packages/core/src/tools/web/browser-type.ts +5 -10
- package/packages/core/src/tools/web/browser-wait.ts +2 -2
- package/packages/core/src/tools/web/index.ts +1 -1
- package/packages/core/src/utils/logger.ts +2 -1
- package/packages/mcp/src/manager.ts +2 -1
- package/packages/skills/src/bundled/api/api_client/SKILL.md +132 -0
- package/packages/skills/src/bundled-data.generated.ts +1274 -1217
- package/packages/skills/src/loader.ts +2 -1
- package/dist/ui/assets/AgentCreateForm-0oFbN3gj.js +0 -1
- package/dist/ui/assets/AgentDetailPage-BJ4L2fNJ.js +0 -1
- package/dist/ui/assets/AgentNewPage-B3n0LUck.js +0 -1
- package/dist/ui/assets/ChannelsPage-fbF8K4MR.js +0 -8
- package/dist/ui/assets/LogsPage-B2lY9maY.js +0 -1
- package/dist/ui/assets/ProvidersPage-CEyUM2tD.js +0 -1
- package/dist/ui/assets/SettingsPage-eO0i3g8p.js +0 -9
- package/dist/ui/assets/SetupPage-ByYqTELb.js +0 -1
- package/dist/ui/assets/accordion-C5d5Rm5z.js +0 -1
- package/dist/ui/assets/globe-DeCQTCDJ.js +0 -1
- package/dist/ui/assets/index-B2fCYtTS.css +0 -2
- package/dist/ui/assets/index-CQ7fn00w.js +0 -116
- package/dist/ui/assets/progress-BherYzY6.js +0 -1
- package/dist/ui/assets/scroll-area-DkeyX32e.js +0 -1
- package/dist/ui/assets/send-B0H5SEIE.js +0 -1
- package/dist/ui/assets/switch-BDwN8RYV.js +0 -1
- package/dist/ui/assets/table-CSc8ubon.js +0 -1
- package/dist/ui/assets/textarea-CXgXWKrT.js +0 -1
- package/dist/ui/assets/useProviders-CnlC_qCS.js +0 -1
- package/dist/ui/dist/assets/AgentCreateForm-0oFbN3gj.js +0 -1
- package/dist/ui/dist/assets/AgentDetailPage-BJ4L2fNJ.js +0 -1
- package/dist/ui/dist/assets/AgentNewPage-B3n0LUck.js +0 -1
- package/dist/ui/dist/assets/ChannelsPage-fbF8K4MR.js +0 -8
- package/dist/ui/dist/assets/LogsPage-B2lY9maY.js +0 -1
- package/dist/ui/dist/assets/ProvidersPage-CEyUM2tD.js +0 -1
- package/dist/ui/dist/assets/SettingsPage-eO0i3g8p.js +0 -9
- package/dist/ui/dist/assets/SetupPage-ByYqTELb.js +0 -1
- package/dist/ui/dist/assets/accordion-C5d5Rm5z.js +0 -1
- package/dist/ui/dist/assets/globe-DeCQTCDJ.js +0 -1
- package/dist/ui/dist/assets/index-B2fCYtTS.css +0 -2
- package/dist/ui/dist/assets/index-CQ7fn00w.js +0 -116
- package/dist/ui/dist/assets/progress-BherYzY6.js +0 -1
- package/dist/ui/dist/assets/scroll-area-DkeyX32e.js +0 -1
- package/dist/ui/dist/assets/send-B0H5SEIE.js +0 -1
- package/dist/ui/dist/assets/switch-BDwN8RYV.js +0 -1
- package/dist/ui/dist/assets/table-CSc8ubon.js +0 -1
- package/dist/ui/dist/assets/textarea-CXgXWKrT.js +0 -1
- package/dist/ui/dist/assets/useProviders-CnlC_qCS.js +0 -1
- /package/dist/ui/assets/{card-CNf6BS2e.js → card-CXAm46at.js} +0 -0
- /package/dist/ui/assets/{cpu-Cdgc_B1K.js → cpu-DSpPVLAz.js} +0 -0
- /package/dist/ui/assets/{download-C3ifGMjJ.js → download-D9ZyUZZR.js} +0 -0
- /package/dist/ui/assets/{external-link-BvxYeTP1.js → external-link-CHPbUorN.js} +0 -0
- /package/dist/ui/assets/{eye-DqNTU_GD.js → eye-epHJZ_nQ.js} +0 -0
- /package/dist/ui/assets/{file-text-BT_9S9SM.js → file-text-BEjEmgby.js} +0 -0
- /package/dist/ui/assets/{folder-open-BhH8y9ac.js → folder-open-iQMHVEqS.js} +0 -0
- /package/dist/ui/assets/{format-GVHeOyWI.js → format-oFACFaca.js} +0 -0
- /package/dist/ui/assets/{gateway-url-COCbW0IR.js → gateway-url-iG-C6Agn.js} +0 -0
- /package/dist/ui/assets/{gauge-D_TMa4i9.js → gauge-D0_GMEcq.js} +0 -0
- /package/dist/ui/assets/{settings-Ds4SqD8s.js → settings-CcMGI1iU.js} +0 -0
- /package/dist/ui/assets/{sparkles-yUEb-7oH.js → sparkles-D6fx8JC5.js} +0 -0
- /package/dist/ui/assets/{trash-2-CNjMkoq6.js → trash-2-BHRa5ft9.js} +0 -0
- /package/dist/ui/assets/{triangle-alert-C9Y8Ub4X.js → triangle-alert-D4nwAVbc.js} +0 -0
- /package/dist/ui/assets/{vendor-router-C9pIYwbJ.js → vendor-router-pCP7sjma.js} +0 -0
- /package/dist/ui/assets/{volume-2-CeSXNDv4.js → volume-2-B6tkRy2u.js} +0 -0
- /package/dist/ui/assets/{zap-hlXjpSeA.js → zap-QO7iWMRg.js} +0 -0
- /package/dist/ui/dist/assets/{card-CNf6BS2e.js → card-CXAm46at.js} +0 -0
- /package/dist/ui/dist/assets/{cpu-Cdgc_B1K.js → cpu-DSpPVLAz.js} +0 -0
- /package/dist/ui/dist/assets/{download-C3ifGMjJ.js → download-D9ZyUZZR.js} +0 -0
- /package/dist/ui/dist/assets/{external-link-BvxYeTP1.js → external-link-CHPbUorN.js} +0 -0
- /package/dist/ui/dist/assets/{eye-DqNTU_GD.js → eye-epHJZ_nQ.js} +0 -0
- /package/dist/ui/dist/assets/{file-text-BT_9S9SM.js → file-text-BEjEmgby.js} +0 -0
- /package/dist/ui/dist/assets/{folder-open-BhH8y9ac.js → folder-open-iQMHVEqS.js} +0 -0
- /package/dist/ui/dist/assets/{format-GVHeOyWI.js → format-oFACFaca.js} +0 -0
- /package/dist/ui/dist/assets/{gateway-url-COCbW0IR.js → gateway-url-iG-C6Agn.js} +0 -0
- /package/dist/ui/dist/assets/{gauge-D_TMa4i9.js → gauge-D0_GMEcq.js} +0 -0
- /package/dist/ui/dist/assets/{settings-Ds4SqD8s.js → settings-CcMGI1iU.js} +0 -0
- /package/dist/ui/dist/assets/{sparkles-yUEb-7oH.js → sparkles-D6fx8JC5.js} +0 -0
- /package/dist/ui/dist/assets/{trash-2-CNjMkoq6.js → trash-2-BHRa5ft9.js} +0 -0
- /package/dist/ui/dist/assets/{triangle-alert-C9Y8Ub4X.js → triangle-alert-D4nwAVbc.js} +0 -0
- /package/dist/ui/dist/assets/{vendor-router-C9pIYwbJ.js → vendor-router-pCP7sjma.js} +0 -0
- /package/dist/ui/dist/assets/{volume-2-CeSXNDv4.js → volume-2-B6tkRy2u.js} +0 -0
- /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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
|
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
|
|
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({
|
|
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
|
|
108
|
+
format,
|
|
77
109
|
encoding: "base64",
|
|
78
110
|
fullPage,
|
|
79
111
|
selector,
|
|
80
|
-
viewport: { width
|
|
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
|
|
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
|
|
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);
|