Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessions.ts
5272 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { localize } from '../../../../../nls.js';
7
import { Codicon } from '../../../../../base/common/codicons.js';
8
import { URI } from '../../../../../base/common/uri.js';
9
import { ThemeIcon } from '../../../../../base/common/themables.js';
10
import { observableValue } from '../../../../../base/common/observable.js';
11
import { IChatSessionTiming } from '../../common/chatService/chatService.js';
12
import { IChatSessionsExtensionPoint } from '../../common/chatSessionsService.js';
13
import { foreground, listActiveSelectionForeground, registerColor, transparent } from '../../../../../platform/theme/common/colorRegistry.js';
14
import { getChatSessionType } from '../../common/model/chatUri.js';
15
16
export enum AgentSessionProviders {
17
Local = 'local',
18
Background = 'copilotcli',
19
Cloud = 'copilot-cloud-agent',
20
Claude = 'claude-code',
21
Codex = 'openai-codex',
22
Growth = 'copilot-growth',
23
}
24
25
export function isBuiltInAgentSessionProvider(provider: string): boolean {
26
return provider === AgentSessionProviders.Local ||
27
provider === AgentSessionProviders.Background ||
28
provider === AgentSessionProviders.Cloud ||
29
provider === AgentSessionProviders.Claude;
30
}
31
32
export function getAgentSessionProvider(sessionResource: URI | string): AgentSessionProviders | undefined {
33
const type = URI.isUri(sessionResource) ? getChatSessionType(sessionResource) : sessionResource;
34
switch (type) {
35
case AgentSessionProviders.Local:
36
case AgentSessionProviders.Background:
37
case AgentSessionProviders.Cloud:
38
case AgentSessionProviders.Claude:
39
case AgentSessionProviders.Codex:
40
case AgentSessionProviders.Growth:
41
return type;
42
default:
43
return undefined;
44
}
45
}
46
47
/**
48
* Observable holding the display name for the background agent session provider.
49
* Updated via experiment treatment to allow A/B testing of the display name.
50
*/
51
export const backgroundAgentDisplayName = observableValue<string>('backgroundAgentDisplayName', localize('chat.session.providerLabel.background', "Background"));
52
53
export function getAgentSessionProviderName(provider: AgentSessionProviders): string {
54
switch (provider) {
55
case AgentSessionProviders.Local:
56
return localize('chat.session.providerLabel.local', "Local");
57
case AgentSessionProviders.Background:
58
return backgroundAgentDisplayName.get();
59
case AgentSessionProviders.Cloud:
60
return localize('chat.session.providerLabel.cloud', "Cloud");
61
case AgentSessionProviders.Claude:
62
return 'Claude';
63
case AgentSessionProviders.Codex:
64
return 'Codex';
65
case AgentSessionProviders.Growth:
66
return 'Growth';
67
}
68
}
69
70
export function getAgentSessionProviderIcon(provider: AgentSessionProviders): ThemeIcon {
71
switch (provider) {
72
case AgentSessionProviders.Local:
73
return Codicon.vm;
74
case AgentSessionProviders.Background:
75
return Codicon.worktree;
76
case AgentSessionProviders.Cloud:
77
return Codicon.cloud;
78
case AgentSessionProviders.Codex:
79
return Codicon.openai;
80
case AgentSessionProviders.Claude:
81
return Codicon.claude;
82
case AgentSessionProviders.Growth:
83
return Codicon.lightbulb;
84
}
85
}
86
87
export function isFirstPartyAgentSessionProvider(provider: AgentSessionProviders): boolean {
88
switch (provider) {
89
case AgentSessionProviders.Local:
90
case AgentSessionProviders.Background:
91
case AgentSessionProviders.Cloud:
92
return true;
93
case AgentSessionProviders.Claude:
94
case AgentSessionProviders.Codex:
95
case AgentSessionProviders.Growth:
96
return false;
97
}
98
}
99
100
export function getAgentCanContinueIn(provider: AgentSessionProviders, contribution?: IChatSessionsExtensionPoint): boolean {
101
// Read-only sessions (e.g., Growth) are passive/informational and cannot be delegation targets
102
if (contribution?.isReadOnly) {
103
return false;
104
}
105
switch (provider) {
106
case AgentSessionProviders.Local:
107
case AgentSessionProviders.Background:
108
case AgentSessionProviders.Cloud:
109
return true;
110
case AgentSessionProviders.Claude:
111
case AgentSessionProviders.Codex:
112
case AgentSessionProviders.Growth:
113
return false;
114
}
115
}
116
117
export function getAgentSessionProviderDescription(provider: AgentSessionProviders): string {
118
switch (provider) {
119
case AgentSessionProviders.Local:
120
return localize('chat.session.providerDescription.local', "Run tasks within VS Code chat. The agent iterates via chat and works interactively to implement changes on your main workspace.");
121
case AgentSessionProviders.Background:
122
return localize('chat.session.providerDescription.background', "Delegate tasks to a background agent running locally on your machine. The agent iterates via chat and works asynchronously in a Git worktree to implement changes isolated from your main workspace using the GitHub Copilot CLI.");
123
case AgentSessionProviders.Cloud:
124
return localize('chat.session.providerDescription.cloud', "Delegate tasks to the GitHub Copilot coding agent. The agent iterates via chat and works asynchronously in the cloud to implement changes and pull requests as needed.");
125
case AgentSessionProviders.Claude:
126
return localize('chat.session.providerDescription.claude', "Delegate tasks to the Claude Agent SDK using the Claude models included in your GitHub Copilot subscription. The agent iterates via chat and works interactively to implement changes on your main workspace.");
127
case AgentSessionProviders.Codex:
128
return localize('chat.session.providerDescription.codex', "Opens a new Codex session in the editor. Codex sessions can be managed from the chat sessions view.");
129
case AgentSessionProviders.Growth:
130
return localize('chat.session.providerDescription.growth', "Educational messages to help you learn Copilot features.");
131
}
132
}
133
134
export enum AgentSessionsViewerOrientation {
135
Stacked = 1,
136
SideBySide,
137
}
138
139
export enum AgentSessionsViewerPosition {
140
Left = 1,
141
Right,
142
}
143
144
export interface IAgentSessionsControl {
145
146
readonly element: HTMLElement | undefined;
147
148
refresh(): void;
149
openFind(): void;
150
151
reveal(sessionResource: URI): boolean;
152
153
clearFocus(): void;
154
hasFocusOrSelection(): boolean;
155
}
156
157
export const agentSessionReadIndicatorForeground = registerColor(
158
'agentSessionReadIndicator.foreground',
159
{ dark: transparent(foreground, 0.2), light: transparent(foreground, 0.2), hcDark: null, hcLight: null },
160
localize('agentSessionReadIndicatorForeground', "Foreground color for the read indicator in an agent session.")
161
);
162
163
export const agentSessionSelectedBadgeBorder = registerColor(
164
'agentSessionSelectedBadge.border',
165
{ dark: transparent(listActiveSelectionForeground, 0.3), light: transparent(listActiveSelectionForeground, 0.3), hcDark: foreground, hcLight: foreground },
166
localize('agentSessionSelectedBadgeBorder', "Border color for the badges in selected agent session items.")
167
);
168
169
export const agentSessionSelectedUnfocusedBadgeBorder = registerColor(
170
'agentSessionSelectedUnfocusedBadge.border',
171
{ dark: transparent(foreground, 0.3), light: transparent(foreground, 0.3), hcDark: foreground, hcLight: foreground },
172
localize('agentSessionSelectedUnfocusedBadgeBorder', "Border color for the badges in selected agent session items when the view is unfocused.")
173
);
174
175
export const AGENT_SESSION_RENAME_ACTION_ID = 'agentSession.rename';
176
export const AGENT_SESSION_DELETE_ACTION_ID = 'agentSession.delete';
177
178
export function getAgentSessionTime(timing: IChatSessionTiming): number {
179
return timing.lastRequestEnded ?? timing.lastRequestStarted ?? timing.created;
180
}
181
182