Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/sessions/contrib/remoteAgentHost/browser/remoteHostOptions.ts
13401 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 { DisposableStore } from '../../../../base/common/lifecycle.js';
8
import { IRemoteAgentHostService, RemoteAgentHostConnectionStatus } from '../../../../platform/agentHost/common/remoteAgentHostService.js';
9
import { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';
10
import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
11
import { IQuickInputService, IQuickPickItem } from '../../../../platform/quickinput/common/quickInput.js';
12
import { IOutputService } from '../../../../workbench/services/output/common/output.js';
13
import { IPreferencesService } from '../../../../workbench/services/preferences/common/preferences.js';
14
import { IAgentHostSessionsProvider } from '../../../common/agentHostSessionsProvider.js';
15
16
export function getStatusLabel(status: RemoteAgentHostConnectionStatus): string {
17
switch (status) {
18
case RemoteAgentHostConnectionStatus.Connected:
19
return localize('workspacePicker.statusOnline', "Online");
20
case RemoteAgentHostConnectionStatus.Connecting:
21
return localize('workspacePicker.statusConnecting', "Connecting");
22
case RemoteAgentHostConnectionStatus.Disconnected:
23
return localize('workspacePicker.statusOffline', "Offline");
24
}
25
}
26
27
export function getStatusHover(status: RemoteAgentHostConnectionStatus, address?: string): string {
28
switch (status) {
29
case RemoteAgentHostConnectionStatus.Connected:
30
return address
31
? localize('workspacePicker.hoverConnectedAddr', "Remote agent host is connected and ready.\n\nAddress: {0}", address)
32
: localize('workspacePicker.hoverConnected', "Remote agent host is connected and ready.");
33
case RemoteAgentHostConnectionStatus.Connecting:
34
return address
35
? localize('workspacePicker.hoverConnectingAddr', "Attempting to connect to remote agent host...\n\nAddress: {0}", address)
36
: localize('workspacePicker.hoverConnecting', "Attempting to connect to remote agent host...");
37
case RemoteAgentHostConnectionStatus.Disconnected:
38
return address
39
? localize('workspacePicker.hoverDisconnectedAddr', "Remote agent host is disconnected.\n\nAddress: {0}", address)
40
: localize('workspacePicker.hoverDisconnected', "Remote agent host is disconnected.");
41
}
42
}
43
44
export interface IShowRemoteHostOptionsOptions {
45
/** When true, show a Back button in the picker title bar. The promise resolves to `'back'` if pressed. */
46
readonly showBackButton?: boolean;
47
}
48
49
/**
50
* Show the per-remote management options quickpick (Reconnect / Remove /
51
* Copy Address / Open Settings / Show Output) for the given provider.
52
*
53
* Used by both the Workspace Picker's Manage submenu and the F1
54
* "Manage Remote Agent Hosts..." command, so both surfaces drive the
55
* same actions. Callers that don't have a {@link ServicesAccessor} should
56
* use `instantiationService.invokeFunction(accessor => showRemoteHostOptions(accessor, provider))`.
57
*
58
* Returns `'back'` if the user clicked the back button (only possible when
59
* `options.showBackButton` is true), otherwise `undefined`.
60
*/
61
export async function showRemoteHostOptions(accessor: ServicesAccessor, provider: IAgentHostSessionsProvider, options: IShowRemoteHostOptionsOptions = {}): Promise<'back' | undefined> {
62
const address = provider.remoteAddress;
63
if (!address) {
64
return undefined;
65
}
66
67
const quickInputService = accessor.get(IQuickInputService);
68
const remoteAgentHostService = accessor.get(IRemoteAgentHostService);
69
const clipboardService = accessor.get(IClipboardService);
70
const preferencesService = accessor.get(IPreferencesService);
71
const outputService = accessor.get(IOutputService);
72
73
const status = provider.connectionStatus?.get();
74
const isConnected = status === RemoteAgentHostConnectionStatus.Connected;
75
76
type RemoteOptionPickItem = IQuickPickItem & { id: string };
77
const items: RemoteOptionPickItem[] = [];
78
if (!isConnected) {
79
items.push({ label: '$(debug-restart) ' + localize('workspacePicker.reconnect', "Reconnect"), id: 'reconnect' });
80
}
81
items.push(
82
{ label: '$(trash) ' + localize('workspacePicker.removeRemote', "Remove Remote"), id: 'remove' },
83
{ label: '$(copy) ' + localize('workspacePicker.copyAddress', "Copy Address"), id: 'copy' },
84
{ label: '$(settings-gear) ' + localize('workspacePicker.openSettings', "Open Settings"), id: 'settings' },
85
);
86
if (provider.outputChannelId) {
87
items.push({ label: '$(output) ' + localize('workspacePicker.showOutput', "Show Output"), id: 'output' });
88
}
89
90
const result = await new Promise<'back' | RemoteOptionPickItem | undefined>((resolve) => {
91
const store = new DisposableStore();
92
const picker = store.add(quickInputService.createQuickPick<RemoteOptionPickItem>());
93
picker.placeholder = localize('workspacePicker.remoteOptionsTitle', "Options for {0}", provider.label);
94
picker.items = items;
95
if (options.showBackButton) {
96
picker.buttons = [quickInputService.backButton];
97
}
98
store.add(picker.onDidTriggerButton(button => {
99
if (button === quickInputService.backButton) {
100
resolve('back');
101
picker.hide();
102
}
103
}));
104
store.add(picker.onDidAccept(() => {
105
resolve(picker.selectedItems[0]);
106
picker.hide();
107
}));
108
store.add(picker.onDidHide(() => {
109
resolve(undefined);
110
store.dispose();
111
}));
112
picker.show();
113
});
114
115
if (result === 'back') {
116
return 'back';
117
}
118
if (!result) {
119
return undefined;
120
}
121
122
switch (result.id) {
123
case 'reconnect':
124
remoteAgentHostService.reconnect(address);
125
break;
126
case 'remove':
127
await remoteAgentHostService.removeRemoteAgentHost(address);
128
break;
129
case 'copy':
130
await clipboardService.writeText(address);
131
break;
132
case 'settings':
133
await preferencesService.openSettings({ query: 'chat.remoteAgentHosts' });
134
break;
135
case 'output':
136
if (provider.outputChannelId) {
137
outputService.showChannel(provider.outputChannelId, true);
138
}
139
break;
140
}
141
return undefined;
142
}
143
144
145