Skip to content

[nova] feat: attach existing Chromium apps through explicit local CDP endpoints #41

Description

@bigduu

User outcome

Part of bigduu/Zenith#185. The user wants Chromium-based applications to participate in Nova interaction UX, including discovery when debugging has not been opened. This issue delivers the bounded connection half; independent application discovery and supported enablement remain separately reviewable slices.

Connect Nova's existing DevTools MCP integration to an explicitly selected, already-running local Chromium application endpoint. Preserve the application and Bodhi windows when Nova connects, disconnects, or fails.

Verified current behavior

At Nova master 8f029d22dbc9ab317a68560788d1e6360b71120e, src/chrome_devtools.rs only exposes isolated Chrome and existing stable Chrome auto-connect. The pinned chrome-devtools-mcp@1.8.0 already supports explicit browser HTTP and browser WebSocket endpoints, pageId targeting, and disconnecting without closing a caller-owned browser.

Acceptance slice (4–6 hours, Nova only)

  • Add explicit endpoint attachment to the existing launcher; preserve isolated mode as the default. HTTP browser URL and browser WebSocket URL inputs are mutually exclusive with each other and with launch/auto-connect options.
  • Validate endpoint syntax before spawning the sidecar: explicit loopback IP literal and port, appropriate HTTP/WS schemes, no userinfo or fragment, and a documented browser-level path contract. Do not echo rejected credentials in errors. Preserve the fixed upstream version and current telemetry/network-header privacy defaults.
  • Clearly state the actual boundary: these are trusted local endpoint inputs, not network confinement. Pinned Puppeteer follows HTTP discovery results and WebSocket redirects. Do not claim input validation prevents all remote traffic; a hardened transport is a separate acceptance slice.
  • Attachment failure must not launch another browser. Detaching or replacing this MCP runtime must leave the target app and Bodhi running. No headless or application launch flags in endpoint mode.
  • Document list_pages followed by explicit pageId targeting for reads/actions, including two-window examples. Selecting an application for discovery does not itself grant full CDP control.
  • Explain browser-level CDP versus renderer-only sockets and Node main-process inspector endpoints. Electron/CEF compatibility must be stated per tested runtime; upstream officially supports Chrome/Chrome for Testing, so successful tools/list alone is not an Electron compatibility claim.
  • Connection/setup errors give actionable instructions without requiring Bodhi to quit. Existing native AX and extension capabilities remain independently available.

In-scope files/systems

src/chrome_devtools.rs, launcher CLI/e2e tests, README and plugin documentation; a URL parser dependency only if needed. No new CDP engine, proxy, daemon, or provider router.

Test plan

  • Fake-npx real-process tests for literal IPv4/IPv6 arguments, mutual exclusions, rejection before spawn, private defaults, and stdio transparency.
  • A test-owned local Chromium fixture and pinned upstream handshake/list_pages; disconnect/SIGTERM preserves the fixture process, failed connection does not launch Chrome, and no Browser.close is sent to an attached browser.
  • Any advertised Electron version requires its own test-owned two-window fixture with exact pageId snapshot/fill/click and observed UI effect. Otherwise label Electron support experimental/unverified.
  • Do not use the user's daily browser, profiles, or installed apps as automated fixtures.

Non-goals

Automatic app discovery, enabling disabled debugging, restarting or altering installed apps, consent persistence, a menu-bar picker, Chrome extension provider unification, arbitrary raw CDP commands, and remote endpoint support.

Evidence

Coordination

Unclaimed proposal. GitHub Projects GraphQL is rate-limited on 2026-09-05; Ready/capacity and board placement are unverified. Check those before implementation rather than treating this issue as claimed.

Public API clarification (2026-09-05)

The user requires these mechanisms to remain internal, with simple application-level public methods. Treat endpoint flags in this slice as internal/advanced transport plumbing, not the normal user workflow. Do not add a separate public vocabulary of scan-port/select-protocol/connect-CDP steps that the caller must learn. The application-level consumer should use #42 discovery internally and accept an app selector; normal callers should not copy a discovered endpoint or configure a second MCP server manually. Preserve existing advanced launcher compatibility. Full internal attachment/provider routing still needs its own bounded acceptance slice before claiming the finished app UX.

Current execution is on #42 only. This issue remains unclaimed; do not infer implementation from the tracker update.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions