@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 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
@@ -212,4 +212,4 @@ npm view @johpaz/hive-sdk dist-tags # verificar después del release
212
212
 
213
213
  ---
214
214
 
215
- *Hive SDK v0.1.5 — MIT*
215
+ *Hive SDK v0.1.6 — MIT*
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": "latest",
12
- "@sapphire/snowflake": "latest",
13
- "@slack/bolt": "latest",
14
- "@whiskeysockets/baileys": "latest",
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": "latest",
18
+ "discord.js": "^14.26.4",
19
19
  "docx": "^9.6.1",
20
- "grammy": "latest",
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": "latest",
30
+ "qrcode-terminal": "^0.12.0",
31
31
  "toon-format-parser": "^1.1.0",
32
32
  "xlsx": "^0.18.5",
33
- "zod": "latest",
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.0.15",
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.0.15",
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": "latest",
59
- "@sapphire/snowflake": "latest",
60
- "@slack/bolt": "latest",
61
- "@whiskeysockets/baileys": "latest",
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": "latest",
65
+ "discord.js": "^14.26.4",
66
66
  "docx": "^9.6.1",
67
- "grammy": "latest",
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": "latest",
77
+ "qrcode-terminal": "^0.12.0",
78
78
  "toon-format-parser": "^1.1.0",
79
79
  "xlsx": "^0.18.5",
80
- "zod": "latest",
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@5.0.0", "", { "dependencies": { "@slack/logger": "^5.0.0", "@slack/oauth": "^4.0.0", "@slack/socket-mode": "^3.0.0", "@slack/types": "^3.0.0", "@slack/web-api": "^8.0.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-L0FTzidrDKTu4Ph8sdv0bB3acafBTAC02TBcD+hojPTTNSMX3hSK+rkpkUKkqbbc0vGpSjd6A/g71Rjy7EbBhw=="],
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@5.0.0", "", { "dependencies": { "@types/node": ">=20" } }, "sha512-VGXhmmgsAo9shdQYh4tFDndd+7nsgp0Y5h0UPDaUp8K359pBasI6YdkMqFW3mCOxLQkq09qj7o7cq6f3DuXcJQ=="],
263
+ "@slack/logger": ["@slack/logger@4.0.1", "", { "dependencies": { "@types/node": ">=18" } }, "sha512-6cmdPrV/RYfd2U0mDGiMK8S7OJqpCTm7enMLRR3edccsPX8j7zXTLnaEF4fhxxJJTAIOil6+qZrnUPTuaLvwrQ=="],
264
264
 
265
- "@slack/oauth": ["@slack/oauth@4.0.0", "", { "dependencies": { "@slack/logger": "^5.0.0", "@slack/web-api": "^8.0.0", "@types/jsonwebtoken": "^9", "@types/node": ">=20", "jsonwebtoken": "^9" } }, "sha512-Aqs5bGghT+VtNcdwVOQy7CcyCfDNd9YYnZsCRukIF9p1Mxuq4uL+BjqlWQB0SeS4wzrLzePPgvj8JDuQil+ezA=="],
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@3.0.0", "", { "dependencies": { "@slack/logger": "^5.0.0", "@slack/web-api": "^8.0.0", "@types/node": ">=20", "eventemitter3": "^5" }, "peerDependencies": { "undici": "^7.0.0" } }, "sha512-QShO60SB0E+HH+TbcKj3CBEQbodToRyiXnxuSB4t1kvUlqEmuGA1nOOjrRDkDJbOECAZ13PLe4ek9SrntpfoYg=="],
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@3.0.0", "", {}, "sha512-KNOqpnNAlsFt5Jk9XBclslQ0lobRIg/0tnhpmvZJAglHJx9E8oceN8hC3gaBzkR6UzQ9Wzq4rLsJ98wUcxWPfw=="],
269
+ "@slack/types": ["@slack/types@2.22.0", "", {}, "sha512-sZ9lIgJhPX2qft/tKWiklFlc0o1FWeI7QtciZJfW1+ErH1eGGHvOZ8e73sleTCFEFJp1q/R0WeS8Oa7AsiDprg=="],
270
270
 
271
- "@slack/web-api": ["@slack/web-api@8.0.0", "", { "dependencies": { "@slack/logger": "^5.0.0", "@slack/types": "^3.0.0", "@types/node": ">=20", "@types/retry": "0.12.0", "eventemitter3": "^5.0.1", "p-queue": "^6", "p-retry": "^4", "retry": "^0.13.1" } }, "sha512-ORx3XQryQPq2Jnxv5giSKXVoQRUeylrrymIR2S9fPzLjPcCts8RayMeBSZMcpfpAqp6fnBRuPW2UB6dUPUTEZA=="],
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-rc13", "", { "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-8JPc8gaaCRykkjW2jxLGQ7/RZGrc7awO7WU+QJocf58eSUI9jAdcuYLynzhAbyU4UWvJJsHImZ+5E/JaZj5ypA=="],
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@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
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
- "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=="],
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.3", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="],
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@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
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.5",
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": "latest",
80
- "@sapphire/snowflake": "latest",
81
- "@slack/bolt": "latest",
82
- "@whiskeysockets/baileys": "latest",
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": "latest",
86
+ "discord.js": "^14.26.4",
87
87
  "docx": "^9.6.1",
88
- "grammy": "latest",
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": "latest",
98
+ "qrcode-terminal": "^0.12.0",
99
99
  "toon-format-parser": "^1.1.0",
100
100
  "xlsx": "^0.18.5",
101
- "zod": "latest"
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/cli",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Hive CLI — init, run, test, trace",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hive/core",
3
- "version": "0.1.5",
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": "latest",
41
- "@sapphire/snowflake": "latest",
42
- "@slack/bolt": "latest",
43
- "@whiskeysockets/baileys": "latest",
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": "latest",
47
+ "discord.js": "^14.26.4",
48
48
  "docx": "^9.6.1",
49
- "grammy": "latest",
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": "latest",
59
+ "qrcode-terminal": "^0.12.0",
60
60
  "toon-format-parser": "^1.1.0",
61
61
  "xlsx": "^0.18.5",
62
- "zod": "latest"
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(/(api[_-]?key|token|authorization|secret)(["'=:\s]+)[^\s,}"']+/gi, "$1$2[REDACTED]")
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
+ }