tabby-rdp 0.2.6 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +63 -1
  2. package/README.md +181 -21
  3. package/dist/connectionStatus.js +140 -0
  4. package/dist/connectionStatus.js.map +1 -0
  5. package/dist/desk.js +21 -10
  6. package/dist/desk.js.map +1 -1
  7. package/dist/deskScript.js +3 -0
  8. package/dist/deskScript.js.map +1 -1
  9. package/dist/desktop.service.js +993 -53
  10. package/dist/desktop.service.js.map +1 -1
  11. package/dist/desktopForm.js +64 -19
  12. package/dist/desktopForm.js.map +1 -1
  13. package/dist/desktops.js +60 -21
  14. package/dist/desktops.js.map +1 -1
  15. package/dist/fileTransfer.js +152 -5
  16. package/dist/fileTransfer.js.map +1 -1
  17. package/dist/header.js +22 -7
  18. package/dist/header.js.map +1 -1
  19. package/dist/help.js +235 -0
  20. package/dist/help.js.map +1 -0
  21. package/dist/index.js +14 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/keyboard.js +142 -5
  24. package/dist/keyboard.js.map +1 -1
  25. package/dist/microphone.js +295 -0
  26. package/dist/microphone.js.map +1 -0
  27. package/dist/osd.js +79 -0
  28. package/dist/osd.js.map +1 -0
  29. package/dist/probe.js +33 -0
  30. package/dist/probe.js.map +1 -0
  31. package/dist/rdcleanpath.js +132 -7
  32. package/dist/rdcleanpath.js.map +1 -1
  33. package/dist/rdpFile.js +47 -0
  34. package/dist/rdpFile.js.map +1 -0
  35. package/dist/rdpProfile.js +367 -0
  36. package/dist/rdpProfile.js.map +1 -0
  37. package/dist/remoteSetup.js +90 -11
  38. package/dist/remoteSetup.js.map +1 -1
  39. package/dist/settingsPage.js +538 -0
  40. package/dist/settingsPage.js.map +1 -0
  41. package/dist/signin.js +21 -2
  42. package/dist/signin.js.map +1 -1
  43. package/dist/ssh.js +28 -0
  44. package/dist/ssh.js.map +1 -1
  45. package/dist/targets.js +148 -8
  46. package/dist/targets.js.map +1 -1
  47. package/dist/ui.js +154 -24
  48. package/dist/ui.js.map +1 -1
  49. package/dist/vms.js +90 -0
  50. package/dist/vms.js.map +1 -0
  51. package/dist/wake.js +124 -0
  52. package/dist/wake.js.map +1 -0
  53. package/package.json +2 -1
  54. package/vendor/IRONRDP-LICENSE +3 -3
  55. package/vendor/iron-remote-desktop-rdp.js +698 -451
  56. package/vendor/iron-remote-desktop.js +87 -81
  57. package/vendor/ironrdp_web_bg.wasm +0 -0
package/dist/ssh.js CHANGED
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isSSHTab = isSSHTab;
4
4
  exports.isConnected = isConnected;
5
5
  exports.openTcpStream = openTcpStream;
6
+ exports.execStream = execStream;
7
+ exports.pingRemote = pingRemote;
6
8
  exports.execRemote = execRemote;
7
9
  const sshChannelStream_1 = require("./sshChannelStream");
