Skip to content

fix(hub-ui): bridge tools to the inspected page - #363

Open
SaKaNa-Y wants to merge 3 commits into
devframes:mainfrom
SaKaNa-Y:fix/inspected-page-bridge
Open

SaKaNa-Y wants to merge 3 commits into
devframes:mainfrom
SaKaNa-Y:fix/inspected-page-bridge

Conversation

@SaKaNa-Y

@SaKaNa-Y SaKaNa-Y commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Problem

Vue Tracer and A11y opened from the Vite DevTools browser extension run against the hub UI provider's iframe instead of the inspected app. The parent/opener connection does not cross the extension boundary. Action setup can finish after its first activation event, leaving Tracer inactive on the first click.

A disconnected or stale inspected-page session can also deactivate a newer session's Tracer action because cleanup previously tracked only the action ID.

Fix

Add a transport-neutral createInPageChannelRelay and a dedicated inspected-page endpoint in @devframes/hub-ui. Browser adapters bind the transport to a document; page scripts and actions execute there while custom renderers stay in the hub UI provider document. Existing panel channel APIs remain unchanged.

Finish action setup before activation and serialize activation and teardown. Track the active action's owning connection so disconnect and explicit deactivation requests can only stop that connection's action. Clear ownership when page selection changes, preserving subsequent activation from the embedded UI. In-flight actions still finish teardown before replacement sessions activate.

Include protocol documentation, API snapshots, and regression coverage for first activation, rapid navigation, reconnection, and session isolation. Incorporate current main, retaining both endpoint and relay references and adapting test protocols to the upstream functions namespace.

Merge and release order

This is step 1 of 2 in the Devframe / Vite DevTools fix. Keep this PR in draft for review.

  1. Merge this PR and publish the affected packages, including devframe, @devframes/hub, and @devframes/hub-ui.
  2. Upgrade the Devframe dependencies in the companion Vite DevTools PR to that release, validate with the published packages, then merge and release the extension changes.

Companion adapter: vitejs/devtools#563. That draft PR depends on this release; this PR can merge first.

Verification

  • pnpm lint and pnpm knip: passed.
  • pnpm test --run: build passed; 1,556 tests passed, 9 skipped, including API snapshots.
  • pnpm typecheck: passed, 39 tasks.
  • Three ownership regressions fail before the fix and pass afterward: old-session disconnect, old-session explicit deactivation, and page selection ending before a subsequent embedded activation.
  • Focused inspected-page and activation tests: 32 passed.
  • Full Tracer/A11y browser UI end-to-end scenarios were not rerun in this revision.

Add a transport-neutral in-page channel relay and a dedicated inspected-page endpoint for browser adapters. Route page scripts and action activation to the inspected document while keeping custom renderers in the hub UI provider document.

Run action setup before activation and serialize stale activation cleanup so rapid navigation cannot disable a newer action. Cover port routing, lifecycle cleanup, isolation, activation races, and the public API with regression tests and snapshots.
@vercel

vercel Bot commented Sep 5, 2026

Copy link
Copy Markdown

@SaKaNa-Y is attempting to deploy a commit to the NuxtLabs Team on Vercel.

A member of the Team first needs to authorize it.

Preserve the endpoint API reference alongside the relay reference and adapt the relay test protocol to the functions namespace introduced upstream.
Track the active inspected-page action across sessions and release ownership when page selection changes. Ignore stale deactivation and disconnect requests while preserving serialized teardown for in-flight activations.
@SaKaNa-Y
SaKaNa-Y marked this pull request as ready for review September 11, 2026 12:21
@coldtea-pr-lens

coldtea-pr-lens Bot commented Sep 11, 2026

Copy link
Copy Markdown

◈ PR Lens

🟢 +5 new · 🟠 ~3 changed · 🔴 -0 removed · 2 flows · 6 files · commit 4559790


Architecture

Architecture diagram for devframes/devframe at 4559790

8 components touched across 4 lanes.

Open the interactive canvas


Inside the changed components — 2 views

Component view — Inspected page bridge

Internal components of the inspected page host and standalone viewer target.

Architecture view of Component view — Inspected page bridge in devframes/devframe

Component view — In-page channel relay

Dual-role relay modules connecting panel iframes to page scripts.

Architecture view of Component view — In-page channel relay in devframes/devframe

Data flow

Data flow diagram for devframes/devframe at 4559790

Activating an action dock in an inspected page · Relaying an in-page channel handshake across the bridge

Open the interactive canvas


The other flows — 1 sequence

Relaying an in-page channel handshake across the bridge

