v1.9.0

ruixenui/ruixen.comv1.9.0May 7, 2026by skyfallsin

AI Summary

This release introduces viewport testing, fixes tab leaks, improves session lifecycle robustness against timeouts, and hardens the installation process.

Key Highlights

  • New endpoint `POST /tabs/:tabId/viewport` for responsive testing.
  • Fixed tab leaks with `safePageClose` force-kill and orphan page reaper.
  • Session lifecycle robustness: timeouts now destroy sessions.
  • Install hardening with compiled `plugin.js` and cross-platform postinstall.

New Features

  • Viewport testing endpoint for live tabs.
  • Force-kill for stuck page close operations.
  • Orphan page reaper for Playwright pages.
  • Session destroy on navigation timeout.
  • Drain locks before closing sessions.
  • Dead-context returns `session_expired` (503).
  • Transparent proxy retry for failures.
  • Graceful handling of `PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1`.

Full Release Notes

## Responsive Viewport Testing

`POST /tabs/:tabId/viewport` — set any viewport size on a live tab for responsive testing. Pass `{ width, height }` and the page re-renders at that size. Useful for testing mobile breakpoints, tablet layouts, or unusual screen dimensions without creating a new session.

## Tab Leak Fix

Two fixes for pages that survive normal cleanup:

- **`safePageClose` force-kill**: If `page.close()` hangs (e.g., stuck unload handler), the page is force-closed after timeout instead of leaked. Previously a single stuck page would starve Firefox of DOM threads.
- **Orphan page reaper**: Background interval detects Playwright pages that escaped `tabGroups` tracking and force-closes them.

## Session Lifecycle Robustness

- **Navigation timeout → session destroy**: A poisoned proxy (Cloudflare holding a connection for 30s) used to kill all subsequent navigations in that context. Now click/navigate/open_url timeouts destroy the session so the next request gets a fresh proxy.
- **Drain locks before close**: Queued tab operations get clean `410 Tab destroyed` instead of cascading `500 Target page closed` errors.
- **Dead-context → 503**: Cascade errors return `session_expired` with retry semantics instead of generic 500.
- **Transparent proxy retry**: Navigation failures from proxy blocks or timeouts automatically retry once with a fresh session.
- **goBack timeout 10s → 20s**: Back navigation uses browser cache; 10s was too short for complex SPA re-renders.

## Install Hardening

- Ship compiled `plugin.js` so install works even when TypeScript compilation is skipped — by @Yeraze (#2140)
- Cross-platform postinstall script with cache validation — by @gustavosmendes (#2149)
- Graceful handling of `PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1` (warns + skips warm-up instead of crash loop) — by @gustavosmendes (#2149)

## Fixes & Improvements

- Native memory pressure: restart browser when idle if heap exceeds threshold
- Memory leak false-positive reduction (3 safeguards for watchdog stall detection)
- Crash reporter renamed to telemetry, credentials moved to Cloudflare Worker relay
- OpenClaw plugin metadata + ClawHub publish workflow

## Thank You

- @cunninghambe — co-authored viewport endpoint and tab leak fix (#2470, #2471)
- @gustavosmendes — install hardening and `PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD` support (#2149)
- @Yeraze — compiled plugin.js fix (#2140)
- @Xy2002 — Railway deployment configuration (#651)