8
10
  function isSSHTab(tab) {
@@ -50,6 +52,32 @@ async function openTcpStream(tab, host, port) {
50
52
  stream.once('close', () => gone?.unsubscribe());
51
53
  return stream;
52
54
  }
55
+ /**
56
+ * A command on the remote whose stdin and stdout are the stream (a session channel, no PTY): e.g. `ssh -W` run there,
57
+ * for a tunnel that goes on from the remote. Its stderr is not part of it.
58
+ */
59
+ async function execStream(tab, command) {
60
+ const ssh = client(tab);
61
+ const session = tab.sshSession;
62
+ const channel = await ssh.activateChannel(await ssh.openSessionChannel());
63
+ const stream = new sshChannelStream_1.SSHChannelStream(channel);
64
+ await channel.requestExec(command);
65
+ const gone = session?.willDestroy$?.subscribe(() => stream.destroy(new Error('the SSH connection closed')));
66
+ stream.once('close', () => gone?.unsubscribe());
67
+ return stream;
68
+ }
69
+ /**
70
+ * One round trip to the SSH server: opening a session channel waits for the server's confirmation, and nothing
71
+ * runs on the remote until a command is requested on it, so this costs next to nothing there.
72
+ */
73
+ async function pingRemote(tab) {
74
+ const ssh = client(tab);
75
+ const started = performance.now();
76
+ const channel = await ssh.openSessionChannel();
77
+ const ms = performance.now() - started;
78
+ ssh.activateChannel(channel).then((c) => c.close()).catch(() => null);
79
+ return ms;
80
+ }
53
81
  // Printed after a command's output, so that execRemote knows all of it arrived.
54
82
  const END = '__trd_exec_end__';
55
83
  /**
package/dist/ssh.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":";;AAcA,4BAGC;AAOD,kCAYC;AAWD,sCAeC;AAMD,gCASC;AAMD,gCAOC;AAqBD,gCA6BC;AA1ID,yDAAqD;AAYrD,SAAgB,QAAQ,CAAE,GAAwC;IAC9D,gFAAgF;IAChF,OAAQ,GAAqB,EAAE,OAAO,EAAE,IAAI,KAAK,KAAK,IAAI,CAAC,CAAE,GAAc,CAAC,OAAO,EAAE,aAAa,CAAA;AACtG,CAAC;AAED,kHAAkH;AAClH,MAAM,SAAS,GAAG,IAAI,OAAO,EAAU,CAAA;AACvC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAU,CAAA;AAErC,0EAA0E;AAC1E,SAAgB,WAAW,CAAE,GAAW;IACpC,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAA;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,KAAK,CAAA;IAChB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACpB,+EAA+E;QAC/E,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACzC,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACnE,CAAC;IACD,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AACpD,CAAC;AAED,SAAS,MAAM,CAAE,GAAW;IACxB,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,CAAA;IAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,EAAE,qBAAqB,KAAK,UAAU,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACrD,CAAC;IACD,OAAO,GAAG,CAAA;AACd,CAAC;AAED,4GAA4G;AACrG,KAAK,UAAU,aAAa,CAAE,GAAW,EAAE,IAAY,EAAE,IAAY;IACxE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACvB,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAA;IAC9B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,qBAAqB,CAAC;QACtE,kBAAkB,EAAE,IAAI;QACxB,eAAe,EAAE,IAAI;QACrB,iBAAiB,EAAE,WAAW;QAC9B,cAAc,EAAE,CAAC;KACpB,CAAC,CAAC,CAAA;IACH,MAAM,MAAM,GAAG,IAAI,mCAAgB,CAAC,OAAO,CAAC,CAAA;IAC5C,4GAA4G;IAC5G,mEAAmE;IACnE,MAAM,IAAI,GAAG,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAA;IAC3G,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;IAC/C,OAAO,MAAM,CAAA;AACjB,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,UAAU,CAAE,GAAW,EAAE,OAAe;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACvB,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAA;IAC9B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAA;IACzE,MAAM,MAAM,GAAG,IAAI,mCAAgB,CAAC,OAAO,CAAC,CAAA;IAC5C,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAA;IAC3G,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;IAC/C,OAAO,MAAM,CAAA;AACjB,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,UAAU,CAAE,GAAW;IACzC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACvB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;IACjC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,kBAAkB,EAAE,CAAA;IAC9C,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAA;IACtC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAC1E,OAAO,EAAE,CAAA;AACb,CAAC;AAED,gFAAgF;AAChF,MAAM,GAAG,GAAG,kBAAkB,CAAA;AAE9B;;;;;GAKG;AACH,SAAS,aAAa,CAAE,GAAQ,EAAE,EAAW,EAAE,GAAa;IACxD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,CAAA;IAC9B,IAAI,OAAO,IAAI,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC;QACxC,OAAM;IACV,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAa,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACvF,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAA;AAC3B,CAAC;AAED,mHAAmH;AAC5G,KAAK,UAAU,UAAU,CAAE,GAAW,EAAE,OAAe,EAAE,KAAK,GAAG,EAAE,EAAE,SAAS,GAAG,KAAK;IACzF,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACvB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAA;IACzE,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACtD,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IACvF,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAa,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACpE,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,UAAU,GAAG,EAAE,CAAC,CAAA;IACpD,IAAI,KAAK,EAAE,CAAC;QACR,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC3D,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,EAAE,CAAA;IACnB,IAAI,KAAiC,CAAA;IACrC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC7C,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IACjH,CAAC,CAAC,CAAA;IACF,IAAI,CAAC;QACD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACzC,CAAC;YAAS,CAAC;QACP,YAAY,CAAC,KAAK,CAAC,CAAA;QACnB,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IACrC,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACrD,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IACvC,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,EAAE,CAAA;IACrB,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACnC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAClD,CAAC"}
package/dist/targets.js CHANGED
@@ -6,22 +6,35 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.RemoteTargets = void 0;
9
+ exports.RemoteTargets = exports.RDP_PROFILE_TYPE = void 0;
10
+ exports.isRDPTab = isRDPTab;
10
11
  exports.desktopPaneOf = desktopPaneOf;
11
12
  exports.parseSSHCommand = parseSSHCommand;
12
13
  const core_1 = require("@angular/core");
13
14
  const child_process_1 = require("child_process");
15
+ const net = require("net");
14
16
  const stream_1 = require("stream");
15
17
  const tabby_core_1 = require("tabby-core");
18
+ const desktops_1 = require("./desktops");
19
+ const desktopForm_1 = require("./desktopForm");
20
+ const deskScript_1 = require("./deskScript");
21
+ const probe_1 = require("./probe");
16
22
  const ssh_1 = require("./ssh");
23
+ /** Tabby profile type of remote desktop tabs (see rdpProfile.ts). */
24
+ exports.RDP_PROFILE_TYPE = 'rdp';
17
25
  function isLocalTerminal(tab) {
18
26
  const t = tab;
19
27
  return t?.profile?.type === 'local' && !!t.element?.nativeElement && typeof t.session?.getChildProcesses === 'function';
20
28
  }
29
+ /** A remote desktop tab (RDP profile, connecting directly): the desktop fills it, there is no terminal under it. */
30
+ function isRDPTab(tab) {
31
+ const t = tab;
32
+ return t?.profile?.type === exports.RDP_PROFILE_TYPE && !!t.element?.nativeElement;
33
+ }
21
34
  /** The pane a tab or tab-header action refers to: the pane itself, or a split's focused pane. */
22
35
  function desktopPaneOf(tab) {
23
36
  const pane = tab instanceof tabby_core_1.SplitTabComponent ? tab.getFocusedTab() : tab;
24
- return (0, ssh_1.isSSHTab)(pane) || isLocalTerminal(pane) ? pane : null;
37
+ return (0, ssh_1.isSSHTab)(pane) || isLocalTerminal(pane) || isRDPTab(pane) ? pane : null;
25
38
  }
26
39
  // ---- system ssh --------------------------------------------------------------------------------
27
40
  function run(file, args, timeoutMs = 10000) {
@@ -77,12 +90,15 @@ function parseSSHCommand(tokens) {
77
90
  const destination = tokens[i];
78
91
  return destination ? { options, destination } : null;
79
92
  }
80
- /** `user@hostname:port` as ssh itself resolves it (config aliases, defaults). */
81
- async function resolveKey(options, destination) {
82
- const out = await run('ssh', [...options, '-G', destination]);
93
+ /** `user@hostname:port` from `ssh -G` output (config aliases, defaults resolved). */
94
+ function keyFromConfig(out, destination) {
83
95
  const get = (k) => new RegExp(`^${k} (.+)$`, 'm').exec(out)?.[1]?.trim();
84
96
  return `${get('user') ?? ''}@${(get('hostname') ?? destination).toLowerCase()}:${get('port') ?? '22'}`;
85
97
  }
98
+ /** `user@hostname:port` as ssh itself resolves it (config aliases, defaults). */
99
+ async function resolveKey(options, destination) {
100
+ return keyFromConfig(await run('ssh', [...options, '-G', destination]), destination);
101
+ }
86
102
  /** A target reached with the system `ssh`, non-interactively (keys/agent/control master only). */
87
103
  class SystemSSHTarget {
88
104
  constructor(key, label, cmd) {
@@ -137,17 +153,100 @@ function sshFailure(label, stderr, code) {
137
153
  }
138
154
  // ---- Tabby SSH tabs ----------------------------------------------------------------------------
139
155
  class TabbySSHTarget {
140
- constructor(key, label, tab) {
156
+ constructor(key, label, tab, hostname) {
141
157
  this.key = key;
142
158
  this.label = label;
143
159
  this.tab = tab;
160
+ this.hostname = hostname;
144
161
  }
145
162
  openTcp(host, port) { return (0, ssh_1.openTcpStream)(this.tab, host, port); }
146
163
  exec(command, stdin) { return (0, ssh_1.execRemote)(this.tab, command, stdin); }
147
164
  isOpen() { return (0, ssh_1.isConnected)(this.tab); }
165
+ ping() { return (0, ssh_1.pingRemote)(this.tab); }
166
+ execStream(command) { return (0, ssh_1.execStream)(this.tab, command); }
148
167
  get reconnectSSH() {
149
168
  return typeof this.tab.reconnect === 'function' ? () => this.tab.reconnect() : undefined;
150
169
  }
170
+ get profileId() { return this.tab.profile?.id; }
171
+ }
172
+ /**
173
+ * Remote script: the user's `ssh` clients in the foreground of a terminal, one `TRD_SSH <n>|<tty>|<args>` line each, the
174
+ * arguments separated by \037 (from /proc where there is one, so that quoted ones stay whole). Each one's terminal gets a
175
+ * probe, `$PROBE-<n>` (see probe.ts), which shows which Tabby pane that terminal is.
176
+ */
177
+ const nestedSSHScript = (probe) => `PROBE=${(0, deskScript_1.shq)(probe)}\n` + String.raw `
178
+ n=0
179
+ for p in $(pgrep -u "$(id -u)" -x ssh 2>/dev/null); do
180
+ set -- $(ps -o tty= -o stat= -p "$p" 2>/dev/null)
181
+ case "$1:$2" in ?*:*+*) ;; *) continue ;; esac
182
+ [ "$1" = "?" ] && continue
183
+ n=$((n + 1))
184
+ if [ -r "/proc/$p/cmdline" ]; then args=$(tr '\000' '\037' < "/proc/$p/cmdline"); else args=$(ps -o args= -p "$p" | tr ' ' '\037'); fi
185
+ printf 'TRD_SSH %s|%s|%s\n' "$n" "$1" "$args"
186
+ printf '\033]7777;probe;%s-%s\007' "$PROBE" "$n" > "/dev/$1" 2>/dev/null || true
187
+ done
188
+ `;
189
+ /**
190
+ * A machine reached from an SSH tab's host with the `ssh` typed there: each command and tunnel runs that host's own
191
+ * ssh, non-interactively (its keys, or a forwarded agent). Like SystemSSHTarget, one hop further.
192
+ */
193
+ class NestedSSHTarget {
194
+ constructor(key, label, outer, cmd) {
195
+ this.key = key;
196
+ this.label = label;
197
+ this.outer = outer;
198
+ this.cmd = cmd;
199
+ }
200
+ get via() { return this.outer.label; }
201
+ ssh(...extra) {
202
+ return ['ssh', ...this.cmd.options, '-o', 'BatchMode=yes', '-o', 'ConnectTimeout=15', ...extra, this.cmd.destination].map(deskScript_1.shq).join(' ');
203
+ }
204
+ openTcp(host, port) {
205
+ return this.outer.execStream(`exec ${this.ssh('-o', 'ExitOnForwardFailure=yes', '-W', `${host.includes(':') ? `[${host}]` : host}:${port}`)} 2>/dev/null`);
206
+ }
207
+ async exec(command, stdin) {
208
+ // ssh's exit status and last error line come after the output, so a failed login says why.
209
+ const out = await this.outer.exec(`e=$(mktemp); ${this.ssh('-T')} ${(0, deskScript_1.shq)(command)} 2>"$e"; r=$?; ` +
210
+ `printf '\n__trd_hop %s %s\n' "$r" "$(tail -n 1 "$e")"; rm -f "$e"`, stdin);
211
+ const m = /\n__trd_hop (\d+) ?(.*)\n?$/.exec(out);
212
+ if (m?.[1] === '255') {
213
+ throw new Error(/permission denied|password|keyboard-interactive|host key/i.test(m[2])
214
+ ? `${this.outer.label} couldn't log in to ${this.label} by itself (${m[2].trim()}). The desktop goes through ${this.outer.label}'s own ssh, which needs a key for ${this.label} there, or agent forwarding.`
215
+ : `ssh from ${this.outer.label} to ${this.label} failed${m[2] ? `: ${m[2].trim()}` : ''}`);
216
+ }
217
+ return m ? out.slice(0, m.index) : out;
218
+ }
219
+ isOpen() { return this.outer.isOpen(); }
220
+ ping() { return this.outer.ping(); }
221
+ }
222
+ // ---- direct connections ------------------------------------------------------------------------
223
+ /** A remote desktop tab's RDP server, reached with a plain TCP connection from this computer (LAN, VPN). */
224
+ class DirectTarget {
225
+ constructor(label, direct) {
226
+ this.label = label;
227
+ this.direct = direct;
228
+ this.key = desktops_1.DIRECT_KEY;
229
+ }
230
+ openTcp(host, port) {
231
+ return new Promise((resolve, reject) => {
232
+ const socket = net.connect({ host, port });
233
+ const timer = setTimeout(() => socket.destroy(new Error(`${(0, desktopForm_1.formatAddress)(host, port)} did not answer`)), 15000);
234
+ socket.once('connect', () => {
235
+ clearTimeout(timer);
236
+ socket.setNoDelay(true);
237
+ // Notices a dead peer (sleep, a dropped VPN) where the SSH path has the SSH connection's keepalive.
238
+ socket.setKeepAlive(true, 10000);
239
+ resolve(socket);
240
+ });
241
+ socket.once('error', e => {
242
+ clearTimeout(timer);
243
+ reject(e);
244
+ });
245
+ });
246
+ }
247
+ exec() { return Promise.reject(new Error('A direct connection runs no commands')); }
248
+ // Each connection is its own socket; there is nothing to wait for between them.
249
+ isOpen() { return true; }
151
250
  }
152
251
  // ---- detection ---------------------------------------------------------------------------------
153
252
  /**
@@ -167,10 +266,19 @@ let RemoteTargets = class RemoteTargets {
167
266
  let target = null;
168
267
  let pid;
169
268
  try {
170
- if ((0, ssh_1.isSSHTab)(pane)) {
269
+ if (isRDPTab(pane)) {
270
+ // Made afresh each time (it holds no state), so that an edited profile applies on the next connection.
271
+ const profile = pane.profile;
272
+ // No `wake` for a direct one: starting a machine takes an SSH host to do it from.
273
+ const spec = (0, desktops_1.specOf)({ ...profile.options, name: profile.name, wake: undefined });
274
+ target = spec && new DirectTarget((0, desktopForm_1.formatAddress)(spec.host, spec.port), spec);
275
+ }
276
+ else if ((0, ssh_1.isSSHTab)(pane)) {
171
277
  const o = pane.profile?.options ?? {};
172
278
  const known = this.cache.get(pane)?.target;
173
- target = known ?? new TabbySSHTarget(await this.key(['-l', o.user ?? '', '-p', String(o.port ?? 22)], o.host ?? ''), o.host ?? 'remote', pane);
279
+ // Named as its profile is (Tabby's imports end in "(.ssh/config)"), else by its address.
280
+ const named = (pane.profile?.name ?? '').replace(/\s*\(\.ssh\/config\)$/, '').trim();
281
+ target = known ?? new TabbySSHTarget(await this.key(['-l', o.user ?? '', '-p', String(o.port ?? 22)], o.host ?? ''), named || o.host || 'remote', pane, o.host || undefined);
174
282
  }
175
283
  else {
176
284
  const found = await this.localSSH(pane);
@@ -190,6 +298,38 @@ let RemoteTargets = class RemoteTargets {
190
298
  this.cache.set(pane, { target, pid });
191
299
  return target;
192
300
  }
301
+ /**
302
+ * `ssh` clients typed at a prompt in this pane, on its SSH tab's host: only those whose terminal there is this pane's
303
+ * (see probe.ts), since other panes and tabs can be on the same host. Empty elsewhere.
304
+ */
305
+ async nestedSSH(pane) {
306
+ const outer = await this.targetOf(pane);
307
+ if (!(outer instanceof TabbySSHTarget)) {
308
+ return [];
309
+ }
310
+ const probe = `trd${Math.random().toString(36).slice(2, 10)}`;
311
+ const { result: out, ids } = await (0, probe_1.probesIn)(pane, probe, () => outer.exec('sh -s', nestedSSHScript(probe)));
312
+ const found = [];
313
+ for (const line of out.split('\n')) {
314
+ const m = /^TRD_SSH (\d+)\|([^|]*)\|(.*)$/.exec(line.trim());
315
+ const args = m?.[3].split('\x1f').filter(Boolean) ?? [];
316
+ const cmd = /(^|\/)ssh$/.test(args[0] ?? '') ? parseSSHCommand(args.slice(1)) : null;
317
+ if (m && cmd && ids.has(`${probe}-${m[1]}`)) {
318
+ found.push({ cmd, tty: m[2] });
319
+ }
320
+ }
321
+ // One per destination.
322
+ return found.filter((f, i, all) => all.findIndex(g => g.cmd.destination === f.cmd.destination) === i);
323
+ }
324
+ /** A target for an `ssh` found by nestedSSH(), going through the pane's SSH connection. */
325
+ async nestedTarget(pane, nested) {
326
+ const outer = await this.targetOf(pane);
327
+ if (!(outer instanceof TabbySSHTarget)) {
328
+ return null;
329
+ }
330
+ const config = await outer.exec(`${['ssh', ...nested.cmd.options, '-G', nested.cmd.destination].map(deskScript_1.shq).join(' ')} 2>/dev/null`, '');
331
+ return new NestedSSHTarget(keyFromConfig(config, nested.cmd.destination), nested.cmd.destination, outer, nested.cmd);
332
+ }
193
333
  key(options, destination) {
194
334
  const id = JSON.stringify([options, destination]);
195
335
  let key = this.keys.get(id);
@@ -1 +1 @@
1
- {"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"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"}
package/dist/ui.js CHANGED
@@ -12,18 +12,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.RemoteDesktopToolbarButton = exports.RemoteDesktopContextMenu = exports.RemoteDesktopConfig = exports.RemoteDesktopHotkeys = exports.TOGGLE_HOTKEY = void 0;
13
13
  exports.toggleLabel = toggleLabel;
14
14
  exports.desktopChoices = desktopChoices;
15
+ exports.desktopActions = desktopActions;
15
16
  exports.settingsMenu = settingsMenu;
16
17
  const core_1 = require("@angular/core");
17
18
  const tabby_core_1 = require("tabby-core");
18
19
  const tabby_terminal_1 = require("tabby-terminal");
19
20
  const desktop_service_1 = require("./desktop.service");
21
+ const help_1 = require("./help");
22
+ Object.defineProperty(exports, "TOGGLE_HOTKEY", { enumerable: true, get: function () { return help_1.TOGGLE_HOTKEY; } });
23
+ const keyboard_1 = require("./keyboard");
20
24
  const ssh_1 = require("./ssh");
21
25
  const targets_1 = require("./targets");
22
- exports.TOGGLE_HOTKEY = 'remote-desktop-toggle';
23
26
  /** Listed in Settings > Hotkeys, where it can be rebound. Works while the desktop has focus too. */
24
27
  let RemoteDesktopHotkeys = class RemoteDesktopHotkeys extends tabby_core_1.HotkeyProvider {
25
28
  async provide() {
26
- return [{ id: exports.TOGGLE_HOTKEY, name: 'Remote desktop: switch between desktop and console (SSH tabs and terminals running ssh)' }];
29
+ return [{ id: help_1.TOGGLE_HOTKEY, name: 'Remote desktop: switch between desktop and console (SSH tabs and terminals running ssh)' }];
27
30
  }
28
31
  };
29
32
  exports.RemoteDesktopHotkeys = RemoteDesktopHotkeys;
@@ -34,7 +37,7 @@ let RemoteDesktopConfig = class RemoteDesktopConfig extends tabby_core_1.ConfigP
34
37
  constructor() {
35
38
  super(...arguments);
36
39
  this.defaults = {
37
- hotkeys: { [exports.TOGGLE_HOTKEY]: [] },
40
+ hotkeys: { [help_1.TOGGLE_HOTKEY]: [] },
38
41
  remoteDesktop: {
39
42
  // Shareable session for SSH logins ('desk'): 'native' (trd-pty) or 'tmux' (earlier setup).
40
43
  sessionBackend: 'native',
@@ -48,16 +51,32 @@ let RemoteDesktopConfig = class RemoteDesktopConfig extends tabby_core_1.ConfigP
48
51
  macShortcuts: true,
49
52
  // Play the remote desktop's sound (applies on the next connect).
50
53
  sound: true,
54
+ // H.264 in the graphics pipeline, decoded by the browser, where it can (applies on the next connect).
55
+ h264: true,
56
+ // With resize 'off': 'fit' (scaled to the pane) | 'actual' (1:1, scrolling).
57
+ zoom: 'fit',
58
+ // A small indicator on the desktop: throughput, frames per second, SSH round trip, connection path.
59
+ connectionStatus: false,
60
+ // Send the microphone to the remote desktop while an application there records (applies on the next connect).
61
+ microphone: false,
51
62
  // More desktops behind SSH hosts (e.g. a Windows VM whose RDP port the host forwards); see desktops.ts.
52
63
  desktops: [],
53
64
  // Sharpness for particular desktops, overriding `sharpness`: [{ desktop: <session key>, sharpness }].
54
65
  desktopSharpness: [],
66
+ // Certificates of desktops behind hosts, trusted on first use: [{ desktop: <session key>, sha256 }].
67
+ trustedCertificates: [],
68
+ // The on-screen display naming a desktop for a moment (see osd.ts).
69
+ osd: { show: 'auto', font: 'condensed', size: 'medium', position: 'top-right', color: '', seconds: 2.5 },
70
+ // Look for VMs with a desktop on SSH hosts (libvirt) and offer them in the menus (see vms.ts).
71
+ discoverVMs: true,
72
+ // The tip shown the first time a desktop connects (see help.ts) has been shown.
73
+ tipShown: false,
55
74
  },
56
75
  };
57
76
  this.platformDefaults = {
58
- [tabby_core_1.Platform.macOS]: { hotkeys: { [exports.TOGGLE_HOTKEY]: ['⌘-Shift-G'] } },
59
- [tabby_core_1.Platform.Windows]: { hotkeys: { [exports.TOGGLE_HOTKEY]: ['Ctrl-Shift-G'] } },
60
- [tabby_core_1.Platform.Linux]: { hotkeys: { [exports.TOGGLE_HOTKEY]: ['Ctrl-Shift-G'] } },
77
+ [tabby_core_1.Platform.macOS]: { hotkeys: { [help_1.TOGGLE_HOTKEY]: ['⌘-Shift-G'] } },
78
+ [tabby_core_1.Platform.Windows]: { hotkeys: { [help_1.TOGGLE_HOTKEY]: ['Ctrl-Shift-G'] } },
79
+ [tabby_core_1.Platform.Linux]: { hotkeys: { [help_1.TOGGLE_HOTKEY]: ['Ctrl-Shift-G'] } },
61
80
  };
62
81
  }
63
82
  };
@@ -65,10 +84,13 @@ exports.RemoteDesktopConfig = RemoteDesktopConfig;
65
84
  exports.RemoteDesktopConfig = RemoteDesktopConfig = __decorate([
66
85
  (0, core_1.Injectable)()
67
86
  ], RemoteDesktopConfig);
68
- /** What switching does for this pane right now. Names the desktop when the host has more than one. */
87
+ /**
88
+ * What switching does for this pane right now. Names the desktop when the host has more than one. Null in a remote
89
+ * desktop tab while its desktop shows: there is no console to switch to.
90
+ */
69
91
  function toggleLabel(desktop, pane) {
70
92
  if (desktop.isVisible(pane)) {
71
- return 'Back to console';
93
+ return desktop.hasConsole(pane) ? 'Back to console' : null;
72
94
  }
73
95
  const { specs, current } = desktop.choicesOf(pane);
74
96
  const what = specs.length > 1 && current ? current.name : 'remote desktop';
@@ -84,20 +106,48 @@ function toggleLabel(desktop, pane) {
84
106
  function desktopChoices(desktop, pane, targetLabel) {
85
107
  const { specs, current } = desktop.choicesOf(pane);
86
108
  const items = specs.filter(spec => spec.id !== current?.id).map(spec => ({
87
- label: desktop.isOpenElsewhere(pane, spec) ? `Switch to ${spec.name} (open in another tab)` : `Open ${spec.name}`,
109
+ label: desktop.isOpenElsewhere(pane, spec) ? `Switch to ${spec.name} (open in another tab)`
110
+ // Found on the host (see vms.ts): say so, and that opening one that's off starts it.
111
+ : spec.found === 'off' ? `Start and open ${spec.name} (VM, shut off)` : spec.found ? `Open ${spec.name} (VM)` : `Open ${spec.name}`,
88
112
  click: () => desktop.showDesktop(pane, spec.id),
89
113
  }));
90
- if (targetLabel) {
114
+ // Not in a remote desktop tab: it isn't an SSH host.
115
+ if (targetLabel && desktop.hasConsole(pane)) {
91
116
  items.push({ label: `Add a desktop behind ${targetLabel}…`, click: () => desktop.addDesktop(pane) });
92
117
  }
93
118
  return items;
94
119
  }
120
+ /** What can be done with the pane's connected desktop: send keys, view only, a screenshot. Shared by the menus. */
121
+ function desktopActions(desktop, keyboard, pane) {
122
+ const spec = desktop.desktopOf(pane);
123
+ if (!spec || !desktop.isConnected(pane)) {
124
+ return [];
125
+ }
126
+ const viewOnly = desktop.isViewOnly(pane);
127
+ return [
128
+ {
129
+ label: 'Send keys',
130
+ enabled: !viewOnly,
131
+ submenu: keyboard_1.SEND_KEYS[spec.kind].map(combo => ({ label: combo.label, click: () => keyboard.send(pane, combo) })),
132
+ },
133
+ {
134
+ type: 'checkbox',
135
+ label: 'View only (no keyboard or mouse input)',
136
+ checked: viewOnly,
137
+ click: () => desktop.setViewOnly(pane, !viewOnly),
138
+ },
139
+ { label: 'Save a screenshot (to Downloads and the clipboard)', click: () => desktop.saveScreenshot(pane) },
140
+ ];
141
+ }
95
142
  /** Tab header menu (whole tab: its focused pane) and in-terminal menu (that pane). */
96
143
  let RemoteDesktopContextMenu = class RemoteDesktopContextMenu extends tabby_core_1.TabContextMenuItemProvider {
97
- constructor(desktop, targets) {
144
+ constructor(desktop, targets, keyboard, help, app) {
98
145
  super();
99
146
  this.desktop = desktop;
100
147
  this.targets = targets;
148
+ this.keyboard = keyboard;
149
+ this.help = help;
150
+ this.app = app;
101
151
  this.weight = 6;
102
152
  }
103
153
  async getItems(tab, tabHeader) {
@@ -107,30 +157,70 @@ let RemoteDesktopContextMenu = class RemoteDesktopContextMenu extends tabby_core
107
157
  }
108
158
  const pane = (0, targets_1.desktopPaneOf)(tab);
109
159
  // Local terminals qualify only while they run ssh.
110
- if (!pane || !this.desktop.has(pane) && !await this.targets.targetOf(pane)) {
160
+ const target = pane && (this.targets.cached(pane) ?? await this.targets.targetOf(pane));
161
+ if (!pane || !this.desktop.has(pane) && !target) {
111
162
  return [];
112
163
  }
113
- const items = [{
114
- label: toggleLabel(this.desktop, pane),
115
- click: () => this.desktop.toggle(pane),
116
- }, ...desktopChoices(this.desktop, pane, this.targets.cached(pane)?.label)];
164
+ // VMs on the host: wait a moment for a fresh look, else show what's known.
165
+ if (target) {
166
+ await Promise.race([this.desktop.discoverVMs(target), new Promise(resolve => setTimeout(resolve, 1200))]);
167
+ }
168
+ // A heading, so the items below read as this plugin's rather than Tabby's.
169
+ const connectedTo = this.desktop.isConnected(pane) ? this.desktop.desktopOf(pane)?.name : undefined;
170
+ const toggle = toggleLabel(this.desktop, pane);
171
+ const items = [
172
+ { label: connectedTo ? `Remote Desktop — connected to ${connectedTo}` : 'Remote Desktop', enabled: false },
173
+ ...toggle ? [{ label: toggle, click: () => this.desktop.toggle(pane) }] : [],
174
+ ];
175
+ // The host's other desktops (and VMs found there) and "Add a desktop behind…", one level down to keep the menu short.
176
+ const choices = desktopChoices(this.desktop, pane, this.targets.cached(pane)?.label);
177
+ if (choices.length) {
178
+ items.push({ label: 'Desktops', submenu: choices });
179
+ }
117
180
  if (this.desktop.isConnected(pane)) {
118
- items.push({ label: 'Send files to the remote desktop…', click: () => this.desktop.sendFiles(pane) });
181
+ items.push({ label: 'Send files…', click: () => this.desktop.sendFiles(pane) });
182
+ items.push(...desktopActions(this.desktop, this.keyboard, pane));
183
+ // Several desktops in this tab: paste on all of them, or type into all of them.
184
+ const all = this.desktop.desktopsInTab(pane);
185
+ if (all > 1) {
186
+ items.push({ label: `Paste to all ${all} desktops in this tab`, click: () => this.desktop.pasteToAll(pane) });
187
+ items.push({
188
+ type: 'checkbox',
189
+ label: `Type into all ${all} desktops in this tab`,
190
+ checked: this.desktop.isBroadcast(pane),
191
+ click: () => this.desktop.setBroadcast(pane, !this.desktop.isBroadcast(pane)),
192
+ });
193
+ }
194
+ }
195
+ if (this.desktop.desktopOf(pane)?.found) {
196
+ items.push({ label: `Save ${this.desktop.desktopOf(pane).name} to this host's desktops`, click: () => this.desktop.saveFoundDesktop(pane) });
197
+ }
198
+ if (this.desktop.canSignInAgain(pane)) {
199
+ items.push({ label: 'Sign in again…', click: () => this.desktop.signInAgain(pane) });
119
200
  }
120
201
  if (this.desktop.has(pane)) {
121
- items.push({ label: 'Disconnect remote desktop', click: () => this.desktop.disconnect(pane) });
202
+ items.push({ label: 'Disconnect', click: () => this.desktop.disconnect(pane) });
203
+ }
204
+ items.push({ label: 'Settings', submenu: settingsMenu(this.desktop, pane, this.help) });
205
+ // Tabby can even out a split's panes but offers it nowhere; a grid of desktops wants it.
206
+ const split = this.app.tabs.find(t => t instanceof tabby_core_1.SplitTabComponent && t.getAllTabs().includes(pane));
207
+ if (split && split.getAllTabs().length > 1) {
208
+ items.push({ label: 'Make panes even', click: () => { split.equalize(); split.layout(); } });
122
209
  }
123
- items.push({ label: 'Remote desktop settings', submenu: settingsMenu(this.desktop, pane) });
124
210
  return items;
125
211
  }
126
212
  };
127
213
  exports.RemoteDesktopContextMenu = RemoteDesktopContextMenu;
128
214
  exports.RemoteDesktopContextMenu = RemoteDesktopContextMenu = __decorate([
129
215
  (0, core_1.Injectable)(),
130
- __metadata("design:paramtypes", [desktop_service_1.RemoteDesktopService, targets_1.RemoteTargets])
216
+ __metadata("design:paramtypes", [desktop_service_1.RemoteDesktopService,
217
+ targets_1.RemoteTargets,
218
+ keyboard_1.DesktopKeyboard,
219
+ help_1.RemoteDesktopHelp,
220
+ tabby_core_1.AppService])
131
221
  ], RemoteDesktopContextMenu);
132
222
  /** Radio items for the `remoteDesktop` settings; shared by the context menus and the header button. */
133
- function settingsMenu(desktop, pane) {
223
+ function settingsMenu(desktop, pane, help) {
134
224
  const current = desktop.settings();
135
225
  const radio = (key, value, label) => ({
136
226
  type: 'radio',
@@ -138,6 +228,13 @@ function settingsMenu(desktop, pane) {
138
228
  checked: current[key] === value,
139
229
  click: () => desktop.updateSettings({ [key]: value }),
140
230
  });
231
+ // A fixed resolution, scaled to fit the pane or shown at actual size.
232
+ const fixed = (zoom, label) => ({
233
+ type: 'radio',
234
+ label,
235
+ checked: current.resize === 'off' && current.zoom === zoom,
236
+ click: () => desktop.updateSettings({ resize: 'off', zoom }),
237
+ });
141
238
  // The desktop open in this pane can have its own sharpness (for example, Retina for Windows only).
142
239
  const spec = pane ? desktop.desktopOf(pane) : null;
143
240
  const own = pane ? desktop.ownSharpness(pane) : null;
@@ -154,10 +251,15 @@ function settingsMenu(desktop, pane) {
154
251
  ownRadio('retina', 'Retina'),
155
252
  ] : [];
156
253
  return [
254
+ ...help ? [
255
+ { label: 'All settings, keys and help…', click: () => help.open() },
256
+ { type: 'separator' },
257
+ ] : [],
157
258
  { label: 'When the pane is resized', enabled: false },
158
259
  radio('resize', 'live', 'Resize the remote desktop to fit'),
159
260
  radio('resize', 'reconnect', 'Reconnect at the new size'),
160
- radio('resize', 'off', 'Keep the resolution (scale to fit)'),
261
+ fixed('fit', 'Keep the resolution (scale to fit)'),
262
+ fixed('actual', 'Keep the resolution (actual size, scroll)'),
161
263
  { type: 'separator' },
162
264
  { label: 'Sharpness', enabled: false },
163
265
  radio('sharpness', 'standard', 'Standard'),
@@ -176,6 +278,24 @@ function settingsMenu(desktop, pane) {
176
278
  checked: current.sound,
177
279
  click: () => desktop.updateSettings({ sound: !current.sound }),
178
280
  },
281
+ {
282
+ type: 'checkbox',
283
+ label: 'Video decoding (H.264, hardware-accelerated where available; applies on the next connect)',
284
+ checked: current.h264,
285
+ click: () => desktop.updateSettings({ h264: !current.h264 }),
286
+ },
287
+ {
288
+ type: 'checkbox',
289
+ label: 'Send the microphone while an app on the remote desktop records (applies on the next connect)',
290
+ checked: current.microphone,
291
+ click: () => desktop.updateSettings({ microphone: !current.microphone }),
292
+ },
293
+ {
294
+ type: 'checkbox',
295
+ label: 'Show connection status on the desktop (throughput, frames per second, round trip)',
296
+ checked: current.connectionStatus,
297
+ click: () => desktop.updateSettings({ connectionStatus: !current.connectionStatus }),
298
+ },
179
299
  ...process.platform === 'darwin' ? [{
180
300
  type: 'checkbox',
181
301
  label: 'Mac shortcuts on the remote desktop (⌘C, ⌘V, ⌘Z… act as Ctrl+C, Ctrl+V…; off: ⌘ is the Windows key)',
@@ -183,12 +303,22 @@ function settingsMenu(desktop, pane) {
183
303
  click: () => desktop.updateSettings({ macShortcuts: !current.macShortcuts }),
184
304
  }] : [],
185
305
  { type: 'separator' },
306
+ { label: 'Import an .rdp file…', click: () => desktop.importRdpFile() },
307
+ {
308
+ // The form shows over a console (a remote desktop tab edits its desktop in Tabby's profile settings).
309
+ label: 'Edit a desktop',
310
+ enabled: !!pane && desktop.hasConsole(pane) && desktop.configuredDesktops().length > 0,
311
+ submenu: desktop.configuredDesktops().map((d, i) => ({
312
+ label: `${d.name ?? `${d.host}:${d.port}`} (behind ${d.via})…`,
313
+ click: () => pane && desktop.editDesktop(pane, i),
314
+ })),
315
+ },
186
316
  {
187
317
  label: 'Remove a desktop',
188
318
  enabled: desktop.configuredDesktops().length > 0,
189
319
  submenu: desktop.configuredDesktops().map((d, i) => ({
190
- label: `${d.name ?? `${d.host}:${d.port}`} (behind ${d.via})`,
191
- click: () => desktop.removeDesktop(i),
320
+ label: `${d.name ?? `${d.host}:${d.port}`} (behind ${d.via})…`,
321
+ click: () => desktop.confirmRemoveDesktop(i),
192
322
  })),
193
323
  },
194
324
  ];