diff --git a/.eslintrc.json b/.eslintrc.json
index 74ebbc80c9c23..f3771d47c4fbb 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -923,14 +923,6 @@
"**/vs/workbench/workbench.sandbox.main"
]
},
- {
- "target": "**/extensions/gitpod-web/**",
- "restrictions": "!@gitpod/supervisor-api-grpc/**"
- },
- {
- "target": "**/extensions/gitpod-remote-ssh/**",
- "restrictions": "!@gitpod/supervisor-api-grpc/**"
- },
{
"target": "**/extensions/**",
"restrictions": "**/*"
diff --git a/.gitpod.yml b/.gitpod.yml
index 2b2f7cde1048b..f008b09c7f217 100644
--- a/.gitpod.yml
+++ b/.gitpod.yml
@@ -17,7 +17,8 @@ tasks:
export NODE_ENV=development
export VSCODE_DEV=1
gp sync-await init
- yarn gitpod:watch
+ cd ./extensions
+ yarn watch
name: watch extension
- command: |
export NODE_ENV=development
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 5f331370008a4..b279f83e8f55d 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -495,13 +495,12 @@
"runtimeExecutable": "${execPath}",
"args": [
"/workspace/vscode",
- "--extensionDevelopmentPath=${workspaceRoot}/extensions/gitpod",
- "--extensionDevelopmentPath=${workspaceRoot}/extensions/gitpod-remote-ssh",
+ "--extensionDevelopmentPath=${workspaceRoot}/extensions/gitpod-remote",
"--log=debug"
],
"outFiles": [
- "${workspaceRoot}/extensions/gitpod/out/**/*.js",
- "${workspaceRoot}/extensions/gitpod-remote-ssh/out/**/*.js",
+ "${workspaceRoot}/extensions/gitpod-shared/out/**/*.js",
+ "${workspaceRoot}/extensions/gitpod-remote/out/**/*.js",
]
}
],
diff --git a/BUILD.yaml b/BUILD.yaml
index b1c58cf11937e..e1e418e348c0a 100644
--- a/BUILD.yaml
+++ b/BUILD.yaml
@@ -13,6 +13,5 @@ packages:
config:
commands:
- ["yarn", "--cwd", "./install/build", "compile"]
- - ["yarn", "--cwd", "./install", "gitpod:link"]
- ["yarn", "--cwd", "./install", "compile"]
- ["yarn", "--cwd", "./install", "download-builtin-extensions"]
diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js
index 5902cb140ce6d..27134ddb51507 100644
--- a/build/gulpfile.extensions.js
+++ b/build/gulpfile.extensions.js
@@ -65,10 +65,6 @@ const compilations = [
'vscode-custom-editor-tests/tsconfig.json',
'vscode-notebook-tests/tsconfig.json',
'vscode-test-resolver/tsconfig.json',
- 'gitpod/tsconfig.json',
- 'gitpod-remote-ssh/tsconfig.json',
- 'gitpod-web/tsconfig.json',
- 'gitpod-desktop/tsconfig.json',
];
const getBaseUrl = out => `https://ticino.blob.core.windows.net/sourcemaps/${commit}/${out}`;
diff --git a/build/gulpfile.gitpod.js b/build/gulpfile.gitpod.js
index c8c5fb01fcd97..1b9926bb6ba0b 100644
--- a/build/gulpfile.gitpod.js
+++ b/build/gulpfile.gitpod.js
@@ -27,7 +27,7 @@ const rename = require('gulp-rename');
const ext = require('./lib/extensions');
const extensionsPath = path.join(path.dirname(__dirname), 'extensions');
-const marketplaceExtensions = ['gitpod', 'gitpod-desktop', 'gitpod-remote-ssh'];
+const marketplaceExtensions = ['gitpod', 'gitpod-remote'];
const outMarketplaceExtensions = 'out-gitpod-marketplace';
const cleanMarketplaceExtensions = task.define('clean-gitpod-marketplace-extensions', util.rimraf(outMarketplaceExtensions));
const bumpMarketplaceExtensions = task.define('bump-marketplace-extensions', () => {
diff --git a/build/hygiene.js b/build/hygiene.js
index 0c043400d10fc..9fd05f3dd64b5 100644
--- a/build/hygiene.js
+++ b/build/hygiene.js
@@ -59,7 +59,7 @@ function hygiene(some, linting = true) {
});
const copyrights = es.through(function (file) {
- if (file.relative.indexOf('vs/server') === -1) {
+ if (file.relative.indexOf('vs/server') === -1 && file.relative.indexOf('gitpod') === -1) {
const lines = file.__lines;
for (let i = 0; i < copyrightHeaderLines.length; i++) {
diff --git a/build/lib/extensions.js b/build/lib/extensions.js
index b6ffcad4b4cba..d351879ffcdcc 100644
--- a/build/lib/extensions.js
+++ b/build/lib/extensions.js
@@ -206,8 +206,9 @@ const excludedExtensions = [
'vscode-notebook-tests',
'vscode-custom-editor-tests',
'github-authentication',
- 'gitpod-remote-ssh',
- 'gitpod-desktop',
+ 'gitpod-shared',
+ 'gitpod-remote',
+ 'gitpod',
];
const marketplaceWebExtensionsExclude = new Set([
'ms-vscode.node-debug',
diff --git a/build/lib/extensions.ts b/build/lib/extensions.ts
index 5ec5f39a0a228..a83dd17c9880e 100644
--- a/build/lib/extensions.ts
+++ b/build/lib/extensions.ts
@@ -241,8 +241,9 @@ const excludedExtensions = [
'vscode-notebook-tests',
'vscode-custom-editor-tests',
'github-authentication',
- 'gitpod-remote-ssh',
- 'gitpod-desktop',
+ 'gitpod-shared',
+ 'gitpod-remote',
+ 'gitpod',
];
const marketplaceWebExtensionsExclude = new Set([
diff --git a/build/npm/dirs.js b/build/npm/dirs.js
index ffb575d9cecd0..3a8ce4d7f28f0 100644
--- a/build/npm/dirs.js
+++ b/build/npm/dirs.js
@@ -42,10 +42,6 @@ exports.dirs = [
'extensions/vscode-custom-editor-tests',
'extensions/vscode-notebook-tests',
'extensions/vscode-test-resolver',
- 'extensions/gitpod',
- 'extensions/gitpod-remote-ssh',
- 'extensions/gitpod-web',
- 'extensions/gitpod-desktop',
'remote',
'remote/web',
'test/automation',
diff --git a/extensions/.gitignore b/extensions/.gitignore
new file mode 100644
index 0000000000000..cc1b7f164211e
--- /dev/null
+++ b/extensions/.gitignore
@@ -0,0 +1 @@
+tsconfig.tsbuildinfo
diff --git a/extensions/gitpod-desktop/README.md b/extensions/gitpod-desktop/README.md
deleted file mode 100644
index 9d85ad0e0aeba..0000000000000
--- a/extensions/gitpod-desktop/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Gitpod Desktop integration
-
-## Features
-
-This extension provides support for Gitpod Desktop integration.
diff --git a/extensions/gitpod-desktop/extension.webpack.config.js b/extensions/gitpod-desktop/extension.webpack.config.js
deleted file mode 100644
index a513ac5c3b511..0000000000000
--- a/extensions/gitpod-desktop/extension.webpack.config.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-
-//@ts-check
-
-'use strict';
-
-const withDefaults = require('../shared.webpack.config');
-
-module.exports = withDefaults({
- context: __dirname,
- entry: {
- extension: './src/extension.ts',
- },
- externals: {
- 'keytar': 'commonjs keytar'
- }
-});
diff --git a/extensions/gitpod-desktop/package.json b/extensions/gitpod-desktop/package.json
deleted file mode 100644
index 8b8885f662303..0000000000000
--- a/extensions/gitpod-desktop/package.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "name": "gitpod-desktop",
- "displayName": "%displayName%",
- "description": "%description%",
- "publisher": "gitpod",
- "version": "0.0.14",
- "license": "MIT",
- "preview": true,
- "repository": {
- "type": "git",
- "url": "https://github.com/gitpod-io/vscode.git"
- },
- "engines": {
- "vscode": "^1.58.2"
- },
- "categories": [
- "Other"
- ],
- "extensionKind": [
- "ui"
- ],
- "activationEvents": [
- "*",
- "onCommand:gitpod-desktop.api.autoTunnel"
- ],
- "main": "./out/extension.js",
- "scripts": {
- "compile": "gulp compile-extension:gitpod-desktop",
- "watch": "gulp watch-extension:gitpod-desktop",
- "vscode:prepublish": "npm run compile"
- },
- "devDependencies": {
- "@types/node": "^10.12.21",
- "@types/node-fetch": "^2.5.12",
- "@types/tmp": "^0.2.1"
- },
- "dependencies": {
- "@gitpod/local-app-api-grpcweb": "ak-vscode-desktop",
- "@improbable-eng/grpc-web-node-http-transport": "^0.14.0",
- "node-fetch": "^2.6.1",
- "tmp": "^0.2.1",
- "vscode-nls": "^5.0.0"
- },
- "extensionDependencies": [
- "ms-vscode-remote.remote-ssh"
- ]
-}
diff --git a/extensions/gitpod-desktop/package.nls.json b/extensions/gitpod-desktop/package.nls.json
deleted file mode 100644
index 87b44eb194759..0000000000000
--- a/extensions/gitpod-desktop/package.nls.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "displayName": "Gitpod Desktop",
- "description": "Gitpod Desktop Support"
-}
diff --git a/extensions/gitpod-desktop/src/extension.ts b/extensions/gitpod-desktop/src/extension.ts
deleted file mode 100644
index 89caa67286c29..0000000000000
--- a/extensions/gitpod-desktop/src/extension.ts
+++ /dev/null
@@ -1,403 +0,0 @@
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Gitpod. All rights reserved.
- *--------------------------------------------------------------------------------------------*/
-
-///
-
-import { AutoTunnelRequest, ResolveSSHConnectionRequest, ResolveSSHConnectionResponse } from '@gitpod/local-app-api-grpcweb/lib/localapp_pb';
-import { LocalAppClient } from '@gitpod/local-app-api-grpcweb/lib/localapp_pb_service';
-import { NodeHttpTransport } from '@improbable-eng/grpc-web-node-http-transport';
-import * as cp from 'child_process';
-import * as fs from 'fs';
-import * as http from 'http';
-import * as net from 'net';
-import fetch, { Response } from 'node-fetch';
-import { performance } from 'perf_hooks';
-import * as tmp from 'tmp';
-import * as util from 'util';
-import * as vscode from 'vscode';
-import { grpc } from '@improbable-eng/grpc-web';
-const streamPipeline = util.promisify(require('stream').pipeline);
-
-interface SSHConnectionParams {
- workspaceId: string
- instanceId: string
- gitpodHost: string
-}
-
-interface LocalAppConfig {
- gitpodHost: string
- configFile: string
- apiPort: number
- pid: number
- logPath: string
-}
-
-interface Lock {
- value: string
- deadline: number
-}
-
-interface LocalAppInstallation {
- path: string
- etag: string | null
-}
-
-export async function activate(context: vscode.ExtensionContext) {
- const output = vscode.window.createOutputChannel('Gitpod');
-
- // TODO(ak) commands to show logs and stop local apps
- // TODO(ak) auto stop local apps if not used for 3 hours
-
- function throwIfCancelled(token: vscode.CancellationToken): void {
- if (token.isCancellationRequested) {
- throw new Error('cancelled');
- }
- }
-
- const lockPrefix = 'lock/';
- const fastLockTimeout = 5000;
- const slowLockTimeout = 30000;
- function releaseStaleLocks(): void {
- for (const key of context.globalState.keys()) {
- if (key.startsWith(lockPrefix)) {
- const lock = context.globalState.get(key);
- if (typeof lock !== 'object' || performance.now() >= lock.deadline) {
- const lockName = key.substr(lockPrefix.length);
- output.appendLine(`cancel stale lock: ${lockName}`);
- context.globalState.update(key, undefined);
- }
- }
- }
- }
- let lockCount = 0;
- async function withLock(lockName: string, op: (token: vscode.CancellationToken) => Promise, timeout: number): Promise {
- output.appendLine(`acquiring lock: ${lockName}`);
- const lockKey = lockPrefix + lockName;
- const value = vscode.env.sessionId + '/' + lockCount++;
- let currentLock: Lock | undefined;
- let deadline: number | undefined;
- const updateTimeout = 150;
- while (currentLock?.value !== value) {
- currentLock = context.globalState.get(lockKey);
- if (!currentLock) {
- deadline = performance.now() + timeout + updateTimeout * 2;
- await context.globalState.update(lockKey, { value, deadline });
- }
- // TODO(ak) env.globaState.onDidChange instead, see https://github.com/microsoft/vscode/issues/131182
- await new Promise(resolve => setTimeout(resolve, updateTimeout));
- currentLock = context.globalState.get(lockKey);
- }
- output.appendLine(`acquired lock: ${lockName}`);
- const tokenSource = new vscode.CancellationTokenSource();
- let timer = setInterval(() => {
- currentLock = context.globalState.get(lockKey);
- if (currentLock?.value !== value) {
- tokenSource.cancel();
- }
- }, updateTimeout);
- try {
- const result = await op(tokenSource.token);
- return result;
- } finally {
- if (timer) {
- clearTimeout(timer);
- }
- output.appendLine(`released lock: ${lockName}`);
- await context.globalState.update(lockKey, undefined);
- }
- }
-
- const releaseStaleLocksTimer = setInterval(() => releaseStaleLocks(), fastLockTimeout);
- context.subscriptions.push(new vscode.Disposable(() => clearInterval(releaseStaleLocksTimer)));
-
- function downloadLocalApp(gitpodHost: string): Promise {
- let downloadUri = vscode.Uri.parse(gitpodHost);
- if (process.platform === 'win32') {
- downloadUri = downloadUri.with({
- path: '/static/bin/gitpod-local-companion-windows.exe'
- });
- } else if (process.platform === 'darwin') {
- downloadUri = downloadUri.with({
- path: '/static/bin/gitpod-local-companion-darwin'
- });
- } else {
- downloadUri = downloadUri.with({
- path: '/static/bin/gitpod-local-companion-linux'
- });
- }
- output.appendLine(`fetching the local app from ${downloadUri.toString()}`);
- return fetch(downloadUri.toString());
- }
-
- async function installLocalApp(download: Response, token: vscode.CancellationToken): Promise {
- try {
- const installationPath = await new Promise((resolve, reject) =>
- tmp.file({ prefix: 'gitpod-local-companion' }, (err, path) => {
- if (err) {
- return reject(err);
- }
- return resolve(path);
- })
- );
- throwIfCancelled(token);
- output.appendLine(`installing the local app to ${installationPath}`);
- throwIfCancelled(token);
- await streamPipeline(download.body, fs.createWriteStream(installationPath));
- throwIfCancelled(token);
- if (process.platform !== 'win32') {
- await fs.promises.chmod(installationPath, '755');
- throwIfCancelled(token);
- }
- const installation: LocalAppInstallation = { path: installationPath, etag: download.headers.get('etag') };
- output.appendLine(`installing the local app: ${JSON.stringify(installation, undefined, 2)}`);
- return installation;
- } catch (e) {
- output.appendLine(`failed to install the local app: ${e}`);
- throw e;
- }
- }
-
- async function startLocalApp(gitpodHost: string, installation: LocalAppInstallation, token: vscode.CancellationToken): Promise {
- try {
- const [configFile, apiPort] = await Promise.all([new Promise((resolve, reject) =>
- tmp.file({ prefix: 'gitpod_ssh_config' }, (err, path) => {
- if (err) {
- return reject(err);
- }
- return resolve(path);
- })
- ), new Promise(resolve => {
- const server = http.createServer();
- server.listen(0, 'localhost', () => {
- resolve((server.address() as net.AddressInfo).port);
- server.close();
- });
- })]);
- throwIfCancelled(token);
- output.appendLine(`starting the local app with the config: ${JSON.stringify({ gitpodHost, configFile, apiPort }, undefined, 2)}`);
- const logPath = installation.path + '.log';
- let spawnTimer: NodeJS.Timeout | undefined;
- const pid = await new Promise((resolve, reject) => {
- const logStream = fs.createWriteStream(logPath);
- logStream.on('error', reject);
- logStream.on('open', () => {
- if (token.isCancellationRequested) {
- reject(new Error('cancelled'));
- }
- // TODO(ak) pass this window URL as oauth callback
- const localAppProcess = cp.spawn(installation.path, {
- detached: true,
- stdio: ['ignore', logStream, logStream],
- env: {
- ...process.env,
- GITPOD_HOST: gitpodHost,
- GITPOD_LCA_SSH_CONFIG: configFile,
- GITPOD_LCA_API_PORT: String(apiPort),
- GITPOD_LCA_AUTO_TUNNEL: String(false),
- GITPOD_LCA_AUTH_REDIRECT_URL: `${vscode.env.uriScheme}://${context.extension.id}${authCompletePath}`
- }
- });
- localAppProcess.on('error', reject);
- localAppProcess.on('exit', code => reject(new Error('unexpectedly exit with code: ' + code)));
- localAppProcess.unref();
- if (localAppProcess.pid) {
- // TODO(ak) when Node.js > 14.17
- // localAppProcess.on('spwan', () => resolve(localAppProcess.pid)));
- spawnTimer = setInterval(() => {
- try {
- process.kill(localAppProcess.pid, 0);
- resolve(localAppProcess.pid);
- } catch { }
- }, 150);
- }
- });
- }).finally(() => {
- if (spawnTimer) {
- clearInterval(spawnTimer);
- }
- });
- output.appendLine(`the local app has been stared: ${JSON.stringify({ pid, logPath }, undefined, 2)}`);
- return { gitpodHost, configFile, apiPort, pid, logPath };
- } catch (e) {
- output.appendLine(`failed to start the local app: ${e}`);
- throw e;
- }
- }
-
- /**
- * **Important: it should not call the local app to manage in 30sec**
- */
- async function ensureLocalApp(gitpodHost: string, configKey: string, installationKey: string, token: vscode.CancellationToken): Promise {
- let download: Response | Error;
- try {
- download = await downloadLocalApp(gitpodHost);
- throwIfCancelled(token);
- if (!download.ok) {
- download = new Error(`unexpected download response ${download.statusText} (${download.status})`);
- }
- } catch (e) {
- download = e;
- }
- let config = context.globalState.get(configKey);
- let installation = context.globalState.get(installationKey);
- if (installation) {
- const upgrade = !(download instanceof Error) && { etag: download.headers.get('etag'), url: download.url };
- if (upgrade && upgrade.etag && upgrade.etag !== installation.etag) {
- output.appendLine(`the local app is outdated, upgrading: ${JSON.stringify({ installation, upgrade }, undefined, 2)}`);
- installation = undefined;
- if (config) {
- try {
- process.kill(config.pid);
- } catch (e) {
- output.appendLine(`failed to kill the outdated local app (pid: ${config.pid}): ${e}`);
- }
- }
- config = undefined;
- }
- }
- if (config) {
- return config;
- }
- if (installation) {
- try {
- await fs.promises.access(installation.path, fs.constants.X_OK);
- throwIfCancelled(token);
- } catch {
- installation = undefined;
- }
- }
- if (!installation) {
- if (download instanceof Error) {
- throw download;
- }
- installation = await installLocalApp(download, token);
- await context.globalState.update(installationKey, installation);
- throwIfCancelled(token);
- }
- config = await startLocalApp(gitpodHost, installation, token);
- await context.globalState.update(configKey, config);
- throwIfCancelled(token);
- return config;
- }
-
- async function withLocalApp(gitpodHost: string, op: (client: LocalAppClient, config: LocalAppConfig) => Promise): Promise {
- const gitpodAuthority = vscode.Uri.parse(gitpodHost).authority;
- const configKey = 'config/' + gitpodAuthority;
- const installationKey = 'installation/' + gitpodAuthority;
- let restartAttempts = 0;
- while (restartAttempts < 5) {
- const config = await withLock(gitpodAuthority, token =>
- ensureLocalApp(gitpodHost, configKey, installationKey, token)
- , slowLockTimeout);
- const client = new LocalAppClient('http://localhost:' + config.apiPort, { transport: NodeHttpTransport() });
- try {
- const result = await op(client, config);
- return result;
- } catch (e) {
- let running: true | Error;
- try {
- process.kill(config.pid, 0);
- running = true;
- } catch (e2) {
- running = e2;
- }
- if (running === true && (e.code === grpc.Code.Unavailable || e.code === grpc.Code.Unknown)) {
- output.appendLine(`the local app (pid: ${config.pid}) is running, but the api endpoint is not ready: ${e}`);
- output.appendLine(`retying again after 1s delay...`);
- await new Promise(resolve => setTimeout(resolve, 1000));
- continue;
- }
- if (running === true) {
- throw e;
- }
- output.appendLine(`failed to access the local app: ${e}`);
- output.appendLine(`the local app (pid: ${config.pid}) is not running: ${running}`);
- output.appendLine(`restarting the local app...`);
- await withLock(gitpodAuthority, async () => {
- if (JSON.stringify(context.globalState.get(configKey)) === JSON.stringify(config)) {
- await context.globalState.update(configKey, undefined);
- }
- }, fastLockTimeout);
- restartAttempts++;
- }
- }
- throw new Error('failed to access the local app');
- }
-
- async function resolveSSHConnection({ instanceId, workspaceId, gitpodHost }: SSHConnectionParams): Promise {
- return withLocalApp(gitpodHost, client => {
- const request = new ResolveSSHConnectionRequest();
- request.setInstanceId(instanceId);
- request.setWorkspaceId(workspaceId);
- return new Promise((resolve, reject) =>
- client.resolveSSHConnection(request, (e, r) => r ? resolve(r) : reject(e))
- );
- });
- }
-
- const authCompletePath = '/auth-complete';
- context.subscriptions.push(vscode.window.registerUriHandler({
- handleUri: async uri => {
- if (uri.path === authCompletePath) {
- output.appendLine('auth completed');
- return;
- }
- output.appendLine('open workspace window: ' + uri.toString());
- const params: SSHConnectionParams = JSON.parse(uri.query);
- try {
- await vscode.window.withProgress({
- location: vscode.ProgressLocation.Notification,
- cancellable: false,
- title: `Connecting to Gitpod workspace: ${params.workspaceId}`
- }, async () => {
- const connection = await resolveSSHConnection(params);
-
- const config = vscode.workspace.getConfiguration('remote.SSH');
- const defaultExtensions = config.get('defaultExtensions') || [];
- if (defaultExtensions.indexOf('gitpod.gitpod-remote-ssh') === -1) {
- defaultExtensions.unshift('gitpod.gitpod-remote-ssh');
- await config.update('defaultExtensions', defaultExtensions, vscode.ConfigurationTarget.Global);
- }
- // TODO(ak) notify a user about config file changes?
- const gitpodConfigFile = connection.getConfigFile();
- const currentConfigFile = config.get('configFile');
- if (currentConfigFile === gitpodConfigFile) {
- // invalidate cached SSH targets from the current config file
- await config.update('configFile', undefined, vscode.ConfigurationTarget.Global);
- }
- await config.update('configFile', gitpodConfigFile, vscode.ConfigurationTarget.Global);
- // TODO(ak) ensure that vscode.ssh-remote is installed
- await vscode.commands.executeCommand('vscode.openFolder', vscode.Uri.parse(`vscode-remote://ssh-remote+${connection.getHost()}${uri.path || '/'}`), {
- forceNewWindow: true
- });
- });
- } catch (e) {
- vscode.window.showErrorMessage(`Failed to connect to Gitpod workspace ${params.workspaceId}: ${e}`);
- output.appendLine(`failed to open uri: ${e}`);
- throw e;
- }
- }
- }));
-
- if (vscode.env.remoteName === undefined || context.extension.extensionKind !== vscode.ExtensionKind.UI) {
- return;
- }
-
- context.subscriptions.push(vscode.commands.registerCommand('gitpod-desktop.api.autoTunnel', async (gitpodHost: string, instanceId: string, enabled: boolean) => {
- try {
- await withLocalApp(gitpodHost, client => {
- const request = new AutoTunnelRequest();
- request.setInstanceId(instanceId);
- request.setEnabled(enabled);
- return new Promise((resolve, reject) =>
- client.autoTunnel(request, (e, r) => r ? resolve(undefined) : reject(e))
- );
- });
- } catch (e) {
- console.error('failed to disable auto tunneling', e);
- }
- }));
-}
-
-export function deactivate() { }
diff --git a/extensions/gitpod-desktop/yarn.lock b/extensions/gitpod-desktop/yarn.lock
deleted file mode 100644
index 6226fa25ca600..0000000000000
--- a/extensions/gitpod-desktop/yarn.lock
+++ /dev/null
@@ -1,198 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@gitpod/local-app-api-grpcweb@ak-vscode-desktop":
- version "0.1.5-ak-vscode-desktop.10"
- resolved "https://registry.yarnpkg.com/@gitpod/local-app-api-grpcweb/-/local-app-api-grpcweb-0.1.5-ak-vscode-desktop.10.tgz#85ae5128dacc7cb7ae0ddbfe36b826302e969f83"
- integrity sha512-YX7zKRQjb0O58DM2e5rAb9VQNZELSHUJXW8ZkIogqe4YY6kQFgl5eTs2Tyj6EsHt1N/du4UR/9Wt4SQ0I0QmYg==
- dependencies:
- "@gitpod/supervisor-api-grpcweb" "0.1.5-prs-core-dev-kubeconfig.3"
- "@improbable-eng/grpc-web" "0.14.0"
- google-protobuf "^3.17.0"
-
-"@gitpod/supervisor-api-grpcweb@0.1.5-prs-core-dev-kubeconfig.3":
- version "0.1.5-prs-core-dev-kubeconfig.3"
- resolved "https://registry.yarnpkg.com/@gitpod/supervisor-api-grpcweb/-/supervisor-api-grpcweb-0.1.5-prs-core-dev-kubeconfig.3.tgz#ce6844841dd66435c77c3ef74cb1833f23038400"
- integrity sha512-d7Def3zFVarb2vueYLmJ+hRkaNEkK84r2B0xWtYT/OLr323NMWiPYlWePPis7Vt7WBV9u69erCtTqP7jAqu2Tg==
- dependencies:
- "@improbable-eng/grpc-web" "^0.14.0"
-
-"@improbable-eng/grpc-web-node-http-transport@^0.14.0":
- version "0.14.0"
- resolved "https://registry.yarnpkg.com/@improbable-eng/grpc-web-node-http-transport/-/grpc-web-node-http-transport-0.14.0.tgz#3edf05360541b2d7ba799ec0144780a7a9a99383"
- integrity sha512-NGZJgY8zTTWM//9oGdJZ+acmCgcgUcqxu3NV3GMFxw35D+3xkdEz599r9O7urg1Vv0+LzXDvfWEg7qg1Ec8x1w==
-
-"@improbable-eng/grpc-web@0.14.0", "@improbable-eng/grpc-web@^0.14.0":
- version "0.14.0"
- resolved "https://registry.yarnpkg.com/@improbable-eng/grpc-web/-/grpc-web-0.14.0.tgz#a71c5af471dcef6a2810798f71f93ed8d6ac3817"
- integrity sha512-ag1PTMWpBZKGi6GrEcZ4lkU5Qag23Xjo10BmnK9qyx4TMmSVcWmQ3rECirfQzm2uogrM9n1M6xfOpFsJP62ivA==
- dependencies:
- browser-headers "^0.4.1"
-
-"@types/node-fetch@^2.5.12":
- version "2.5.12"
- resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66"
- integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==
- dependencies:
- "@types/node" "*"
- form-data "^3.0.0"
-
-"@types/node@*":
- version "16.6.2"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-16.6.2.tgz#331b7b9f8621c638284787c5559423822fdffc50"
- integrity sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA==
-
-"@types/node@^10.12.21":
- version "10.17.60"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b"
- integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==
-
-"@types/tmp@^0.2.1":
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.1.tgz#83ecf4ec22a8c218c71db25f316619fe5b986011"
- integrity sha512-7cTXwKP/HLOPVgjg+YhBdQ7bMiobGMuoBmrGmqwIWJv8elC6t1DfVc/mn4fD9UE1IjhwmhaQ5pGVXkmXbH0rhg==
-
-asynckit@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
- integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
-
-balanced-match@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
- integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
-
-brace-expansion@^1.1.7:
- version "1.1.11"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
- integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
- dependencies:
- balanced-match "^1.0.0"
- concat-map "0.0.1"
-
-browser-headers@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/browser-headers/-/browser-headers-0.4.1.tgz#4308a7ad3b240f4203dbb45acedb38dc2d65dd02"
- integrity sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==
-
-combined-stream@^1.0.8:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
- integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
- dependencies:
- delayed-stream "~1.0.0"
-
-concat-map@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
- integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
-
-delayed-stream@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
- integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
-
-form-data@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
- integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
- dependencies:
- asynckit "^0.4.0"
- combined-stream "^1.0.8"
- mime-types "^2.1.12"
-
-fs.realpath@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
- integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
-
-glob@^7.1.3:
- version "7.1.7"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
- integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.4"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-google-protobuf@^3.17.0:
- version "3.17.3"
- resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.17.3.tgz#f87595073545a77946c8f0b67c302c5f7646d700"
- integrity sha512-OVPzcSWIAJ+d5yiHyeaLrdufQtrvaBrF4JQg+z8ynTkbO3uFcujqXszTumqg1cGsAsjkWnI+M5B1xZ19yR4Wyg==
-
-inflight@^1.0.4:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
- integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
- dependencies:
- once "^1.3.0"
- wrappy "1"
-
-inherits@2:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-mime-db@1.49.0:
- version "1.49.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed"
- integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==
-
-mime-types@^2.1.12:
- version "2.1.32"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5"
- integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==
- dependencies:
- mime-db "1.49.0"
-
-minimatch@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
- integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
- dependencies:
- brace-expansion "^1.1.7"
-
-node-fetch@^2.6.1:
- version "2.6.1"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
- integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
-
-once@^1.3.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
- dependencies:
- wrappy "1"
-
-path-is-absolute@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
- integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
-
-rimraf@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
- integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
- dependencies:
- glob "^7.1.3"
-
-tmp@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
- integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
- dependencies:
- rimraf "^3.0.0"
-
-vscode-nls@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840"
- integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==
-
-wrappy@1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
diff --git a/extensions/gitpod-remote-ssh/.vscodeignore b/extensions/gitpod-remote-ssh/.vscodeignore
deleted file mode 100644
index f65bc15d8391a..0000000000000
--- a/extensions/gitpod-remote-ssh/.vscodeignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.gitignore
-src/**
-!src/common/config.json
-out/**
-build/**
-extension.webpack.config.js
-extension-browser.webpack.config.js
-tsconfig.json
-yarn.lock
diff --git a/extensions/gitpod-remote-ssh/package.json b/extensions/gitpod-remote-ssh/package.json
deleted file mode 100644
index 4bd359d980462..0000000000000
--- a/extensions/gitpod-remote-ssh/package.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "name": "gitpod-remote-ssh",
- "displayName": "%displayName%",
- "description": "%description%",
- "publisher": "gitpod",
- "version": "0.0.14",
- "license": "MIT",
- "preview": true,
- "repository": {
- "type": "git",
- "url": "https://github.com/gitpod-io/vscode.git"
- },
- "engines": {
- "vscode": "^1.58.2"
- },
- "categories": [
- "Other"
- ],
- "extensionKind": [
- "workspace"
- ],
- "activationEvents": [
- "*"
- ],
- "main": "./out/extension.js",
- "contributes": {},
- "scripts": {
- "compile": "gulp compile-extension:gitpod-remote-ssh",
- "watch": "gulp watch-extension:gitpod-remote-ssh",
- "vscode:prepublish": "npm run compile"
- },
- "devDependencies": {
- "@types/node": "^10.12.21"
- },
- "dependencies": {
- "vscode-nls": "^5.0.0"
- },
- "extensionDependencies": [
- "gitpod.gitpod"
- ]
-}
diff --git a/extensions/gitpod-remote-ssh/package.nls.json b/extensions/gitpod-remote-ssh/package.nls.json
deleted file mode 100644
index b18416320a760..0000000000000
--- a/extensions/gitpod-remote-ssh/package.nls.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "displayName": "Gitpod Remote SSH",
- "description": "Gitpod Remote SSH Support"
-}
diff --git a/extensions/gitpod-remote-ssh/yarn.lock b/extensions/gitpod-remote-ssh/yarn.lock
deleted file mode 100644
index f869b66a776f9..0000000000000
--- a/extensions/gitpod-remote-ssh/yarn.lock
+++ /dev/null
@@ -1,13 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@types/node@^10.12.21":
- version "10.17.60"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b"
- integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==
-
-vscode-nls@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840"
- integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==
diff --git a/extensions/gitpod-desktop/.vscodeignore b/extensions/gitpod-remote/.vscodeignore
similarity index 100%
rename from extensions/gitpod-desktop/.vscodeignore
rename to extensions/gitpod-remote/.vscodeignore
diff --git a/extensions/gitpod-remote-ssh/README.md b/extensions/gitpod-remote/README.md
similarity index 100%
rename from extensions/gitpod-remote-ssh/README.md
rename to extensions/gitpod-remote/README.md
diff --git a/extensions/gitpod-remote-ssh/extension.webpack.config.js b/extensions/gitpod-remote/extension.webpack.config.js
similarity index 100%
rename from extensions/gitpod-remote-ssh/extension.webpack.config.js
rename to extensions/gitpod-remote/extension.webpack.config.js
diff --git a/extensions/gitpod-remote/package.json b/extensions/gitpod-remote/package.json
new file mode 100644
index 0000000000000..7dbd577debd6d
--- /dev/null
+++ b/extensions/gitpod-remote/package.json
@@ -0,0 +1,224 @@
+{
+ "name": "gitpod-remote-ssh",
+ "displayName": "%displayName%",
+ "description": "%description%",
+ "publisher": "gitpod",
+ "version": "0.0.16",
+ "license": "MIT",
+ "preview": true,
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/gitpod-io/vscode.git"
+ },
+ "engines": {
+ "vscode": "^1.58.2"
+ },
+ "categories": [
+ "Other"
+ ],
+ "extensionKind": [
+ "workspace"
+ ],
+ "activationEvents": [
+ "*"
+ ],
+ "main": "./out/extension.js",
+ "contributes": {
+ "commands": [
+ {
+ "command": "gitpod.stop.ws",
+ "title": "%stopWorkspace%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.open.settings",
+ "title": "%openSettings%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.accessControl",
+ "title": "%openAccessControl%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.context",
+ "title": "%openContext%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.dashboard",
+ "title": "%openDashboard%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.documentation",
+ "title": "%openDocumentation%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.twitter",
+ "title": "%openTwitter%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.discord",
+ "title": "%openDiscord%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.discourse",
+ "title": "%openDiscourse%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.reportIssue",
+ "title": "%reportIssue%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.upgradeSubscription",
+ "title": "%upgradeSubscription%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.ExtendTimeout",
+ "title": "%extendTimeout%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.takeSnapshot",
+ "title": "%takeSnapshot%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.shareWorkspace",
+ "title": "%shareWorkspace%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == false"
+ },
+ {
+ "command": "gitpod.stopSharingWorkspace",
+ "title": "%stopSharingWorkspace%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == true"
+ },
+ {
+ "command": "gitpod.openInStable",
+ "title": "%openInStable%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.UIKind == 'web'"
+ },
+ {
+ "command": "gitpod.openInInsiders",
+ "title": "%openInInsiders%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.UIKind == 'web'"
+ },
+ {
+ "command": "gitpod.openInBrowser",
+ "title": "%openInBrowser%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.UIKind == 'desktop'"
+ }
+ ],
+ "menus": {
+ "statusBar/remoteIndicator": [
+ {
+ "command": "gitpod.stop.ws",
+ "group": "remote_00_gitpod_navigation@10",
+ "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.open.settings",
+ "group": "remote_00_gitpod_navigation@20",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.accessControl",
+ "group": "remote_00_gitpod_navigation@30",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.context",
+ "group": "remote_00_gitpod_navigation@40",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.dashboard",
+ "group": "remote_00_gitpod_navigation@50",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.documentation",
+ "group": "remote_00_gitpod_navigation@60",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.twitter",
+ "group": "remote_00_gitpod_navigation@70",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.discord",
+ "group": "remote_00_gitpod_navigation@80",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.discourse",
+ "group": "remote_00_gitpod_navigation@81",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.reportIssue",
+ "group": "remote_00_gitpod_navigation@90",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.upgradeSubscription",
+ "group": "remote_00_gitpod_navigation@100",
+ "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.ExtendTimeout",
+ "group": "remote_00_gitpod_navigation@110",
+ "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.takeSnapshot",
+ "group": "remote_00_gitpod_navigation@120",
+ "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.shareWorkspace",
+ "group": "remote_00_gitpod_navigation@130",
+ "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == false"
+ },
+ {
+ "command": "gitpod.stopSharingWorkspace",
+ "group": "remote_00_gitpod_navigation@130",
+ "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == true"
+ },
+ {
+ "command": "gitpod.openInStable",
+ "group": "remote_00_gitpod_navigation@900",
+ "when": "gitpod.inWorkspace == true && gitpod.UIKind == 'web'"
+ },
+ {
+ "command": "gitpod.openInInsiders",
+ "group": "remote_00_gitpod_navigation@1000",
+ "when": "gitpod.inWorkspace == true && gitpod.UIKind == 'web'"
+ },
+ {
+ "command": "gitpod.openInBrowser",
+ "group": "remote_00_gitpod_navigation@1000",
+ "when": "gitpod.inWorkspace == true && gitpod.UIKind == 'desktop'"
+ }
+ ]
+ }
+ },
+ "scripts": {
+ "vscode:prepublish": "yarn run compile --cwd .."
+ },
+ "devDependencies": {
+ "@types/node": "^10.12.21"
+ },
+ "dependencies": {
+ "gitpod-shared": "0.0.1",
+ "vscode-nls": "^5.0.0"
+ }
+}
diff --git a/extensions/gitpod-remote/package.nls.json b/extensions/gitpod-remote/package.nls.json
new file mode 100644
index 0000000000000..25a1830803087
--- /dev/null
+++ b/extensions/gitpod-remote/package.nls.json
@@ -0,0 +1,22 @@
+{
+ "displayName": "Gitpod Remote",
+ "description": "Gitpod Remote Support",
+ "openDashboard": "Gitpod: Open Dashboard",
+ "openAccessControl": "Gitpod: Open Access Control",
+ "openSettings": "Gitpod: Open Settings",
+ "openContext": "Gitpod: Open Context",
+ "openDocumentation": "Gitpod: Documentation",
+ "openDiscord": "Gitpod: Open Community Chat",
+ "openDiscourse": "Gitpod: Open Community Forum",
+ "openTwitter": "Gitpod: Follow us on Twitter",
+ "reportIssue": "Gitpod: Report Issue",
+ "stopWorkspace": "Gitpod: Stop Workspace",
+ "upgradeSubscription": "Gitpod: Upgrade Subscription",
+ "extendTimeout": "Gitpod: Extend Workspace Timeout",
+ "takeSnapshot": "Gitpod: Share Workspace Snapshot",
+ "shareWorkspace": "Gitpod: Share Running Workspace",
+ "stopSharingWorkspace": "Gitpod: Stop Sharing Running Workspace",
+ "openInStable": "Gitpod: Open in VS Code",
+ "openInInsiders": "Gitpod: Open in VS Code Insiders",
+ "openInBrowser": "Gitpod: Open in Browser"
+}
\ No newline at end of file
diff --git a/extensions/gitpod-remote-ssh/src/cli.ts b/extensions/gitpod-remote/src/cli.ts
similarity index 100%
rename from extensions/gitpod-remote-ssh/src/cli.ts
rename to extensions/gitpod-remote/src/cli.ts
diff --git a/extensions/gitpod-remote-ssh/src/extension.ts b/extensions/gitpod-remote/src/extension.ts
similarity index 89%
rename from extensions/gitpod-remote-ssh/src/extension.ts
rename to extensions/gitpod-remote/src/extension.ts
index 0d65780dd1dba..3544407857047 100644
--- a/extensions/gitpod-remote-ssh/src/extension.ts
+++ b/extensions/gitpod-remote/src/extension.ts
@@ -6,18 +6,30 @@
import * as grpc from '@grpc/grpc-js';
import * as cp from 'child_process';
-import type { GitpodExtension, GitpodExtensionContext, status, terminal } from 'gitpod/src/gitpod';
+import * as shared from 'gitpod-shared/out/extension';
+import { GitpodExtensionContext } from 'gitpod-shared/out/features';
+import { TaskStatus, TasksStatusRequest, TasksStatusResponse, TaskState } from '@gitpod/supervisor-api-grpc/lib/status_pb';
+import { Terminal, ListTerminalsRequest, TerminalSize, SetTerminalSizeRequest, ListenTerminalRequest, ListenTerminalResponse, ShutdownTerminalRequest, WriteTerminalRequest } from '@gitpod/supervisor-api-grpc/lib/terminal_pb';
import * as http from 'http';
import * as path from 'path';
import * as util from 'util';
import * as vscode from 'vscode';
+let gitpodContext: GitpodExtensionContext | undefined;
export async function activate(context: vscode.ExtensionContext) {
- const gitpodExtension = vscode.extensions.getExtension('gitpod.gitpod')!.exports;
- if (!gitpodExtension) {
+ gitpodContext = await shared.createContext(context);
+ if (!gitpodContext) {
+ return;
+ }
+ if (vscode.extensions.getExtension('gitpod.gitpod')) {
+ try {
+ await util.promisify(cp.exec)('code --uninstall-extension gitpod.gitpod');
+ vscode.commands.executeCommand('workbench.action.reloadWindow');
+ } catch (e) {
+ gitpodContext.output.appendLine('failed to uninstall gitpod.gitpod: ' + e);
+ }
return;
}
- const gitpodContext = gitpodExtension.newContext(context);
if (openWorkspaceLocation(gitpodContext)) {
return;
}
@@ -28,8 +40,8 @@ export async function activate(context: vscode.ExtensionContext) {
registerCLI(gitpodContext);
// For port tunneling we rely on Remote SSH capabilities
- // and gitpod.gitpod-desktop to disable auto tunneling from the current local machine.
- vscode.commands.executeCommand('gitpod-desktop.api.autoTunnel', gitpodContext.info.getGitpodHost(), gitpodContext.info.getInstanceId(), false);
+ // and gitpod.gitpod to disable auto tunneling from the current local machine.
+ vscode.commands.executeCommand('gitpod.api.autoTunnel', gitpodContext.info.getGitpodHost(), gitpodContext.info.getInstanceId(), false);
// TODO
// - auth?
@@ -40,7 +52,12 @@ export async function activate(context: vscode.ExtensionContext) {
await gitpodContext.active;
}
-export function deactivate() { }
+export function deactivate() {
+ if (!gitpodContext) {
+ return;
+ }
+ return gitpodContext.dispose();
+}
export function registerCLI(context: GitpodExtensionContext): void {
// configure regular terminals
@@ -247,12 +264,12 @@ async function registerTasks(context: GitpodExtensionContext): Promise {
dispose: () => tokenSource.cancel()
});
- const tasks = new Map();
+ const tasks = new Map();
let synched = false;
while (!synched) {
let listener: vscode.Disposable | undefined;
try {
- const req = new context.supervisor.TasksStatusRequest();
+ const req = new TasksStatusRequest();
req.setObserve(true);
const stream = context.supervisor.status.tasksStatus(req, context.supervisor.metadata);
function done() {
@@ -263,10 +280,10 @@ async function registerTasks(context: GitpodExtensionContext): Promise {
await new Promise((resolve, reject) => {
stream.on('end', resolve);
stream.on('error', reject);
- stream.on('data', (response: status.TasksStatusResponse) => {
+ stream.on('data', (response: TasksStatusResponse) => {
if (response.getTasksList().every(status => {
tasks.set(status.getTerminal(), status);
- return status.getState() !== context.supervisor.TaskState.OPENING;
+ return status.getState() !== TaskState.OPENING;
})) {
done();
}
@@ -287,9 +304,9 @@ async function registerTasks(context: GitpodExtensionContext): Promise {
return;
}
- const terminals = new Map();
+ const terminals = new Map();
try {
- const response = await util.promisify(context.supervisor.terminal.list.bind(context.supervisor.terminal, new context.supervisor.ListTerminalsRequest(), context.supervisor.metadata, {
+ const response = await util.promisify(context.supervisor.terminal.list.bind(context.supervisor.terminal, new ListTerminalsRequest(), context.supervisor.metadata, {
deadline: Date.now() + context.supervisor.deadlines.long
}))();
for (const terminal of response.getTerminalsList()) {
@@ -330,11 +347,11 @@ function regsiterTask(alias: string, initialTitle: string, context: GitpodExtens
return;
}
try {
- const size = new context.supervisor.TerminalSize();
+ const size = new TerminalSize();
size.setCols(dimensions.columns);
size.setRows(dimensions.rows);
- const request = new context.supervisor.SetTerminalSizeRequest();
+ const request = new SetTerminalSizeRequest();
request.setAlias(alias);
request.setSize(size);
request.setForce(true);
@@ -364,13 +381,13 @@ function regsiterTask(alias: string, initialTitle: string, context: GitpodExtens
let listener: vscode.Disposable | undefined;
try {
await new Promise((resolve, reject) => {
- const request = new context.supervisor.ListenTerminalRequest();
+ const request = new ListenTerminalRequest();
request.setAlias(alias);
const stream = context.supervisor.terminal.listen(request, context.supervisor.metadata);
listener = token.onCancellationRequested(() => stream.cancel());
stream.on('end', resolve);
stream.on('error', reject);
- stream.on('data', (response: terminal.ListenTerminalResponse) => {
+ stream.on('data', (response: ListenTerminalResponse) => {
if (response.hasTitle()) {
const title = response.getTitle();
if (title) {
@@ -426,7 +443,7 @@ function regsiterTask(alias: string, initialTitle: string, context: GitpodExtens
// Attempt to kill the pty, it may have already been killed at this
// point but we want to make sure
try {
- const request = new context.supervisor.ShutdownTerminalRequest();
+ const request = new ShutdownTerminalRequest();
request.setAlias(alias);
await util.promisify(context.supervisor.terminal.shutdown.bind(context.supervisor.terminal, request, context.supervisor.metadata, {
deadline: Date.now() + context.supervisor.deadlines.short
@@ -450,7 +467,7 @@ function regsiterTask(alias: string, initialTitle: string, context: GitpodExtens
return;
}
try {
- const request = new context.supervisor.WriteTerminalRequest();
+ const request = new WriteTerminalRequest();
request.setAlias(alias);
request.setStdin(Buffer.from(data, 'utf8'));
await util.promisify(context.supervisor.terminal.write.bind(context.supervisor.terminal, request, context.supervisor.metadata, {
diff --git a/extensions/gitpod-remote-ssh/tsconfig.json b/extensions/gitpod-remote/tsconfig.json
similarity index 69%
rename from extensions/gitpod-remote-ssh/tsconfig.json
rename to extensions/gitpod-remote/tsconfig.json
index 13d9b9033b070..60d09fdf59579 100644
--- a/extensions/gitpod-remote-ssh/tsconfig.json
+++ b/extensions/gitpod-remote/tsconfig.json
@@ -4,5 +4,8 @@
"outDir": "./out",
"rootDir": "./src",
"esModuleInterop": true
- }
+ },
+ "references": [
+ { "path": "../gitpod-shared" }
+ ]
}
diff --git a/extensions/gitpod-shared/package.json b/extensions/gitpod-shared/package.json
new file mode 100644
index 0000000000000..05b5c8a74915d
--- /dev/null
+++ b/extensions/gitpod-shared/package.json
@@ -0,0 +1,27 @@
+{
+ "private": true,
+ "name": "gitpod-shared",
+ "publisher": "gitpod",
+ "version": "0.0.1",
+ "license": "MIT",
+ "engines": {
+ "vscode": "^1.58.2"
+ },
+ "scripts": {
+ "prepare": "node scripts/inflate.js"
+ },
+ "devDependencies": {
+ "@types/node": "^10.12.21",
+ "@types/ws": "^7.2.6"
+ },
+ "dependencies": {
+ "@gitpod/gitpod-protocol": "main",
+ "@gitpod/supervisor-api-grpc": "main",
+ "bufferutil": "^4.0.1",
+ "reconnecting-websocket": "^4.4.0",
+ "utf-8-validate": "^5.0.2",
+ "vscode-nls": "^5.0.0",
+ "ws": "^7.3.1",
+ "yaml": "^1.10.0"
+ }
+}
diff --git a/extensions/gitpod-shared/scripts/inflate.js b/extensions/gitpod-shared/scripts/inflate.js
new file mode 100644
index 0000000000000..47d966ed66681
--- /dev/null
+++ b/extensions/gitpod-shared/scripts/inflate.js
@@ -0,0 +1,242 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Gitpod. All rights reserved.
+ *--------------------------------------------------------------------------------------------*/
+
+//@ts-check
+const fs = require('fs');
+const path = require('path');
+
+const nls = {
+ 'openDashboard': 'Gitpod: Open Dashboard',
+ 'openAccessControl': 'Gitpod: Open Access Control',
+ 'openSettings': 'Gitpod: Open Settings',
+ 'openContext': 'Gitpod: Open Context',
+ 'openDocumentation': 'Gitpod: Documentation',
+ 'openDiscord': 'Gitpod: Open Community Chat',
+ 'openDiscourse': 'Gitpod: Open Community Forum',
+ 'openTwitter': 'Gitpod: Follow us on Twitter',
+ 'reportIssue': 'Gitpod: Report Issue',
+ 'stopWorkspace': 'Gitpod: Stop Workspace',
+ 'upgradeSubscription': 'Gitpod: Upgrade Subscription',
+ 'extendTimeout': 'Gitpod: Extend Workspace Timeout',
+ 'takeSnapshot': 'Gitpod: Share Workspace Snapshot',
+ 'shareWorkspace': 'Gitpod: Share Running Workspace',
+ 'stopSharingWorkspace': 'Gitpod: Stop Sharing Running Workspace',
+ 'openInStable': 'Gitpod: Open in VS Code',
+ 'openInInsiders': 'Gitpod: Open in VS Code Insiders',
+ 'openInBrowser': 'Gitpod: Open in Browser'
+};
+
+const commands = [
+ {
+ 'command': 'gitpod.stop.ws',
+ 'title': '%stopWorkspace%',
+ 'enablement': 'gitpod.inWorkspace == true && gitpod.workspaceOwned == true'
+ },
+ {
+ 'command': 'gitpod.open.settings',
+ 'title': '%openSettings%',
+ 'enablement': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.open.accessControl',
+ 'title': '%openAccessControl%',
+ 'enablement': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.open.context',
+ 'title': '%openContext%',
+ 'enablement': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.open.dashboard',
+ 'title': '%openDashboard%',
+ 'enablement': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.open.documentation',
+ 'title': '%openDocumentation%',
+ 'enablement': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.open.twitter',
+ 'title': '%openTwitter%',
+ 'enablement': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.open.discord',
+ 'title': '%openDiscord%',
+ 'enablement': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.open.discourse',
+ 'title': '%openDiscourse%',
+ 'enablement': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.reportIssue',
+ 'title': '%reportIssue%',
+ 'enablement': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.upgradeSubscription',
+ 'title': '%upgradeSubscription%',
+ 'enablement': 'gitpod.inWorkspace == true && gitpod.workspaceOwned == true'
+ },
+ {
+ 'command': 'gitpod.ExtendTimeout',
+ 'title': '%extendTimeout%',
+ 'enablement': 'gitpod.inWorkspace == true && gitpod.workspaceOwned == true'
+ },
+ {
+ 'command': 'gitpod.takeSnapshot',
+ 'title': '%takeSnapshot%',
+ 'enablement': 'gitpod.inWorkspace == true && gitpod.workspaceOwned == true'
+ },
+ {
+ 'command': 'gitpod.shareWorkspace',
+ 'title': '%shareWorkspace%',
+ 'enablement': 'gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == false'
+ },
+ {
+ 'command': 'gitpod.stopSharingWorkspace',
+ 'title': '%stopSharingWorkspace%',
+ 'enablement': 'gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == true'
+ },
+ {
+ 'command': 'gitpod.openInStable',
+ 'title': '%openInStable%',
+ 'enablement': 'gitpod.inWorkspace == true && gitpod.UIKind == \'web\''
+ },
+ {
+ 'command': 'gitpod.openInInsiders',
+ 'title': '%openInInsiders%',
+ 'enablement': 'gitpod.inWorkspace == true && gitpod.UIKind == \'web\''
+ },
+ {
+ 'command': 'gitpod.openInBrowser',
+ 'title': '%openInBrowser%',
+ 'enablement': 'gitpod.inWorkspace == true && gitpod.UIKind == \'desktop\''
+ }
+];
+
+const remoteMenus = [
+ {
+ 'command': 'gitpod.stop.ws',
+ 'group': 'remote_00_gitpod_navigation@10',
+ 'when': 'gitpod.inWorkspace == true && gitpod.workspaceOwned == true'
+ },
+ {
+ 'command': 'gitpod.open.settings',
+ 'group': 'remote_00_gitpod_navigation@20',
+ 'when': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.open.accessControl',
+ 'group': 'remote_00_gitpod_navigation@30',
+ 'when': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.open.context',
+ 'group': 'remote_00_gitpod_navigation@40',
+ 'when': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.open.dashboard',
+ 'group': 'remote_00_gitpod_navigation@50',
+ 'when': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.open.documentation',
+ 'group': 'remote_00_gitpod_navigation@60',
+ 'when': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.open.twitter',
+ 'group': 'remote_00_gitpod_navigation@70',
+ 'when': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.open.discord',
+ 'group': 'remote_00_gitpod_navigation@80',
+ 'when': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.open.discourse',
+ 'group': 'remote_00_gitpod_navigation@81',
+ 'when': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.reportIssue',
+ 'group': 'remote_00_gitpod_navigation@90',
+ 'when': 'gitpod.inWorkspace == true'
+ },
+ {
+ 'command': 'gitpod.upgradeSubscription',
+ 'group': 'remote_00_gitpod_navigation@100',
+ 'when': 'gitpod.inWorkspace == true && gitpod.workspaceOwned == true'
+ },
+ {
+ 'command': 'gitpod.ExtendTimeout',
+ 'group': 'remote_00_gitpod_navigation@110',
+ 'when': 'gitpod.inWorkspace == true && gitpod.workspaceOwned == true'
+ },
+ {
+ 'command': 'gitpod.takeSnapshot',
+ 'group': 'remote_00_gitpod_navigation@120',
+ 'when': 'gitpod.inWorkspace == true && gitpod.workspaceOwned == true'
+ },
+ {
+ 'command': 'gitpod.shareWorkspace',
+ 'group': 'remote_00_gitpod_navigation@130',
+ 'when': 'gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == false'
+ },
+ {
+ 'command': 'gitpod.stopSharingWorkspace',
+ 'group': 'remote_00_gitpod_navigation@130',
+ 'when': 'gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == true'
+ },
+ {
+ 'command': 'gitpod.openInStable',
+ 'group': 'remote_00_gitpod_navigation@900',
+ 'when': 'gitpod.inWorkspace == true && gitpod.UIKind == \'web\''
+ },
+ {
+ 'command': 'gitpod.openInInsiders',
+ 'group': 'remote_00_gitpod_navigation@1000',
+ 'when': 'gitpod.inWorkspace == true && gitpod.UIKind == \'web\''
+ },
+ {
+ 'command': 'gitpod.openInBrowser',
+ 'group': 'remote_00_gitpod_navigation@1000',
+ 'when': 'gitpod.inWorkspace == true && gitpod.UIKind == \'desktop\''
+ }
+];
+
+function inflateManifest(manifest) {
+ const contributes = manifest.contributes = (manifest.contributes || {});
+ contributes.commands = (contributes.commands || []).filter(c => commands.findIndex(c2 => c.command === c2.command) === -1);
+ contributes.commands.unshift(...commands);
+ const menus = contributes.menus = (contributes.menus || {});
+ menus['statusBar/remoteIndicator'] = (menus['statusBar/remoteIndicator'] || []).filter(m => remoteMenus.findIndex(m2 => m.command === m2.command) === -1);
+ menus['statusBar/remoteIndicator'].unshift(...remoteMenus);
+}
+
+function main() {
+ const workspacePath = path.resolve(__dirname, '..', '..');
+ for (const name of ['gitpod-remote', 'gitpod-web']) {
+ const manifestPath = path.resolve(workspacePath, name, 'package.json');
+ const pckContent = fs.readFileSync(manifestPath, { encoding: 'utf-8' });
+ const manifest = JSON.parse(pckContent);
+ inflateManifest(manifest);
+ fs.writeFileSync(manifestPath, JSON.stringify(manifest, undefined, 2), { encoding: 'utf-8' });
+
+ const nlsPath = path.resolve(workspacePath, name, 'package.nls.json');
+ const nlsContent = fs.readFileSync(nlsPath, { encoding: 'utf-8' });
+ fs.writeFileSync(nlsPath, JSON.stringify({
+ ...JSON.parse(nlsContent), ...nls
+ }, undefined, '\t'), { encoding: 'utf-8' });
+ }
+}
+
+main();
diff --git a/extensions/gitpod-shared/src/extension.ts b/extensions/gitpod-shared/src/extension.ts
new file mode 100644
index 0000000000000..8a8d95369a386
--- /dev/null
+++ b/extensions/gitpod-shared/src/extension.ts
@@ -0,0 +1,55 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Gitpod. All rights reserved.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as vscode from 'vscode';
+import { createGitpodExtensionContext, GitpodExtensionContext, registerDefaultLayout, registerNotifications, registerWorkspaceCommands, registerWorkspaceSharing, registerWorkspaceTimeout } from './features';
+import { performance } from 'perf_hooks';
+
+export async function createContext(context: vscode.ExtensionContext): Promise {
+ if (typeof vscode.env.remoteName === 'undefined' || context.extension.extensionKind !== vscode.ExtensionKind.Workspace) {
+ return undefined;
+ }
+
+ const gitpodContext = await createGitpodExtensionContext(context);
+ if (!gitpodContext) {
+ vscode.commands.executeCommand('setContext', 'gitpod.inWorkspace', false);
+ return undefined;
+ }
+ vscode.commands.executeCommand('setContext', 'gitpod.inWorkspace', true);
+ registerUsageAnalytics(gitpodContext);
+ registerWorkspaceCommands(gitpodContext);
+ registerWorkspaceSharing(gitpodContext);
+ registerWorkspaceTimeout(gitpodContext);
+ registerNotifications(gitpodContext);
+ registerDefaultLayout(gitpodContext);
+ return gitpodContext;
+}
+
+function registerUsageAnalytics(context: GitpodExtensionContext): void {
+ if (context.devMode && vscode.env.uiKind === vscode.UIKind.Web) {
+ return;
+ }
+ const properties = {
+ id: vscode.env.sessionId,
+ workspaceId: context.info.getWorkspaceId(),
+ appName: vscode.env.appName,
+ uiKind: vscode.env.uiKind === vscode.UIKind.Web ? 'web' : 'desktop',
+ devMode: context.devMode,
+ };
+ function fireEvent(phase: 'start' | 'running' | 'end'): Promise {
+ return context.gitpod.server.trackEvent({
+ event: 'vscode_session',
+ properties: {
+ ...properties,
+ timestamp: performance.now(),
+ focused: vscode.window.state.focused,
+ phase,
+ }
+ });
+ }
+ fireEvent('start');
+ context.subscriptions.push(vscode.window.onDidChangeWindowState(() => fireEvent('running')));
+ context.pendingWillCloseSocket.push(() => fireEvent('end'));
+}
+
diff --git a/extensions/gitpod/src/features.ts b/extensions/gitpod-shared/src/features.ts
similarity index 93%
rename from extensions/gitpod/src/features.ts
rename to extensions/gitpod-shared/src/features.ts
index 6af27b783c67c..4effb2b024800 100644
--- a/extensions/gitpod/src/features.ts
+++ b/extensions/gitpod-shared/src/features.ts
@@ -10,17 +10,14 @@ import { JsonRpcProxyFactory } from '@gitpod/gitpod-protocol/lib/messaging/proxy
import { NavigatorContext, PullRequestContext, User } from '@gitpod/gitpod-protocol/lib/protocol';
import { GitpodHostUrl } from '@gitpod/gitpod-protocol/lib/util/gitpod-host-url';
import { ControlServiceClient } from '@gitpod/supervisor-api-grpc/lib/control_grpc_pb';
-import { ExposePortRequest } from '@gitpod/supervisor-api-grpc/lib/control_pb';
import { InfoServiceClient } from '@gitpod/supervisor-api-grpc/lib/info_grpc_pb';
import { WorkspaceInfoRequest, WorkspaceInfoResponse } from '@gitpod/supervisor-api-grpc/lib/info_pb';
import { NotificationServiceClient } from '@gitpod/supervisor-api-grpc/lib/notification_grpc_pb';
import { NotifyRequest, NotifyResponse, RespondRequest, SubscribeRequest, SubscribeResponse } from '@gitpod/supervisor-api-grpc/lib/notification_pb';
import { PortServiceClient } from '@gitpod/supervisor-api-grpc/lib/port_grpc_pb';
-import { CloseTunnelRequest, RetryAutoExposeRequest, TunnelPortRequest, TunnelVisiblity } from '@gitpod/supervisor-api-grpc/lib/port_pb';
import { StatusServiceClient } from '@gitpod/supervisor-api-grpc/lib/status_grpc_pb';
-import { ContentStatusRequest, ExposedPortInfo, OnPortExposedAction, PortAutoExposure, PortsStatus, PortsStatusRequest, PortsStatusResponse, PortVisibility, TasksStatusRequest, TaskState } from '@gitpod/supervisor-api-grpc/lib/status_pb';
+import { ContentStatusRequest } from '@gitpod/supervisor-api-grpc/lib/status_pb';
import { TerminalServiceClient } from '@gitpod/supervisor-api-grpc/lib/terminal_grpc_pb';
-import { ListenTerminalRequest, ListTerminalsRequest, SetTerminalSizeRequest, ShutdownTerminalRequest, TerminalSize, WriteTerminalRequest } from '@gitpod/supervisor-api-grpc/lib/terminal_pb';
import { TokenServiceClient } from '@gitpod/supervisor-api-grpc/lib/token_grpc_pb';
import { GetTokenRequest } from '@gitpod/supervisor-api-grpc/lib/token_pb';
import * as grpc from '@grpc/grpc-js';
@@ -65,32 +62,6 @@ export class SupervisorConnection {
this.port = new PortServiceClient(this.addr, grpc.credentials.createInsecure(), this.clientOptions);
this.terminal = new TerminalServiceClient(this.addr, grpc.credentials.createInsecure(), this.clientOptions);
}
-
- ExposePortRequest = ExposePortRequest;
-
- CloseTunnelRequest = CloseTunnelRequest;
- RetryAutoExposeRequest = RetryAutoExposeRequest;
- TunnelPortRequest = TunnelPortRequest;
- TunnelVisiblity = TunnelVisiblity;
-
- ExposedPortInfo = ExposedPortInfo;
- OnPortExposedAction = OnPortExposedAction;
- PortAutoExposure = PortAutoExposure;
- PortsStatus = PortsStatus;
- PortsStatusRequest = PortsStatusRequest;
- PortsStatusResponse = PortsStatusResponse;
- PortVisibility = PortVisibility;
- TaskState = TaskState;
- TasksStatusRequest = TasksStatusRequest;
-
- GetTokenRequest = GetTokenRequest;
-
- TerminalSize = TerminalSize;
- ListTerminalsRequest = ListTerminalsRequest;
- ListenTerminalRequest = ListenTerminalRequest;
- WriteTerminalRequest = WriteTerminalRequest;
- SetTerminalSizeRequest = SetTerminalSizeRequest;
- ShutdownTerminalRequest = ShutdownTerminalRequest;
}
type UsedGitpodFunction = ['getWorkspace', 'openPort', 'stopWorkspace', 'setWorkspaceTimeout', 'getWorkspaceTimeout', 'getLoggedInUser', 'takeSnapshot', 'controlAdmission', 'sendHeartBeat', 'trackEvent'];
@@ -123,13 +94,6 @@ export class GitpodExtensionContext implements vscode.ExtensionContext {
this.workspaceContextUrl = vscode.Uri.parse(info.getWorkspaceContextUrl());
}
- fork(context: vscode.ExtensionContext): GitpodExtensionContext {
- const { devMode, config, supervisor, gitpod, pendingWillCloseSocket, info, owner, user, instanceListener, workspaceOwned, output, ipcHookCli } = this;
- return new GitpodExtensionContext(
- context, devMode, config, supervisor, gitpod, undefined, pendingWillCloseSocket, info, owner, user, instanceListener, workspaceOwned, output, ipcHookCli
- );
- }
-
get active() {
Object.freeze(this.pendingActivate);
return Promise.all(this.pendingActivate.map(p => p.catch(console.error)));
@@ -206,7 +170,7 @@ export class GitpodExtensionContext implements vscode.ExtensionContext {
}
export async function createGitpodExtensionContext(context: vscode.ExtensionContext): Promise {
- const output = vscode.window.createOutputChannel('Gitpod');
+ const output = vscode.window.createOutputChannel('Gitpod Workspace');
const devMode = context.extensionMode === vscode.ExtensionMode.Development || !!process.env['VSCODE_DEV'];
const supervisor = new SupervisorConnection(context);
diff --git a/extensions/gitpod/src/gitpod-plugin-model.ts b/extensions/gitpod-shared/src/gitpod-plugin-model.ts
similarity index 100%
rename from extensions/gitpod/src/gitpod-plugin-model.ts
rename to extensions/gitpod-shared/src/gitpod-plugin-model.ts
diff --git a/extensions/gitpod-desktop/tsconfig.json b/extensions/gitpod-shared/tsconfig.json
similarity index 86%
rename from extensions/gitpod-desktop/tsconfig.json
rename to extensions/gitpod-shared/tsconfig.json
index 13d9b9033b070..6a3f5ca88a5d5 100644
--- a/extensions/gitpod-desktop/tsconfig.json
+++ b/extensions/gitpod-shared/tsconfig.json
@@ -3,6 +3,7 @@
"compilerOptions": {
"outDir": "./out",
"rootDir": "./src",
+ "composite": true,
"esModuleInterop": true
}
}
diff --git a/extensions/gitpod-web/package.json b/extensions/gitpod-web/package.json
index e6624ee6e7614..7875461824d87 100644
--- a/extensions/gitpod-web/package.json
+++ b/extensions/gitpod-web/package.json
@@ -1,266 +1,444 @@
{
- "name": "gitpod-web",
- "displayName": "%displayName%",
- "description": "%description%",
- "publisher": "gitpod",
- "version": "0.0.1",
- "license": "MIT",
- "engines": {
- "vscode": "^1.58.2"
- },
- "enableProposedApi": true,
- "categories": [
- "Other"
- ],
- "extensionKind": [
- "workspace"
- ],
- "activationEvents": [
- "*",
- "onAuthenticationRequest:gitpod",
- "onAuthenticationRequest:github"
- ],
- "main": "./out/extension.js",
- "contributes": {
- "commands": [
- {
- "command": "gitpod.ports.openBrowser",
- "title": "%openBrowser%",
- "icon": "$(globe)"
- },
- {
- "command": "gitpod.ports.retryAutoExpose",
- "title": "%retryAutoExpose%",
- "icon": "$(refresh)"
- },
- {
- "command": "gitpod.ports.preview",
- "title": "%openPreview%",
- "icon": "$(open-preview)"
- },
- {
- "command": "gitpod.ports.makePrivate",
- "title": "%makePrivate%",
- "icon": "$(lock)"
- },
- {
- "command": "gitpod.ports.makePublic",
- "title": "%makePublic%",
- "icon": "$(unlock)"
- },
- {
- "command": "gitpod.ports.tunnelNetwork",
- "title": "%tunnelNetwork%",
- "icon": "$(eye-closed)"
- },
- {
- "command": "gitpod.ports.tunnelHost",
- "title": "%tunnelHost%",
- "icon": "$(eye)"
- },
- {
- "command": "gitpod.extensions.addToConfig",
- "title": "%addToConfig%"
- },
- {
- "command": "gitpod.dev.connectLocalApp",
- "title": "%connectLocalApp%"
- },
- {
- "command": "gitpod.dev.enableForwardedPortsView",
- "title": "%enableForwardedPortsView%"
- }
- ],
- "menus": {
- "menuBar/home": [
- {
- "command": "gitpod.open.context",
- "group": "gitpod@10"
- },
- {
- "command": "gitpod.open.documentation",
- "group": "gitpod@20"
- },
- {
- "command": "gitpod.takeSnapshot",
- "group": "gitpod@30",
- "when": "gitpod.workspaceOwned == true"
- },
- {
- "command": "gitpod.shareWorkspace",
- "group": "gitpod@40",
- "when": "gitpod.workspaceOwned == true && gitpod.workspaceShared == false"
- },
- {
- "command": "gitpod.stopSharingWorkspace",
- "group": "gitpod@40",
- "when": "gitpod.workspaceOwned == true && gitpod.workspaceShared == true"
- },
- {
- "command": "gitpod.stop.ws",
- "group": "gitpod@50",
- "when": "gitpod.workspaceOwned == true"
- },
- {
- "command": "gitpod.openInStable",
- "group": "gitpod@60"
- },
- {
- "command": "gitpod.openInInsiders",
- "group": "gitpod@70"
- }
- ],
- "accounts/context": [
- {
- "command": "gitpod.open.settings",
- "group": "navigation@10"
- },
- {
- "command": "gitpod.open.accessControl",
- "group": "navigation@20"
- },
- {
- "command": "gitpod.upgradeSubscription",
- "group": "navigation@30",
- "when": "gitpod.workspaceOwned == true"
- },
- {
- "command": "gitpod.ExtendTimeout",
- "group": "navigation@50",
- "when": "gitpod.workspaceOwned == true"
- }
- ],
- "menuBar/help": [
- {
- "command": "gitpod.open.twitter",
- "group": "z_about2@10"
- },
- {
- "command": "gitpod.open.discord",
- "group": "z_about2@20"
- },
- {
- "command": "gitpod.open.discourse",
- "group": "z_about2@30"
- },
- {
- "command": "gitpod.reportIssue",
- "group": "z_about2@40"
- }
- ],
- "extension/context": [
- {
- "command": "gitpod.extensions.addToConfig",
- "group": "2_configure"
- }
- ],
- "view/item/context": [
- {
- "command": "gitpod.ports.tunnelNetwork",
- "when": "view == gitpod.workspace && viewItem =~ /host/ && viewItem =~ /tunneled/",
- "group": "inline@1"
- },
- {
- "command": "gitpod.ports.tunnelHost",
- "when": "view == gitpod.workspace && viewItem =~ /network/ && viewItem =~ /tunneled/",
- "group": "inline@1"
- },
- {
- "command": "gitpod.ports.makePublic",
- "when": "view == gitpod.workspace && viewItem =~ /private/",
- "group": "inline@2"
- },
- {
- "command": "gitpod.ports.makePrivate",
- "when": "view == gitpod.workspace && viewItem =~ /public/",
- "group": "inline@2"
- },
- {
- "command": "gitpod.ports.preview",
- "when": "view == gitpod.workspace && viewItem =~ /exposed/Â ||Â viewItem =~ /tunneled/",
- "group": "inline@3"
- },
- {
- "command": "gitpod.ports.openBrowser",
- "when": "view == gitpod.workspace && viewItem =~ /exposed/Â ||Â viewItem =~ /tunneled/",
- "group": "inline@4"
- },
- {
- "command": "gitpod.ports.retryAutoExpose",
- "when": "view == gitpod.workspace && viewItem =~ /failed/",
- "group": "inline@5"
- }
- ],
- "commandPalette": [
- {
- "command": "gitpod.ports.preview",
- "when": "false"
- },
- {
- "command": "gitpod.ports.openBrowser",
- "when": "false"
- },
- {
- "command": "gitpod.ports.retryAutoExpose",
- "when": "false"
- },
- {
- "command": "gitpod.ports.makePublic",
- "when": "false"
- },
- {
- "command": "gitpod.ports.makePrivate",
- "when": "false"
- },
- {
- "command": "gitpod.ports.tunnelNetwork",
- "when": "false"
- },
- {
- "command": "gitpod.ports.tunnelHost",
- "when": "false"
- },
- {
- "command": "gitpod.dev.connectLocalApp",
- "when": "gitpod.localAppConnected == false"
- }
- ]
- },
- "views": {
- "remote": [
- {
- "id": "gitpod.workspace",
- "name": "Gitpod Workspace"
- }
- ]
- },
- "authentication": [
- {
- "id": "gitpod",
- "label": "Gitpod"
- },
- {
- "id": "github",
- "label": "GitHub"
- }
- ]
- },
- "scripts": {
- "compile": "gulp compile-extension:gitpod-web",
- "watch": "gulp watch-extension:gitpod-web",
- "vscode:prepublish": "npm run compile"
- },
- "devDependencies": {
- "@types/node": "^10.12.21",
- "@types/node-fetch": "^2.5.8"
- },
- "dependencies": {
- "node-fetch": "^2.6.1",
- "uuid": "^8.3.1",
- "vscode-jsonrpc": "^5.0.1",
- "vscode-nls": "^5.0.0"
- },
- "extensionDependencies": [
- "gitpod.gitpod"
- ]
+ "name": "gitpod-web",
+ "displayName": "%displayName%",
+ "description": "%description%",
+ "publisher": "gitpod",
+ "version": "0.0.1",
+ "license": "MIT",
+ "engines": {
+ "vscode": "^1.58.2"
+ },
+ "enableProposedApi": true,
+ "categories": [
+ "Other"
+ ],
+ "extensionKind": [
+ "workspace"
+ ],
+ "activationEvents": [
+ "*",
+ "onAuthenticationRequest:gitpod",
+ "onAuthenticationRequest:github"
+ ],
+ "main": "./out/extension.js",
+ "contributes": {
+ "commands": [
+ {
+ "command": "gitpod.stop.ws",
+ "title": "%stopWorkspace%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.open.settings",
+ "title": "%openSettings%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.accessControl",
+ "title": "%openAccessControl%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.context",
+ "title": "%openContext%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.dashboard",
+ "title": "%openDashboard%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.documentation",
+ "title": "%openDocumentation%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.twitter",
+ "title": "%openTwitter%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.discord",
+ "title": "%openDiscord%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.discourse",
+ "title": "%openDiscourse%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.reportIssue",
+ "title": "%reportIssue%",
+ "enablement": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.upgradeSubscription",
+ "title": "%upgradeSubscription%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.ExtendTimeout",
+ "title": "%extendTimeout%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.takeSnapshot",
+ "title": "%takeSnapshot%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.shareWorkspace",
+ "title": "%shareWorkspace%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == false"
+ },
+ {
+ "command": "gitpod.stopSharingWorkspace",
+ "title": "%stopSharingWorkspace%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == true"
+ },
+ {
+ "command": "gitpod.openInStable",
+ "title": "%openInStable%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.UIKind == 'web'"
+ },
+ {
+ "command": "gitpod.openInInsiders",
+ "title": "%openInInsiders%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.UIKind == 'web'"
+ },
+ {
+ "command": "gitpod.openInBrowser",
+ "title": "%openInBrowser%",
+ "enablement": "gitpod.inWorkspace == true && gitpod.UIKind == 'desktop'"
+ },
+ {
+ "command": "gitpod.ports.openBrowser",
+ "title": "%openBrowser%",
+ "icon": "$(globe)"
+ },
+ {
+ "command": "gitpod.ports.retryAutoExpose",
+ "title": "%retryAutoExpose%",
+ "icon": "$(refresh)"
+ },
+ {
+ "command": "gitpod.ports.preview",
+ "title": "%openPreview%",
+ "icon": "$(open-preview)"
+ },
+ {
+ "command": "gitpod.ports.makePrivate",
+ "title": "%makePrivate%",
+ "icon": "$(lock)"
+ },
+ {
+ "command": "gitpod.ports.makePublic",
+ "title": "%makePublic%",
+ "icon": "$(unlock)"
+ },
+ {
+ "command": "gitpod.ports.tunnelNetwork",
+ "title": "%tunnelNetwork%",
+ "icon": "$(eye-closed)"
+ },
+ {
+ "command": "gitpod.ports.tunnelHost",
+ "title": "%tunnelHost%",
+ "icon": "$(eye)"
+ },
+ {
+ "command": "gitpod.extensions.addToConfig",
+ "title": "%addToConfig%"
+ },
+ {
+ "command": "gitpod.dev.connectLocalApp",
+ "title": "%connectLocalApp%"
+ },
+ {
+ "command": "gitpod.dev.enableForwardedPortsView",
+ "title": "%enableForwardedPortsView%"
+ }
+ ],
+ "menus": {
+ "menuBar/home": [
+ {
+ "command": "gitpod.open.context",
+ "group": "gitpod@10"
+ },
+ {
+ "command": "gitpod.open.documentation",
+ "group": "gitpod@20"
+ },
+ {
+ "command": "gitpod.takeSnapshot",
+ "group": "gitpod@30",
+ "when": "gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.shareWorkspace",
+ "group": "gitpod@40",
+ "when": "gitpod.workspaceOwned == true && gitpod.workspaceShared == false"
+ },
+ {
+ "command": "gitpod.stopSharingWorkspace",
+ "group": "gitpod@40",
+ "when": "gitpod.workspaceOwned == true && gitpod.workspaceShared == true"
+ },
+ {
+ "command": "gitpod.stop.ws",
+ "group": "gitpod@50",
+ "when": "gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.openInStable",
+ "group": "gitpod@60"
+ },
+ {
+ "command": "gitpod.openInInsiders",
+ "group": "gitpod@70"
+ }
+ ],
+ "accounts/context": [
+ {
+ "command": "gitpod.open.settings",
+ "group": "navigation@10"
+ },
+ {
+ "command": "gitpod.open.accessControl",
+ "group": "navigation@20"
+ },
+ {
+ "command": "gitpod.upgradeSubscription",
+ "group": "navigation@30",
+ "when": "gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.ExtendTimeout",
+ "group": "navigation@50",
+ "when": "gitpod.workspaceOwned == true"
+ }
+ ],
+ "menuBar/help": [
+ {
+ "command": "gitpod.open.twitter",
+ "group": "z_about2@10"
+ },
+ {
+ "command": "gitpod.open.discord",
+ "group": "z_about2@20"
+ },
+ {
+ "command": "gitpod.open.discourse",
+ "group": "z_about2@30"
+ },
+ {
+ "command": "gitpod.reportIssue",
+ "group": "z_about2@40"
+ }
+ ],
+ "extension/context": [
+ {
+ "command": "gitpod.extensions.addToConfig",
+ "group": "2_configure"
+ }
+ ],
+ "view/item/context": [
+ {
+ "command": "gitpod.ports.tunnelNetwork",
+ "when": "view == gitpod.workspace && viewItem =~ /host/ && viewItem =~ /tunneled/",
+ "group": "inline@1"
+ },
+ {
+ "command": "gitpod.ports.tunnelHost",
+ "when": "view == gitpod.workspace && viewItem =~ /network/ && viewItem =~ /tunneled/",
+ "group": "inline@1"
+ },
+ {
+ "command": "gitpod.ports.makePublic",
+ "when": "view == gitpod.workspace && viewItem =~ /private/",
+ "group": "inline@2"
+ },
+ {
+ "command": "gitpod.ports.makePrivate",
+ "when": "view == gitpod.workspace && viewItem =~ /public/",
+ "group": "inline@2"
+ },
+ {
+ "command": "gitpod.ports.preview",
+ "when": "view == gitpod.workspace && viewItem =~ /exposed/Â ||Â viewItem =~ /tunneled/",
+ "group": "inline@3"
+ },
+ {
+ "command": "gitpod.ports.openBrowser",
+ "when": "view == gitpod.workspace && viewItem =~ /exposed/Â ||Â viewItem =~ /tunneled/",
+ "group": "inline@4"
+ },
+ {
+ "command": "gitpod.ports.retryAutoExpose",
+ "when": "view == gitpod.workspace && viewItem =~ /failed/",
+ "group": "inline@5"
+ }
+ ],
+ "commandPalette": [
+ {
+ "command": "gitpod.ports.preview",
+ "when": "false"
+ },
+ {
+ "command": "gitpod.ports.openBrowser",
+ "when": "false"
+ },
+ {
+ "command": "gitpod.ports.retryAutoExpose",
+ "when": "false"
+ },
+ {
+ "command": "gitpod.ports.makePublic",
+ "when": "false"
+ },
+ {
+ "command": "gitpod.ports.makePrivate",
+ "when": "false"
+ },
+ {
+ "command": "gitpod.ports.tunnelNetwork",
+ "when": "false"
+ },
+ {
+ "command": "gitpod.ports.tunnelHost",
+ "when": "false"
+ },
+ {
+ "command": "gitpod.dev.connectLocalApp",
+ "when": "gitpod.localAppConnected == false"
+ }
+ ],
+ "statusBar/remoteIndicator": [
+ {
+ "command": "gitpod.stop.ws",
+ "group": "remote_00_gitpod_navigation@10",
+ "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.open.settings",
+ "group": "remote_00_gitpod_navigation@20",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.accessControl",
+ "group": "remote_00_gitpod_navigation@30",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.context",
+ "group": "remote_00_gitpod_navigation@40",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.dashboard",
+ "group": "remote_00_gitpod_navigation@50",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.documentation",
+ "group": "remote_00_gitpod_navigation@60",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.twitter",
+ "group": "remote_00_gitpod_navigation@70",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.discord",
+ "group": "remote_00_gitpod_navigation@80",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.open.discourse",
+ "group": "remote_00_gitpod_navigation@81",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.reportIssue",
+ "group": "remote_00_gitpod_navigation@90",
+ "when": "gitpod.inWorkspace == true"
+ },
+ {
+ "command": "gitpod.upgradeSubscription",
+ "group": "remote_00_gitpod_navigation@100",
+ "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.ExtendTimeout",
+ "group": "remote_00_gitpod_navigation@110",
+ "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.takeSnapshot",
+ "group": "remote_00_gitpod_navigation@120",
+ "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
+ },
+ {
+ "command": "gitpod.shareWorkspace",
+ "group": "remote_00_gitpod_navigation@130",
+ "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == false"
+ },
+ {
+ "command": "gitpod.stopSharingWorkspace",
+ "group": "remote_00_gitpod_navigation@130",
+ "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == true"
+ },
+ {
+ "command": "gitpod.openInStable",
+ "group": "remote_00_gitpod_navigation@900",
+ "when": "gitpod.inWorkspace == true && gitpod.UIKind == 'web'"
+ },
+ {
+ "command": "gitpod.openInInsiders",
+ "group": "remote_00_gitpod_navigation@1000",
+ "when": "gitpod.inWorkspace == true && gitpod.UIKind == 'web'"
+ },
+ {
+ "command": "gitpod.openInBrowser",
+ "group": "remote_00_gitpod_navigation@1000",
+ "when": "gitpod.inWorkspace == true && gitpod.UIKind == 'desktop'"
+ }
+ ]
+ },
+ "views": {
+ "remote": [
+ {
+ "id": "gitpod.workspace",
+ "name": "Gitpod Workspace"
+ }
+ ]
+ },
+ "authentication": [
+ {
+ "id": "gitpod",
+ "label": "Gitpod"
+ },
+ {
+ "id": "github",
+ "label": "GitHub"
+ }
+ ]
+ },
+ "scripts": {
+ "vscode:prepublish": "yarn run compile --cwd .."
+ },
+ "devDependencies": {
+ "@types/node": "^10.12.21",
+ "@types/node-fetch": "^2.5.8"
+ },
+ "dependencies": {
+ "gitpod-shared": "0.0.1",
+ "node-fetch": "^2.6.1",
+ "uuid": "^8.3.1",
+ "vscode-jsonrpc": "^5.0.1",
+ "vscode-nls": "^5.0.0"
}
+}
\ No newline at end of file
diff --git a/extensions/gitpod-web/package.nls.json b/extensions/gitpod-web/package.nls.json
index 096bb8bdb1ef0..0bcc32a23b07f 100644
--- a/extensions/gitpod-web/package.nls.json
+++ b/extensions/gitpod-web/package.nls.json
@@ -10,5 +10,23 @@
"addToConfig": "Add to .gitpod.yml",
"connectLocalApp": "Developer: Connect to Local Gitpod App",
"enableForwardedPortsView": "Developer: Enable Tunneled Ports View",
- "retryAutoExpose": "Retry to expose"
-}
+ "retryAutoExpose": "Retry to expose",
+ "openDashboard": "Gitpod: Open Dashboard",
+ "openAccessControl": "Gitpod: Open Access Control",
+ "openSettings": "Gitpod: Open Settings",
+ "openContext": "Gitpod: Open Context",
+ "openDocumentation": "Gitpod: Documentation",
+ "openDiscord": "Gitpod: Open Community Chat",
+ "openDiscourse": "Gitpod: Open Community Forum",
+ "openTwitter": "Gitpod: Follow us on Twitter",
+ "reportIssue": "Gitpod: Report Issue",
+ "stopWorkspace": "Gitpod: Stop Workspace",
+ "upgradeSubscription": "Gitpod: Upgrade Subscription",
+ "extendTimeout": "Gitpod: Extend Workspace Timeout",
+ "takeSnapshot": "Gitpod: Share Workspace Snapshot",
+ "shareWorkspace": "Gitpod: Share Running Workspace",
+ "stopSharingWorkspace": "Gitpod: Stop Sharing Running Workspace",
+ "openInStable": "Gitpod: Open in VS Code",
+ "openInInsiders": "Gitpod: Open in VS Code Insiders",
+ "openInBrowser": "Gitpod: Open in Browser"
+}
\ No newline at end of file
diff --git a/extensions/gitpod-web/src/extension.ts b/extensions/gitpod-web/src/extension.ts
index 50be998a0a60f..ce4c350e0374e 100644
--- a/extensions/gitpod-web/src/extension.ts
+++ b/extensions/gitpod-web/src/extension.ts
@@ -8,6 +8,13 @@
import * as workspaceInstance from '@gitpod/gitpod-protocol/lib/workspace-instance';
import * as grpc from '@grpc/grpc-js';
import * as fs from 'fs';
+import * as shared from 'gitpod-shared/out/extension';
+import { GitpodExtensionContext } from 'gitpod-shared/out/features';
+import { GitpodPluginModel } from 'gitpod-shared/out/gitpod-plugin-model';
+import { GetTokenRequest } from '@gitpod/supervisor-api-grpc/lib/token_pb';
+import { PortsStatus, ExposedPortInfo, PortsStatusRequest, PortsStatusResponse, PortAutoExposure, PortVisibility, OnPortExposedAction } from '@gitpod/supervisor-api-grpc/lib/status_pb';
+import { TunnelVisiblity, TunnelPortRequest, RetryAutoExposeRequest, CloseTunnelRequest } from '@gitpod/supervisor-api-grpc/lib/port_pb';
+import { ExposePortRequest } from '@gitpod/supervisor-api-grpc/lib/control_pb';
import type * as keytarType from 'keytar';
import fetch from 'node-fetch';
import * as path from 'path';
@@ -16,15 +23,14 @@ import * as util from 'util';
import * as vscode from 'vscode';
import * as rpc from 'vscode-jsonrpc';
import type { ServerExtensionHostConnection } from '../../../src/vs/gitpod/node/server-extension-host-connection';
-import type { GitpodExtension, GitpodExtensionContext, GitpodPluginModel, port, status } from 'gitpod/src/gitpod';
import { ThrottledDelayer } from './async';
+let gitpodContext: GitpodExtensionContext | undefined;
export async function activate(context: vscode.ExtensionContext) {
- const gitpodExtension = vscode.extensions.getExtension('gitpod.gitpod')!.exports;
- if (!gitpodExtension) {
+ gitpodContext = await shared.createContext(context);
+ if (!gitpodContext) {
return;
}
- const gitpodContext = gitpodExtension.newContext(context);
registerAuth(gitpodContext);
registerPorts(gitpodContext);
@@ -34,7 +40,12 @@ export async function activate(context: vscode.ExtensionContext) {
await gitpodContext.active;
}
-export function deactivate() { }
+export function deactivate() {
+ if (!gitpodContext) {
+ return;
+ }
+ return gitpodContext.dispose();
+}
class MessageReader extends rpc.IPCMessageReader {
override listen(callback: rpc.DataCallback): void {
@@ -136,7 +147,7 @@ export function registerAuth(context: GitpodExtensionContext): void {
}
}
} else {
- const getTokenRequest = new context.supervisor.GetTokenRequest();
+ const getTokenRequest = new GetTokenRequest();
getTokenRequest.setKind('gitpod');
getTokenRequest.setHost(context.info.getGitpodApi()!.getHost());
const scopes = [
@@ -205,7 +216,7 @@ export function registerAuth(context: GitpodExtensionContext): void {
}
async function loginGitHub(scopes?: readonly string[]): Promise {
- const getTokenRequest = new context.supervisor.GetTokenRequest();
+ const getTokenRequest = new GetTokenRequest();
getTokenRequest.setKind('git');
getTokenRequest.setHost('github.com');
if (scopes) {
@@ -262,7 +273,7 @@ export function registerAuth(context: GitpodExtensionContext): void {
}
export class GitpodWorkspacePort extends vscode.TreeItem {
- status?: status.PortsStatus.AsObject;
+ status?: PortsStatus.AsObject;
tunnel?: vscode.TunnelDescription;
readonly localUrl: string;
constructor(
@@ -304,8 +315,8 @@ export class GitpodWorkspacePort extends vscode.TreeItem {
});
}
}
- async setTunnelVisibility(visibility: port.TunnelVisiblity): Promise {
- const request = new this.context.supervisor.TunnelPortRequest();
+ async setTunnelVisibility(visibility: TunnelVisiblity): Promise {
+ const request = new TunnelPortRequest();
request.setPort(this.portNumber);
request.setTargetPort(this.portNumber);
request.setVisibility(visibility);
@@ -315,16 +326,16 @@ export class GitpodWorkspacePort extends vscode.TreeItem {
}
}
-interface ExposedPort extends status.PortsStatus.AsObject {
- exposed: status.ExposedPortInfo.AsObject
+interface ExposedPort extends PortsStatus.AsObject {
+ exposed: ExposedPortInfo.AsObject
}
-function isExposedPort(port: status.PortsStatus.AsObject | undefined): port is ExposedPort {
+function isExposedPort(port: PortsStatus.AsObject | undefined): port is ExposedPort {
return !!port?.exposed;
}
interface ExposedServedPort extends ExposedPort {
served: true
}
-function isExposedServedPort(port: status.PortsStatus.AsObject | undefined): port is ExposedServedPort {
+function isExposedServedPort(port: PortsStatus.AsObject | undefined): port is ExposedServedPort {
return isExposedPort(port) && !!port.served;
}
interface ExposedServedGitpodWorkspacePort extends GitpodWorkspacePort {
@@ -388,8 +399,8 @@ export class GitpodWorkspaceTreeDataProvider implements vscode.TreeDataProvider<
this.update();
}
- private portStatus: status.PortsStatusResponse | undefined;
- updatePortsStatus(portsStatus: status.PortsStatusResponse): void {
+ private portStatus: PortsStatusResponse | undefined;
+ updatePortsStatus(portsStatus: PortsStatusResponse): void {
this.portStatus = portsStatus;
this.update();
}
@@ -426,7 +437,7 @@ export class GitpodWorkspaceTreeDataProvider implements vscode.TreeDataProvider<
port.description = 'not served';
port.iconPath = new vscode.ThemeIcon('circle-outline');
} else if (!accessible) {
- if (portStatus.getAutoExposure() === this.context.supervisor.PortAutoExposure.FAILED) {
+ if (portStatus.getAutoExposure() === PortAutoExposure.FAILED) {
port.description = 'failed to expose';
port.iconPath = new vscode.ThemeIcon('warning', new vscode.ThemeColor('editorWarning.foreground'));
} else {
@@ -439,7 +450,7 @@ export class GitpodWorkspaceTreeDataProvider implements vscode.TreeDataProvider<
port.description += ` on ${!!port.tunnel.public ? 'all interfaces' : 'localhost'}`;
}
if (exposed) {
- port.description += ` ${exposed.getVisibility() === this.context.supervisor.PortVisibility.PUBLIC ? '(public)' : '(private)'}`;
+ port.description += ` ${exposed.getVisibility() === PortVisibility.PUBLIC ? '(public)' : '(private)'}`;
}
port.iconPath = new vscode.ThemeIcon('circle-filled', new vscode.ThemeColor('ports.iconRunningProcessForeground'));
}
@@ -450,7 +461,7 @@ export class GitpodWorkspaceTreeDataProvider implements vscode.TreeDataProvider<
}
if (exposed) {
port.contextValue = 'exposed-' + port.contextValue;
- if (exposed.getVisibility() === this.context.supervisor.PortVisibility.PUBLIC) {
+ if (exposed.getVisibility() === PortVisibility.PUBLIC) {
port.contextValue = 'public-' + port.contextValue;
} else {
port.contextValue = 'private-' + port.contextValue;
@@ -464,7 +475,7 @@ export class GitpodWorkspaceTreeDataProvider implements vscode.TreeDataProvider<
port.contextValue = 'host-' + port.contextValue;
}
}
- if (!accessible && portStatus.getAutoExposure() === this.context.supervisor.PortAutoExposure.FAILED) {
+ if (!accessible && portStatus.getAutoExposure() === PortAutoExposure.FAILED) {
port.contextValue = 'failed-' + port.contextValue;
}
if (isExposedServedGitpodWorkspacePort(port) && !isExposedServedPort(currentStatus)) {
@@ -496,7 +507,7 @@ export function registerPorts(context: GitpodExtensionContext): void {
(async () => {
while (run) {
try {
- const req = new context.supervisor.PortsStatusRequest();
+ const req = new PortsStatusRequest();
req.setObserve(true);
const evts = context.supervisor.status.portsStatus(req, context.supervisor.metadata);
stopUpdates = evts.cancel.bind(evts);
@@ -504,7 +515,7 @@ export function registerPorts(context: GitpodExtensionContext): void {
await new Promise((resolve, reject) => {
evts.on('end', resolve);
evts.on('error', reject);
- evts.on('data', (update: status.PortsStatusResponse) => {
+ evts.on('data', (update: PortsStatusResponse) => {
gitpodWorkspaceTreeDataProvider.updatePortsStatus(update);
});
});
@@ -544,7 +555,7 @@ export function registerPorts(context: GitpodExtensionContext): void {
listener.dispose();
}
});
- const request = new context.supervisor.ExposePortRequest();
+ const request = new ExposePortRequest();
request.setPort(portNumber);
request.setTargetPort(portNumber);
await util.promisify(context.supervisor.control.exposePort.bind(context.supervisor.control, request, context.supervisor.metadata, {
@@ -563,10 +574,10 @@ export function registerPorts(context: GitpodExtensionContext): void {
port.setPortVisibility('public')
));
context.subscriptions.push(vscode.commands.registerCommand('gitpod.ports.tunnelNetwork', (port: GitpodWorkspacePort) =>
- port.setTunnelVisibility(context.supervisor.TunnelVisiblity.NETWORK)
+ port.setTunnelVisibility(TunnelVisiblity.NETWORK)
));
context.subscriptions.push(vscode.commands.registerCommand('gitpod.ports.tunnelHost', async (port: GitpodWorkspacePort) =>
- port.setTunnelVisibility(context.supervisor.TunnelVisiblity.HOST)
+ port.setTunnelVisibility(TunnelVisiblity.HOST)
));
context.subscriptions.push(vscode.commands.registerCommand('gitpod.ports.preview', (port: GitpodWorkspacePort) =>
openPreview(port)
@@ -575,7 +586,7 @@ export function registerPorts(context: GitpodExtensionContext): void {
port.openExternal()
));
context.subscriptions.push(vscode.commands.registerCommand('gitpod.ports.retryAutoExpose', async (port: GitpodWorkspacePort) => {
- const request = new context.supervisor.RetryAutoExposeRequest();
+ const request = new RetryAutoExposeRequest();
request.setPort(port.portNumber);
await util.promisify(context.supervisor.port.retryAutoExpose.bind(context.supervisor.port, request, context.supervisor.metadata, {
deadline: Date.now() + context.supervisor.deadlines.normal
@@ -652,27 +663,27 @@ export function registerPorts(context: GitpodExtensionContext): void {
});
}
context.subscriptions.push(gitpodWorkspaceTreeDataProvider.onDidExposeServedPort(port => {
- if (port.status.exposed.onExposed === context.supervisor.OnPortExposedAction.IGNORE) {
+ if (port.status.exposed.onExposed === OnPortExposedAction.IGNORE) {
return;
}
- if (port.status.exposed.onExposed === context.supervisor.OnPortExposedAction.OPEN_BROWSER) {
+ if (port.status.exposed.onExposed === OnPortExposedAction.OPEN_BROWSER) {
port.openExternal();
return;
}
- if (port.status.exposed.onExposed === context.supervisor.OnPortExposedAction.OPEN_PREVIEW) {
+ if (port.status.exposed.onExposed === OnPortExposedAction.OPEN_PREVIEW) {
openPreview(port);
return;
}
- if (port.status.exposed.onExposed === context.supervisor.OnPortExposedAction.NOTIFY) {
+ if (port.status.exposed.onExposed === OnPortExposedAction.NOTIFY) {
showOpenServiceNotification(port);
return;
}
- if (port.status.exposed.onExposed === context.supervisor.OnPortExposedAction.NOTIFY_PRIVATE) {
- showOpenServiceNotification(port, port.status.exposed.visibility !== context.supervisor.PortVisibility.PUBLIC);
+ if (port.status.exposed.onExposed === OnPortExposedAction.NOTIFY_PRIVATE) {
+ showOpenServiceNotification(port, port.status.exposed.visibility !== PortVisibility.PUBLIC);
return;
}
}));
@@ -697,16 +708,16 @@ export function registerPorts(context: GitpodExtensionContext): void {
return vscode.workspace.openTunnel(tunnelOptions);
}));
context.subscriptions.push(vscode.commands.registerCommand('gitpod.api.openTunnel', async (tunnelOptions: vscode.TunnelOptions, _tunnelCreationOptions: vscode.TunnelCreationOptions) => {
- const request = new context.supervisor.TunnelPortRequest();
+ const request = new TunnelPortRequest();
request.setPort(tunnelOptions.remoteAddress.port);
request.setTargetPort(tunnelOptions.localAddressPort || tunnelOptions.remoteAddress.port);
- request.setVisibility(!!tunnelOptions?.public ? context.supervisor.TunnelVisiblity.NETWORK : context.supervisor.TunnelVisiblity.HOST);
+ request.setVisibility(!!tunnelOptions?.public ? TunnelVisiblity.NETWORK : TunnelVisiblity.HOST);
await util.promisify(context.supervisor.port.tunnel.bind(context.supervisor.port, request, context.supervisor.metadata, {
deadline: Date.now() + context.supervisor.deadlines.normal
}))();
}));
context.subscriptions.push(vscode.commands.registerCommand('gitpod.api.closeTunnel', async (port: number) => {
- const request = new context.supervisor.CloseTunnelRequest();
+ const request = new CloseTunnelRequest();
request.setPort(port);
await util.promisify(context.supervisor.port.closeTunnel.bind(context.supervisor.port, request, context.supervisor.metadata, {
deadline: Date.now() + context.supervisor.deadlines.normal
diff --git a/extensions/gitpod-web/tsconfig.json b/extensions/gitpod-web/tsconfig.json
index 13d9b9033b070..60d09fdf59579 100644
--- a/extensions/gitpod-web/tsconfig.json
+++ b/extensions/gitpod-web/tsconfig.json
@@ -4,5 +4,8 @@
"outDir": "./out",
"rootDir": "./src",
"esModuleInterop": true
- }
+ },
+ "references": [
+ { "path": "../gitpod-shared" }
+ ]
}
diff --git a/extensions/gitpod-web/yarn.lock b/extensions/gitpod-web/yarn.lock
deleted file mode 100644
index 659c16f242976..0000000000000
--- a/extensions/gitpod-web/yarn.lock
+++ /dev/null
@@ -1,79 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@types/node-fetch@^2.5.8":
- version "2.5.12"
- resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66"
- integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==
- dependencies:
- "@types/node" "*"
- form-data "^3.0.0"
-
-"@types/node@*":
- version "16.4.1"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.1.tgz#9fad171a5b701613ee8a6f4ece3c88b1034b1b03"
- integrity sha512-UW7cbLqf/Wu5XH2RKKY1cHwUNLicIDRLMraYKz+HHAerJ0ZffUEk+fMnd8qU2JaS6cAy0r8tsaf7yqHASf/Y0Q==
-
-"@types/node@^10.12.21":
- version "10.17.60"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b"
- integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==
-
-asynckit@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
- integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
-
-combined-stream@^1.0.8:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
- integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
- dependencies:
- delayed-stream "~1.0.0"
-
-delayed-stream@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
- integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
-
-form-data@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
- integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
- dependencies:
- asynckit "^0.4.0"
- combined-stream "^1.0.8"
- mime-types "^2.1.12"
-
-mime-db@1.48.0:
- version "1.48.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d"
- integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
-
-mime-types@^2.1.12:
- version "2.1.31"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b"
- integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==
- dependencies:
- mime-db "1.48.0"
-
-node-fetch@^2.6.1:
- version "2.6.1"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
- integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
-
-uuid@^8.3.1:
- version "8.3.2"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
- integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
-
-vscode-jsonrpc@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz#9bab9c330d89f43fc8c1e8702b5c36e058a01794"
- integrity sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==
-
-vscode-nls@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840"
- integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==
diff --git a/extensions/gitpod/README.md b/extensions/gitpod/README.md
index 9a8a56a69c89b..9d85ad0e0aeba 100644
--- a/extensions/gitpod/README.md
+++ b/extensions/gitpod/README.md
@@ -1,7 +1,5 @@
-# Gitpod integration
-
-**Notice:** This extension is bundled with Gitpod Code. It can be disabled but not uninstalled.
+# Gitpod Desktop integration
## Features
-This extension provides support for Gitpod integration.
+This extension provides support for Gitpod Desktop integration.
diff --git a/extensions/gitpod/extension.webpack.config.js b/extensions/gitpod/extension.webpack.config.js
index e18229a8e170a..a513ac5c3b511 100644
--- a/extensions/gitpod/extension.webpack.config.js
+++ b/extensions/gitpod/extension.webpack.config.js
@@ -7,7 +7,6 @@
'use strict';
-const path = require('path');
const withDefaults = require('../shared.webpack.config');
module.exports = withDefaults({
diff --git a/extensions/gitpod/package.json b/extensions/gitpod/package.json
index 9951fb5bbb40d..00041354fc65e 100644
--- a/extensions/gitpod/package.json
+++ b/extensions/gitpod/package.json
@@ -1,233 +1,47 @@
{
- "name": "gitpod",
- "displayName": "%displayName%",
- "description": "%description%",
- "publisher": "gitpod",
- "version": "0.0.14",
- "license": "MIT",
- "preview": true,
- "repository": {
- "type": "git",
- "url": "https://github.com/gitpod-io/vscode.git"
- },
- "engines": {
- "vscode": "^1.58.2"
- },
- "categories": [
- "Other"
- ],
- "extensionKind": [
- "workspace"
- ],
- "activationEvents": [
- "*"
- ],
- "main": "./out/extension.js",
- "contributes": {
- "commands": [
- {
- "command": "gitpod.stop.ws",
- "title": "%stopWorkspace%",
- "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
- },
- {
- "command": "gitpod.open.settings",
- "title": "%openSettings%",
- "enablement": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.open.accessControl",
- "title": "%openAccessControl%",
- "enablement": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.open.context",
- "title": "%openContext%",
- "enablement": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.open.dashboard",
- "title": "%openDashboard%",
- "enablement": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.open.documentation",
- "title": "%openDocumentation%",
- "enablement": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.open.twitter",
- "title": "%openTwitter%",
- "enablement": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.open.discord",
- "title": "%openDiscord%",
- "enablement": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.open.discourse",
- "title": "%openDiscourse%",
- "enablement": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.reportIssue",
- "title": "%reportIssue%",
- "enablement": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.upgradeSubscription",
- "title": "%upgradeSubscription%",
- "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
- },
- {
- "command": "gitpod.ExtendTimeout",
- "title": "%extendTimeout%",
- "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
- },
- {
- "command": "gitpod.takeSnapshot",
- "title": "%takeSnapshot%",
- "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
- },
- {
- "command": "gitpod.shareWorkspace",
- "title": "%shareWorkspace%",
- "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == false"
- },
- {
- "command": "gitpod.stopSharingWorkspace",
- "title": "%stopSharingWorkspace%",
- "enablement": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == true"
- },
- {
- "command": "gitpod.openInStable",
- "title": "%openInStable%",
- "enablement": "gitpod.inWorkspace == true && gitpod.UIKind == 'web'"
- },
- {
- "command": "gitpod.openInInsiders",
- "title": "%openInInsiders%",
- "enablement": "gitpod.inWorkspace == true && gitpod.UIKind == 'web'"
- },
- {
- "command": "gitpod.openInBrowser",
- "title": "%openInBrowser%",
- "enablement": "gitpod.inWorkspace == true && gitpod.UIKind == 'desktop'"
- }
- ],
- "menus": {
- "statusBar/remoteIndicator": [
- {
- "command": "gitpod.stop.ws",
- "group": "remote_00_gitpod_navigation@10",
- "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
- },
- {
- "command": "gitpod.open.settings",
- "group": "remote_00_gitpod_navigation@20",
- "when": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.open.accessControl",
- "group": "remote_00_gitpod_navigation@30",
- "when": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.open.context",
- "group": "remote_00_gitpod_navigation@40",
- "when": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.open.dashboard",
- "group": "remote_00_gitpod_navigation@50",
- "when": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.open.documentation",
- "group": "remote_00_gitpod_navigation@60",
- "when": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.open.twitter",
- "group": "remote_00_gitpod_navigation@70",
- "when": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.open.discord",
- "group": "remote_00_gitpod_navigation@80",
- "when": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.open.discourse",
- "group": "remote_00_gitpod_navigation@81",
- "when": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.reportIssue",
- "group": "remote_00_gitpod_navigation@90",
- "when": "gitpod.inWorkspace == true"
- },
- {
- "command": "gitpod.upgradeSubscription",
- "group": "remote_00_gitpod_navigation@100",
- "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
- },
- {
- "command": "gitpod.ExtendTimeout",
- "group": "remote_00_gitpod_navigation@110",
- "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
- },
- {
- "command": "gitpod.takeSnapshot",
- "group": "remote_00_gitpod_navigation@120",
- "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true"
- },
- {
- "command": "gitpod.shareWorkspace",
- "group": "remote_00_gitpod_navigation@130",
- "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == false"
- },
- {
- "command": "gitpod.stopSharingWorkspace",
- "group": "remote_00_gitpod_navigation@130",
- "when": "gitpod.inWorkspace == true && gitpod.workspaceOwned == true && gitpod.workspaceShared == true"
- },
- {
- "command": "gitpod.openInStable",
- "group": "remote_00_gitpod_navigation@900",
- "when": "gitpod.inWorkspace == true && gitpod.UIKind == 'web'"
- },
- {
- "command": "gitpod.openInInsiders",
- "group": "remote_00_gitpod_navigation@1000",
- "when": "gitpod.inWorkspace == true && gitpod.UIKind == 'web'"
- },
- {
- "command": "gitpod.openInBrowser",
- "group": "remote_00_gitpod_navigation@1000",
- "when": "gitpod.inWorkspace == true && gitpod.UIKind == 'desktop'"
- }
- ]
- }
- },
- "scripts": {
- "compile": "gulp compile-extension:gitpod",
- "watch": "gulp watch-extension:gitpod",
- "vscode:prepublish": "npm run compile"
- },
- "devDependencies": {
- "@types/node": "^10.12.21",
- "@types/ws": "^7.2.6"
- },
- "dependencies": {
- "@gitpod/gitpod-protocol": "main",
- "@gitpod/supervisor-api-grpc": "main",
- "bufferutil": "^4.0.1",
- "reconnecting-websocket": "^4.4.0",
- "utf-8-validate": "^5.0.2",
- "vscode-nls": "^5.0.0",
- "ws": "^7.3.1",
- "yaml": "^1.10.0"
- }
+ "name": "gitpod-desktop",
+ "displayName": "%displayName%",
+ "description": "%description%",
+ "publisher": "gitpod",
+ "version": "0.0.16",
+ "license": "MIT",
+ "preview": true,
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/gitpod-io/vscode.git"
+ },
+ "engines": {
+ "vscode": "^1.58.2"
+ },
+ "categories": [
+ "Other"
+ ],
+ "extensionKind": [
+ "ui"
+ ],
+ "activationEvents": [
+ "*",
+ "onCommand:gitpod.api.autoTunnel"
+ ],
+ "main": "./out/extension.js",
+ "scripts": {
+ "compile": "gulp compile-extension:gitpod",
+ "watch": "gulp watch-extension:gitpod",
+ "vscode:prepublish": "npm run compile"
+ },
+ "devDependencies": {
+ "@types/node": "^10.12.21",
+ "@types/node-fetch": "^2.5.12",
+ "@types/tmp": "^0.2.1"
+ },
+ "dependencies": {
+ "@gitpod/local-app-api-grpcweb": "main",
+ "@improbable-eng/grpc-web-node-http-transport": "^0.14.0",
+ "node-fetch": "^2.6.1",
+ "tmp": "^0.2.1",
+ "vscode-nls": "^5.0.0"
+ },
+ "extensionDependencies": [
+ "ms-vscode-remote.remote-ssh"
+ ]
}
diff --git a/extensions/gitpod/package.nls.json b/extensions/gitpod/package.nls.json
index 3d5c07d335cd1..8646753789e8a 100644
--- a/extensions/gitpod/package.nls.json
+++ b/extensions/gitpod/package.nls.json
@@ -1,22 +1,4 @@
{
"displayName": "Gitpod",
- "description": "Gitpod Integration Support",
- "openDashboard": "Gitpod: Open Dashboard",
- "openAccessControl": "Gitpod: Open Access Control",
- "openSettings": "Gitpod: Open Settings",
- "openContext": "Gitpod: Open Context",
- "openDocumentation": "Gitpod: Documentation",
- "openDiscord": "Gitpod: Open Community Chat",
- "openDiscourse": "Gitpod: Open Community Forum",
- "openTwitter": "Gitpod: Follow us on Twitter",
- "reportIssue": "Gitpod: Report Issue",
- "stopWorkspace": "Gitpod: Stop Workspace",
- "upgradeSubscription": "Gitpod: Upgrade Subscription",
- "extendTimeout": "Gitpod: Extend Workspace Timeout",
- "takeSnapshot": "Gitpod: Share Workspace Snapshot",
- "shareWorkspace": "Gitpod: Share Running Workspace",
- "stopSharingWorkspace": "Gitpod: Stop Sharing Running Workspace",
- "openInStable": "Gitpod: Open in VS Code",
- "openInInsiders": "Gitpod: Open in VS Code Insiders",
- "openInBrowser": "Gitpod: Open in Browser"
+ "description": "Gitpod Support"
}
diff --git a/extensions/gitpod/src/extension.ts b/extensions/gitpod/src/extension.ts
index 260e1021d9aac..bf83c959fcd4f 100644
--- a/extensions/gitpod/src/extension.ts
+++ b/extensions/gitpod/src/extension.ts
@@ -2,67 +2,410 @@
* Copyright (c) Gitpod. All rights reserved.
*--------------------------------------------------------------------------------------------*/
-import * as vscode from 'vscode';
-import { createGitpodExtensionContext, GitpodExtensionContext, registerDefaultLayout, registerNotifications, registerWorkspaceCommands, registerWorkspaceSharing, registerWorkspaceTimeout } from './features';
-import { GitpodExtension } from './gitpod';
+///
+
+import { AutoTunnelRequest, ResolveSSHConnectionRequest, ResolveSSHConnectionResponse } from '@gitpod/local-app-api-grpcweb/lib/localapp_pb';
+import { LocalAppClient } from '@gitpod/local-app-api-grpcweb/lib/localapp_pb_service';
+import { NodeHttpTransport } from '@improbable-eng/grpc-web-node-http-transport';
+import * as cp from 'child_process';
+import * as fs from 'fs';
+import * as http from 'http';
+import * as net from 'net';
+import fetch, { Response } from 'node-fetch';
import { performance } from 'perf_hooks';
+import * as tmp from 'tmp';
+import * as util from 'util';
+import * as vscode from 'vscode';
+import { grpc } from '@improbable-eng/grpc-web';
+const streamPipeline = util.promisify(require('stream').pipeline);
+
+interface SSHConnectionParams {
+ workspaceId: string
+ instanceId: string
+ gitpodHost: string
+}
+
+interface LocalAppConfig {
+ gitpodHost: string
+ configFile: string
+ apiPort: number
+ pid: number
+ logPath: string
+}
+
+interface Lock {
+ value: string
+ deadline: number
+}
+
+interface LocalAppInstallation {
+ path: string
+ etag: string | null
+}
-let gitpodContext: GitpodExtensionContext | undefined;
-export async function activate(context: vscode.ExtensionContext): Promise {
- if (typeof vscode.env.remoteName === 'undefined' || context.extension.extensionKind !== vscode.ExtensionKind.Workspace) {
- return undefined;
+export async function activate(context: vscode.ExtensionContext) {
+ const output = vscode.window.createOutputChannel('Gitpod');
+
+ // TODO(ak) commands to show logs and stop local apps
+ // TODO(ak) auto stop local apps if not used for 3 hours
+
+ function throwIfCancelled(token: vscode.CancellationToken): void {
+ if (token.isCancellationRequested) {
+ throw new Error('cancelled');
+ }
}
- gitpodContext = await createGitpodExtensionContext(context);
- if (!gitpodContext) {
- vscode.commands.executeCommand('setContext', 'gitpod.inWorkspace', false);
- return undefined;
+ const lockPrefix = 'lock/';
+ const fastLockTimeout = 30000;
+ const slowLockTimeout = 300000;
+ function releaseStaleLocks(): void {
+ for (const key of context.globalState.keys()) {
+ if (key.startsWith(lockPrefix)) {
+ const lock = context.globalState.get(key);
+ if (typeof lock !== 'object' || performance.now() >= lock.deadline) {
+ const lockName = key.substr(lockPrefix.length);
+ output.appendLine(`cancel stale lock: ${lockName}`);
+ context.globalState.update(key, undefined);
+ }
+ }
+ }
+ }
+ let lockCount = 0;
+ async function withLock(lockName: string, op: (token: vscode.CancellationToken) => Promise, timeout: number): Promise {
+ output.appendLine(`acquiring lock: ${lockName}`);
+ const lockKey = lockPrefix + lockName;
+ const value = vscode.env.sessionId + '/' + lockCount++;
+ let currentLock: Lock | undefined;
+ let deadline: number | undefined;
+ const updateTimeout = 150;
+ while (currentLock?.value !== value) {
+ currentLock = context.globalState.get(lockKey);
+ if (!currentLock) {
+ deadline = performance.now() + timeout + updateTimeout * 2;
+ await context.globalState.update(lockKey, { value, deadline });
+ }
+ // TODO(ak) env.globaState.onDidChange instead, see https://github.com/microsoft/vscode/issues/131182
+ await new Promise(resolve => setTimeout(resolve, updateTimeout));
+ currentLock = context.globalState.get(lockKey);
+ }
+ output.appendLine(`acquired lock: ${lockName}`);
+ const tokenSource = new vscode.CancellationTokenSource();
+ let timer = setInterval(() => {
+ currentLock = context.globalState.get(lockKey);
+ if (currentLock?.value !== value) {
+ tokenSource.cancel();
+ }
+ }, updateTimeout);
+ try {
+ const result = await op(tokenSource.token);
+ return result;
+ } finally {
+ if (timer) {
+ clearTimeout(timer);
+ }
+ output.appendLine(`released lock: ${lockName}`);
+ await context.globalState.update(lockKey, undefined);
+ }
}
- vscode.commands.executeCommand('setContext', 'gitpod.inWorkspace', true);
- registerUsageAnalytics(gitpodContext);
- registerWorkspaceCommands(gitpodContext);
- registerWorkspaceSharing(gitpodContext);
- registerWorkspaceTimeout(gitpodContext);
- registerNotifications(gitpodContext);
- registerDefaultLayout(gitpodContext);
-
- await gitpodContext.active;
- return {
- newContext: childContext => gitpodContext!.fork(childContext)
- };
-}
-export function deactivate() {
- if (!gitpodContext) {
- return;
+ const releaseStaleLocksTimer = setInterval(() => releaseStaleLocks(), fastLockTimeout);
+ context.subscriptions.push(new vscode.Disposable(() => clearInterval(releaseStaleLocksTimer)));
+
+ function downloadLocalApp(gitpodHost: string): Promise {
+ let downloadUri = vscode.Uri.parse(gitpodHost);
+ if (process.platform === 'win32') {
+ downloadUri = downloadUri.with({
+ path: '/static/bin/gitpod-local-companion-windows.exe'
+ });
+ } else if (process.platform === 'darwin') {
+ downloadUri = downloadUri.with({
+ path: '/static/bin/gitpod-local-companion-darwin'
+ });
+ } else {
+ downloadUri = downloadUri.with({
+ path: '/static/bin/gitpod-local-companion-linux'
+ });
+ }
+ output.appendLine(`fetching the local app from ${downloadUri.toString()}`);
+ return fetch(downloadUri.toString());
}
- return gitpodContext.dispose();
-}
-function registerUsageAnalytics(context: GitpodExtensionContext): void {
- if (context.devMode && vscode.env.uiKind === vscode.UIKind.Web) {
- return;
+ async function installLocalApp(download: Response, token: vscode.CancellationToken): Promise {
+ try {
+ const fileExtension = process.platform === 'win32' ? '.exe' : undefined;
+ const installationPath = await new Promise((resolve, reject) =>
+ tmp.file({ prefix: 'gitpod-local-companion', postfix: fileExtension }, (err, path) => {
+ if (err) {
+ return reject(err);
+ }
+ return resolve(path);
+ })
+ );
+ throwIfCancelled(token);
+ output.appendLine(`installing the local app to ${installationPath}`);
+ throwIfCancelled(token);
+ await streamPipeline(download.body, fs.createWriteStream(installationPath));
+ throwIfCancelled(token);
+ if (process.platform !== 'win32') {
+ await fs.promises.chmod(installationPath, '755');
+ throwIfCancelled(token);
+ }
+ const installation: LocalAppInstallation = { path: installationPath, etag: download.headers.get('etag') };
+ output.appendLine(`installing the local app: ${JSON.stringify(installation, undefined, 2)}`);
+ return installation;
+ } catch (e) {
+ output.appendLine(`failed to install the local app: ${e}`);
+ throw e;
+ }
+ }
+
+ async function startLocalApp(gitpodHost: string, installation: LocalAppInstallation, token: vscode.CancellationToken): Promise {
+ try {
+ const [configFile, apiPort] = await Promise.all([new Promise((resolve, reject) =>
+ tmp.file({ prefix: 'gitpod_ssh_config' }, (err, path) => {
+ if (err) {
+ return reject(err);
+ }
+ return resolve(path);
+ })
+ ), new Promise(resolve => {
+ const server = http.createServer();
+ server.listen(0, 'localhost', () => {
+ resolve((server.address() as net.AddressInfo).port);
+ server.close();
+ });
+ })]);
+ throwIfCancelled(token);
+ output.appendLine(`starting the local app with the config: ${JSON.stringify({ gitpodHost, configFile, apiPort }, undefined, 2)}`);
+ const logPath = installation.path + '.log';
+ let spawnTimer: NodeJS.Timeout | undefined;
+ const pid = await new Promise((resolve, reject) => {
+ const logStream = fs.createWriteStream(logPath);
+ logStream.on('error', reject);
+ logStream.on('open', () => {
+ if (token.isCancellationRequested) {
+ reject(new Error('cancelled'));
+ }
+ const localAppProcess = cp.spawn(installation.path, {
+ detached: true,
+ stdio: ['ignore', logStream, logStream],
+ env: {
+ ...process.env,
+ GITPOD_HOST: gitpodHost,
+ GITPOD_LCA_SSH_CONFIG: configFile,
+ GITPOD_LCA_API_PORT: String(apiPort),
+ GITPOD_LCA_AUTO_TUNNEL: String(false),
+ GITPOD_LCA_AUTH_REDIRECT_URL: `${vscode.env.uriScheme}://${context.extension.id}${authCompletePath}`
+ }
+ });
+ localAppProcess.on('error', reject);
+ localAppProcess.on('exit', code => reject(new Error('unexpectedly exit with code: ' + code)));
+ localAppProcess.unref();
+ if (localAppProcess.pid) {
+ // TODO(ak) when Node.js > 14.17
+ // localAppProcess.on('spwan', () => resolve(localAppProcess.pid)));
+ spawnTimer = setInterval(() => {
+ try {
+ process.kill(localAppProcess.pid, 0);
+ resolve(localAppProcess.pid);
+ } catch { }
+ }, 150);
+ }
+ });
+ }).finally(() => {
+ if (spawnTimer) {
+ clearInterval(spawnTimer);
+ }
+ });
+ output.appendLine(`the local app has been stared: ${JSON.stringify({ pid, log: vscode.Uri.file(logPath).toString() }, undefined, 2)}`);
+ return { gitpodHost, configFile, apiPort, pid, logPath };
+ } catch (e) {
+ output.appendLine(`failed to start the local app: ${e}`);
+ throw e;
+ }
+ }
+
+ /**
+ * **Important: it should not call the local app to manage in 30sec**
+ */
+ async function ensureLocalApp(gitpodHost: string, configKey: string, installationKey: string, token: vscode.CancellationToken): Promise {
+ let download: Response | Error;
+ try {
+ download = await downloadLocalApp(gitpodHost);
+ throwIfCancelled(token);
+ if (!download.ok) {
+ download = new Error(`unexpected download response ${download.statusText} (${download.status})`);
+ }
+ } catch (e) {
+ download = e;
+ }
+ let config = context.globalState.get(configKey);
+ let installation = context.globalState.get(installationKey);
+ if (installation) {
+ const upgrade = !(download instanceof Error) && { etag: download.headers.get('etag'), url: download.url };
+ if (upgrade && upgrade.etag && upgrade.etag !== installation.etag) {
+ output.appendLine(`the local app is outdated, upgrading: ${JSON.stringify({ installation, upgrade }, undefined, 2)}`);
+ installation = undefined;
+ if (config) {
+ try {
+ process.kill(config.pid);
+ } catch (e) {
+ output.appendLine(`failed to kill the outdated local app (pid: ${config.pid}): ${e}`);
+ }
+ }
+ config = undefined;
+ }
+ }
+ if (config) {
+ return config;
+ }
+ if (installation) {
+ try {
+ await fs.promises.access(installation.path, fs.constants.X_OK);
+ throwIfCancelled(token);
+ } catch {
+ installation = undefined;
+ }
+ }
+ if (!installation) {
+ if (download instanceof Error) {
+ throw download;
+ }
+ installation = await installLocalApp(download, token);
+ await context.globalState.update(installationKey, installation);
+ throwIfCancelled(token);
+ }
+ config = await startLocalApp(gitpodHost, installation, token);
+ await context.globalState.update(configKey, config);
+ throwIfCancelled(token);
+ return config;
}
- const properties = {
- id: vscode.env.sessionId,
- workspaceId: context.info.getWorkspaceId(),
- appName: vscode.env.appName,
- uiKind: vscode.env.uiKind === vscode.UIKind.Web ? 'web' : 'desktop',
- devMode: context.devMode,
- };
- function fireEvent(phase: 'start' | 'running' | 'end'): Promise {
- return context.gitpod.server.trackEvent({
- event: 'vscode_session',
- properties: {
- ...properties,
- timestamp: performance.now(),
- focused: vscode.window.state.focused,
- phase,
+
+ async function withLocalApp(gitpodHost: string, op: (client: LocalAppClient, config: LocalAppConfig) => Promise): Promise {
+ const gitpodAuthority = vscode.Uri.parse(gitpodHost).authority;
+ const configKey = 'config/' + gitpodAuthority;
+ const installationKey = 'installation/' + gitpodAuthority;
+ let restartAttempts = 0;
+ while (restartAttempts < 5) {
+ const config = await withLock(gitpodAuthority, token =>
+ ensureLocalApp(gitpodHost, configKey, installationKey, token)
+ , slowLockTimeout);
+ const client = new LocalAppClient('http://localhost:' + config.apiPort, { transport: NodeHttpTransport() });
+ try {
+ const result = await op(client, config);
+ return result;
+ } catch (e) {
+ let running: true | Error;
+ try {
+ process.kill(config.pid, 0);
+ running = true;
+ } catch (e2) {
+ running = e2;
+ }
+ if (running === true && (e.code === grpc.Code.Unavailable || e.code === grpc.Code.Unknown)) {
+ output.appendLine(`the local app (pid: ${config.pid}) is running, but the api endpoint is not ready: ${e}`);
+ output.appendLine(`retying again after 1s delay...`);
+ await new Promise(resolve => setTimeout(resolve, 1000));
+ continue;
+ }
+ if (running === true) {
+ throw e;
+ }
+ output.appendLine(`failed to access the local app: ${e}`);
+ output.appendLine(`the local app (pid: ${config.pid}) is not running: ${running}`);
+ output.appendLine(`restarting the local app...`);
+ await withLock(gitpodAuthority, async () => {
+ if (JSON.stringify(context.globalState.get(configKey)) === JSON.stringify(config)) {
+ await context.globalState.update(configKey, undefined);
+ }
+ }, fastLockTimeout);
+ restartAttempts++;
+ }
+ }
+ throw new Error('failed to access the local app');
+ }
+
+ const authCompletePath = '/auth-complete';
+ context.subscriptions.push(vscode.window.registerUriHandler({
+ handleUri: async uri => {
+ if (uri.path === authCompletePath) {
+ output.appendLine('auth completed');
+ return;
}
- });
+ output.appendLine('open workspace window: ' + uri.toString());
+ const params: SSHConnectionParams = JSON.parse(uri.query);
+ let resolvedConfig: LocalAppConfig | undefined;
+ try {
+ await vscode.window.withProgress({
+ location: vscode.ProgressLocation.Notification,
+ cancellable: false,
+ title: `Connecting to Gitpod workspace: ${params.workspaceId}`
+ }, async () => {
+ const connection = await withLocalApp(params.gitpodHost, (client, config) => {
+ resolvedConfig = config;
+ const request = new ResolveSSHConnectionRequest();
+ request.setInstanceId(params.instanceId);
+ request.setWorkspaceId(params.workspaceId);
+ return new Promise((resolve, reject) =>
+ client.resolveSSHConnection(request, (e, r) => r ? resolve(r) : reject(e))
+ );
+ });
+
+ const config = vscode.workspace.getConfiguration('remote.SSH');
+ const defaultExtensions = config.get('defaultExtensions') || [];
+ if (defaultExtensions.indexOf('gitpod.gitpod-remote-ssh') === -1) {
+ defaultExtensions.unshift('gitpod.gitpod-remote-ssh');
+ await config.update('defaultExtensions', defaultExtensions, vscode.ConfigurationTarget.Global);
+ }
+ // TODO(ak) notify a user about config file changes?
+ const gitpodConfigFile = connection.getConfigFile();
+ const currentConfigFile = config.get('configFile');
+ if (currentConfigFile === gitpodConfigFile) {
+ // invalidate cached SSH targets from the current config file
+ await config.update('configFile', undefined, vscode.ConfigurationTarget.Global);
+ }
+ await config.update('configFile', gitpodConfigFile, vscode.ConfigurationTarget.Global);
+ // TODO(ak) ensure that vscode.ssh-remote is installed
+ await vscode.commands.executeCommand('vscode.openFolder', vscode.Uri.parse(`vscode-remote://ssh-remote+${connection.getHost()}${uri.path || '/'}`), {
+ forceNewWindow: true
+ });
+ });
+ } catch (e) {
+ const seeLogs = 'See Logs';
+ vscode.window.showErrorMessage(`Failed to connect to Gitpod workspace ${params.workspaceId}: ${e}`, seeLogs).then(async result => {
+ if (result !== seeLogs) {
+ return;
+ }
+ output.show();
+ if (resolvedConfig) {
+ const document = await vscode.workspace.openTextDocument(vscode.Uri.file(resolvedConfig.logPath));
+ vscode.window.showTextDocument(document);
+ }
+ });
+ output.appendLine(`failed to open uri: ${e}`);
+ throw e;
+ }
+ }
+ }));
+
+ if (vscode.env.remoteName === undefined || context.extension.extensionKind !== vscode.ExtensionKind.UI) {
+ return;
}
- fireEvent('start');
- context.subscriptions.push(vscode.window.onDidChangeWindowState(() => fireEvent('running')));
- context.pendingWillCloseSocket.push(() => fireEvent('end'));
+
+ context.subscriptions.push(vscode.commands.registerCommand('gitpod.api.autoTunnel', async (gitpodHost: string, instanceId: string, enabled: boolean) => {
+ try {
+ await withLocalApp(gitpodHost, client => {
+ const request = new AutoTunnelRequest();
+ request.setInstanceId(instanceId);
+ request.setEnabled(enabled);
+ return new Promise((resolve, reject) =>
+ client.autoTunnel(request, (e, r) => r ? resolve(undefined) : reject(e))
+ );
+ });
+ } catch (e) {
+ console.error('failed to disable auto tunneling', e);
+ }
+ }));
}
+export function deactivate() { }
diff --git a/extensions/gitpod/src/gitpod.d.ts b/extensions/gitpod/src/gitpod.d.ts
deleted file mode 100644
index 95746452dfcca..0000000000000
--- a/extensions/gitpod/src/gitpod.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Gitpod. All rights reserved.
- *--------------------------------------------------------------------------------------------*/
-
-import type * as vscode from 'vscode';
-import type { GitpodExtensionContext } from './features';
-export { GitpodExtensionContext };
-export interface GitpodExtension {
- newContext(context: vscode.ExtensionContext): GitpodExtensionContext;
-}
-
-import type { GitpodPluginModel } from './gitpod-plugin-model';
-export { GitpodPluginModel };
-
-import type * as status from '@gitpod/supervisor-api-grpc/lib/status_pb';
-import type * as port from '@gitpod/supervisor-api-grpc/lib/port_pb';
-import type * as terminal from '@gitpod/supervisor-api-grpc/lib/terminal_pb';
-export {
- status, port, terminal
-};
diff --git a/extensions/gitpod/yarn.lock b/extensions/gitpod/yarn.lock
deleted file mode 100644
index 11d07c40bb62e..0000000000000
--- a/extensions/gitpod/yarn.lock
+++ /dev/null
@@ -1,445 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@gitpod/gitpod-protocol@main":
- version "0.1.5-main.1215"
- resolved "https://registry.yarnpkg.com/@gitpod/gitpod-protocol/-/gitpod-protocol-0.1.5-main.1215.tgz#dae24f5f4498a3c0a47ae191bc4c2c80c0fd7ab5"
- integrity sha512-8owHtTWENWn8OQYmnV846WijLuP962Lz15k5nG+f1XEX26Ku1i3MhoXIpej0bKI6yA9z72t7XAuX9lK6rAyMIQ==
- dependencies:
- ajv "^6.5.4"
- analytics-node "^4.0.1"
- inversify "^5.0.1"
- jaeger-client "3.17.2"
- js-yaml "^3.10.0"
- opentracing "^0.14.4"
- prom-client "^10.2.0"
- random-number-csprng "^1.0.2"
- reconnecting-websocket "^4.4.0"
- reflect-metadata "^0.1.10"
- uuid "^3.3.3"
- vscode-uri "^1.0.1"
- vscode-ws-jsonrpc "^0.2.0"
- ws "^7.4.6"
-
-"@gitpod/supervisor-api-grpc@main":
- version "0.1.5-main.1153"
- resolved "https://registry.yarnpkg.com/@gitpod/supervisor-api-grpc/-/supervisor-api-grpc-0.1.5-main.1153.tgz#fca63edd4603d889f18875fffe1abaf33816004d"
- integrity sha512-izCAZ1ZzHnDjPc38a7wwv4GsQoEmbqnoeY+XBbsOpMvBWLJcMcT57UuDFurb7rIOPiFgYMyrzu8dZ1S4WYpc7Q==
- dependencies:
- "@grpc/grpc-js" "^1.1.5"
- google-protobuf "^3.15.8"
-
-"@grpc/grpc-js@^1.1.5":
- version "1.3.6"
- resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.3.6.tgz#6e2d17610c2c8df0f6ceab0e1968f563df74b173"
- integrity sha512-v7+LQFbqZKmd/Tvf5/j1Xlbq6jXL/4d+gUtm2TNX4QiEC3ELWADmGr2dGlUyLl6aKTuYfsN72vAsO5zmavYkEg==
- dependencies:
- "@types/node" ">=12.12.47"
-
-"@segment/loosely-validate-event@^2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz#87dfc979e5b4e7b82c5f1d8b722dfd5d77644681"
- integrity sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==
- dependencies:
- component-type "^1.2.1"
- join-component "^1.1.0"
-
-"@types/node@*":
- version "14.11.2"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.2.tgz#2de1ed6670439387da1c9f549a2ade2b0a799256"
- integrity sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==
-
-"@types/node@>=12.12.47":
- version "14.14.35"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.35.tgz#42c953a4e2b18ab931f72477e7012172f4ffa313"
- integrity sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==
-
-"@types/node@^10.12.21":
- version "10.17.35"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.35.tgz#58058f29b870e6ae57b20e4f6e928f02b7129f56"
- integrity sha512-gXx7jAWpMddu0f7a+L+txMplp3FnHl53OhQIF9puXKq3hDGY/GjH+MF04oWnV/adPSCrbtHumDCFwzq2VhltWA==
-
-"@types/ws@^7.2.6":
- version "7.2.6"
- resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.2.6.tgz#516cbfb818310f87b43940460e065eb912a4178d"
- integrity sha512-Q07IrQUSNpr+cXU4E4LtkSIBPie5GLZyyMC1QtQYRLWz701+XcoVygGUZgvLqElq1nU4ICldMYPnexlBsg3dqQ==
- dependencies:
- "@types/node" "*"
-
-ajv@^6.5.4:
- version "6.12.5"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da"
- integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==
- dependencies:
- fast-deep-equal "^3.1.1"
- fast-json-stable-stringify "^2.0.0"
- json-schema-traverse "^0.4.1"
- uri-js "^4.2.2"
-
-analytics-node@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/analytics-node/-/analytics-node-4.0.1.tgz#f3d20738d4da1e4aa7236d654d9f580e254a7437"
- integrity sha512-+zXOOTB+eTRW6R9+pfvPfk1dHraFJzhNnAyZiYJIDGOjHQgfk9qfqgoJX9MfR4qY0J/E1YJ3FBncrLGadTDW1A==
- dependencies:
- "@segment/loosely-validate-event" "^2.0.0"
- axios "^0.21.1"
- axios-retry "^3.0.2"
- lodash.isstring "^4.0.1"
- md5 "^2.2.1"
- ms "^2.0.0"
- remove-trailing-slash "^0.1.0"
- uuid "^3.2.1"
-
-ansi-color@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/ansi-color/-/ansi-color-0.2.1.tgz#3e75c037475217544ed763a8db5709fa9ae5bf9a"
- integrity sha1-PnXAN0dSF1RO12Oo21cJ+prlv5o=
-
-argparse@^1.0.7:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
- integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
- dependencies:
- sprintf-js "~1.0.2"
-
-axios-retry@^3.0.2:
- version "3.1.9"
- resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.1.9.tgz#6c30fc9aeb4519aebaec758b90ef56fa03fe72e8"
- integrity sha512-NFCoNIHq8lYkJa6ku4m+V1837TP6lCa7n79Iuf8/AqATAHYB0ISaAS1eyIenDOfHOLtym34W65Sjke2xjg2fsA==
- dependencies:
- is-retry-allowed "^1.1.0"
-
-axios@^0.21.1:
- version "0.21.1"
- resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8"
- integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==
- dependencies:
- follow-redirects "^1.10.0"
-
-bintrees@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.1.tgz#0e655c9b9c2435eaab68bf4027226d2b55a34524"
- integrity sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ=
-
-bluebird@^3.3.3:
- version "3.7.2"
- resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
- integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
-
-bufferutil@^4.0.1:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b"
- integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==
- dependencies:
- node-gyp-build "^4.2.0"
-
-bufrw@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/bufrw/-/bufrw-1.3.0.tgz#28d6cfdaf34300376836310f5c31d57eeb40c8fa"
- integrity sha512-jzQnSbdJqhIltU9O5KUiTtljP9ccw2u5ix59McQy4pV2xGhVLhRZIndY8GIrgh5HjXa6+QJ9AQhOd2QWQizJFQ==
- dependencies:
- ansi-color "^0.2.1"
- error "^7.0.0"
- hexer "^1.5.0"
- xtend "^4.0.0"
-
-charenc@0.0.2:
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
- integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=
-
-component-type@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/component-type/-/component-type-1.2.1.tgz#8a47901700238e4fc32269771230226f24b415a9"
- integrity sha1-ikeQFwAjjk/DIml3EjAibyS0Fak=
-
-create-error@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/create-error/-/create-error-0.3.1.tgz#69810245a629e654432bf04377360003a5351a23"
- integrity sha1-aYECRaYp5lRDK/BDdzYAA6U1GiM=
-
-crypt@0.0.2:
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
- integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=
-
-error@7.0.2:
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02"
- integrity sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=
- dependencies:
- string-template "~0.2.1"
- xtend "~4.0.0"
-
-error@^7.0.0:
- version "7.2.1"
- resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894"
- integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==
- dependencies:
- string-template "~0.2.1"
-
-esprima@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
- integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-
-fast-deep-equal@^3.1.1:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
- integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-
-fast-json-stable-stringify@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
- integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
-
-follow-redirects@^1.10.0:
- version "1.14.1"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
- integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
-
-google-protobuf@^3.15.8:
- version "3.15.8"
- resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.15.8.tgz#5f3948905e4951c867d6bc143f385a80e2a39efe"
- integrity sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw==
-
-hexer@^1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/hexer/-/hexer-1.5.0.tgz#b86ce808598e8a9d1892c571f3cedd86fc9f0653"
- integrity sha1-uGzoCFmOip0YksVx887dhvyfBlM=
- dependencies:
- ansi-color "^0.2.1"
- minimist "^1.1.0"
- process "^0.10.0"
- xtend "^4.0.0"
-
-inversify@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.0.1.tgz#500d709b1434896ce5a0d58915c4a4210e34fb6e"
- integrity sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==
-
-is-buffer@~1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
- integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
-
-is-retry-allowed@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
- integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
-
-jaeger-client@3.17.2:
- version "3.17.2"
- resolved "https://registry.yarnpkg.com/jaeger-client/-/jaeger-client-3.17.2.tgz#92cf26752c5c66f3e66adf595cdde2f548cc0804"
- integrity sha512-19YloSidmKbrXHgecLWod8eXo7rm2ieUnsfg0ripTFGRCW5v2OWE96Gte4/tOQG/8N+T39VoLU2nMBdjbdMUJg==
- dependencies:
- node-int64 "^0.4.0"
- opentracing "^0.13.0"
- thriftrw "^3.5.0"
- uuid "^3.2.1"
- xorshift "^0.2.0"
-
-join-component@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/join-component/-/join-component-1.1.0.tgz#b8417b750661a392bee2c2537c68b2a9d4977cd5"
- integrity sha1-uEF7dQZho5K+4sJTfGiyqdSXfNU=
-
-js-yaml@^3.10.0:
- version "3.14.0"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
- integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
- dependencies:
- argparse "^1.0.7"
- esprima "^4.0.0"
-
-json-schema-traverse@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
- integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
-
-lodash.isstring@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
- integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
-
-long@^2.4.0:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/long/-/long-2.4.0.tgz#9fa180bb1d9500cdc29c4156766a1995e1f4524f"
- integrity sha1-n6GAux2VAM3CnEFWdmoZleH0Uk8=
-
-md5@^2.2.1:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f"
- integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==
- dependencies:
- charenc "0.0.2"
- crypt "0.0.2"
- is-buffer "~1.1.6"
-
-minimist@^1.1.0:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
- integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
-
-ms@^2.0.0:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
- integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-
-node-gyp-build@^4.2.0:
- version "4.2.3"
- resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739"
- integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==
-
-node-gyp-build@~3.7.0:
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d"
- integrity sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==
-
-node-int64@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
- integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
-
-opentracing@^0.13.0:
- version "0.13.0"
- resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.13.0.tgz#6a341442f09d7d866bc11ed03de1e3828e3d6aab"
- integrity sha1-ajQUQvCdfYZrwR7QPeHjgo49aqs=
-
-opentracing@^0.14.4:
- version "0.14.4"
- resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.4.tgz#a113408ea740da3a90fde5b3b0011a375c2e4268"
- integrity sha512-nNnZDkUNExBwEpb7LZaeMeQgvrlO8l4bgY/LvGNZCR0xG/dGWqHqjKrAmR5GUoYo0FIz38kxasvA1aevxWs2CA==
-
-process@^0.10.0:
- version "0.10.1"
- resolved "https://registry.yarnpkg.com/process/-/process-0.10.1.tgz#842457cc51cfed72dc775afeeafb8c6034372725"
- integrity sha1-hCRXzFHP7XLcd1r+6vuMYDQ3JyU=
-
-prom-client@^10.2.0:
- version "10.2.3"
- resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-10.2.3.tgz#a51bf21c239c954a6c5be4b1361fdd380218bb41"
- integrity sha512-Xboq5+TdUwuQtSSDRZRNnb5NprINlgQN999VqUjZxnLKydUNLeIPx6Eiahg6oJua3XBg2TGnh5Cth1s4I6+r7g==
- dependencies:
- tdigest "^0.1.1"
-
-punycode@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
- integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-
-random-number-csprng@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/random-number-csprng/-/random-number-csprng-1.0.2.tgz#fcd120e62dffc2c07674c7c3fe01e16b25f73a26"
- integrity sha1-/NEg5i3/wsB2dMfD/gHhayX3OiY=
- dependencies:
- bluebird "^3.3.3"
- create-error "^0.3.1"
-
-reconnecting-websocket@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz#3b0e5b96ef119e78a03135865b8bb0af1b948783"
- integrity sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==
-
-reflect-metadata@^0.1.10:
- version "0.1.13"
- resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
- integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
-
-remove-trailing-slash@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz#be2285a59f39c74d1bce4f825950061915e3780d"
- integrity sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==
-
-sprintf-js@~1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
- integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
-
-string-template@~0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
- integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=
-
-tdigest@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/tdigest/-/tdigest-0.1.1.tgz#2e3cb2c39ea449e55d1e6cd91117accca4588021"
- integrity sha1-Ljyyw56kSeVdHmzZEReszKRYgCE=
- dependencies:
- bintrees "1.0.1"
-
-thriftrw@^3.5.0:
- version "3.12.0"
- resolved "https://registry.yarnpkg.com/thriftrw/-/thriftrw-3.12.0.tgz#30857847755e7f036b2e0a79d11c9f55075539d9"
- integrity sha512-4YZvR4DPEI41n4Opwr4jmrLGG4hndxr7387kzRFIIzxHQjarPusH4lGXrugvgb7TtPrfZVTpZCVe44/xUxowEw==
- dependencies:
- bufrw "^1.3.0"
- error "7.0.2"
- long "^2.4.0"
-
-uri-js@^4.2.2:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602"
- integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==
- dependencies:
- punycode "^2.1.0"
-
-utf-8-validate@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.2.tgz#63cfbccd85dc1f2b66cf7a1d0eebc08ed056bfb3"
- integrity sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==
- dependencies:
- node-gyp-build "~3.7.0"
-
-uuid@^3.2.1, uuid@^3.3.3:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
- integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
-
-vscode-jsonrpc@^5.0.0:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz#9bab9c330d89f43fc8c1e8702b5c36e058a01794"
- integrity sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==
-
-vscode-nls@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840"
- integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==
-
-vscode-uri@^1.0.1:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.8.tgz#9769aaececae4026fb6e22359cb38946580ded59"
- integrity sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ==
-
-vscode-ws-jsonrpc@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/vscode-ws-jsonrpc/-/vscode-ws-jsonrpc-0.2.0.tgz#5e9c26e10da54a1a235da7d59e74508bbcb8edd9"
- integrity sha512-NE9HNRgPjCaPyTJvIudcpyIWPImxwRDtuTX16yks7SAiZgSXigxAiZOvSvVBGmD1G/OMfrFo6BblOtjVR9DdVA==
- dependencies:
- vscode-jsonrpc "^5.0.0"
-
-ws@^7.3.1:
- version "7.3.1"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8"
- integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==
-
-ws@^7.4.6:
- version "7.5.3"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74"
- integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==
-
-xorshift@^0.2.0:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/xorshift/-/xorshift-0.2.1.tgz#fcd82267e9351c13f0fb9c73307f25331d29c63a"
- integrity sha1-/NgiZ+k1HBPw+5xzMH8lMx0pxjo=
-
-xtend@^4.0.0, xtend@~4.0.0:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
- integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
-
-yaml@^1.10.0:
- version "1.10.2"
- resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
- integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
diff --git a/extensions/package.json b/extensions/package.json
index 848eaa085f24a..e2ebd6b351d4e 100644
--- a/extensions/package.json
+++ b/extensions/package.json
@@ -1,4 +1,5 @@
{
+ "private": true,
"name": "vscode-extensions",
"version": "0.0.1",
"license": "MIT",
@@ -7,10 +8,20 @@
"typescript": "4.4.3"
},
"scripts": {
- "postinstall": "node ./postinstall"
+ "postinstall": "node ./postinstall",
+ "compile": "../node_modules/.bin/tsc -b",
+ "watch": "../node_modules/.bin/tsc -b -w"
},
"devDependencies": {
"esbuild": "^0.11.12",
"vscode-grammar-updater": "^1.0.3"
+ },
+ "workspaces": {
+ "packages": [
+ "gitpod-shared",
+ "gitpod-remote",
+ "gitpod-web",
+ "gitpod"
+ ]
}
}
diff --git a/extensions/tsconfig.base.json b/extensions/tsconfig.base.json
index 5651d57263223..0c444f51597cd 100644
--- a/extensions/tsconfig.base.json
+++ b/extensions/tsconfig.base.json
@@ -32,6 +32,7 @@
"noImplicitOverride": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
- "forceConsistentCasingInFileNames": true
+ "forceConsistentCasingInFileNames": true,
+ "skipLibCheck": true
}
}
diff --git a/extensions/tsconfig.json b/extensions/tsconfig.json
new file mode 100644
index 0000000000000..20ade7e7a8ae4
--- /dev/null
+++ b/extensions/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "files": [],
+ "references": [
+ { "path": "./gitpod-shared" },
+ { "path": "./gitpod-remote" },
+ { "path": "./gitpod-web" },
+ { "path": "./gitpod" }
+ ]
+}
diff --git a/extensions/yarn.lock b/extensions/yarn.lock
index 69310ebd64ad4..f35f70f726ee8 100644
--- a/extensions/yarn.lock
+++ b/extensions/yarn.lock
@@ -2,11 +2,251 @@
# yarn lockfile v1
+"@gitpod/gitpod-protocol@main":
+ version "0.1.5-main.1291"
+ resolved "https://registry.yarnpkg.com/@gitpod/gitpod-protocol/-/gitpod-protocol-0.1.5-main.1291.tgz#98b6d9c14a8eb0ed852352723f7087787411f61c"
+ integrity sha512-GmonU20iiu/LMGgI2cSYHdM87zywPq2tZJnhvK20WIxCh4lEgk+PIECdIyJgiUafZ9g4LWkSyrikJfgB0ZVqjQ==
+ dependencies:
+ ajv "^6.5.4"
+ analytics-node "^4.0.1"
+ inversify "^5.0.1"
+ jaeger-client "3.17.2"
+ js-yaml "^3.10.0"
+ opentracing "^0.14.4"
+ prom-client "^10.2.0"
+ random-number-csprng "^1.0.2"
+ reconnecting-websocket "^4.4.0"
+ reflect-metadata "^0.1.10"
+ uuid "^3.3.3"
+ vscode-uri "^1.0.1"
+ vscode-ws-jsonrpc "^0.2.0"
+ ws "^7.4.6"
+
+"@gitpod/local-app-api-grpcweb@main":
+ version "0.1.5-main.1291"
+ resolved "https://registry.yarnpkg.com/@gitpod/local-app-api-grpcweb/-/local-app-api-grpcweb-0.1.5-main.1291.tgz#0ad3b11c38b7db7f026188817d24cbf02ac173f6"
+ integrity sha512-GkOK0kd63Ji5EDskAxMMtT9NihGCDZuw05dVhCp2E7CdspROURlEQumRQA1RTQE6lDb0O70xNA2DICUnA0ssFg==
+ dependencies:
+ "@gitpod/supervisor-api-grpcweb" "0.1.5-main.1291"
+ "@improbable-eng/grpc-web" "0.14.0"
+ google-protobuf "^3.17.0"
+
+"@gitpod/supervisor-api-grpc@main":
+ version "0.1.5-main.1291"
+ resolved "https://registry.yarnpkg.com/@gitpod/supervisor-api-grpc/-/supervisor-api-grpc-0.1.5-main.1291.tgz#4b30571d6e5934fefceec8bc9c34506904d05e6c"
+ integrity sha512-+N6kFrpzB+Ljk2CO/2XZB7btgBdnx5LiiyjSnwJShn9XHju+eao9rzH/ZrChUbDVb/POFnwl1zfsBpISQChV3Q==
+ dependencies:
+ "@grpc/grpc-js" "^1.3.6"
+ google-protobuf "^3.17.3"
+
+"@gitpod/supervisor-api-grpcweb@0.1.5-main.1291":
+ version "0.1.5-main.1291"
+ resolved "https://registry.yarnpkg.com/@gitpod/supervisor-api-grpcweb/-/supervisor-api-grpcweb-0.1.5-main.1291.tgz#5c149cff213b2d515821a2950b5d1f7fe8b0fbc8"
+ integrity sha512-A7Qyt1KKdZhwHYTWL/7HHkbCQ3Ezd3wnQ0yMRNvhxjtCDvGF+MhAxOVl2lo+OUBPiY8nrt3DgrTbO1Gp+zCfLA==
+ dependencies:
+ "@improbable-eng/grpc-web" "^0.14.0"
+
+"@grpc/grpc-js@^1.3.6":
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.3.7.tgz#58b687aff93b743aafde237fd2ee9a3259d7f2d8"
+ integrity sha512-CKQVuwuSPh40tgOkR7c0ZisxYRiN05PcKPW72mQL5y++qd7CwBRoaJZvU5xfXnCJDFBmS3qZGQ71Frx6Ofo2XA==
+ dependencies:
+ "@types/node" ">=12.12.47"
+
+"@improbable-eng/grpc-web-node-http-transport@^0.14.0":
+ version "0.14.1"
+ resolved "https://registry.yarnpkg.com/@improbable-eng/grpc-web-node-http-transport/-/grpc-web-node-http-transport-0.14.1.tgz#16c078db2e10aca9a8f7fb235a80b2fa447273a3"
+ integrity sha512-ZsCTzI1iKUbmQjB5DNZSI5/hvdliuaPpS2h8mVj1QzynL3IFb5NrNnHVHbfcH1wbm26Ka6Z1CrKFGvKLrmbFIg==
+
+"@improbable-eng/grpc-web@0.14.0":
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/@improbable-eng/grpc-web/-/grpc-web-0.14.0.tgz#a71c5af471dcef6a2810798f71f93ed8d6ac3817"
+ integrity sha512-ag1PTMWpBZKGi6GrEcZ4lkU5Qag23Xjo10BmnK9qyx4TMmSVcWmQ3rECirfQzm2uogrM9n1M6xfOpFsJP62ivA==
+ dependencies:
+ browser-headers "^0.4.1"
+
+"@improbable-eng/grpc-web@^0.14.0":
+ version "0.14.1"
+ resolved "https://registry.yarnpkg.com/@improbable-eng/grpc-web/-/grpc-web-0.14.1.tgz#f4662f64dc89c0f956a94bb8a3b576556c74589c"
+ integrity sha512-XaIYuunepPxoiGVLLHmlnVminUGzBTnXr8Wv7khzmLWbNw4TCwJKX09GSMJlKhu/TRk6gms0ySFxewaETSBqgw==
+ dependencies:
+ browser-headers "^0.4.1"
+
+"@segment/loosely-validate-event@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz#87dfc979e5b4e7b82c5f1d8b722dfd5d77644681"
+ integrity sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==
+ dependencies:
+ component-type "^1.2.1"
+ join-component "^1.1.0"
+
+"@types/node-fetch@^2.5.12", "@types/node-fetch@^2.5.8":
+ version "2.5.12"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66"
+ integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==
+ dependencies:
+ "@types/node" "*"
+ form-data "^3.0.0"
+
+"@types/node@*", "@types/node@>=12.12.47":
+ version "16.7.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.7.1.tgz#c6b9198178da504dfca1fd0be9b2e1002f1586f0"
+ integrity sha512-ncRdc45SoYJ2H4eWU9ReDfp3vtFqDYhjOsKlFFUDEn8V1Bgr2RjYal8YT5byfadWIRluhPFU6JiDOl0H6Sl87A==
+
+"@types/node@^10.12.21":
+ version "10.17.60"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b"
+ integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==
+
+"@types/tmp@^0.2.1":
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.1.tgz#83ecf4ec22a8c218c71db25f316619fe5b986011"
+ integrity sha512-7cTXwKP/HLOPVgjg+YhBdQ7bMiobGMuoBmrGmqwIWJv8elC6t1DfVc/mn4fD9UE1IjhwmhaQ5pGVXkmXbH0rhg==
+
+"@types/ws@^7.2.6":
+ version "7.4.7"
+ resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702"
+ integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==
+ dependencies:
+ "@types/node" "*"
+
+ajv@^6.5.4:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+analytics-node@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/analytics-node/-/analytics-node-4.0.1.tgz#f3d20738d4da1e4aa7236d654d9f580e254a7437"
+ integrity sha512-+zXOOTB+eTRW6R9+pfvPfk1dHraFJzhNnAyZiYJIDGOjHQgfk9qfqgoJX9MfR4qY0J/E1YJ3FBncrLGadTDW1A==
+ dependencies:
+ "@segment/loosely-validate-event" "^2.0.0"
+ axios "^0.21.1"
+ axios-retry "^3.0.2"
+ lodash.isstring "^4.0.1"
+ md5 "^2.2.1"
+ ms "^2.0.0"
+ remove-trailing-slash "^0.1.0"
+ uuid "^3.2.1"
+
+ansi-color@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-color/-/ansi-color-0.2.1.tgz#3e75c037475217544ed763a8db5709fa9ae5bf9a"
+ integrity sha1-PnXAN0dSF1RO12Oo21cJ+prlv5o=
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+axios-retry@^3.0.2:
+ version "3.1.9"
+ resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.1.9.tgz#6c30fc9aeb4519aebaec758b90ef56fa03fe72e8"
+ integrity sha512-NFCoNIHq8lYkJa6ku4m+V1837TP6lCa7n79Iuf8/AqATAHYB0ISaAS1eyIenDOfHOLtym34W65Sjke2xjg2fsA==
+ dependencies:
+ is-retry-allowed "^1.1.0"
+
+axios@^0.21.1:
+ version "0.21.1"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8"
+ integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==
+ dependencies:
+ follow-redirects "^1.10.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+bintrees@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.1.tgz#0e655c9b9c2435eaab68bf4027226d2b55a34524"
+ integrity sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ=
+
+bluebird@^3.3.3:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+browser-headers@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/browser-headers/-/browser-headers-0.4.1.tgz#4308a7ad3b240f4203dbb45acedb38dc2d65dd02"
+ integrity sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==
+
+bufferutil@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b"
+ integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+bufrw@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/bufrw/-/bufrw-1.3.0.tgz#28d6cfdaf34300376836310f5c31d57eeb40c8fa"
+ integrity sha512-jzQnSbdJqhIltU9O5KUiTtljP9ccw2u5ix59McQy4pV2xGhVLhRZIndY8GIrgh5HjXa6+QJ9AQhOd2QWQizJFQ==
+ dependencies:
+ ansi-color "^0.2.1"
+ error "^7.0.0"
+ hexer "^1.5.0"
+ xtend "^4.0.0"
+
+charenc@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
+ integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=
+
coffee-script@^1.10.0:
version "1.12.7"
resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53"
integrity sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+component-type@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-type/-/component-type-1.2.1.tgz#8a47901700238e4fc32269771230226f24b415a9"
+ integrity sha1-ikeQFwAjjk/DIml3EjAibyS0Fak=
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+create-error@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/create-error/-/create-error-0.3.1.tgz#69810245a629e654432bf04377360003a5351a23"
+ integrity sha1-aYECRaYp5lRDK/BDdzYAA6U1GiM=
+
+crypt@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
+ integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=
+
cson-parser@^1.3.3:
version "1.3.5"
resolved "https://registry.yarnpkg.com/cson-parser/-/cson-parser-1.3.5.tgz#7ec675e039145533bf2a6a856073f1599d9c2d24"
@@ -14,21 +254,348 @@ cson-parser@^1.3.3:
dependencies:
coffee-script "^1.10.0"
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+error@7.0.2:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02"
+ integrity sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=
+ dependencies:
+ string-template "~0.2.1"
+ xtend "~4.0.0"
+
+error@^7.0.0:
+ version "7.2.1"
+ resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894"
+ integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==
+ dependencies:
+ string-template "~0.2.1"
+
esbuild@^0.11.12:
- version "0.11.12"
- resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.11.12.tgz#8cbe15bcb44212624c3e77c896a835f74dc71c3c"
- integrity sha512-c8cso/1RwVj+fbDvLtUgSG4ZJQ0y9Zdrl6Ot/GAjyy4pdMCHaFnDMts5gqFnWRPLajWtEnI+3hlET4R9fVoZng==
+ version "0.11.23"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.11.23.tgz#c42534f632e165120671d64db67883634333b4b8"
+ integrity sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
fast-plist@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/fast-plist/-/fast-plist-0.1.2.tgz#a45aff345196006d406ca6cdcd05f69051ef35b8"
integrity sha1-pFr/NFGWAG1AbKbNzQX2kFHvNbg=
+follow-redirects@^1.10.0:
+ version "1.14.2"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.2.tgz#cecb825047c00f5e66b142f90fed4f515dec789b"
+ integrity sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA==
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+glob@^7.1.3:
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+google-protobuf@^3.17.0, google-protobuf@^3.17.3:
+ version "3.17.3"
+ resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.17.3.tgz#f87595073545a77946c8f0b67c302c5f7646d700"
+ integrity sha512-OVPzcSWIAJ+d5yiHyeaLrdufQtrvaBrF4JQg+z8ynTkbO3uFcujqXszTumqg1cGsAsjkWnI+M5B1xZ19yR4Wyg==
+
+hexer@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/hexer/-/hexer-1.5.0.tgz#b86ce808598e8a9d1892c571f3cedd86fc9f0653"
+ integrity sha1-uGzoCFmOip0YksVx887dhvyfBlM=
+ dependencies:
+ ansi-color "^0.2.1"
+ minimist "^1.1.0"
+ process "^0.10.0"
+ xtend "^4.0.0"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inversify@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.1.1.tgz#6fbd668c591337404e005a1946bfe0d802c08730"
+ integrity sha512-j8grHGDzv1v+8T1sAQ+3boTCntFPfvxLCkNcxB1J8qA0lUN+fAlSyYd+RXKvaPRL4AGyPxViutBEJHNXOyUdFQ==
+
+is-buffer@~1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-retry-allowed@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
+ integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+
+jaeger-client@3.17.2:
+ version "3.17.2"
+ resolved "https://registry.yarnpkg.com/jaeger-client/-/jaeger-client-3.17.2.tgz#92cf26752c5c66f3e66adf595cdde2f548cc0804"
+ integrity sha512-19YloSidmKbrXHgecLWod8eXo7rm2ieUnsfg0ripTFGRCW5v2OWE96Gte4/tOQG/8N+T39VoLU2nMBdjbdMUJg==
+ dependencies:
+ node-int64 "^0.4.0"
+ opentracing "^0.13.0"
+ thriftrw "^3.5.0"
+ uuid "^3.2.1"
+ xorshift "^0.2.0"
+
+join-component@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/join-component/-/join-component-1.1.0.tgz#b8417b750661a392bee2c2537c68b2a9d4977cd5"
+ integrity sha1-uEF7dQZho5K+4sJTfGiyqdSXfNU=
+
+js-yaml@^3.10.0:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+lodash.isstring@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
+ integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
+
+long@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-2.4.0.tgz#9fa180bb1d9500cdc29c4156766a1995e1f4524f"
+ integrity sha1-n6GAux2VAM3CnEFWdmoZleH0Uk8=
+
+md5@^2.2.1:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f"
+ integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==
+ dependencies:
+ charenc "0.0.2"
+ crypt "0.0.2"
+ is-buffer "~1.1.6"
+
+mime-db@1.49.0:
+ version "1.49.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed"
+ integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==
+
+mime-types@^2.1.12:
+ version "2.1.32"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5"
+ integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==
+ dependencies:
+ mime-db "1.49.0"
+
+minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.1.0:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+ms@^2.0.0:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+node-fetch@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
+ integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
+
+node-gyp-build@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739"
+ integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+ integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+opentracing@^0.13.0:
+ version "0.13.0"
+ resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.13.0.tgz#6a341442f09d7d866bc11ed03de1e3828e3d6aab"
+ integrity sha1-ajQUQvCdfYZrwR7QPeHjgo49aqs=
+
+opentracing@^0.14.4:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.5.tgz#891fa92cd90a24e64f99bc964370227310926c85"
+ integrity sha512-XLKtEfHxqrWyF1fzxznsv78w3csW41ucHnjiKnfzZLD5FN8UBDZZL1i4q0FR29zjxXhm+2Hop+5Vr/b8tKIvEg==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+process@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.10.1.tgz#842457cc51cfed72dc775afeeafb8c6034372725"
+ integrity sha1-hCRXzFHP7XLcd1r+6vuMYDQ3JyU=
+
+prom-client@^10.2.0:
+ version "10.2.3"
+ resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-10.2.3.tgz#a51bf21c239c954a6c5be4b1361fdd380218bb41"
+ integrity sha512-Xboq5+TdUwuQtSSDRZRNnb5NprINlgQN999VqUjZxnLKydUNLeIPx6Eiahg6oJua3XBg2TGnh5Cth1s4I6+r7g==
+ dependencies:
+ tdigest "^0.1.1"
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+random-number-csprng@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/random-number-csprng/-/random-number-csprng-1.0.2.tgz#fcd120e62dffc2c07674c7c3fe01e16b25f73a26"
+ integrity sha1-/NEg5i3/wsB2dMfD/gHhayX3OiY=
+ dependencies:
+ bluebird "^3.3.3"
+ create-error "^0.3.1"
+
+reconnecting-websocket@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz#3b0e5b96ef119e78a03135865b8bb0af1b948783"
+ integrity sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==
+
+reflect-metadata@^0.1.10:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
+ integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
+
+remove-trailing-slash@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz#be2285a59f39c74d1bce4f825950061915e3780d"
+ integrity sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==
+
+rimraf@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+string-template@~0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
+ integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=
+
+tdigest@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/tdigest/-/tdigest-0.1.1.tgz#2e3cb2c39ea449e55d1e6cd91117accca4588021"
+ integrity sha1-Ljyyw56kSeVdHmzZEReszKRYgCE=
+ dependencies:
+ bintrees "1.0.1"
+
+thriftrw@^3.5.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/thriftrw/-/thriftrw-3.12.0.tgz#30857847755e7f036b2e0a79d11c9f55075539d9"
+ integrity sha512-4YZvR4DPEI41n4Opwr4jmrLGG4hndxr7387kzRFIIzxHQjarPusH4lGXrugvgb7TtPrfZVTpZCVe44/xUxowEw==
+ dependencies:
+ bufrw "^1.3.0"
+ error "7.0.2"
+ long "^2.4.0"
+
+tmp@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
+ integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
+ dependencies:
+ rimraf "^3.0.0"
+
typescript@4.4.3:
version "4.4.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324"
integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+utf-8-validate@^5.0.2:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1"
+ integrity sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==
+ dependencies:
+ node-gyp-build "^4.2.0"
+
+uuid@^3.2.1, uuid@^3.3.3:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+uuid@^8.3.1:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
vscode-grammar-updater@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/vscode-grammar-updater/-/vscode-grammar-updater-1.0.3.tgz#695ccaf0567c6a000005a969cd87ecc3b5c25018"
@@ -36,3 +603,50 @@ vscode-grammar-updater@^1.0.3:
dependencies:
cson-parser "^1.3.3"
fast-plist "0.1.2"
+
+vscode-jsonrpc@^5.0.0, vscode-jsonrpc@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz#9bab9c330d89f43fc8c1e8702b5c36e058a01794"
+ integrity sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==
+
+vscode-nls@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840"
+ integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==
+
+vscode-uri@^1.0.1:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.8.tgz#9769aaececae4026fb6e22359cb38946580ded59"
+ integrity sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ==
+
+vscode-ws-jsonrpc@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/vscode-ws-jsonrpc/-/vscode-ws-jsonrpc-0.2.0.tgz#5e9c26e10da54a1a235da7d59e74508bbcb8edd9"
+ integrity sha512-NE9HNRgPjCaPyTJvIudcpyIWPImxwRDtuTX16yks7SAiZgSXigxAiZOvSvVBGmD1G/OMfrFo6BblOtjVR9DdVA==
+ dependencies:
+ vscode-jsonrpc "^5.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+ws@^7.3.1, ws@^7.4.6:
+ version "7.5.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74"
+ integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==
+
+xorshift@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/xorshift/-/xorshift-0.2.1.tgz#fcd82267e9351c13f0fb9c73307f25331d29c63a"
+ integrity sha1-/NgiZ+k1HBPw+5xzMH8lMx0pxjo=
+
+xtend@^4.0.0, xtend@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+yaml@^1.10.0:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
diff --git a/src/vs/gitpod/node/server.ts b/src/vs/gitpod/node/server.ts
index bc43467e1294a..d1e6b35d5ac41 100644
--- a/src/vs/gitpod/node/server.ts
+++ b/src/vs/gitpod/node/server.ts
@@ -75,7 +75,7 @@ main({
port,
main: path.join(APP_ROOT, 'out', 'vs', 'gitpod', 'browser', 'workbench', 'workbench.html'),
mainDev: path.join(APP_ROOT, 'out', 'vs', 'gitpod', 'browser', 'workbench', 'workbench-dev.html'),
- skipExtensions: new Set(['vscode.github-authentication', 'gitpod.gitpod-remote-ssh', 'gitpod.gitpod-desktop']),
+ skipExtensions: new Set(['vscode.github-authentication', 'gitpod.gitpod-shared', 'gitpod.gitpod-remote-ssh', 'gitpod.gitpod-desktop']),
configure: services => {
services.set(IExtensionManagementCLIService, new SyncDescriptor(ExtensionManagementCLIService));
},