anomalyco / anomalyco/opencode

[FEATURE]: Plugin UI surface for the web/desktop app, mirroring the TUI plugin API

Open
#43,132 1 comment 4 reactions 1 assignee View on GitHub

@Brendonovich is already working on this.

Since Aug 17, 2026.

Dominant language
TypeScript
Stars
209k
Forks
27.5k
PR merge metrics
PR metrics pending

Description

The gap

V2 has a rich client-side plugin surface for the TUI (@opencode-ai/plugin/tui): Plugin.define({ id, setup }) with keymap.layer (slash commands with run(input) that execute before any model dispatch), ui.dialog (show/select/prompt/confirm), ui.slot (e.g. sidebar.content), host-reactive storage, and client. The loader resolves package plugins through the exports["./tui"] subpath.

The web/desktop app (packages/app) has no equivalent: no plugin runtime, no slot system, no client-side command hooks. The Extensions settings tab (packages/app/src/components/settings-v2/extensions.tsx) is a read-only list of server config. So any plugin UX built for the TUI simply cannot exist in the web or desktop clients.

Concrete use case

opencode-waits schedules a prompt for later (/wait 1hour implement this). Its whole point is working while rate limited, so scheduling must not cost a model turn. In the TUI that works: a plugin slash command intercepts before submission, plus a sidebar section with live countdowns and a manager dialog (list/search/add/edit/delete/send-now) built from ui.dialog.show + keymap layers.

In the web/desktop app the only available fallback is a server-side command template that instructs the agent to call a scheduling tool — one model turn per use, and unusable exactly when rate limited, which is the scenario the feature exists for.

The ask

A plugin UI surface for packages/app, even a small subset of the TUI's:

  1. Client-side slash commands with a run(input) executed before prompt submission — this alone unlocks model-free plugin commands.
  2. Dialogs (the select/prompt/confirm primitives).
  3. A sidebar slot.

A natural shape would be an exports["./web"] entrypoint mirroring the ./tui loader convention, with a context exposing the same client/storage/ui capabilities adapted to solid-on-DOM.

I understand the V2 plugin API is beta and moving; happy to adapt the plugin to whatever shape this takes, and to test early iterations.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.