Sequence diagram of Relaying an in-page channel handshake across the bridge in devframes/devframe

View

  • Architecture lens
  • Data flow lens
  • Expand every detail

Tip

The diagrams are links. Click one to open it on the canvas, then press W or click play to walk through the change.

🪧 More tips
  • Run npx skills add coldteadotai/pr-lens, then tell your coding agent: "Diagram the change you just made with PR Lens and attach it to the pull request."
  • Run npx @coldtea/pr-lens-cli analyze --base origin/main on a branch, then npx @coldtea/pr-lens-cli render .pr-lens/graph.json. Same lenses, your own model key, before the pull request exists.
  • Untick Architecture lens or Data flow lens under View to hide a diagram, or tick Expand every detail to open every section. The comment redraws in a few seconds.
  • Click the link under each diagram to open it on a canvas you can zoom, pan and step through.
  • Open a diagram on the canvas, then press W or click play to walk through the change one step at a time.
  • The CLI's render reads .github/pr-lens.yml and applies your renames, exclusions and lane pins at draw time.
  • Set github.comment.collapsed: true in .github/pr-lens.yml to fold the comment behind one View architecture and data flow row. Drawing still runs on every push.
  • Add .github/workflows/pr-lens.yml with coldteadotai/pr-lens/packages/action@v0 and your model provider's key as its api-key to run PR Lens from your own CI. Any /chat/completions endpoint works.
  • Push a commit and the comment redraws for the new head. A slow older run never overwrites a newer one.
  • Switch GitHub to dark mode and the diagrams follow. The moving dots are this pull request's data in motion.

Thanks for using PR Lens! It's built by Coldtea, free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Repeated action setup can duplicate Tracer handlers, and delayed relay handshakes can leak ports or enter reconnect loops.

Get a fresh assessment by requesting another Copilot review.

Pull request overview

Adds an inspected-page bridge so dock actions and page scripts execute in the inspected document while preserving existing panel APIs.

Changes:

  • Adds transport-neutral in-page channel relaying.
  • Adds inspected-page session, ownership, and teardown handling.
  • Adds protocol documentation, snapshots, and regression tests.
File summaries
File Description
tests/__snapshots__/tsnapi/devframe/in-page-channel.snapshot.js Records the relay export.
tests/__snapshots__/tsnapi/devframe/in-page-channel.snapshot.d.ts Records relay types.
tests/__snapshots__/tsnapi/@devframes/hub/constants.snapshot.d.ts Records the connection event.
packages/hub/src/events.ts Defines the inspected-page event.
packages/hub-ui/src/client/state/inspected-page.ts Implements inspected-page sessions and transport.
packages/hub-ui/src/client/state/inspected-page.test.ts Tests bridge behavior and isolation.
packages/hub-ui/src/client/state/inspected-page.test-utils.ts Provides browser test doubles.
packages/hub-ui/src/client/state/inspected-page-context.test.ts Tests remote dock execution.
packages/hub-ui/src/client/state/context.ts Routes scripts and actions to the inspected page.
packages/hub-ui/src/client/state/action-activation.test.ts Tests first-activation ordering.
packages/hub-ui/src/client/standalone/main.ts Connects the standalone UI to the bridge.
packages/devframe/src/in-page-channel/relay.ts Implements channel relaying.
packages/devframe/src/in-page-channel/relay.test.ts Tests relay lifecycle and isolation.
packages/devframe/src/in-page-channel/index.ts Exports the relay API.
docs/content/8.references/5.browser-api.md Documents the relay API.
docs/content/8.references/3.events.md Documents the connection protocol.
Review details
  • Files reviewed: 14/16 changed files
  • Comments generated: 3
  • Review effort level: Balanced

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +157 to +167
function onPageGrant(event: MessageEvent): void {
if (event.source !== win || !validHandshake(event.data, 'grant') || !event.ports[0])
return
for (const [id, connection] of connections) {
if (!connection.port && matches(event.data, connection.hello)) {
attach(id, connection, event.ports[0])
send({ id, kind: 'grant', handshake: event.data })
return
}
}
}
Comment on lines +178 to +183
function forwardHello(id: string, hello: InPageChannelHandshakeMessage): void {
const connection = connections.get(id)
if (connection?.port || (connection && !sameHello(connection.hello, hello)))
return
connections.set(id, { hello })
win.postMessage(hello, origin)
Comment on lines +288 to +290
// Import/setup must finish before activation is emitted. Page scripts
// such as Vue Tracer install their activation listener during setup.
await runDockSetupScript(entry)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants