@@ -25,8 +25,10 @@ import { localize } from '../../../../nls.js';
2525import { IActiveSession , ICreateNewSessionOptions , ISessionsManagementService } from '../../../services/sessions/common/sessionsManagement.js' ;
2626import { ISession , SESSION_WORKSPACE_GROUP_GITHUB } from '../../../services/sessions/common/session.js' ;
2727import { IOpenNewSessionResult , ISessionsService } from '../../../services/sessions/browser/sessionsService.js' ;
28+ import { ISessionsProvidersService } from '../../../services/sessions/browser/sessionsProvidersService.js' ;
2829import { isAllowSignedOutWhenUsableEnabled , shouldShowGitHubWorkspaceGroupSignIn } from '../../../browser/sessionsAuthGate.js' ;
2930import { AGENTIC_SIGN_IN_COMMAND_ID } from '../../../common/sessionCommands.js' ;
31+ import { isAgentHostProvider } from '../../../common/agentHostSessionsProvider.js' ;
3032import { IAquariumService , IMountedToggleHandle } from '../../aquarium/browser/aquariumOverlay.js' ;
3133import { IWorkspacePickerNoWorkspaceOption , IWorkspacePickerTrigger , WorkspacePicker } from './sessionWorkspacePicker.js' ;
3234import { WebWorkspacePicker } from './webWorkspacePicker.js' ;
@@ -35,7 +37,7 @@ import { NewChatInputWidget } from './newChatInput.js';
3537import { NoAgentHostEmptyState } from './noAgentHostEmptyState.js' ;
3638import { IChatRequestVariableEntry } from '../../../../workbench/contrib/chat/common/attachments/chatVariableEntries.js' ;
3739import { IAgentHostFilterService } from '../../../services/agentHostFilter/common/agentHostFilter.js' ;
38- import { IChatViewOptions } from '../../../browser/parts/chatView.js' ;
40+ import { IChatViewOptions , ISelectWorkspaceOptions } from '../../../browser/parts/chatView.js' ;
3941import { SessionWorkspacePickerVisibleContext } from '../../../common/contextkeys.js' ;
4042import { AGENT_FEEDBACK_NEW_SESSION_RESOURCE , AgentFeedbackState , IAgentFeedback , IAgentFeedbackService } from '../../agentFeedback/browser/agentFeedbackService.js' ;
4143import { buildNewSessionPrompt } from '../../agentFeedback/browser/agentFeedbackAttachmentEntry.js' ;
@@ -70,6 +72,7 @@ export class NewChatWidget extends Disposable {
7072 /** Recreates the draft once a better/late-registering provider can serve the folder (see {@link _createNewSession}). */
7173 private readonly _pendingPreferredUpgrade = new MutableDisposable < IDisposable > ( ) ;
7274 private readonly _newSessionCreation = new MutableDisposable < IDisposable > ( ) ;
75+ private _preferredDevContainerFolderUri : URI | undefined ;
7376
7477 /**
7578 * The currently mounted no-agent-host empty state, if any. Set by
@@ -114,6 +117,7 @@ export class NewChatWidget extends Disposable {
114117 @ILogService private readonly logService : ILogService ,
115118 @ISessionsManagementService private readonly sessionsManagementService : ISessionsManagementService ,
116119 @ISessionsService private readonly sessionsService : ISessionsService ,
120+ @ISessionsProvidersService private readonly sessionsProvidersService : ISessionsProvidersService ,
117121 @IAquariumService private readonly aquariumService : IAquariumService ,
118122 @IAgentHostFilterService private readonly agentHostFilterService : IAgentHostFilterService ,
119123 @IUriIdentityService private readonly uriIdentityService : IUriIdentityService ,
@@ -618,13 +622,16 @@ export class NewChatWidget extends Disposable {
618622 } else {
619623 return result ;
620624 }
625+ this . _applyPreferredDevContainer ( result . session , folderUri ) ;
621626 if ( result . trustDeclined ) {
627+ this . _preferredDevContainerFolderUri = undefined ;
622628 // The user explicitly declined trust: don't schedule a retry, which
623629 // would silently recreate (and possibly re-prompt) the draft once a
624630 // provider registers/changes without any further user action.
625631 this . _pendingPreferredUpgrade . clear ( ) ;
626632 return result ;
627633 }
634+
628635 // Keep the draft in sync with late-registering providers. Agent hosts
629636 // connect lazily, so there is no timeout — the listener lives until the
630637 // draft is sent or replaced. We watch when:
@@ -640,6 +647,18 @@ export class NewChatWidget extends Disposable {
640647 return result ;
641648 }
642649
650+ private _applyPreferredDevContainer ( session : ISession | undefined , folderUri : URI ) : void {
651+ if ( ! session || ! this . _preferredDevContainerFolderUri || ! this . uriIdentityService . extUri . isEqual ( this . _preferredDevContainerFolderUri , folderUri ) ) {
652+ return ;
653+ }
654+ const provider = this . sessionsProvidersService . getProvider ( session . providerId ) ;
655+ if ( ! provider || ! isAgentHostProvider ( provider ) || ! provider . preferDevContainer ) {
656+ return ;
657+ }
658+ provider . preferDevContainer ( session . sessionId ) ;
659+ this . _preferredDevContainerFolderUri = undefined ;
660+ }
661+
643662 private async _createSessionNow ( folderUri : URI , userPick : IPreferredSessionType | undefined , token : CancellationToken ) : Promise < IOpenNewSessionResult > {
644663 // Prefer the user's explicit pick when its provider can serve the
645664 // folder; otherwise fall back to the preferred (first) session type.
@@ -997,6 +1016,9 @@ export class NewChatWidget extends Disposable {
9971016 private async _onWorkspaceSelected ( folderUri : URI | undefined ) : Promise < void > {
9981017 // Cancel any in-flight upgrade for a previous selection.
9991018 this . _pendingPreferredUpgrade . clear ( ) ;
1019+ if ( ! folderUri || ! this . _preferredDevContainerFolderUri || ! this . uriIdentityService . extUri . isEqual ( this . _preferredDevContainerFolderUri , folderUri ) ) {
1020+ this . _preferredDevContainerFolderUri = undefined ;
1021+ }
10001022 const currentFolderUri = this . _session . get ( ) ?. workspace . get ( ) ?. folders [ 0 ] ?. root ;
10011023 const refreshingPromptOptions = ! ! currentFolderUri
10021024 && ( ! folderUri || ! this . uriIdentityService . extUri . isEqual ( currentFolderUri , folderUri ) )
@@ -1054,8 +1076,9 @@ export class NewChatWidget extends Disposable {
10541076 this . _newChatInput . attach ( uris ) ;
10551077 }
10561078
1057- selectWorkspace ( folderUri : URI , providerId ?: string ) : void {
1058- this . _workspacePicker . setSelectedWorkspace ( folderUri , { providerId } ) ;
1079+ selectWorkspace ( folderUri : URI , options ?: ISelectWorkspaceOptions ) : void {
1080+ this . _preferredDevContainerFolderUri = options ?. preferDevContainer ? folderUri : undefined ;
1081+ this . _workspacePicker . setSelectedWorkspace ( folderUri , { providerId : options ?. providerId } ) ;
10591082 }
10601083}
10611084
0 commit comments