feat(desktop): allow Side Conversations to select an independent model
- Dominant language
- TypeScript
- Stars
- 5.4k
- Forks
- 502
- Avg merge
- 1d 2h
- Merged PRs (30d)
- 715
Description
## Problem
Desktop Side Conversations inherit the source Session's model when the temporary fork is created, but the model is rendered as a read-only label. The Side Conversation cannot select another enabled model without closing the panel and changing the source Session first.
That prevents several common auxiliary workflows:
- keep a high-capability model on the main task while using a faster or lower-cost model for a short side question;
- choose a model with a capability needed only by the Side Conversation without changing the main task;
- recover a Side Conversation whose inherited model or connection is no longer available, while preserving its accepted transcript.
The fork is already a separate Session and its permission mode can change independently after creation. Model selection should follow the same Session-local boundary.
## Desired outcome
Expose the normal model picker in a committed Desktop Side Conversation and apply the selection to that temporary Session only.
- A new Side Conversation still inherits the source Session's exact connection and model.
- After creation, the source and Side Conversation model selections are independent.
- Changing the Side Conversation model updates the existing temporary Session; it does not recreate the fork, clear its transcript, consume its draft, or mutate the source Session.
- Changing the source Session model does not silently overwrite an existing Side Conversation selection.
- The picker uses the current Host-authorized model catalog and preserves exact connection identity.
- A rejected or unavailable selection leaves the current Side Conversation model unchanged and surfaces the failure.
- Model changes follow the same active-Turn admission rule as ordinary Sessions.
- Cross-model history replay keeps the existing compatibility rules: portable history remains available and provider-specific state is reused only when compatible with the selected model.
## Acceptance criteria
1. The Side Conversation Composer shows the same model-selection affordance as the main conversation after its fork is ready.
2. Selecting another enabled model updates the Side Conversation Session and the displayed model without changing the source Session.
3. Existing Side Conversation messages, staged quotes, attachments, and drafts remain intact across a successful model change.
4. A model change is rejected while the Side Conversation has a running Turn, with no partial UI or Session update.
5. A failed model change remains retryable and does not close or recreate the Side Conversation.
6. Closing the tab, navigation cleanup, hidden-session behavior, and restart cleanup remain unchanged.
## Non-goals
- Synchronizing later model changes between the source and Side Conversation
- Adding `/compact` or other slash commands to Side Conversations
- Changing permission inheritance or tool policy
- Making temporary Side Conversations durable or promoting them to ordinary Sessions
- Choosing a globally different default model for every Side Conversation
This is a focused Side Conversation follow-up under #4331.
Contributor guide
Research direction
Start with the Desktop Side Conversation Composer and the fork-ready temporary Session model-selection path; trace how the Host-authorized catalog and active-Turn admission rule are applied. Verify that changing the model preserves messages, quotes, attachments, and drafts, leaves the source Session unchanged, and handles rejected selections without recreating or closing the Side Conversation.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- electron, typescript
- Domain
- ai, desktop
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 65/100