Skip to content

[Bug]: bun:semver and bun-pty imports break plugin loading on OpenCode 1.14.x (Node ESM plugin host) #36

@Skeptomenos

Description

@Skeptomenos

Summary

opencode-pty@0.3.4 fails to load on OpenCode 1.14.x (and likely all OpenCode versions since ~1.4.x) because the compiled dist/src/plugin/pty/manager.js imports bun:semver and bun-pty/package.json. OpenCode's plugin host switched from Bun to Node ESM (anomalyco/opencode#18308, merged 2026-04-01), so these Bun-only imports now throw Cannot find package 'bun' at plugin load time.

This is related to but distinct from #7 (Windows + bun-pty GLIBC issue). On macOS the failure happens earlier — the plugin never gets past module resolution because bun:semver isn't a real npm package.

Error in OpenCode log

ERROR 2026-05-05T08:35:35 service=plugin path=opencode-pty@latest
  target=file:///Users/.../.cache/opencode/packages/opencode-pty@latest/node_modules/opencode-pty/dist/index.js
  error=Cannot find package 'bun' imported from
        /Users/.../.cache/opencode/packages/opencode-pty@latest/node_modules/opencode-pty/dist/src/plugin/pty/manager.js
  failed to load plugin

This fires on every workspace bootstrap — for users with multiple projects in the OpenCode sidebar, this means a stack of error toasts + chimes on every cold start.

Reproduction

npm pack opencode-pty@0.3.4
tar -xzf opencode-pty-0.3.4.tgz
head -5 package/dist/src/plugin/pty/manager.js
# import { semver } from 'bun';
# import { Terminal } from 'bun-pty';
# import { version as bunPtyVersion } from 'bun-pty/package.json';
# import { NotificationManager } from "./notification-manager.js";
# ...
node -e "import('./package/dist/index.js').catch(e=>console.error(e.message))"
# Cannot find package 'bun' imported from /.../dist/src/plugin/pty/manager.js

Why this is now broken

OpenCode 1.4.x+ replaced the BunProc plugin runtime with @npmcli/arborist + native Node import() (anomalyco/opencode#18308). The Node loader doesn't ship bun:* virtual modules and doesn't have a bun-pty peer package available.

PR #27 ("Ship pre-compiled JS to avoid transpilation cost") helped reduce on-the-fly Bun work but the runtime imports still target Bun's standard library and bun-pty's native .node bindings.

Suggested fix (high-level — likely needs a real refactor)

Replace Bun-specific dependencies with Node-compatible alternatives:

  1. bun:semversemver (npm). One-line swap.
  2. bun-pty@lydell/node-pty or the upstream node-pty. OpenCode itself already ships @lydell/node-pty-darwin-arm64 in its app bundle, so the Node ecosystem is the natural target.
  3. Either:
    • Maintain dual support (detect Bun vs Node at runtime and pick the impl), or
    • Drop Bun support and target Node ESM only — which is what OpenCode has effectively already done.

Open question: is there demand to keep Bun-only operation, or can the plugin become Node-first now that OpenCode is Node-based?

Environment

  • OpenCode: 1.14.37 (Electron 41 / Node 24, macOS arm64)
  • Plugin: opencode-pty@0.3.4 (latest)
  • macOS 26.4.1 arm64
  • Plugin declared globally in ~/.config/opencode/opencode.json "plugin" array; fails on every workspace bootstrap.

References

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requesthelp wantedExtra attention is needed

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions