You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug]: V2 removed UI-only session messages available through ignored + noReply #48644
resume: false prevents an immediate execution, but the synthetic input is later promoted into the transcript as a user-role model message. Compaction also retains it as synthetic context.
V2 needs a way to add a visible session notice that:
does not start or resume execution
is rendered by TUI, Desktop, and Web clients
never enters model context or compaction
This is narrower than #6330. It restores behavior available to V1 server plugins.
Plugins
@subrouter/opencode
OpenCode version
V1: 1.18.23
V2: 2.0.2
Steps to reproduce
Call session.synthetic() with description and resume: false.
Start the next session execution.
Inspect the provider request.
The synthetic text appears as a user-role model message.
There is no V2 equivalent of the V1 ignored: true plus noReply: true behavior.
V2 gap has two halves: (a) a visible + model-exempt + compaction-exempt session notice (this issue), (b) noReply on the command path (#46579).
Zero-cost status notifications — session.prompt({noReply:true, parts:[{type:'text',text,ignored:true}]}) for lifecycle events (paused/maxed/error). On V2 this rejects; our feature-detection falls back to toast-only, which is invisible in web/serve mode.
Model-invisible control-command results — command.execute.before mutating output.parts (in place) to ignored text parts: visible bubble, excluded from the LLM context (1.19.0-verified). On V2 the ignored part no longer exists, so the result either disappears from the UI or re-enters model context — both break the plugin contract.
session.synthetic({resume:false}) doesn't substitute: per the repro above it promotes to a user-role model message and is retained in compaction — exactly what the command-path noReply (PR #46579, closed as V1-EOL; maintainer asked for a V2 port) is trying to remove.
You're asking for a v2 way to add a session notice, such as a provider failover or cooldown message from a plugin, that:
does not start or resume execution
is shown in the TUI, Desktop and Web clients
never reaches model context or compaction
V1 did this with noReply plus ignored text parts. In v2, session.synthetic always becomes model input (resume: false only delays it), and the plugin API has no display-only message type. So this can't be built as a plugin today; it needs a new addition to the API. One option is a dedicated notice endpoint. Another is a display-only flag on synthetic messages, which would also skip resuming and keep the message out of history and compaction.
I'm treating this as a feature request, and maintainers will consider it. Related:
Activity
blockspacer commentedon Oct 18, 2026
V2 gap has two halves: (a) a visible + model-exempt + compaction-exempt session notice (this issue), (b) noReply on the command path (#46579).
Zero-cost status notifications — session.prompt({noReply:true, parts:[{type:'text',text,ignored:true}]}) for lifecycle events (paused/maxed/error). On V2 this rejects; our feature-detection falls back to toast-only, which is invisible in web/serve mode.
Model-invisible control-command results — command.execute.before mutating output.parts (in place) to ignored text parts: visible bubble, excluded from the LLM context (1.19.0-verified). On V2 the ignored part no longer exists, so the result either disappears from the UI or re-enters model context — both break the plugin contract.
session.synthetic({resume:false}) doesn't substitute: per the repro above it promotes to a user-role model message and is retained in compaction — exactly what the command-path noReply (PR #46579, closed as V1-EOL; maintainer asked for a V2 port) is trying to remove.
opencodejr commentedon Oct 28, 2026
Thanks for the detailed write-up, @remorses!
You're asking for a v2 way to add a session notice, such as a provider failover or cooldown message from a plugin, that:
V1 did this with
noReplyplusignoredtext parts. In v2,session.syntheticalways becomes model input (resume: falseonly delays it), and the plugin API has no display-only message type. So this can't be built as a plugin today; it needs a new addition to the API. One option is a dedicated notice endpoint. Another is a display-only flag on synthetic messages, which would also skip resuming and keep the message out of history and compaction.I'm treating this as a feature request, and maintainers will consider it. Related: