Skip to content

Refactor model picker architecture#326052

Open
lramos15 wants to merge 10 commits into
mainfrom
lramos15/residential-prawn
Open

Refactor model picker architecture#326052
lramos15 wants to merge 10 commits into
mainfrom
lramos15/residential-prawn

Conversation

@lramos15

@lramos15 lramos15 commented Jul 15, 2026

Copy link
Copy Markdown
Member

Summary

Make model selection consistent across the Agents window and split the shared model picker UI into focused, testable modules.

This remains a model-picker change. It touches the Send button only so it reads the same model availability state as the picker. It does not change model execution, request transport, chat responses, or general session lifecycle.

Before

Desktop and phone surfaces each maintained parts of model selection themselves.

flowchart LR
    Desktop["Desktop model picker"] --> DesktopLogic["Desktop selection state"]
    Phone["Phone Mode and Model picker"] --> PhoneLogic["Phone selection state"]
    Send["Send button"] --> SendLogic["Separate availability check"]
    DesktopLogic --> Provider["Sessions provider"]
    PhoneLogic --> Provider
Loading

That duplicated model filtering, fallback rules, storage, provider listeners, and send availability. A fix in one surface could leave another surface stale.

After

Each chat input owns one model-selection state value. Desktop, phone, and Send all consume it.

flowchart LR
    Provider["Sessions provider<br/>models snapshot + options + setModel"] --> State["One scoped model-selection state<br/>per chat input"]
    State --> Desktop["Desktop model picker"]
    State --> Phone["Phone Mode and Model picker"]
    State --> Send["Send enabled"]
    Desktop --> State
    Phone --> State
    State --> Provider
Loading

The selection policy underneath that state handles configured defaults, restored models, remembered choices, removed-model fallback, and reused new-chat inputs.

Models snapshot

ISessionsProvider.getModelsSnapshot(...) returns:

  • models: the models currently available for the session
  • isResolved: whether a missing restored model is conclusively gone, rather than still loading

This is a synchronous provider result, not a new registry, service, or database. Keeping the list and readiness together prevents valid restored selections from being replaced while providers are still loading.

Phone picker

The phone presenter now receives one explicit request:

  • delegates: state from the standard workbench Mode and Model pickers
  • session: state from a specific Sessions chat input

The scoped Sessions path rechecks provider, session, and chat identity before applying an action, so a picker opened for one chat cannot modify another chat after navigation.

Shared picker UI

The previous large workbench picker file is organized under widget/input/modelPicker/:

  • modelPickerWidget.ts: trigger and picker coordination
  • modelPickerItems.ts: deterministic list construction
  • modelPickerConfiguration.ts: thinking effort and context-size options
  • modelPickerHover.ts: model details and pricing hover
  • modelPickerUtils.ts, icons, and CSS: focused presentation helpers

This is primarily code movement and responsibility separation; it does not introduce another picker implementation.

Key changes

  • Added one disposable SessionModelSelectionModel per NewChatInputWidget.
  • Exposed available models, current selection, picker options, and send eligibility as one observable state value.
  • Reduced the Sessions desktop picker to presentation and telemetry over that state.
  • Made the phone new-session picker button consume the same state and storage path.
  • Removed legacy Agent Host model filtering and phone-only persistence helpers.
  • Kept provider-specific model discovery and writes behind ISessionsProvider.
  • Isolated selection rules into a pure, directly testable policy.
  • Split shared picker rendering into focused modules.

Out of scope

  • Model execution and request transport
  • Chat response rendering
  • General session creation or lifecycle
  • Converging the standard non-Sessions ChatInputPart state model

Validation

  • npm run typecheck-client
  • npm run valid-layers-check
  • Repository hygiene and pre-commit hooks
  • 316 affected Sessions, provider, and selection tests

Copilot AI review requested due to automatic review settings July 15, 2026 21:16
@github-actions

github-actions Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Screenshot Changes

