fix(plugins): draft metadata survives a remount, plugin commands follow the composer lock

Draft metadata was component state while the prompt lived in the draft store, so a composer that
remounted across the compact breakpoint kept its text and lost the plugin's choices. It now lives
in the draft store beside the prompt, is cleared when the draft is sent, and is not cleared when
the prompt is emptied. It is not persisted across app restarts.

While the New workspace composer is creating the agent, the built-in controls are disabled but
plugin controls and commands were not. They read the composer's own lock: Paseo controls render
disabled, and setPrompt, insertText and the agent commands refuse.

The options and metadata a plugin reads are frozen copies, through the same helper the timeline
projection uses. The composer control test mounted components in JSDOM, which the testing rules
ban; it now runs in the browser project.
This commit is contained in:
Mohamed Boudra
2026-11-04 06:55:18 +01:00
parent be91ab9a47
commit 342ddfdd71
16 changed files with 198 additions and 35 deletions
+5
View File
@@ -1972,6 +1972,11 @@ callback, so `await composer.setProvider("codex")` followed by `await composer.s
changes both. A command's promise resolves once the change has taken effect, and `composer.agent`
shows it on the next render.
While the New workspace screen creates the workspace and its agent, the composer is locked. Your
controls render disabled, `setPrompt` and `insertText` throw, and the agent commands reject with
"The composer is locked while the agent is being created." `composer.agent.options` and
`composer.agent.metadata` are frozen copies; change them through `setOptions` and `setMetadata`.
A composer item counts toward how much fits before Paseo knows what it renders. An item that
renders nothing can still leave an empty overflow sheet on a narrow composer, so always render a
control.