Path: blob/main/src/vs/sessions/contrib/chat/browser/agentHost/agentHostPermissionPickerActionItem.ts
13405 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { autorun } from '../../../../../base/common/observable.js';6import { MenuItemAction } from '../../../../../platform/actions/common/actions.js';7import { IActionWidgetService } from '../../../../../platform/actionWidget/browser/actionWidget.js';8import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';9import { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';10import { IDialogService } from '../../../../../platform/dialogs/common/dialogs.js';11import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';12import { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';13import { IOpenerService } from '../../../../../platform/opener/common/opener.js';14import { IStorageService } from '../../../../../platform/storage/common/storage.js';15import { ITelemetryService } from '../../../../../platform/telemetry/common/telemetry.js';16import { IChatInputPickerOptions } from '../../../../../workbench/contrib/chat/browser/widget/input/chatInputPickerActionItem.js';17import { PermissionPickerActionItem } from '../../../../../workbench/contrib/chat/browser/widget/input/permissionPickerActionItem.js';18import { AgentHostPermissionPickerDelegate } from './agentHostPermissionPickerDelegate.js';1920/**21* Agent host wrapper around the workbench {@link PermissionPickerActionItem}22* for use in the running chat widget's secondary toolbar23* (`MenuId.ChatInputSecondary`). Owns its24* {@link AgentHostPermissionPickerDelegate} and reactively hides itself when25* the active session's `autoApprove` schema doesn't match the well-known26* shape.27*/28export class AgentHostPermissionPickerActionItem extends PermissionPickerActionItem {2930private readonly _delegate: AgentHostPermissionPickerDelegate;3132constructor(33action: MenuItemAction,34pickerOptions: IChatInputPickerOptions,35@IInstantiationService instantiationService: IInstantiationService,36@IActionWidgetService actionWidgetService: IActionWidgetService,37@IKeybindingService keybindingService: IKeybindingService,38@IContextKeyService contextKeyService: IContextKeyService,39@ITelemetryService telemetryService: ITelemetryService,40@IConfigurationService configurationService: IConfigurationService,41@IDialogService dialogService: IDialogService,42@IOpenerService openerService: IOpenerService,43@IStorageService storageService: IStorageService,44) {45const delegate = instantiationService.createInstance(AgentHostPermissionPickerDelegate);46super(47action,48delegate,49pickerOptions,50actionWidgetService,51keybindingService,52contextKeyService,53telemetryService,54configurationService,55dialogService,56openerService,57storageService,58);59this._delegate = this._register(delegate);6061// The base widget's label is rendered on demand via `refresh()`. Keep it62// in sync with the delegate's level observable.63this._register(autorun(reader => {64delegate.currentPermissionLevel.read(reader);65this.refresh();66}));67}6869override render(container: HTMLElement): void {70super.render(container);71// The active session can change while this view item is alive (the72// `IActionViewItemService` factory only runs once per render), so gate73// visibility reactively rather than at construction time.74this._register(autorun(reader => {75const visible = this._delegate.isApplicable.read(reader);76if (this.element) {77this.element.style.display = visible ? '' : 'none';78}79}));80}81}828384