Repository navigation
Description
Feature hasn't been suggested before.
- I have verified this feature I'm about to request hasn't been suggested before.
Describe the enhancement you want to request
Summary
Add a built-in, opencode-owned per-message feedback affordance (thumbs
up/down, like ChatGPT/Claude) and expose a plugin hook/event that delivers
the user's rating. opencode owns the rendering; plugins just receive the
signal. I explicitly do not want a plugin-maintained custom-UI framework —
just a standard primitive plus a callback.
Problem
A plugin wants to collect per-response satisfaction feedback. The natural place
is an inline 👍/👎 under each assistant message — on the desktop GUI especially,
this would feel completely native. Today there is no way to do it:
- Toasts (
client.tui.showToast) are output, not input — can't capture
a click, and popping one up is itself an interruption. - Slash commands require the user to proactively type
/and discover the
command. Most users only ask questions and read replies; they never explore
the palette. - Natural language ("that was wrong") relies on the user volunteering and
the model routing it — near-zero coverage for ordinary users.
Inline buttons are the only spot that is always visible yet never interrupts
— they sit under the reply the user is already reading. Nothing today can
occupy it.
Proposed (primary): built-in feedback + plugin callback
opencode renders a standard rating control on each assistant message and emits
an event plugins can subscribe to:
export const MyPlugin = {
// fired when the user rates a message via the built-in control
async messageFeedback({ sessionID, messageID, rating, comment }) {
// rating: "up" | "down" (or a numeric scale, your call)
// comment: optional free text, if the control offers an input
// plugin persists / forwards it
},
}
opencode fully owns placement, look, and behavior. Plugins never render or
maintain UI — they only receive { sessionID, messageID, rating, comment? }.
Also acceptable (secondary): generic per-message action slot
If you'd rather expose a generic primitive, a per-message action contribution
with an onClick callback (custom bottom icons + click delivery) would also
satisfy this and subsumes the above:
message: {
actions(message) {
return [{ id: "thumbs-up", icon: "👍" }, { id: "thumbs-down", icon: "👎" }]
},
async onAction({ actionId, message, sessionID }) { /* ... */ },
}
Either one works. Preference is the built-in control, to keep UI ownership with
opencode.
Use cases
- 👍/👎 response rating → telemetry / eval datasets
- quality signals for plugin authors to improve their agents
- (with the generic slot) "regenerate", "save as template", "bookmark", etc.
Related (not duplicates)
- #17492 (Plugin API for TUI customization) — closed; scoped to static
content injection + layout config. No interactive or message-scoped primitive.
- #23539 (status bar widgets) — open, but render-only and a global bar,
not per-message.
Neither offers an interactive, message-scoped feedback primitive. Keeping
this ask deliberately minimal: a built-in control + a callback, not a TUI
framework.
Activity
github-actions commentedon Aug 24, 2026
To stay organized issues are automatically closed after 60 days of no activity. If the issue is still relevant please open a new one.
qdrddr commentedon Oct 26, 2026
Would be great to have message feedback similar to the DeepSeek-harness agent
https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/subsystems/feedback.md