Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/sessions/contrib/chat/browser/openInVSCode.contribution.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 { Codicon } from '../../../../base/common/codicons.js';
7
import { Schemas } from '../../../../base/common/network.js';
8
import { URI } from '../../../../base/common/uri.js';
9
import { ServicesAccessor } from '../../../../editor/browser/editorExtensions.js';
10
import { localize2 } from '../../../../nls.js';
11
import { Action2, registerAction2 } from '../../../../platform/actions/common/actions.js';
12
import { AGENT_HOST_SCHEME, fromAgentHostUri } from '../../../../platform/agentHost/common/agentHostUri.js';
13
import { IRemoteAgentHostService } from '../../../../platform/agentHost/common/remoteAgentHostService.js';
14
import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';
15
import { IOpenerService } from '../../../../platform/opener/common/opener.js';
16
import { IProductService } from '../../../../platform/product/common/productService.js';
17
import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js';
18
import { IsAuxiliaryWindowContext } from '../../../../workbench/common/contextkeys.js';
19
import { IsPhoneLayoutContext, SessionsWelcomeVisibleContext } from '../../../common/contextkeys.js';
20
import { logSessionsInteraction } from '../../../common/sessionsTelemetry.js';
21
import { Menus } from '../../../browser/menus.js';
22
import { isWorkspaceAgentSessionType } from '../../../services/sessions/common/session.js';
23
import { ISessionsManagementService } from '../../../services/sessions/common/sessionsManagement.js';
24
import { ISessionsProvidersService } from '../../../services/sessions/browser/sessionsProvidersService.js';
25
import { resolveRemoteAuthority } from './openInVSCodeUtils.js';
26
27
/**
28
* Opens the host VS Code app from the Agents window via protocol handler.
29
* On desktop this action is replaced by the electron-browser override that
30
* uses {@link INativeHostService.launchSiblingApp} instead.
31
*/
32
registerAction2(class OpenSessionWorktreeInVSCodeAction extends Action2 {
33
static readonly ID = 'chat.openSessionWorktreeInVSCode';
34
35
constructor() {
36
super({
37
id: OpenSessionWorktreeInVSCodeAction.ID,
38
title: localize2('openInVSCode', 'Open in VS Code'),
39
icon: Codicon.vscodeInsiders,
40
precondition: ContextKeyExpr.and(IsAuxiliaryWindowContext.toNegated(), SessionsWelcomeVisibleContext.toNegated()),
41
menu: [{
42
id: Menus.TitleBarSessionMenu,
43
group: 'navigation',
44
order: 7,
45
when: ContextKeyExpr.and(IsAuxiliaryWindowContext.toNegated(), SessionsWelcomeVisibleContext.toNegated(), IsPhoneLayoutContext.negate()),
46
}]
47
});
48
}
49
50
override async run(accessor: ServicesAccessor): Promise<void> {
51
const telemetryService = accessor.get(ITelemetryService);
52
logSessionsInteraction(telemetryService, 'openInVSCode');
53
54
const openerService = accessor.get(IOpenerService);
55
const productService = accessor.get(IProductService);
56
const sessionsManagementService = accessor.get(ISessionsManagementService);
57
const sessionsProvidersService = accessor.get(ISessionsProvidersService);
58
const remoteAgentHostService = accessor.get(IRemoteAgentHostService);
59
60
const scheme = productService.quality === 'stable'
61
? 'vscode'
62
: productService.quality === 'exploration'
63
? 'vscode-exploration'
64
: productService.quality === 'insider'
65
? 'vscode-insiders'
66
: productService.urlProtocol;
67
68
const params = new URLSearchParams();
69
params.set('windowId', '_blank');
70
71
const activeSession = sessionsManagementService.activeSession.get();
72
if (!activeSession) {
73
await openerService.open(URI.from({ scheme, query: params.toString() }), { openExternal: true });
74
return;
75
}
76
77
const workspace = activeSession.workspace.get();
78
const repo = workspace?.repositories[0];
79
const rawFolderUri = isWorkspaceAgentSessionType(activeSession.sessionType) ? repo?.workingDirectory ?? repo?.uri : undefined;
80
81
if (!rawFolderUri) {
82
await openerService.open(URI.from({ scheme, query: params.toString() }), { openExternal: true });
83
return;
84
}
85
86
const folderUri = rawFolderUri.scheme === AGENT_HOST_SCHEME ? fromAgentHostUri(rawFolderUri) : rawFolderUri;
87
const remoteAuthority = resolveRemoteAuthority(
88
activeSession.providerId, sessionsProvidersService, remoteAgentHostService);
89
90
params.set('session', activeSession.resource.toString());
91
92
if (remoteAuthority) {
93
await openerService.open(URI.from({
94
scheme,
95
authority: Schemas.vscodeRemote,
96
path: `/${remoteAuthority}${folderUri.path}`,
97
query: params.toString(),
98
}), { openExternal: true });
99
} else {
100
await openerService.open(URI.from({
101
scheme,
102
authority: Schemas.file,
103
path: folderUri.path,
104
query: params.toString(),
105
}), { openExternal: true });
106
}
107
}
108
});
109
110