Change:
cmd+i now cmd+backspace invokes instead of deleting the line in the text editor The ChatWidget is writing its context keys to the editor's ContextKeyService, so we need a scoped CKS at some point, either inside the ChatWidget or outside in the inline widgets
pushing a fix to use a scoped CKS but this does look like debt. Isn't a better fix to reset context keys when hiding/dispose the chat widget?
I don't think those context keys should be applied on the editor at all, they are intended to just be active inside the widget's dom tree.

Discussion:
// Only allow history navigation when the input is empty. // (If this model change happened as a result of a history navigation, this is canceled out by a call in this.navigateHistory) const model = this._inputEditor.getModel(); <del> const inputHasText = !!model && model.getValueLength() > 0; </del> <ins> const inputHasText = !!model && model.getValue().trim().length > 0; </ins> this.inputEditorHasText.set(inputHasText); // If the user is typing on a history entry, then reset the onHistoryEntry flag so that history navigation can be disabled

import { editorBackground, editorForeground, inputBackground } from 'vs/platform/theme/common/colorRegistry'; import { ChatModel } from 'vs/workbench/contrib/chat/common/chatModel'; import { Range } from 'vs/editor/common/core/range'; <ins> import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; </ins> export class InlineChatContentWidget implements IContentWidget {

constructor( private readonly _editor: ICodeEditor, @IInstantiationService instaService: IInstantiationService, <ins> @IContextKeyService contextKeyService: IContextKeyService, </ins> ) { this._defaultChatModel = this._store.add(instaService.createInstance(ChatModel, `inlineChatDefaultModel/editorContentWidgetPlaceholder`, undefined)); <del> this._widget = instaService.createInstance( </del> <ins> const scopedInstaService = instaService.createChild( new ServiceCollection([ IContextKeyService, this._store.add(contextKeyService.createScoped(this._domNode)) ]) ); this._widget = scopedInstaService.createInstance( </ins> ChatWidget, ChatAgentLocation.Editor, { resource: true },

} return false; }); <del> if (refer && slashCommandLike) { </del> <ins> if (refer && slashCommandLike && !this._session.lastExchange) { </ins> this._log('[IE] seeing refer command, continuing outside editor', this._session.provider.extensionId); // cancel this request

// if agent has a refer command, massage the input to include the agent name await this._instaService.invokeFunction(sendRequest, massagedInput); <del> if (!this._session.lastExchange) { // DONE when there wasn't any exchange yet. We used the inline chat only as trampoline return State.ACCEPT; } return State.WAIT_FOR_INPUT; </del> <ins> return State.ACCEPT; </ins> } this._session.addInput(new SessionPrompt(input, this._nextAttempt, this._nextWithIntentDetection));

import { IChatService } from 'vs/workbench/contrib/chat/common/chatService'; import { setupCustomHover } from 'vs/base/browser/ui/hover/updatableHoverWidget'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; <ins> import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; </ins> export interface InlineChatWidgetViewState {

this._store.add(this._progressBar); let allowRequests = false; <del> this._chatWidget = _instantiationService.createInstance( </del> <ins> const scopedInstaService = _instantiationService.createChild( new ServiceCollection([ IContextKeyService, this._store.add(_contextKeyService.createScoped(this._elements.chatWidget)) ]) ); this._chatWidget = scopedInstaService.createInstance( </ins> ChatWidget, location, { resource: true },

get contentHeight(): number { const data = { followUpsHeight: getTotalHeight(this._elements.followUps), <del> chatWidgetHeight: this._chatWidget.contentHeight, </del> <ins> chatWidgetContentHeight: this._chatWidget.contentHeight, </ins> progressHeight: getTotalHeight(this._elements.progress), statusHeight: getTotalHeight(this._elements.status), extraHeight: this._getExtraHeight() }; <del> const result = data.progressHeight + data.chatWidgetHeight + data.followUpsHeight + data.statusHeight + data.extraHeight; // console.log(`InlineChat#contentHeight ${result}`, data); </del> <ins> const result = data.progressHeight + data.chatWidgetContentHeight + data.followUpsHeight + data.statusHeight + data.extraHeight; </ins> return result; } <ins> get minHeight(): number { // The chat widget is variable height and supports scrolling. It // should be at least 100px high and at most the content height. let value = this.contentHeight; value -= this._chatWidget.contentHeight; value += Math.min(100, this._chatWidget.contentHeight); return value; } </ins> protected _getExtraHeight(): number { return 12 /* padding */ + 2 /*border*/ + 12 /*shadow*/; }

const chatContentHeight = this.widget.contentHeight; const editorHeight = this.editor.getLayoutInfo().height; <del> const contentHeight = Math.min(chatContentHeight, editorHeight * 0.42); </del> <ins> const contentHeight = Math.min(chatContentHeight, Math.max(this.widget.minHeight, editorHeight * 0.42)); </ins> const heightInLines = contentHeight / this.editor.getOption(EditorOption.lineHeight); <del> // console.log('ZONE#_computeHeightInLines', { chatContentHeight, editorHeight, contentHeight, heightInLines }); </del> return heightInLines; }

z-index: 3; } <ins> .monaco-workbench .zone-widget.inline-chat-widget .interactive-session { max-width: unset; } </ins> .monaco-workbench .zone-widget-container.inside-selection { background-color: var(--vscode-inlineChat-regionHighlight); }