Base: fcb86b62 Current: ed2b6887

Changed (72)

sessions/chat/input/chatInput/SessionsWindow/Dark
Before After
before after
sessions/chat/input/chatInput/SessionsWindow/Light
Before After
before after
sessions/chat/input/chatInput/SessionsWindowSelection/Dark
Before After
before after
sessions/chat/input/chatInput/SessionsWindowSelection/Light
Before After
before after
sessions/chat/newInput/newChatInput/Default/Dark
Before After
before after
sessions/chat/newInput/newChatInput/Default/Light
Before After
before after
sessions/chat/newInput/newChatInput/Selection/Dark
Before After
before after
sessions/chat/newInput/newChatInput/Selection/Light
Before After
before after
sessions/chat/newInput/newChatInput/SlashCommand/Dark
Before After
before after
sessions/chat/newInput/newChatInput/SlashCommand/Light
Before After
before after
sessions/chat/newInput/newChatInput/VariableReference/Dark
Before After
before after
sessions/chat/newInput/newChatInput/VariableReference/Light
Before After
before after
sessions/sessionChatInputToolbar/SessionChatView_ChangesPill/Dark
Before After
before after
sessions/sessionChatInputToolbar/SessionChatView_ChangesPill/Light
Before After
before after
sessions/sessionChatInputToolbar/SessionChatView_BothPills/Dark
Before After
before after
sessions/sessionChatInputToolbar/SessionChatView_BothPills/Light
Before After
before after
chat/input/chatInput/Default/Dark
Before After
before after
chat/input/chatInput/Default/Light
Before After
before after
chat/input/chatInput/WithSandboxing/Dark
Before After
before after
chat/input/chatInput/WithSandboxing/Light
Before After
before after
chat/input/chatInput/WithProviderIcon/Dark
Before After
before after
chat/input/chatInput/WithProviderIcon/Light
Before After
before after
chat/input/chatInput/CompactWithProviderIcon/Dark
Before After
before after
chat/input/chatInput/CompactWithProviderIcon/Light
Before After
before after
chat/input/chatInput/WithArtifacts/Dark
Before After
before after
chat/input/chatInput/WithArtifacts/Light
Before After
before after
chat/input/chatInput/WithFileChanges/Dark
Before After
before after
chat/input/chatInput/WithFileChanges/Light
Before After
before after
chat/input/chatInput/WithTodos/Dark
Before After
before after
chat/input/chatInput/WithTodos/Light
Before After
before after
chat/input/chatInput/WithTodosAndFileChanges/Dark
Before After
before after
chat/input/chatInput/WithTodosAndFileChanges/Light
Before After
before after
chat/input/chatInput/WithArtifactsAndFileChanges/Dark
Before After
before after
chat/input/chatInput/WithArtifactsAndFileChanges/Light
Before After
before after
chat/input/chatInput/Full/Dark
Before After
before after
chat/input/chatInput/Full/Light
Before After
before after
chat/chatToolRiskBadge/GreenInContext/Dark
Before After
before after
chat/chatToolRiskBadge/GreenInContext/Light
Before After
before after
chat/chatToolRiskBadge/OrangeInContext/Dark
Before After
before after
chat/chatToolRiskBadge/OrangeInContext/Light
Before After
before after
chat/chatToolRiskBadge/RedInContext/Dark
Before After
before after
chat/chatToolRiskBadge/RedInContext/Light
Before After
before after
chat/chatToolRiskBadge/GreenElicitationInContext/Dark
Before After
before after
chat/chatToolRiskBadge/GreenElicitationInContext/Light
Before After
before after
chat/chatToolRiskBadge/OrangeElicitationInContext/Dark
Before After
before after
chat/chatToolRiskBadge/OrangeElicitationInContext/Light
Before After
before after
chat/chatToolRiskBadge/RedElicitationInContext/Dark
Before After
before after
chat/chatToolRiskBadge/RedElicitationInContext/Light
Before After
before after
chat/chatToolRiskBadge/BadgeOffInContext/Dark
Before After
before after
chat/chatToolRiskBadge/BadgeOffInContext/Light
Before After
before after
chat/chatToolRiskBadge/BadgeOffWithDisclaimerInContext/Dark
Before After
before after
chat/chatToolRiskBadge/BadgeOffWithDisclaimerInContext/Light
Before After
before after
chat/chatToolRiskBadge/BadgeOffUnsandboxedInContext/Dark
Before After
before after
chat/chatToolRiskBadge/BadgeOffUnsandboxedInContext/Light
Before After
before after
chat/chatToolRiskBadge/BadgeOffUnsandboxedWithDisclaimerInContext/Dark
Before After
before after
chat/chatToolRiskBadge/BadgeOffUnsandboxedWithDisclaimerInContext/Light
Before After
before after
chat/chatTurnPills/inChat/Changes/Dark
Before After
before after
chat/chatTurnPills/inChat/Changes/Light
Before After
before after
chat/chatTurnPills/inChat/ChangesAndPreview/Dark
Before After
before after
chat/chatTurnPills/inChat/ChangesAndPreview/Light
Before After
before after
chat/widget/chatWidget/SimpleQA/Dark
Before After
before after
chat/widget/chatWidget/SimpleQA/Light
Before After
before after
chat/widget/chatWidget/PendingToolApproval/Dark
Before After
before after
chat/widget/chatWidget/PendingToolApproval/Light
Before After
before after
chat/widget/chatWidget/CodeBlockInList/Dark
Before After
before after
chat/widget/chatWidget/CodeBlockInList/Light
Before After
before after
chat/widget/chatWidget/bugs/issue-309796-missing-backslash/Dark
Before After
before after
chat/widget/chatWidget/bugs/issue-309796-missing-backslash/Light
Before After
before after
chat/widget/chatWidget/MultiTurn/Dark
Before After
before after
chat/widget/chatWidget/MultiTurn/Light
Before After
before after
editor/inlineChatZoneWidget/InlineChatZoneWidget/Dark
Before After
before after
editor/inlineChatZoneWidget/InlineChatZoneWidget/Light
Before After
before after

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors model selection around a shared, input-scoped sessions coordinator and decomposes the workbench model picker into focused modules.

