Skip to content

Plugin TUI: "No renderer found" thrown when slot renders against host (dual @opentui/solid instances) #27447

Closed

Description

@patricio0312rev

Problem

Since opencode 1.14.50, any TUI plugin that renders JSX into a host slot via @opentui/solid crashes the TUI on first render:

Error: No renderer found
  at createElement (.../node_modules/<plugin>/dist/tui.js:965:17)
  at <anonymous> (.../node_modules/<plugin>/dist/tui.js:1722:16)
  at I (/$bunfs/root/chunk-*.js:2:7764)
  at Cd (/$bunfs/root/chunk-*.js:2:11279)
  ...

The throw comes from the bundled reconciler: useContext(RendererContext) returns undefined, so createElement has nothing to attach to.

Reproduction

  • opencode 1.14.50
  • opencode-sdd-engram-manage@1.6.4 registered in ~/.config/opencode/tui.json

Launching opencode shows the fatal-error overlay immediately. Downgrading the host to 1.14.49 without touching the plugin restores normal behavior, so the regression is on the host side.

Why it happens

Solid resolves contexts by symbol identity. The plugin's bundled code reads RendererContext from its own imported copy of @opentui/solid. The host provides a RendererContext from its own copy. If those resolve to two module instances, the symbols don't match and useContext returns undefined.

The plugin marks @opentui/solid as a peerDependency and external in its tsup config, so it expects the host to provide the runtime. An earlier version of the same plugin (1.6.3) instead bundled @opentui/solid via noExternal. Both variants behave the same against 1.14.50, which points to a change in how the host exposes the renderer to plugin imports rather than something the plugin can fix on its own.

Impact

Any TUI plugin that uses @opentui/solid JSX in a slot hits the same throw, and because it propagates through the host's render tree the whole TUI dies instead of just the affected plugin.

A few options

  1. Resolve @opentui/solid in plugin imports to the host's instance so the context is shared.
  2. Expose a host-side helper like api.ui.mount(slotName, render) that runs JSX against the host renderer, so plugin authors don't import @opentui/solid directly.
  3. Catch render errors at the slot boundary so a broken plugin disables itself instead of killing the TUI.

A defensive patch on the plugin side is at ricardo-rod/sdd-engram-plugin#33. It prevents the crash but doesn't fix the underlying mismatch.

Environment

  • opencode 1.14.50 (broken), 1.14.49 (works)
  • macOS 25.5.0, arm64
  • Installed via the official install script (~/.opencode/bin/opencode)

Activity

  1. github-actions commented on May 14, 2026

    @github-actions
    Contributor

    This issue might be a duplicate of an existing issue. Please check:

  2. kommander commented on May 15, 2026

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

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions