diff --git a/src/vs/workbench/api/common/extHostApiCommands.ts b/src/vs/workbench/api/common/extHostApiCommands.ts index 9349335fa1c..112faf74966 100644 --- a/src/vs/workbench/api/common/extHostApiCommands.ts +++ b/src/vs/workbench/api/common/extHostApiCommands.ts @@ -550,7 +550,7 @@ const newCommands: ApiCommand[] = [ attachments: v.attachments, autoSend: v.autoSend, position: v.position ? typeConverters.Position.from(v.position) : undefined, - blockOnResponse: v.blockOnResponse + resolveOnResponse: v.resolveOnResponse }; })], ApiCommandResult.Void @@ -564,7 +564,7 @@ type InlineChatEditorApiArg = { attachments?: vscode.Uri[]; autoSend?: boolean; position?: vscode.Position; - blockOnResponse?: boolean; + resolveOnResponse?: boolean; }; type InlineChatRunOptions = { @@ -574,7 +574,7 @@ type InlineChatRunOptions = { attachments?: URI[]; autoSend?: boolean; position?: IPosition; - blockOnResponse?: boolean; + resolveOnResponse?: boolean; }; //#endregion diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts index 91c874e70ab..ea19a4ee0a1 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts @@ -116,10 +116,7 @@ export class StartSessionAction extends Action2 { if (arg && InlineChatRunOptions.isInlineChatRunOptions(arg)) { options = arg; } - const task = InlineChatController.get(editor)?.run({ ...options }); - if (options?.blockOnResponse) { - await task; - } + await InlineChatController.get(editor)?.run({ ...options }); } } diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index b47d6950711..7491ecc8c16 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -65,7 +65,7 @@ export abstract class InlineChatRunOptions { autoSend?: boolean; position?: IPosition; modelSelector?: ILanguageModelChatSelector; - blockOnResponse?: boolean; + resolveOnResponse?: boolean; static isInlineChatRunOptions(options: unknown): options is InlineChatRunOptions { @@ -73,7 +73,7 @@ export abstract class InlineChatRunOptions { return false; } - const { initialSelection, initialRange, message, autoSend, position, attachments, modelSelector, blockOnResponse } = options; + const { initialSelection, initialRange, message, autoSend, position, attachments, modelSelector, resolveOnResponse } = options; if ( typeof message !== 'undefined' && typeof message !== 'string' || typeof autoSend !== 'undefined' && typeof autoSend !== 'boolean' @@ -82,7 +82,7 @@ export abstract class InlineChatRunOptions { || typeof position !== 'undefined' && !Position.isIPosition(position) || typeof attachments !== 'undefined' && (!Array.isArray(attachments) || !attachments.every(item => item instanceof URI)) || typeof modelSelector !== 'undefined' && !isILanguageModelChatSelector(modelSelector) - || typeof blockOnResponse !== 'undefined' && typeof blockOnResponse !== 'boolean' + || typeof resolveOnResponse !== 'undefined' && typeof resolveOnResponse !== 'boolean' ) { return false; } @@ -415,7 +415,6 @@ export class InlineChatController implements IEditorContribution { async run(arg?: InlineChatRunOptions): Promise { assertType(this._editor.hasModel()); - const uri = this._editor.getModel().uri; const existingSession = this._inlineChatSessionService.getSessionByTextModel(uri); @@ -479,10 +478,21 @@ export class InlineChatController implements IEditorContribution { } } - await Event.toPromise(session.editingSession.onDidDispose); + if (!arg?.resolveOnResponse) { + // DEFAULT: wait for the session to be accepted or rejected + await Event.toPromise(session.editingSession.onDidDispose); + const rejected = session.editingSession.getEntry(uri)?.state.get() === ModifiedFileEntryState.Rejected; + return !rejected; - const rejected = session.editingSession.getEntry(uri)?.state.get() === ModifiedFileEntryState.Rejected; - return !rejected; + } else { + // resolveOnResponse: ONLY wait for the file to be modified + const modifiedObs = derived(r => { + const entry = session.editingSession.readEntry(uri, r); + return entry?.state.read(r) === ModifiedFileEntryState.Modified && !entry?.isCurrentlyBeingModifiedBy.read(r); + }); + await waitForState(modifiedObs, state => state === true); + return true; + } } async acceptSession() {