A broad bug-fix release, driven almost entirely by community reports. The headline fix restores the npm package — v26.3.18 shipped without its dist/ folder, which broke require('vibium') / import 'vibium/sync', the bundled TypeScript types, and ESM binary resolution. Beyond that, this release fixes a wide range of issues across the CLI, the MCP server, and the JavaScript, Python, and Java clients — most surfaced by systematic cross-client testing.
📦 Packaging (npm) — repairs the broken v26.3.18
- The npm package ships
dist/again, sorequire('vibium'),import 'vibium/sync', and the TypeScript declarations work. A self-healingprepackhook now rebuildsdist/and refuses to publish an incomplete package. (#103 by @ichimond, #127 by @snackattas, #100 by @michaelhly) - ESM binary resolution fixed —
require.resolvefailed under native ESM, so the vibium binary couldn't be located. (#62 by @cavoirom)
⚙️ Core engine (all clients)
fillno longer crashes on<textarea>("Illegal invocation") — the value setter now matches the element's actual type. (#117 by @paulsmith, #155 by @lana-20)selecterrors on a non-matching option instead of silently "succeeding", and now matches by visible label, not just thevalueattribute. (#140 by @paulsmith)⚠️ waitUntil/waitForFunctionaccept bare expressions, not only() => …functions. (#123, #131, #145 by @lana-20)- Clock methods error clearly when
clock.install()wasn't called instead of silently doing nothing. (#125 by @lana-20)⚠️ - Script exceptions now surface a real error message instead of an empty one. (#111 by @Udit1305)
🤖 MCP server
- Empty /
nullresults no longer causeinvalid_union—browser_evaluateof"", an absent attribute, and text-less elements return cleanly. (#154, #153, #157 by @lana-20) - Stringified numbers accepted — e.g.
{"ms": "2000"}. (#85 by @tnsardesai) browser_countno longer crashes on the numeric result. (#149 by @lana-20)browser_storage_stateparses BiDi's structured cookie values instead of crashing. (#150 by @lana-20)browser_set_cookiederives the domain from the current page when omitted. (#152 by @lana-20)browser_screenshot { annotate: true }no longer crashes. (#156 by @lana-20)
🖥️ CLI & error messages
- No more Node stack traces on ordinary command failures — you get the binary's own message and exit code. (#161 by @paulsmith, #111 by @Udit1305)
- Errors are categorized correctly — validation/not-found failures are no longer mislabeled as timeouts (and no longer raise
TimeoutErrorin the Python/Java clients). (#64 by @evanniedojadlo)⚠️
🐍 Python client
page.eval()added as an alias forevaluate(). (#144 by @lana-20)element.bounds()supports dict-style access (bb["width"],"width" in bb) alongside attribute access. (#147 by @lana-20)- Large pipe messages (e.g. base64 screenshots) no longer crash with
LimitOverrunError. (#110 by @Jhoan0714)
☕ Java client
- Fixed
waitForURL(#129),addScript/addStyle(#130),dispatchEvent(#132),dragTo(#134),onError/collectErrors(#136), and clock time formats (#137) — mostly command/parameter mismatches with the engine.el.highlight()is now implemented engine-side (#133). (all reported by @lana-20)
🔧 Tooling & docs
make test-pythonupgrades pip before installing, so the editable install works on stock environments.- Windows:
npm.cmdspawning, platform-binary copy, and process-cleanup fixes somake testpasses on Windows. - The Windows and Linux dev-setup guides now list the JDK and Python prerequisites.
⚠️ Notable behavior changes
selectnow errors when the value matches no option (was a silent success) and matches by visible label.- Clock operations now error if
clock.install()wasn't called first (was a silent no-op). - Non-timeout failures are no longer reported as timeouts — in Python/Java they raise a generic error instead of
TimeoutError.
🧭 Known issues (deferred to a follow-up)
- Click → daemon deadlock on native dialogs / navigation (#146, #151, #128)
- Java
page.expose()(#135) - The remaining CLI bugs tracked in #112 (B6, B8–B33)
🙏 Thanks
This release was driven almost entirely by community bug reports. A huge thank-you to @lana-20 for an extraordinary amount of systematic, cross-client testing, and to @paulsmith, @Udit1305, @snackattas, @ichimond, @michaelhly, @cavoirom, @tnsardesai, and @Jhoan0714 for the reports that made these fixes possible.
What's Changed
- Fix npm package shipping empty dist and ESM binary resolution by @hugs in #162
- Fix textarea fill crash, silent select no-op, wait-expression timeout, and clock guard by @hugs in #163
- Fix MCP empty-result serialization, number coercion, count, cookies, annotate by @hugs in #164
- Improve CLI failure output and stop mislabeling errors as timeouts by @hugs in #165
- Add page.eval alias, dict-compatible BoundingBox, larger pipe limit (Python) by @hugs in #166
- Fix Java client command/param mismatches; add engine highlight command by @hugs in #167
- Upgrade pip before installing Python test deps by @hugs in #169
- Use npm.cmd on Windows in prepack + packaging test by @hugs in #170
- Add Java (JDK) + Python prerequisites to Windows and Linux setup docs by @hugs in #171
- Quote pack-destination in packaging test for Windows paths with spaces by @hugs in #172
Full Changelog: v26.3.18...v26.5.31