Conversation
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.
|
@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.
◈ PR Lens
Architecture 9 components touched across 5 lanes. Inside the changed components — 2 viewsComponent view — In-page channel relay Internal components of the in-page channel bridge relaying handshakes and dedicated MessagePorts. Component view — Inspected page bridge Internal components managing inspected page connection, action preparation, and lifecycle serialization. Data flow
The other flows — 1 sequence
View
Tip Push a commit and the comment redraws for the new head. A slow older run never overwrites a newer one. 🪧 More tips
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. |
There was a problem hiding this comment.
🟡 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.
Preserve trusted eager initialization while routing page scripts to the inspected document. Keep action setup before activation and reject stale page preparation after navigation.
Close unclaimed grant ports and end their opposite endpoints. Retry pending document handshakes with distinct identities so delayed grants cannot replace newer connections. Cover cancellation, delayed grants, late scripts, and direct in-page connections.
Count each action invocation directly, preserving the per-activation action contract without retaining entry activation subscriptions.
A panel could close before receiving its port while the relay kept retrying. A later grant then registered an unused peer indefinitely when heartbeat was disabled. Send cancellation through the window handshake and validate its source and identity before closing the relay connection. Cover late page scripts, delayed grants, and cancellation isolation.
Important
Please take a moment to read this. Thank you!
I should include a brief explanation of the problem in my own words in every PR. If that explanation is missing, please @mention me and do not merge this PR until I have added it. You may also leave this PR unaddressed (because this means I have not fulfilled my responsibilities as the author).
If my explanation is unclear or difficult to follow, please ask me to clarify or provide reproduction steps or supporting evidence.
I welcome suggestions and counterarguments, especially questions about anything I may have overlooked. (Your feedback helps me learn and improve. 🙏)
I hold myself to this standard for every PR, regardless of its size.
Problem
Vue Tracer and A11y opened from the Vite DevTools browser extension execute against the hub UI provider document instead of the inspected app. Action setup can also miss the first activation, and stale inspected-page sessions can deactivate newer sessions' actions.
Fix
Add a transport-neutral
createInPageChannelRelayand an inspected-page endpoint in@devframes/hub-ui. Page scripts and actions execute in the inspected document; custom renderers stay in the hub UI provider document. Preserve existing panel channel APIs.Complete action setup before activation, serialize remote activation and teardown, and track action ownership per connection. Preserve main's trusted eager initialization and setup cache while routing eager page/action scripts to the inspected document. Ignore stale page preparation after navigation.
Deduplicate pending document handshakes and retry every second with an attempt-specific identity. Close unclaimed or superseded grant ports and explicitly end their opposite endpoints, including when heartbeat is disabled. Panels send cancellation on close even before receiving a port. Relays match the originating window, origin, and handshake identity before cancelling, stop pending retries, and release late grants. Preserve direct in-page connections alongside relayed panels.
The demo action now performs its work directly on each invocation instead of accumulating activation subscriptions. Actions retain the per-activation execution contract established in #387.
Review follow-up: Vue Tracer
The demo action no longer accumulates activation subscriptions. The Tracer-owned dock and element-click subscription cleanup is implemented separately in antfu/vite-plugin-vue-tracer#13. This preserves the per-activation action contract established in #387; one-time framework setup alone would leave Tracer's inner click-listener leak intact.
Merge and release order
devframe,@devframes/hub, and@devframes/hub-ui.The first two fixes are independently mergeable and may be reviewed in parallel. The recommended order above puts the Tracer lifecycle fix first; the extension integration remains the final step. Published-package validation should include repeated Tracer activation, cancellation, and A11y inspection against the inspected app.
Verification
pnpm lintandpnpm knip: passed.pnpm build: all 28 tasks passed.pnpm typecheck: coverage verification and all 40 tasks passed.pnpm test --run: 145 test files passed; 1,621 tests passed and 9 skipped, including API snapshots.