Skip to content

v0.3.3

Choose a tag to compare

@github-actions github-actions released this 25 May 03:32
· 196 commits to main since this release
c08ed32

A perf pass on the LLM hot path plus a round of UX fixes that came out of dogfooding the result.

Performance

Three wins on the LLM-driven loop's hot path. ~1 second (median ~16%) shaved off the time-to-first-tool_use on a cold command; 93% trimmed off the system-prompt addendum on every follow-up turn. End-to-end benchmark in packages/core/src/scripts/bench-ttfb.ts (run via pnpm bench-ttfb).

  • Pinned MCP server path. npx -y @playwright/mcp@latest was kicking off a full npm registry round-trip + tarball extract on every claude -p spawn (2.4-6.0 s in isolation). @playwright/mcp is now a direct dep of @hover-dev/core and resolved via createRequire(...).resolve() at service boot.
  • System-prompt split (stable + volatile). The full 2.4 KB CDP hint was re-appended every turn, fragmenting Anthropic's prompt-cache fingerprint and re-billing ~600 input tokens per follow-up. Follow-up turns now use a 175-char tab-only snapshot. 93% size reduction, cache-friendly fingerprint.
  • Shared preflight cache. The CDP preflight (/json/version + /json/list) is now cached at module scope keyed by cdpUrl, shared between the command path and the widget's check-cdp ping. TTL bumped to 30 s.

Fixes (from dogfooding the perf pass)

After the perf changes landed, a dogfood session surfaced four UX bugs that had been latent for a while:

  • Group status now reflects business outcome, not tool retries. A single MCP tool call that returned is_error: true was painting the entire group red ✗ — even when the agent recovered and the step actually succeeded. Real example: 3-of-4 steps red on a run that had fully completed. Now only the session-level done.isError paints the group red; individual tool errors stay in the expanded diagnostic view.
  • User-pressed-Stop renders as "Stopped", not "Failed". The cancel path was emitting isError: true, treating the user's own action as a system failure. Run terminal states are now three: ✓ green Result, ✗ red Failed, ⊘ grey Stopped. Cancelled runs are also no longer saveable — they're not complete specs.
  • The agent now knows its standing mission. Typing "test" got you a single browser_snapshot and a one-line "App is running fine" report. The system prompt covered navigation rules but never stated the mission. New "Your job" preamble in buildCdpHint defines the standing mission: drive the app, exercise interactive surfaces, report bugs. Vague prompts trigger a real exploratory test pass (snapshot → identify surfaces → drive 2-5 flows → note findings). Specific prompts are still followed verbatim.
  • Result card no longer drops the prose summary written inside a ## Findings block. extractFindings only kept the list items and threw the rest away. Agents writing structured findings mixed with prose (the common shape, especially after the mission preamble landed) saw their narrative summary silently vanish. Fixed: non-list-item lines inside the block are preserved as Result text.
  • Next.js MCP wiring works under Turbopack. resolveMcpConfig was using import.meta.url as the resolution base, which Turbopack rewrites to a virtual [project]/... URL. The generated mcp config then contained an unloadable path and Claude reported mcp_status: failed. Now resolves from process.cwd().

Install

npx @hover-dev/cli@latest add

Or upgrade an existing project:

pnpm up @hover-dev/next  # or vite-plugin-hover / @hover-dev/astro / @hover-dev/nuxt / webpack-plugin-hover / @hover-dev/cli

All 8 packages were published to npm at 0.3.3. Full grouped notes in CHANGELOG.md.

Full Changelog: v0.3.2...v0.3.3