@johpaz/hive-sdk 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/README.md +1 -1
- package/bun.lock +55 -29
- package/package.json +9 -9
- package/packages/cli/package.json +1 -1
- package/packages/core/package.json +9 -9
- package/packages/core/src/agent/acceptance-checks.ts +7 -1
- package/packages/core/src/config/loader.ts +5 -0
- package/packages/core/src/tools/web/browser-backend.ts +129 -0
- package/packages/core/src/tools/web/browser-service.ts +75 -35
- package/packages/core/src/tools/web/webview-backend.ts +412 -0
- package/test/acceptance-checks.test.ts +403 -0
- package/test/browser-backend.test.ts +308 -0
- package/test/tool-selector-runtime-tools.test.ts +117 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## Sin publicar
|
|
4
|
+
|
|
5
|
+
### Seguridad
|
|
6
|
+
|
|
7
|
+
- **`sanitizeDiagnostic` dejaba el token en claro detrás del esquema de auth.**
|
|
8
|
+
La regex consumía sólo la palabra `Bearer`, así que un diagnóstico con
|
|
9
|
+
`authorization: Bearer <token>` quedaba como `authorization: [REDACTED] <token>`
|
|
10
|
+
y la credencial viajaba al prompt del coordinador. Afecta a **0.1.5 y
|
|
11
|
+
anteriores**: el archivo viaja en el tarball publicado.
|
|
12
|
+
|
|
13
|
+
### Corregido
|
|
14
|
+
|
|
15
|
+
- Se fijaron las 8 dependencias que estaban en `latest` (`zod`, `discord.js`,
|
|
16
|
+
`grammy`, `@slack/bolt`, `@whiskeysockets/baileys`, `@modelcontextprotocol/sdk`,
|
|
17
|
+
`qrcode-terminal`, `@sapphire/snowflake`). Como `bun.lock` no se publica, cada
|
|
18
|
+
instalación resolvía `latest` de nuevo: el SDK ya estaba corriendo
|
|
19
|
+
`@slack/bolt` **5.0.0** mientras hive, con el mismo código de canales, corría
|
|
20
|
+
**4.7.x**. Ahora quedan alineados.
|
|
21
|
+
|
|
22
|
+
### Añadido
|
|
23
|
+
|
|
24
|
+
- **Backend de navegador intercambiable.** Las tools hablan con la interfaz
|
|
25
|
+
`BrowserBackend`; además del `agent-browser` de siempre (default, sin cambios)
|
|
26
|
+
hay un `WebViewBackend` sobre `Bun.WebView`, in-process, sin instalación de
|
|
27
|
+
~75 MB ni descarga de Chrome. Se elige con `tools.browser.backend`
|
|
28
|
+
(`"agent-browser" | "webview" | "auto"`) o `HIVE_BROWSER_BACKEND`.
|
|
29
|
+
- Cobertura de `acceptance-checks` (27 tests), del backend de navegador (27) y
|
|
30
|
+
del selector con tools registradas en runtime (6).
|
|
31
|
+
- Workflow de CI: typecheck, tests, verificación de aislamiento de la base, y un
|
|
32
|
+
job que genera un scaffold con `create-app` y lo typechequea contra el SDK de
|
|
33
|
+
ese commit.
|
|
34
|
+
|
|
3
35
|
## 0.1.5
|
|
4
36
|
|
|
5
37
|
Sincronización del SDK con el runtime de agentes de `hive`. **Trae rupturas de
|
package/README.md
CHANGED
package/bun.lock
CHANGED
|
@@ -8,16 +8,16 @@
|
|
|
8
8
|
"@anthropic-ai/sdk": "^0.74.0",
|
|
9
9
|
"@google/genai": "^1.43.0",
|
|
10
10
|
"@johpaz/hive-db": "^0.4.0",
|
|
11
|
-
"@modelcontextprotocol/sdk": "
|
|
12
|
-
"@sapphire/snowflake": "
|
|
13
|
-
"@slack/bolt": "
|
|
14
|
-
"@whiskeysockets/baileys": "
|
|
11
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
12
|
+
"@sapphire/snowflake": "^3.5.5",
|
|
13
|
+
"@slack/bolt": "^4.7.2",
|
|
14
|
+
"@whiskeysockets/baileys": "7.0.0-rc11",
|
|
15
15
|
"async-mutex": "^0.5.0",
|
|
16
16
|
"cron-parser": "^5.5.0",
|
|
17
17
|
"croner": "^10.0.1",
|
|
18
|
-
"discord.js": "
|
|
18
|
+
"discord.js": "^14.26.4",
|
|
19
19
|
"docx": "^9.6.1",
|
|
20
|
-
"grammy": "
|
|
20
|
+
"grammy": "^1.42.0",
|
|
21
21
|
"groq-sdk": "^0.37.0",
|
|
22
22
|
"jsonwebtoken": "^9.0.3",
|
|
23
23
|
"jszip": "^3.10.1",
|
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
"pdf-lib": "^1.17.1",
|
|
28
28
|
"pdfjs-dist": "^5.6.205",
|
|
29
29
|
"pptxgenjs": "^4.0.1",
|
|
30
|
-
"qrcode-terminal": "
|
|
30
|
+
"qrcode-terminal": "^0.12.0",
|
|
31
31
|
"toon-format-parser": "^1.1.0",
|
|
32
32
|
"xlsx": "^0.18.5",
|
|
33
|
-
"zod": "
|
|
33
|
+
"zod": "^4.4.3",
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/bun": "^1.3.13",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
},
|
|
41
41
|
"packages/cli": {
|
|
42
42
|
"name": "@hive/cli",
|
|
43
|
-
"version": "0.
|
|
43
|
+
"version": "0.1.5",
|
|
44
44
|
"bin": {
|
|
45
45
|
"hive": "./src/index.ts",
|
|
46
46
|
},
|
|
@@ -50,21 +50,21 @@
|
|
|
50
50
|
},
|
|
51
51
|
"packages/core": {
|
|
52
52
|
"name": "@hive/core",
|
|
53
|
-
"version": "0.
|
|
53
|
+
"version": "0.1.5",
|
|
54
54
|
"dependencies": {
|
|
55
55
|
"@anthropic-ai/sdk": "^0.74.0",
|
|
56
56
|
"@google/genai": "^1.43.0",
|
|
57
57
|
"@johpaz/hive-db": "^0.4.0",
|
|
58
|
-
"@modelcontextprotocol/sdk": "
|
|
59
|
-
"@sapphire/snowflake": "
|
|
60
|
-
"@slack/bolt": "
|
|
61
|
-
"@whiskeysockets/baileys": "
|
|
58
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
59
|
+
"@sapphire/snowflake": "^3.5.5",
|
|
60
|
+
"@slack/bolt": "^4.7.2",
|
|
61
|
+
"@whiskeysockets/baileys": "7.0.0-rc11",
|
|
62
62
|
"async-mutex": "^0.5.0",
|
|
63
63
|
"cron-parser": "^5.5.0",
|
|
64
64
|
"croner": "^10.0.1",
|
|
65
|
-
"discord.js": "
|
|
65
|
+
"discord.js": "^14.26.4",
|
|
66
66
|
"docx": "^9.6.1",
|
|
67
|
-
"grammy": "
|
|
67
|
+
"grammy": "^1.42.0",
|
|
68
68
|
"groq-sdk": "^0.37.0",
|
|
69
69
|
"jsonwebtoken": "^9.0.3",
|
|
70
70
|
"jszip": "^3.10.1",
|
|
@@ -74,10 +74,10 @@
|
|
|
74
74
|
"pdf-lib": "^1.17.1",
|
|
75
75
|
"pdfjs-dist": "^5.6.205",
|
|
76
76
|
"pptxgenjs": "^4.0.1",
|
|
77
|
-
"qrcode-terminal": "
|
|
77
|
+
"qrcode-terminal": "^0.12.0",
|
|
78
78
|
"toon-format-parser": "^1.1.0",
|
|
79
79
|
"xlsx": "^0.18.5",
|
|
80
|
-
"zod": "
|
|
80
|
+
"zod": "^4.4.3",
|
|
81
81
|
},
|
|
82
82
|
"devDependencies": {
|
|
83
83
|
"@types/jsonwebtoken": "^9.0.10",
|
|
@@ -258,17 +258,17 @@
|
|
|
258
258
|
|
|
259
259
|
"@sapphire/snowflake": ["@sapphire/snowflake@3.5.5", "", {}, "sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ=="],
|
|
260
260
|
|
|
261
|
-
"@slack/bolt": ["@slack/bolt@
|
|
261
|
+
"@slack/bolt": ["@slack/bolt@4.7.3", "", { "dependencies": { "@slack/logger": "^4.0.1", "@slack/oauth": "^3.0.5", "@slack/socket-mode": "^2.0.7", "@slack/types": "^2.21.1", "@slack/web-api": "^7.16.0", "axios": "^1.12.0", "express": "^5.0.0", "path-to-regexp": "^8.1.0", "raw-body": "^3", "tsscmp": "^1.0.6" }, "peerDependencies": { "@types/express": "^5.0.0" } }, "sha512-bODs8q/yNDWUPoxmQhFrRqLMA5vhB/PDizYWqb6CkQhLWEUo5JFtfJcmeU4ElGl6qSt++OKjSYNa4MPc77CleQ=="],
|
|
262
262
|
|
|
263
|
-
"@slack/logger": ["@slack/logger@
|
|
263
|
+
"@slack/logger": ["@slack/logger@4.0.1", "", { "dependencies": { "@types/node": ">=18" } }, "sha512-6cmdPrV/RYfd2U0mDGiMK8S7OJqpCTm7enMLRR3edccsPX8j7zXTLnaEF4fhxxJJTAIOil6+qZrnUPTuaLvwrQ=="],
|
|
264
264
|
|
|
265
|
-
"@slack/oauth": ["@slack/oauth@
|
|
265
|
+
"@slack/oauth": ["@slack/oauth@3.0.5", "", { "dependencies": { "@slack/logger": "^4.0.1", "@slack/web-api": "^7.15.0", "@types/jsonwebtoken": "^9", "@types/node": ">=18", "jsonwebtoken": "^9" } }, "sha512-exqFQySKhNDptWYSWhvRUJ4/+ndu2gayIy7vg/JfmJq3wGtGdHk531P96fAZyBm5c1Le3yaPYqv92rL4COlU3A=="],
|
|
266
266
|
|
|
267
|
-
"@slack/socket-mode": ["@slack/socket-mode@
|
|
267
|
+
"@slack/socket-mode": ["@slack/socket-mode@2.0.7", "", { "dependencies": { "@slack/logger": "^4.0.1", "@slack/web-api": "^7.15.0", "@types/node": ">=18", "@types/ws": "^8", "eventemitter3": "^5", "ws": "^8" } }, "sha512-qYy07je71WnEHgRwmw12DlAnZLi5HXmdlI2WUzUK2LH/rYXQpP6uEg462S5CwfE8FoCKUdIigHtYnOOfzZH1lQ=="],
|
|
268
268
|
|
|
269
|
-
"@slack/types": ["@slack/types@
|
|
269
|
+
"@slack/types": ["@slack/types@2.22.0", "", {}, "sha512-sZ9lIgJhPX2qft/tKWiklFlc0o1FWeI7QtciZJfW1+ErH1eGGHvOZ8e73sleTCFEFJp1q/R0WeS8Oa7AsiDprg=="],
|
|
270
270
|
|
|
271
|
-
"@slack/web-api": ["@slack/web-api@
|
|
271
|
+
"@slack/web-api": ["@slack/web-api@7.19.0", "", { "dependencies": { "@slack/logger": "^4.0.1", "@slack/types": "^2.21.0", "@types/node": ">=18", "@types/retry": "0.12.0", "axios": "^1.16.0", "eventemitter3": "^5.0.1", "form-data": "^4.0.4", "is-electron": "2.2.2", "is-stream": "^2", "p-queue": "^6", "p-retry": "^4", "retry": "^0.13.1" } }, "sha512-ItjyjEZml+LDH8CjcCLRLJHh7VZtevPKExrRN3l5KWyBliyDnGAeoO4Y+K+fFBmRpKLYVPgqWMX4THldv2HVtA=="],
|
|
272
272
|
|
|
273
273
|
"@tokenizer/inflate": ["@tokenizer/inflate@0.4.1", "", { "dependencies": { "debug": "^4.4.3", "token-types": "^6.1.1" } }, "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA=="],
|
|
274
274
|
|
|
@@ -308,7 +308,7 @@
|
|
|
308
308
|
|
|
309
309
|
"@vladfrangu/async_event_emitter": ["@vladfrangu/async_event_emitter@2.4.7", "", {}, "sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g=="],
|
|
310
310
|
|
|
311
|
-
"@whiskeysockets/baileys": ["@whiskeysockets/baileys@7.0.0-
|
|
311
|
+
"@whiskeysockets/baileys": ["@whiskeysockets/baileys@7.0.0-rc11", "", { "dependencies": { "@cacheable/node-cache": "^1.4.0", "@hapi/boom": "^9.1.3", "async-mutex": "^0.5.0", "libsignal": "^6.0.0", "lru-cache": "^11.1.0", "music-metadata": "^11.12.3", "p-queue": "^9.0.0", "pino": "^9.6", "protobufjs": "^7.5.6", "whatsapp-rust-bridge": "0.5.4", "ws": "^8.13.0" }, "peerDependencies": { "audio-decode": "^2.1.3", "jimp": "^1.6.1", "link-preview-js": "^3.0.0", "sharp": "*" }, "optionalPeers": ["audio-decode", "jimp", "link-preview-js"] }, "sha512-4FKCVZR8mGz7oy6aRJgcBdM5t1CjzzDOedfccphwJao5BAy6RKCTTDbjyOaJejCkYDwjkEADpZBRmKDxvGmoUQ=="],
|
|
312
312
|
|
|
313
313
|
"@xmldom/xmldom": ["@xmldom/xmldom@0.8.13", "", {}, "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw=="],
|
|
314
314
|
|
|
@@ -318,7 +318,7 @@
|
|
|
318
318
|
|
|
319
319
|
"adler-32": ["adler-32@1.3.1", "", {}, "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="],
|
|
320
320
|
|
|
321
|
-
"agent-base": ["agent-base@
|
|
321
|
+
"agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="],
|
|
322
322
|
|
|
323
323
|
"agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="],
|
|
324
324
|
|
|
@@ -334,6 +334,8 @@
|
|
|
334
334
|
|
|
335
335
|
"atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="],
|
|
336
336
|
|
|
337
|
+
"axios": ["axios@1.19.0", "", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw=="],
|
|
338
|
+
|
|
337
339
|
"base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
|
|
338
340
|
|
|
339
341
|
"bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="],
|
|
@@ -446,7 +448,9 @@
|
|
|
446
448
|
|
|
447
449
|
"finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="],
|
|
448
450
|
|
|
449
|
-
"
|
|
451
|
+
"follow-redirects": ["follow-redirects@1.16.0", "", {}, "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw=="],
|
|
452
|
+
|
|
453
|
+
"form-data": ["form-data@4.0.6", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.4", "mime-types": "^2.1.35" } }, "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ=="],
|
|
450
454
|
|
|
451
455
|
"form-data-encoder": ["form-data-encoder@1.7.2", "", {}, "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="],
|
|
452
456
|
|
|
@@ -488,7 +492,7 @@
|
|
|
488
492
|
|
|
489
493
|
"hashery": ["hashery@1.5.1", "", { "dependencies": { "hookified": "^1.15.0" } }, "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ=="],
|
|
490
494
|
|
|
491
|
-
"hasown": ["hasown@2.0.
|
|
495
|
+
"hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="],
|
|
492
496
|
|
|
493
497
|
"hono": ["hono@4.12.18", "", {}, "sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ=="],
|
|
494
498
|
|
|
@@ -498,7 +502,7 @@
|
|
|
498
502
|
|
|
499
503
|
"https": ["https@1.0.0", "", {}, "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg=="],
|
|
500
504
|
|
|
501
|
-
"https-proxy-agent": ["https-proxy-agent@
|
|
505
|
+
"https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="],
|
|
502
506
|
|
|
503
507
|
"humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="],
|
|
504
508
|
|
|
@@ -516,8 +520,12 @@
|
|
|
516
520
|
|
|
517
521
|
"ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="],
|
|
518
522
|
|
|
523
|
+
"is-electron": ["is-electron@2.2.2", "", {}, "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg=="],
|
|
524
|
+
|
|
519
525
|
"is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
|
|
520
526
|
|
|
527
|
+
"is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
|
|
528
|
+
|
|
521
529
|
"isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],
|
|
522
530
|
|
|
523
531
|
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
|
@@ -656,6 +664,8 @@
|
|
|
656
664
|
|
|
657
665
|
"proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
|
|
658
666
|
|
|
667
|
+
"proxy-from-env": ["proxy-from-env@2.1.0", "", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="],
|
|
668
|
+
|
|
659
669
|
"qified": ["qified@0.10.1", "", { "dependencies": { "hookified": "^2.1.1" } }, "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA=="],
|
|
660
670
|
|
|
661
671
|
"qrcode-terminal": ["qrcode-terminal@0.12.0", "", { "bin": { "qrcode-terminal": "./bin/qrcode-terminal.js" } }, "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ=="],
|
|
@@ -802,12 +812,20 @@
|
|
|
802
812
|
|
|
803
813
|
"@slack/web-api/p-queue": ["p-queue@6.6.2", "", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="],
|
|
804
814
|
|
|
815
|
+
"@types/node-fetch/form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="],
|
|
816
|
+
|
|
817
|
+
"es-set-tostringtag/hasown": ["hasown@2.0.3", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="],
|
|
818
|
+
|
|
805
819
|
"fetch-blob/web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
|
|
806
820
|
|
|
807
821
|
"form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
|
|
808
822
|
|
|
823
|
+
"gaxios/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
|
|
824
|
+
|
|
809
825
|
"gaxios/node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="],
|
|
810
826
|
|
|
827
|
+
"get-intrinsic/hasown": ["hasown@2.0.3", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="],
|
|
828
|
+
|
|
811
829
|
"groq-sdk/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="],
|
|
812
830
|
|
|
813
831
|
"music-metadata/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
|
|
@@ -824,10 +842,18 @@
|
|
|
824
842
|
|
|
825
843
|
"@slack/web-api/p-queue/p-timeout": ["p-timeout@3.2.0", "", { "dependencies": { "p-finally": "^1.0.0" } }, "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="],
|
|
826
844
|
|
|
845
|
+
"@types/node-fetch/form-data/hasown": ["hasown@2.0.3", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="],
|
|
846
|
+
|
|
847
|
+
"@types/node-fetch/form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
|
|
848
|
+
|
|
827
849
|
"form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
|
|
828
850
|
|
|
851
|
+
"gaxios/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
|
|
852
|
+
|
|
829
853
|
"groq-sdk/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
|
|
830
854
|
|
|
831
855
|
"pptxgenjs/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
|
|
856
|
+
|
|
857
|
+
"@types/node-fetch/form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
|
|
832
858
|
}
|
|
833
859
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@johpaz/hive-sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Hive SDK — The Agent Harness SDK. Build, deploy, and scale AI agent applications with multi-channel support, context engineering, and swarm orchestration.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -76,16 +76,16 @@
|
|
|
76
76
|
"@johpaz/hive-db": "^0.4.0",
|
|
77
77
|
"@anthropic-ai/sdk": "^0.74.0",
|
|
78
78
|
"@google/genai": "^1.43.0",
|
|
79
|
-
"@modelcontextprotocol/sdk": "
|
|
80
|
-
"@sapphire/snowflake": "
|
|
81
|
-
"@slack/bolt": "
|
|
82
|
-
"@whiskeysockets/baileys": "
|
|
79
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
80
|
+
"@sapphire/snowflake": "^3.5.5",
|
|
81
|
+
"@slack/bolt": "^4.7.2",
|
|
82
|
+
"@whiskeysockets/baileys": "7.0.0-rc11",
|
|
83
83
|
"async-mutex": "^0.5.0",
|
|
84
84
|
"cron-parser": "^5.5.0",
|
|
85
85
|
"croner": "^10.0.1",
|
|
86
|
-
"discord.js": "
|
|
86
|
+
"discord.js": "^14.26.4",
|
|
87
87
|
"docx": "^9.6.1",
|
|
88
|
-
"grammy": "
|
|
88
|
+
"grammy": "^1.42.0",
|
|
89
89
|
"groq-sdk": "^0.37.0",
|
|
90
90
|
"jsonwebtoken": "^9.0.3",
|
|
91
91
|
"jszip": "^3.10.1",
|
|
@@ -95,10 +95,10 @@
|
|
|
95
95
|
"openai": "^6.18.0",
|
|
96
96
|
"pdfjs-dist": "^5.6.205",
|
|
97
97
|
"pptxgenjs": "^4.0.1",
|
|
98
|
-
"qrcode-terminal": "
|
|
98
|
+
"qrcode-terminal": "^0.12.0",
|
|
99
99
|
"toon-format-parser": "^1.1.0",
|
|
100
100
|
"xlsx": "^0.18.5",
|
|
101
|
-
"zod": "
|
|
101
|
+
"zod": "^4.4.3"
|
|
102
102
|
},
|
|
103
103
|
"devDependencies": {
|
|
104
104
|
"@types/bun": "^1.3.13",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hive/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Hive Core — runtime de agentes con context engineering, catálogo de modelos y HiveDB",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -37,16 +37,16 @@
|
|
|
37
37
|
"@johpaz/hive-db": "^0.4.0",
|
|
38
38
|
"@anthropic-ai/sdk": "^0.74.0",
|
|
39
39
|
"@google/genai": "^1.43.0",
|
|
40
|
-
"@modelcontextprotocol/sdk": "
|
|
41
|
-
"@sapphire/snowflake": "
|
|
42
|
-
"@slack/bolt": "
|
|
43
|
-
"@whiskeysockets/baileys": "
|
|
40
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
41
|
+
"@sapphire/snowflake": "^3.5.5",
|
|
42
|
+
"@slack/bolt": "^4.7.2",
|
|
43
|
+
"@whiskeysockets/baileys": "7.0.0-rc11",
|
|
44
44
|
"async-mutex": "^0.5.0",
|
|
45
45
|
"cron-parser": "^5.5.0",
|
|
46
46
|
"croner": "^10.0.1",
|
|
47
|
-
"discord.js": "
|
|
47
|
+
"discord.js": "^14.26.4",
|
|
48
48
|
"docx": "^9.6.1",
|
|
49
|
-
"grammy": "
|
|
49
|
+
"grammy": "^1.42.0",
|
|
50
50
|
"groq-sdk": "^0.37.0",
|
|
51
51
|
"jsonwebtoken": "^9.0.3",
|
|
52
52
|
"jszip": "^3.10.1",
|
|
@@ -56,10 +56,10 @@
|
|
|
56
56
|
"openai": "^6.18.0",
|
|
57
57
|
"pdfjs-dist": "^5.6.205",
|
|
58
58
|
"pptxgenjs": "^4.0.1",
|
|
59
|
-
"qrcode-terminal": "
|
|
59
|
+
"qrcode-terminal": "^0.12.0",
|
|
60
60
|
"toon-format-parser": "^1.1.0",
|
|
61
61
|
"xlsx": "^0.18.5",
|
|
62
|
-
"zod": "
|
|
62
|
+
"zod": "^4.4.3"
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
65
65
|
"@types/jsonwebtoken": "^9.0.10"
|
|
@@ -42,7 +42,13 @@ export interface AcceptanceChecks {
|
|
|
42
42
|
|
|
43
43
|
export function sanitizeDiagnostic(value: string, limit = 1000): string {
|
|
44
44
|
return value
|
|
45
|
-
.replace(
|
|
45
|
+
.replace(
|
|
46
|
+
// El esquema de auth va aparte: sin el grupo opcional, "authorization:
|
|
47
|
+
// Bearer <token>" consumía sólo "Bearer" y dejaba el token en claro.
|
|
48
|
+
/(api[_-]?key|token|authorization|secret)(["'=:\s]+)(?:(bearer|basic)\s+)?[^\s,}"']+/gi,
|
|
49
|
+
(_match, key: string, separator: string, scheme?: string) =>
|
|
50
|
+
`${key}${separator}${scheme ? `${scheme} ` : ""}[REDACTED]`,
|
|
51
|
+
)
|
|
46
52
|
.slice(0, limit);
|
|
47
53
|
}
|
|
48
54
|
|
|
@@ -120,6 +120,11 @@ const BrowserConfigSchema = z.object({
|
|
|
120
120
|
headless: z.boolean().optional(),
|
|
121
121
|
timeoutMs: z.number().optional(),
|
|
122
122
|
sessionName: z.string().optional(),
|
|
123
|
+
// "agent-browser" (default) usa Chrome via CLI y sirve headless/Docker.
|
|
124
|
+
// "webview" usa Bun.WebView in-process — mucho más rápido y sin instalación,
|
|
125
|
+
// pero requiere Chrome instalado (o macOS con WebKit). "auto" toma webview
|
|
126
|
+
// sólo si hay motor. Lo pisa HIVE_BROWSER_BACKEND.
|
|
127
|
+
backend: z.enum(["agent-browser", "webview", "auto"]).optional(),
|
|
123
128
|
});
|
|
124
129
|
|
|
125
130
|
const CanvasConfigSchema = z.object({
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BrowserBackend — el contrato que consumen las browser tools.
|
|
3
|
+
*
|
|
4
|
+
* Hay dos implementaciones con perfiles opuestos:
|
|
5
|
+
*
|
|
6
|
+
* - `AgentBrowserBackend` (browser-service.ts): habla con el CLI de
|
|
7
|
+
* agent-browser por subproceso. Maneja Chrome de verdad, corre headless y
|
|
8
|
+
* por lo tanto sirve en Docker y en un servidor sin display. El costo es
|
|
9
|
+
* un `Bun.spawn` por operación —medido en ~68 ms de piso— más una
|
|
10
|
+
* instalación diferida de ~75 MB y la descarga de Chrome.
|
|
11
|
+
*
|
|
12
|
+
* - `WebViewBackend` (webview-backend.ts): usa `Bun.WebView`, in-process.
|
|
13
|
+
* Sin instalación, sin subprocesos, ~0.25 ms por `evaluate`. Necesita un
|
|
14
|
+
* entorno gráfico (WebKitGTK en Linux, WebKit del sistema en macOS), así
|
|
15
|
+
* que no sirve headless.
|
|
16
|
+
*
|
|
17
|
+
* El default sigue siendo agent-browser: es el único de los dos que funciona
|
|
18
|
+
* donde suele correr el gateway. WebView se elige explícitamente.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
export interface ScreenshotOptions {
|
|
22
|
+
encoding?: "blob" | "buffer" | "base64" | "shmem";
|
|
23
|
+
format?: "png" | "jpeg" | "webp";
|
|
24
|
+
quality?: number;
|
|
25
|
+
clip?: { x: number; y: number; width: number; height: number; scale: number };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface SnapshotOptions {
|
|
29
|
+
/** Colapsa nodos sin nombre accesible y recorta el texto largo. Default: true. */
|
|
30
|
+
compact?: boolean;
|
|
31
|
+
/** Profundidad máxima del árbol. */
|
|
32
|
+
depth?: number;
|
|
33
|
+
/** Sólo elementos accionables (links, botones, inputs...). */
|
|
34
|
+
interactiveOnly?: boolean;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* La superficie que las tools de `tools/web/` realmente usan. Se mantuvo
|
|
39
|
+
* deliberadamente chica: cualquier método que se agregue acá hay que
|
|
40
|
+
* implementarlo en los dos backends.
|
|
41
|
+
*/
|
|
42
|
+
export interface BrowserBackend {
|
|
43
|
+
readonly url: string;
|
|
44
|
+
readonly title: string;
|
|
45
|
+
readonly loading: boolean;
|
|
46
|
+
|
|
47
|
+
navigate(url: string): Promise<void>;
|
|
48
|
+
evaluate<T = unknown>(script: string): Promise<T>;
|
|
49
|
+
screenshot(options?: ScreenshotOptions): Promise<string>;
|
|
50
|
+
/** Árbol de accesibilidad en texto — lo que ve el modelo en vez del HTML crudo. */
|
|
51
|
+
snapshot(options?: SnapshotOptions): Promise<string>;
|
|
52
|
+
click(selector: string, options?: Record<string, unknown>): Promise<void>;
|
|
53
|
+
type(text: string): Promise<void>;
|
|
54
|
+
typeIn(selector: string, text: string): Promise<void>;
|
|
55
|
+
fill(selector: string, text: string): Promise<void>;
|
|
56
|
+
press(key: string, options?: { modifiers?: string[] }): Promise<void>;
|
|
57
|
+
scroll(dx: number, dy: number): Promise<void>;
|
|
58
|
+
scrollTo(selector: string, options?: { behavior?: "smooth" | "instant" }): Promise<void>;
|
|
59
|
+
back(): Promise<void>;
|
|
60
|
+
forward(): Promise<void>;
|
|
61
|
+
reload(): Promise<void>;
|
|
62
|
+
resize(width: number, height: number): Promise<void>;
|
|
63
|
+
/** Captura de un elemento puntual; el backend puede recortar sobre el viewport. */
|
|
64
|
+
screenshotElement(selector: string): Promise<string>;
|
|
65
|
+
close(): void;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export type BrowserBackendKind = "agent-browser" | "webview";
|
|
69
|
+
|
|
70
|
+
/** `auto` resuelve a webview si el runtime lo soporta; si no, agent-browser. */
|
|
71
|
+
export type BrowserBackendPreference = BrowserBackendKind | "auto";
|
|
72
|
+
|
|
73
|
+
/** Motor que usa `Bun.WebView` por debajo. */
|
|
74
|
+
export type WebViewEngine = "webkit" | "chrome";
|
|
75
|
+
|
|
76
|
+
const CHROME_PATHS = [
|
|
77
|
+
"/usr/bin/google-chrome",
|
|
78
|
+
"/usr/bin/google-chrome-stable",
|
|
79
|
+
"/usr/bin/chromium",
|
|
80
|
+
"/usr/bin/chromium-browser",
|
|
81
|
+
"/snap/bin/chromium",
|
|
82
|
+
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
83
|
+
"/Applications/Chromium.app/Contents/MacOS/Chromium",
|
|
84
|
+
"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
|
|
85
|
+
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
/** Chrome instalado en el sistema — `Bun.WebView` con motor chrome lo necesita. */
|
|
89
|
+
export function findChrome(): string | null {
|
|
90
|
+
if (process.env.BUN_CHROME_PATH) return process.env.BUN_CHROME_PATH;
|
|
91
|
+
const { existsSync } = require("node:fs") as typeof import("node:fs");
|
|
92
|
+
for (const candidate of CHROME_PATHS) {
|
|
93
|
+
if (existsSync(candidate)) return candidate;
|
|
94
|
+
}
|
|
95
|
+
// Último recurso: lo que esté en el PATH del usuario.
|
|
96
|
+
const home = process.env.HOME;
|
|
97
|
+
if (home) {
|
|
98
|
+
for (const name of ["google-chrome", "chromium"]) {
|
|
99
|
+
const local = `${home}/.local/bin/${name}`;
|
|
100
|
+
if (existsSync(local)) return local;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Motor a usar. WebKit no tiene dependencias externas pero sólo existe en macOS;
|
|
108
|
+
* Chrome corre headless en cualquier lado —incluido Docker— siempre que el
|
|
109
|
+
* binario esté instalado.
|
|
110
|
+
*/
|
|
111
|
+
export function resolveWebViewEngine(): WebViewEngine | null {
|
|
112
|
+
if (process.platform === "darwin") return "webkit";
|
|
113
|
+
return findChrome() ? "chrome" : null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** `Bun.WebView` existe desde Bun 1.3; además hace falta un motor utilizable. */
|
|
117
|
+
export function isWebViewSupported(): boolean {
|
|
118
|
+
if (typeof (globalThis as { Bun?: { WebView?: unknown } }).Bun?.WebView !== "function") return false;
|
|
119
|
+
return resolveWebViewEngine() !== null;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function resolveBackendKind(
|
|
123
|
+
preference: BrowserBackendPreference | undefined,
|
|
124
|
+
): BrowserBackendKind {
|
|
125
|
+
const wanted = process.env.HIVE_BROWSER_BACKEND ?? preference ?? "agent-browser";
|
|
126
|
+
if (wanted === "webview") return "webview";
|
|
127
|
+
if (wanted === "auto") return isWebViewSupported() ? "webview" : "agent-browser";
|
|
128
|
+
return "agent-browser";
|
|
129
|
+
}
|