feat: enhance inline chat functionality with additional services and mock implementations (#313017)

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
Johannes Rieken
2026-04-28 16:14:46 +02:00
committed by GitHub
parent c11c069d62
commit a7bcda727c
@@ -25,6 +25,7 @@ import { IDecorationsService } from '../../../../services/decorations/common/dec
import { ITextFileService } from '../../../../services/textfile/common/textfiles.js';
import { IWorkbenchAssignmentService } from '../../../../services/assignment/common/assignmentService.js';
import { IChatEntitlementService } from '../../../../services/chat/common/chatEntitlementService.js';
import { IChatInputNotificationService } from '../../../../contrib/chat/browser/widget/input/chatInputNotificationService.js';
import { IPathService } from '../../../../services/path/common/pathService.js';
import { IChatWidgetService, IChatAccessibilityService } from '../../../../contrib/chat/browser/chat.js';
import { IChatContextPickService } from '../../../../contrib/chat/browser/attachments/chatContextPickService.js';
@@ -63,6 +64,14 @@ import { IMarkdownRendererService, MarkdownRendererService } from '../../../../.
import { observableValue } from '../../../../../base/common/observable.js';
import { ComponentFixtureContext, createEditorServices, createTextModel, defineComponentFixture, defineThemedFixtureGroup, registerWorkbenchServices } from '../fixtureUtils.js';
import { InlineChatZoneWidget } from '../../../../contrib/inlineChat/browser/inlineChatZoneWidget.js';
import { ChatModel } from '../../../../contrib/chat/common/model/chatModel.js';
import { IChatEditingService } from '../../../../contrib/chat/common/editing/chatEditingService.js';
import { Target } from '../../../../contrib/chat/common/promptSyntax/promptTypes.js';
import { ICustomizationHarnessService } from '../../../../contrib/chat/common/customizationHarnessService.js';
// Side-effect import: registers InputEditorDecorations into ChatWidget.CONTRIBS
// so the placeholder decoration is rendered.
import '../../../../contrib/chat/browser/widget/input/editor/chatInputEditorContrib.js';
// CSS imports
import '../../../../contrib/inlineChat/browser/media/inlineChat.css';
@@ -203,9 +212,11 @@ function renderInlineChatZoneWidget({ container, disposableStore, theme }: Compo
}());
reg.defineInstance(IChatTipService, new class extends mock<IChatTipService>() {
readonly onDidReceiveTip = Event.None;
override resetSession() { }
}());
reg.defineInstance(IChatDebugService, new class extends mock<IChatDebugService>() {
override readonly onDidAddEvent = Event.None;
override getEvents() { return []; }
}());
reg.defineInstance(IChatEntitlementService, new class extends mock<IChatEntitlementService>() {
override readonly sentimentObs = observableValue('sentiment', { completed: true });
@@ -222,10 +233,26 @@ function renderInlineChatZoneWidget({ container, disposableStore, theme }: Compo
override readonly onDidChangeSessionOptions = Event.None;
override readonly onDidChangeOptionGroups = Event.None;
override readonly onDidChangeAvailability = Event.None;
override readonly onDidChangeCustomizations = Event.None;
override readonly onDidChangeContentProviderSchemes = Event.None;
override readonly onDidChangeItemsProviders = Event.None;
override readonly onDidChangeSessionItems = Event.None;
override readonly onDidCommitSession = Event.None;
override readonly onDidChangeInProgress = Event.None;
override sessionSupportsFork() { return false; }
override supportsDelegationForSessionType() { return false; }
override getOptionGroupsForSessionType() { return undefined; }
override getCustomAgentTargetForSessionType() { return Target.Undefined; }
override requiresCustomModelsForSessionType() { return false; }
override getChatSessionContribution() { return undefined; }
override getCapabilitiesForSessionType() { return undefined; }
override getSessionOptions() { return undefined; }
override hasCustomizationsProvider() { return false; }
}());
reg.defineInstance(ILanguageModelsService, new class extends mock<ILanguageModelsService>() {
override readonly onDidChangeLanguageModels = Event.None;
override getLanguageModelIds() { return []; }
override getVendors() { return []; }
}());
reg.defineInstance(ILanguageModelToolsService, new class extends mock<ILanguageModelToolsService>() {
override readonly onDidChangeTools = Event.None;
@@ -263,6 +290,17 @@ function renderInlineChatZoneWidget({ container, disposableStore, theme }: Compo
override getHistory() { return []; }
override readonly onDidChangeHistory = Event.None;
}());
reg.defineInstance(IChatEditingService, new class extends mock<IChatEditingService>() {
override editingSessionsObs = observableValue('editingSessionsObs', []);
}());
reg.defineInstance(IChatInputNotificationService, new class extends mock<IChatInputNotificationService>() {
override readonly onDidChange = Event.None;
override getActiveNotification() { return undefined; }
}());
reg.defineInstance(ICustomizationHarnessService, new class extends mock<ICustomizationHarnessService>() {
override readonly onDidChangeSlashCommands = Event.None;
override readonly onDidChangeCustomAgents = Event.None;
}());
reg.defineInstance(IChatContextPickService, new class extends mock<IChatContextPickService>() { }());
reg.defineInstance(IDecorationsService, new class extends mock<IDecorationsService>() { override readonly onDidChangeDecorations = Event.None; }());
reg.defineInstance(ITextFileService, new class extends mock<ITextFileService>() { override readonly untitled = new class extends mock<ITextFileService['untitled']>() { override readonly onDidChangeLabel = Event.None; }(); }());
@@ -362,6 +400,10 @@ function renderInlineChatZoneWidget({ container, disposableStore, theme }: Compo
zoneWidget.show(new Position(10, 1));
const dummyModel = instantiationService.createInstance(ChatModel, undefined, { initialLocation: ChatAgentLocation.EditorInline, canUseTools: false });
zoneWidget.widget.chatWidget.setModel(dummyModel);
zoneWidget.widget.chatWidget.setInputPlaceholder('Ask Copilot...');
// Force a relayout after the initial show so that the chat widget's
// contentHeight (which includes the toolbar row rendered below the input)
// is fully measured and the zone widget adjusts its height accordingly.