Files
vscode/src/vs/workbench/contrib/chat/common/constants.ts
Josh Spicer e3d1e4f115 Add eligibleForAutoApproval (#277043)
* first pass at eligibleForAutoApproval

* add policy object

* tidy

* add default confirmationMessages and prevent globally auto-approving

* --amend

* do not show the allow button dropdown when menu is empty!

* update description

* compile test

* update test

* polish

* remove policy for now

* polish
2025-11-13 03:50:30 +01:00

130 lines
4.4 KiB
TypeScript

/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Schemas } from '../../../../base/common/network.js';
import { IChatSessionsService } from './chatSessionsService.js';
import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
import { RawContextKey } from '../../../../platform/contextkey/common/contextkey.js';
export enum ChatConfiguration {
AgentEnabled = 'chat.agent.enabled',
Edits2Enabled = 'chat.edits2.enabled',
ExtensionToolsEnabled = 'chat.extensionTools.enabled',
EditRequests = 'chat.editRequests',
GlobalAutoApprove = 'chat.tools.global.autoApprove',
AutoApproveEdits = 'chat.tools.edits.autoApprove',
AutoApprovedUrls = 'chat.tools.urls.autoApprove',
EligibleForAutoApproval = 'chat.tools.eligibleForAutoApproval',
EnableMath = 'chat.math.enabled',
CheckpointsEnabled = 'chat.checkpoints.enabled',
AgentSessionsViewLocation = 'chat.agentSessionsViewLocation',
ThinkingStyle = 'chat.agent.thinkingStyle',
TodosShowWidget = 'chat.tools.todos.showWidget',
UseCloudButtonV2 = 'chat.useCloudButtonV2',
ShowAgentSessionsViewDescription = 'chat.showAgentSessionsViewDescription',
EmptyStateHistoryEnabled = 'chat.emptyState.history.enabled',
NotifyWindowOnResponseReceived = 'chat.notifyWindowOnResponseReceived',
SubagentToolCustomAgents = 'chat.customAgentInSubagent.enabled',
}
/**
* The "kind" of agents for custom agents.
*/
export enum ChatModeKind {
Ask = 'ask',
Edit = 'edit',
Agent = 'agent'
}
export function validateChatMode(mode: unknown): ChatModeKind | undefined {
switch (mode) {
case ChatModeKind.Ask:
case ChatModeKind.Edit:
case ChatModeKind.Agent:
return mode as ChatModeKind;
default:
return undefined;
}
}
export function isChatMode(mode: unknown): mode is ChatModeKind {
return !!validateChatMode(mode);
}
// Thinking display modes for pinned content
export enum ThinkingDisplayMode {
Collapsed = 'collapsed',
CollapsedPreview = 'collapsedPreview',
FixedScrolling = 'fixedScrolling',
}
export type RawChatParticipantLocation = 'panel' | 'terminal' | 'notebook' | 'editing-session';
export enum ChatAgentLocation {
/**
* This is chat, whether it's in the sidebar, a chat editor, or quick chat.
* Leaving the values alone as they are in stored data so we don't have to normalize them.
*/
Chat = 'panel',
Terminal = 'terminal',
Notebook = 'notebook',
/**
* EditorInline means inline chat in a text editor.
*/
EditorInline = 'editor',
}
export namespace ChatAgentLocation {
export function fromRaw(value: RawChatParticipantLocation | string): ChatAgentLocation {
switch (value) {
case 'panel': return ChatAgentLocation.Chat;
case 'terminal': return ChatAgentLocation.Terminal;
case 'notebook': return ChatAgentLocation.Notebook;
case 'editor': return ChatAgentLocation.EditorInline;
}
return ChatAgentLocation.Chat;
}
}
/**
* List of file schemes that are always unsupported for use in chat
*/
const chatAlwaysUnsupportedFileSchemes = new Set([
Schemas.vscodeChatEditor,
Schemas.walkThrough,
Schemas.vscodeLocalChatSession,
Schemas.vscodeSettings,
Schemas.webviewPanel,
Schemas.vscodeUserData,
Schemas.extension,
'ccreq',
'openai-codex', // Codex session custom editor scheme
]);
export function isSupportedChatFileScheme(accessor: ServicesAccessor, scheme: string): boolean {
const chatService = accessor.get(IChatSessionsService);
// Exclude schemes we always know are bad
if (chatAlwaysUnsupportedFileSchemes.has(scheme)) {
return false;
}
// Plus any schemes used by content providers
if (chatService.getContentProviderSchemes().includes(scheme)) {
return false;
}
// Everything else is supported
return true;
}
export const AGENT_SESSIONS_VIEWLET_ID = 'workbench.view.chat.sessions'; // TODO@bpasero clear once settled
export const MANAGE_CHAT_COMMAND_ID = 'workbench.action.chat.manage';
export const ChatEditorTitleMaxLength = 30;
export const CHAT_TERMINAL_OUTPUT_MAX_PREVIEW_LINES = 1000;
export const CONTEXT_MODELS_EDITOR = new RawContextKey<boolean>('inModelsEditor', false);
export const CONTEXT_MODELS_SEARCH_FOCUS = new RawContextKey<boolean>('inModelsSearch', false);