Changes:

  • Centralizes model resolution, persistence, provider updates, and send eligibility.
  • Unifies desktop and mobile Agent Host picker behavior.
  • Splits picker UI, hover, icons, utilities, styles, and tests.
Show a summary per file
File Description
src/vs/workbench/contrib/chat/test/browser/widget/input/modelPicker/modelProviderIcons.test.ts Adds provider icon tests.
src/vs/workbench/contrib/chat/test/browser/widget/input/modelPicker/modelPickerItems.test.ts Updates item-builder tests.
src/vs/workbench/contrib/chat/test/browser/widget/input/modelPicker/modelPickerHover.test.ts Adds hover tests.
src/vs/workbench/contrib/chat/browser/widget/media/chat.css Removes relocated picker styles.
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/modelProviderIcons.ts Adds picker icon resolution.
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/modelPickerWidget.ts Extracts the picker widget.
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/modelPickerUtils.ts Adds shared picker utilities.
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/modelPickerHover.ts Extracts hover rendering.
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/modelPickerActionItem.ts Updates action-item packaging.
src/vs/workbench/contrib/chat/browser/widget/input/modelPicker/media/modelPicker.css Co-locates picker styling.
src/vs/workbench/contrib/chat/browser/widget/input/chatPhoneInputPresenter.ts Updates picker imports.
src/vs/workbench/contrib/chat/browser/widget/input/chatModelConfigurationStore.ts Updates configuration imports.
src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.ts Uses the packaged action item.
src/vs/workbench/contrib/chat/browser/chatSessions/chatSessionPickerActionItem.ts Uses extracted hover rendering.
src/vs/sessions/SESSIONS.md Documents scoped selection architecture.
src/vs/sessions/MOBILE.md Documents mobile picker behavior.
src/vs/sessions/contrib/providers/copilotChatSessions/COPILOT_CHAT_SESSIONS_PROVIDER.md Documents provider integration.
src/vs/sessions/contrib/providers/agentHost/test/browser/mobileChatPhoneInputTarget.test.ts Tests target validation.
src/vs/sessions/contrib/providers/agentHost/test/browser/localAgentHostSessionsProvider.test.ts Tests provider model filtering.
src/vs/sessions/contrib/providers/agentHost/test/browser/agentHostModelPicker.test.ts Removes legacy helper tests.
src/vs/sessions/contrib/providers/agentHost/test/browser/agentHost/agentHostPermissionPickerDelegate.test.ts Tests mode validation.
src/vs/sessions/contrib/providers/agentHost/browser/mobile/mobileChatPhoneInputTarget.ts Adds phone action target guards.
src/vs/sessions/contrib/providers/agentHost/browser/mobile/mobileChatPhoneInputPresenter.ts Uses provider-backed mobile data.
src/vs/sessions/contrib/providers/agentHost/browser/mobile/mobileChatInputConfigPicker.ts Consumes scoped model state.
src/vs/sessions/contrib/providers/agentHost/browser/agentHostPermissionPickerDelegate.ts Adds mode-value validation.
src/vs/sessions/contrib/providers/agentHost/browser/agentHostModePicker.ts Reuses shared mode icons.
src/vs/sessions/contrib/providers/agentHost/browser/agentHostModelPicker.ts Removes legacy model helpers.
src/vs/sessions/contrib/providers/agentHost/browser/agentHostModeIcon.ts Centralizes mode icons.
src/vs/sessions/contrib/providers/agentHost/AGENT_HOST_SESSIONS_PROVIDER.md Updates Agent Host documentation.
src/vs/sessions/contrib/chat/test/browser/modelPickerSelection.test.ts Tests selection policy.
src/vs/sessions/contrib/chat/test/browser/modelPickerModel.test.ts Tests scoped coordinator behavior.
src/vs/sessions/contrib/chat/test/browser/modelPicker.test.ts Updates selectability tests.
src/vs/sessions/contrib/chat/browser/newChatWidget.ts Delegates send gating.
src/vs/sessions/contrib/chat/browser/newChatInSessionWidget.ts Delegates in-session send gating.
src/vs/sessions/contrib/chat/browser/newChatInput.ts Owns the scoped coordinator.
src/vs/sessions/contrib/chat/browser/modelPickerSelection.ts Implements selection transitions.
src/vs/sessions/contrib/chat/browser/modelPickerModel.ts Coordinates reactive model state.
src/vs/sessions/contrib/chat/browser/modelPicker.ts Reduces picker to presentation.
src/vs/platform/agentHost/common/agentModelPricing.ts Updates documentation references.

Review details

  • Files reviewed: 41/41 changed files
  • Comments generated: 8
  • Review effort level: Medium

Comment thread src/vs/sessions/contrib/chat/browser/modelPickerModel.ts Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review details

  • Files reviewed: 43/43 changed files
  • Comments generated: 5
  • Review effort level: Medium

@lramos15 lramos15 marked this pull request as ready for review July 16, 2026 00:02
@vs-code-engineering

Copy link
Copy Markdown
Contributor

📬 CODENOTIFY

The following users are being notified based on files changed in this PR:

@sandy081

Matched files:

  • src/vs/sessions/services/sessions/common/sessionsProvider.ts
  • src/vs/sessions/services/sessions/test/browser/sessionsManagementService.test.ts

@lszomoru

Matched files:

  • src/vs/sessions/services/sessions/common/sessionsProvider.ts
  • src/vs/sessions/services/sessions/test/browser/sessionsManagementService.test.ts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants