1
>
/*---------------------------------------------------------------------------------------------
extHostTerminalService.ts
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 type * as vscode from 'vscode';
7
>
import { Event, Emitter } from '../../../base/common/event.js';
8
>
import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, ITerminalDimensionsDto, ITerminalLinkDto, ExtHostTerminalIdentifier, ICommandDto, ITerminalQuickFixOpenerDto, ITerminalQuickFixTerminalCommandDto, TerminalCommandMatchResultDto, ITerminalCommandDto, ITerminalCompletionContextDto, TerminalCompletionListDto } from './extHost.protocol.js';
9
>
import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';
10
>
import { URI } from '../../../base/common/uri.js';
11
>
import { IExtHostRpcService } from './extHostRpcService.js';
12
>
import { IDisposable, DisposableStore, Disposable, MutableDisposable } from '../../../base/common/lifecycle.js';
13
>
import { Disposable as VSCodeDisposable, EnvironmentVariableMutatorType, TerminalExitReason, TerminalCompletionItem } from './extHostTypes.js';
14
>
import { IExtensionDescription } from '../../../platform/extensions/common/extensions.js';
15
>
import { localize } from '../../../nls.js';
16
>
import { NotSupportedError } from '../../../base/common/errors.js';
17
>
import { serializeEnvironmentDescriptionMap, serializeEnvironmentVariableCollection } from '../../../platform/terminal/common/environmentVariableShared.js';
18
>
import { CancellationTokenSource } from '../../../base/common/cancellation.js';
19
>
import { generateUuid } from '../../../base/common/uuid.js';
20
>
import { IEnvironmentVariableCollectionDescription, IEnvironmentVariableMutator, ISerializableEnvironmentVariableCollection } from '../../../platform/terminal/common/environmentVariable.js';
21
>
import { ICreateContributedTerminalProfileOptions, IProcessReadyEvent, IShellLaunchConfigDto, ITerminalChildProcess, ITerminalLaunchError, ITerminalProfile, TerminalIcon, TerminalLocation, IProcessProperty, ProcessPropertyType, IProcessPropertyMap, TerminalShellType, WindowsShellType } from '../../../platform/terminal/common/terminal.js';
22
>
import { TerminalDataBufferer } from '../../../platform/terminal/common/terminalDataBuffering.js';
23
>
import { ThemeColor } from '../../../base/common/themables.js';
24
>
import { Promises } from '../../../base/common/async.js';
25
>
import { EditorGroupColumn } from '../../services/editor/common/editorGroupColumn.js';
26
>
import { TerminalCompletionList, TerminalQuickFix, ViewColumn } from './extHostTypeConverters.js';
27
>
import { IExtHostCommands } from './extHostCommands.js';
28
>
import { IExtHostInitDataService } from './extHostInitDataService.js';
29
>
import { MarshalledId } from '../../../base/common/marshallingIds.js';
30
>
import { ISerializedTerminalInstanceContext } from '../../contrib/terminal/common/terminal.js';
31
>
import { isWindows } from '../../../base/common/platform.js';
32
>
import { hasKey } from '../../../base/common/types.js';
33
>
import { isProposedApiEnabled } from '../../services/extensions/common/extensions.js';
34
>
35
>
export interface IExtHostTerminalService extends ExtHostTerminalServiceShape, IDisposable {
36
>
37
>
readonly _serviceBrand: undefined;
38
>
39
>
activeTerminal: vscode.Terminal | undefined;
40
>
terminals: vscode.Terminal[];
41
>
42
>
readonly onDidCloseTerminal: Event<vscode.Terminal>;
43
>
readonly onDidOpenTerminal: Event<vscode.Terminal>;
44
>
readonly onDidChangeActiveTerminal: Event<vscode.Terminal | undefined>;
45
>
readonly onDidChangeTerminalDimensions: Event<vscode.TerminalDimensionsChangeEvent>;
46
>
readonly onDidChangeTerminalState: Event<vscode.Terminal>;
47
>
readonly onDidWriteTerminalData: Event<vscode.TerminalDataWriteEvent>;
48
>
readonly onDidExecuteTerminalCommand: Event<vscode.TerminalExecutedCommand>;
49
>
readonly onDidChangeShell: Event<string>;
50
>
51
>
createTerminal(name?: string, shellPath?: string, shellArgs?: readonly string[] | string): vscode.Terminal;
52
>
createTerminalFromOptions(options: vscode.TerminalOptions, internalOptions?: ITerminalInternalOptions): vscode.Terminal;
53
>
createExtensionTerminal(options: vscode.ExtensionTerminalOptions): vscode.Terminal;
54
>
attachPtyToTerminal(id: number, pty: vscode.Pseudoterminal): void;
55
>
getDefaultShell(useAutomationShell: boolean): string;
56
>
getDefaultShellArgs(useAutomationShell: boolean): string[] | string;
57
>
registerLinkProvider(provider: vscode.TerminalLinkProvider): vscode.Disposable;
58
>
registerProfileProvider(extension: IExtensionDescription, id: string, provider: vscode.TerminalProfileProvider): vscode.Disposable;
59
>
registerTerminalQuickFixProvider(id: string, extensionId: string, provider: vscode.TerminalQuickFixProvider): vscode.Disposable;
60
>
getEnvironmentVariableCollection(extension: IExtensionDescription): IEnvironmentVariableCollection;
61
>
getTerminalById(id: number): ExtHostTerminal | null;
62
>
getTerminalIdByApiObject(apiTerminal: vscode.Terminal): number | null;
63
>
registerTerminalCompletionProvider(extension: IExtensionDescription, provider: vscode.TerminalCompletionProvider<vscode.TerminalCompletionItem>, ...triggerCharacters: string[]): vscode.Disposable;
64
>
}
65
>
66
>
interface IEnvironmentVariableCollection extends vscode.EnvironmentVariableCollection {
67
>
getScoped(scope: vscode.EnvironmentVariableScope): vscode.EnvironmentVariableCollection;
68
>
}
69
>
70
>
export interface ITerminalInternalOptions {
71
>
cwd?: string | URI;
72
>
isFeatureTerminal?: boolean;
73
>
forceShellIntegration?: boolean;
74
>
useShellEnvironment?: boolean;
75
>
resolvedExtHostIdentifier?: ExtHostTerminalIdentifier;
76
>
/**
77
>
* This location is different from the API location because it can include splitActiveTerminal,
78
>
* a property we resolve internally
79
>
*/
80
>
location?: TerminalLocation | { viewColumn: number; preserveState?: boolean } | { splitActiveTerminal: boolean };
81
>
}
82
>
83
>
export const IExtHostTerminalService = createDecorator<IExtHostTerminalService>('IExtHostTerminalService');
84
>
85
>
export class ExtHostTerminal extends Disposable {
86
>
private _disposed: boolean = false;
87
>
private _pidPromise: Promise<number | undefined>;
88
>
private _cols: number | undefined;
89
>
private _pidPromiseComplete: ((value: number | undefined) => unknown) | undefined;
90
>
private _rows: number | undefined;
91
>
private _exitStatus: vscode.TerminalExitStatus | undefined;
92
>
private _state: vscode.TerminalState = { isInteractedWith: false, shell: undefined };
93
>
private _selection: string | undefined;
94
>
95
>
shellIntegration: vscode.TerminalShellIntegration | undefined;
96
>
97
>
public isOpen: boolean = false;
98
>
99
>
readonly value: vscode.Terminal;
100
>
101
>
protected readonly _onWillDispose = this._register(new Emitter<void>());
102
>
readonly onWillDispose = this._onWillDispose.event;
103
>
104
>
constructor(
105
private _proxy: MainThreadTerminalServiceShape,
106
public _id: ExtHostTerminalIdentifier,