@celljs/ta-web 4.6.0 → 4.7.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.
- package/README.en.md +90 -0
- package/README.md +12 -6
- package/esm/browser/chat/chat-view.js +1 -1
- package/esm/browser/chat/chat-view.js.map +1 -1
- package/esm/browser/components/account-menu.d.ts +3 -2
- package/esm/browser/components/account-menu.js +21 -16
- package/esm/browser/components/account-menu.js.map +1 -1
- package/esm/browser/components/app-view.js +3 -1
- package/esm/browser/components/app-view.js.map +1 -1
- package/esm/browser/components/chat-list.d.ts +3 -1
- package/esm/browser/components/chat-list.js +6 -1
- package/esm/browser/components/chat-list.js.map +1 -1
- package/esm/browser/components/folder-picker.d.ts +37 -6
- package/esm/browser/components/folder-picker.js +155 -33
- package/esm/browser/components/folder-picker.js.map +1 -1
- package/esm/browser/components/remote-hosts.d.ts +7 -0
- package/esm/browser/components/remote-hosts.js +94 -0
- package/esm/browser/components/remote-hosts.js.map +1 -0
- package/esm/browser/components/remote-prompts.d.ts +7 -0
- package/esm/browser/components/remote-prompts.js +72 -0
- package/esm/browser/components/remote-prompts.js.map +1 -0
- package/esm/browser/components/settings-view.js +8 -1
- package/esm/browser/components/settings-view.js.map +1 -1
- package/esm/browser/components/web-composer.d.ts +4 -1
- package/esm/browser/components/web-composer.js +2 -2
- package/esm/browser/components/web-composer.js.map +1 -1
- package/esm/browser/components/working-directory.js +1 -1
- package/esm/browser/components/working-directory.js.map +1 -1
- package/esm/browser/extension/icons.js +3 -1
- package/esm/browser/extension/icons.js.map +1 -1
- package/esm/browser/extension/web-extension-api.d.ts +4 -2
- package/esm/browser/extension/web-extensions.js +11 -1
- package/esm/browser/extension/web-extensions.js.map +1 -1
- package/esm/browser/i18n/locales.d.ts +32 -1
- package/esm/browser/i18n/messages.d.ts +31 -0
- package/esm/browser/i18n/messages.js +75 -13
- package/esm/browser/i18n/messages.js.map +1 -1
- package/esm/browser/style/base.d.ts +1 -1
- package/esm/browser/style/base.js +6 -1
- package/esm/browser/style/base.js.map +1 -1
- package/esm/browser/style/layout.d.ts +1 -1
- package/esm/browser/style/layout.js +48 -15
- package/esm/browser/style/layout.js.map +1 -1
- package/esm/browser/util/message.d.ts +1 -0
- package/esm/browser/util/message.js +7 -5
- package/esm/browser/util/message.js.map +1 -1
- package/esm/browser/workbench-protocol.d.ts +7 -1
- package/esm/browser/workbench-protocol.js.map +1 -1
- package/esm/browser/workbench.d.ts +7 -1
- package/esm/browser/workbench.js +23 -0
- package/esm/browser/workbench.js.map +1 -1
- package/lib/browser/chat/chat-view.js +1 -1
- package/lib/browser/chat/chat-view.js.map +1 -1
- package/lib/browser/components/account-menu.d.ts +3 -2
- package/lib/browser/components/account-menu.d.ts.map +1 -1
- package/lib/browser/components/account-menu.js +21 -16
- package/lib/browser/components/account-menu.js.map +1 -1
- package/lib/browser/components/app-view.d.ts.map +1 -1
- package/lib/browser/components/app-view.js +3 -1
- package/lib/browser/components/app-view.js.map +1 -1
- package/lib/browser/components/chat-list.d.ts +3 -1
- package/lib/browser/components/chat-list.d.ts.map +1 -1
- package/lib/browser/components/chat-list.js +6 -1
- package/lib/browser/components/chat-list.js.map +1 -1
- package/lib/browser/components/folder-picker.d.ts +37 -6
- package/lib/browser/components/folder-picker.d.ts.map +1 -1
- package/lib/browser/components/folder-picker.js +156 -33
- package/lib/browser/components/folder-picker.js.map +1 -1
- package/lib/browser/components/folder-picker.spec.js +15 -0
- package/lib/browser/components/folder-picker.spec.js.map +1 -1
- package/lib/browser/components/remote-hosts.d.ts +8 -0
- package/lib/browser/components/remote-hosts.d.ts.map +1 -0
- package/lib/browser/components/remote-hosts.js +130 -0
- package/lib/browser/components/remote-hosts.js.map +1 -0
- package/lib/browser/components/remote-prompts.d.ts +8 -0
- package/lib/browser/components/remote-prompts.d.ts.map +1 -0
- package/lib/browser/components/remote-prompts.js +108 -0
- package/lib/browser/components/remote-prompts.js.map +1 -0
- package/lib/browser/components/settings-view.d.ts.map +1 -1
- package/lib/browser/components/settings-view.js +7 -0
- package/lib/browser/components/settings-view.js.map +1 -1
- package/lib/browser/components/web-composer.d.ts +4 -1
- package/lib/browser/components/web-composer.d.ts.map +1 -1
- package/lib/browser/components/web-composer.js +2 -2
- package/lib/browser/components/web-composer.js.map +1 -1
- package/lib/browser/components/working-directory.js +1 -1
- package/lib/browser/components/working-directory.js.map +1 -1
- package/lib/browser/extension/icons.d.ts.map +1 -1
- package/lib/browser/extension/icons.js +2 -0
- package/lib/browser/extension/icons.js.map +1 -1
- package/lib/browser/extension/web-extension-api.d.ts +4 -2
- package/lib/browser/extension/web-extension-api.d.ts.map +1 -1
- package/lib/browser/extension/web-extensions.d.ts.map +1 -1
- package/lib/browser/extension/web-extensions.js +11 -1
- package/lib/browser/extension/web-extensions.js.map +1 -1
- package/lib/browser/i18n/locales.d.ts +32 -1
- package/lib/browser/i18n/locales.d.ts.map +1 -1
- package/lib/browser/i18n/messages.d.ts +31 -0
- package/lib/browser/i18n/messages.d.ts.map +1 -1
- package/lib/browser/i18n/messages.js +75 -13
- package/lib/browser/i18n/messages.js.map +1 -1
- package/lib/browser/notices/notices.spec.js +1 -1
- package/lib/browser/notices/notices.spec.js.map +1 -1
- package/lib/browser/style/base.d.ts +1 -1
- package/lib/browser/style/base.d.ts.map +1 -1
- package/lib/browser/style/base.js +6 -1
- package/lib/browser/style/base.js.map +1 -1
- package/lib/browser/style/layout.d.ts +1 -1
- package/lib/browser/style/layout.d.ts.map +1 -1
- package/lib/browser/style/layout.js +48 -15
- package/lib/browser/style/layout.js.map +1 -1
- package/lib/browser/util/message.d.ts +1 -0
- package/lib/browser/util/message.d.ts.map +1 -1
- package/lib/browser/util/message.js +7 -5
- package/lib/browser/util/message.js.map +1 -1
- package/lib/browser/util/message.spec.js +2 -0
- package/lib/browser/util/message.spec.js.map +1 -1
- package/lib/browser/workbench-protocol.d.ts +7 -1
- package/lib/browser/workbench-protocol.d.ts.map +1 -1
- package/lib/browser/workbench-protocol.js.map +1 -1
- package/lib/browser/workbench.d.ts +7 -1
- package/lib/browser/workbench.d.ts.map +1 -1
- package/lib/browser/workbench.js +23 -0
- package/lib/browser/workbench.js.map +1 -1
- package/package.json +7 -7
- package/src/browser/chat/chat-view.tsx +1 -1
- package/src/browser/components/account-menu.tsx +23 -20
- package/src/browser/components/app-view.tsx +2 -0
- package/src/browser/components/chat-list.tsx +9 -2
- package/src/browser/components/folder-picker.spec.ts +17 -0
- package/src/browser/components/folder-picker.tsx +221 -39
- package/src/browser/components/remote-hosts.tsx +149 -0
- package/src/browser/components/remote-prompts.tsx +111 -0
- package/src/browser/components/settings-view.tsx +8 -0
- package/src/browser/components/web-composer.tsx +17 -3
- package/src/browser/components/working-directory.tsx +1 -1
- package/src/browser/extension/icons.ts +4 -0
- package/src/browser/extension/web-extension-api.ts +4 -2
- package/src/browser/extension/web-extensions.ts +12 -2
- package/src/browser/i18n/messages.ts +75 -13
- package/src/browser/notices/notices.spec.ts +1 -1
- package/src/browser/style/base.ts +6 -1
- package/src/browser/style/layout.ts +48 -15
- package/src/browser/util/message.spec.ts +2 -0
- package/src/browser/util/message.ts +7 -4
- package/src/browser/workbench-protocol.ts +8 -0
- package/src/browser/workbench.ts +29 -0
|
@@ -1,28 +1,59 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type TaDirEntry, TaLocation, type TaRemoteEvent, type TaRemoteServer } from '@celljs/ta-protocol';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
+
import { type Translate } from '../i18n/use-t.js';
|
|
4
|
+
/** The hosts of ssh, for a picker that offers them: TaWorkbench has it all (TaRemoteServer and its events). */
|
|
5
|
+
export interface FolderPickerRemote {
|
|
6
|
+
readonly remote: Pick<TaRemoteServer, 'listHosts' | 'resolveLocation'>;
|
|
7
|
+
readonly state: {
|
|
8
|
+
server?: {
|
|
9
|
+
cwd: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
onRemoteEvent(listener: (event: TaRemoteEvent) => void): () => void;
|
|
13
|
+
}
|
|
14
|
+
export declare namespace RemoteHostsUtil {
|
|
15
|
+
/** Why what the user typed is no host, in their words. */
|
|
16
|
+
function problem(read: Exclude<TaLocation.HostInput, {
|
|
17
|
+
host: string;
|
|
18
|
+
}>, input: string, t: Translate): string;
|
|
19
|
+
}
|
|
3
20
|
export declare namespace FolderPickerUtil {
|
|
4
|
-
/** The directory above
|
|
21
|
+
/** The directory above; undefined at a root (`/`, `C:\`, the root of a host). */
|
|
5
22
|
function parent(path: string): string | undefined;
|
|
6
23
|
function child(path: string, name: string): string;
|
|
7
24
|
/** The folders to offer: no files, no hidden ones (a path typed in still opens those). */
|
|
8
25
|
function folders(entries: TaDirEntry[]): TaDirEntry[];
|
|
26
|
+
/** Where the tab of this computer starts: `initial` when it is a path of it, else the server's, else the root. */
|
|
27
|
+
function localStart(initial: string, serverCwd: string | undefined): string;
|
|
28
|
+
/** What the user typed, as a location of the machine shown: a path there, or a whole location. */
|
|
29
|
+
function typed(input: string, host: string | undefined): string;
|
|
9
30
|
}
|
|
10
31
|
export interface FolderPickerProps {
|
|
11
32
|
/** The entries of a directory of the server. */
|
|
12
33
|
list(directory: string): Promise<TaDirEntry[]>;
|
|
13
|
-
/** Where it opens. */
|
|
34
|
+
/** Where it opens: a path, or an `ssh://` location. */
|
|
14
35
|
initial: string;
|
|
15
36
|
onPick(path: string): Promise<void>;
|
|
16
37
|
onClose(): void;
|
|
38
|
+
/** Offers the hosts of ssh too. */
|
|
39
|
+
remote?: FolderPickerRemote;
|
|
17
40
|
}
|
|
18
|
-
/**
|
|
19
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Picks a directory, of the machine of the server or of a host it reaches with ssh, folder by folder or by
|
|
43
|
+
* a path typed in, to open a conversation there.
|
|
44
|
+
*/
|
|
45
|
+
export declare function FolderPicker({ list, initial, onPick, onClose, remote: bench }: FolderPickerProps): React.ReactElement;
|
|
46
|
+
/** The name of a directory, with the host of one of another machine. */
|
|
47
|
+
export declare function DirectoryName({ cwd }: {
|
|
48
|
+
cwd: string;
|
|
49
|
+
}): React.ReactElement;
|
|
20
50
|
export interface DirectoryButtonProps {
|
|
21
51
|
/** The directory now. */
|
|
22
52
|
cwd: string;
|
|
23
53
|
/** The entries of a directory of the server, the same function from one render to the next. */
|
|
24
54
|
list(directory: string): Promise<TaDirEntry[]>;
|
|
25
55
|
onPick(cwd: string): void | Promise<void>;
|
|
56
|
+
remote?: FolderPickerRemote;
|
|
26
57
|
}
|
|
27
58
|
/** The directory a new conversation will work in, beside the + of its message box: a click picks another. */
|
|
28
|
-
export declare function DirectoryButton({ cwd, list, onPick }: DirectoryButtonProps): React.ReactElement;
|
|
59
|
+
export declare function DirectoryButton({ cwd, list, onPick, remote }: DirectoryButtonProps): React.ReactElement;
|
|
@@ -1,25 +1,27 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TaLocation } from '@celljs/ta-protocol';
|
|
2
|
+
import { ChevronDown, ChevronRight, CornerLeftUp, Folder, Monitor, Plus, Server, X } from 'lucide-react';
|
|
2
3
|
import * as React from 'react';
|
|
3
4
|
import { createPortal } from 'react-dom';
|
|
4
5
|
import { useT } from '../i18n/use-t.js';
|
|
5
6
|
import { MessageUtil } from '../util/message.js';
|
|
6
7
|
import { Icon, IconButton } from './icon.js';
|
|
8
|
+
export var RemoteHostsUtil;
|
|
9
|
+
(function (RemoteHostsUtil) {
|
|
10
|
+
/** Why what the user typed is no host, in their words. */
|
|
11
|
+
function problem(read, input, t) {
|
|
12
|
+
return read.error === 'options' ? t('ta.remote.options', { options: read.options.join(' ') }) : t('ta.remote.invalid', { host: input.trim() });
|
|
13
|
+
}
|
|
14
|
+
RemoteHostsUtil.problem = problem;
|
|
15
|
+
})(RemoteHostsUtil || (RemoteHostsUtil = {}));
|
|
7
16
|
export var FolderPickerUtil;
|
|
8
17
|
(function (FolderPickerUtil) {
|
|
9
|
-
/** The directory above
|
|
18
|
+
/** The directory above; undefined at a root (`/`, `C:\`, the root of a host). */
|
|
10
19
|
function parent(path) {
|
|
11
|
-
|
|
12
|
-
const at = Math.max(trimmed.lastIndexOf('/'), trimmed.lastIndexOf('\\'));
|
|
13
|
-
if (at < 0) {
|
|
14
|
-
return undefined;
|
|
15
|
-
}
|
|
16
|
-
const head = trimmed.slice(0, at);
|
|
17
|
-
return head === '' || /^[A-Za-z]:$/.test(head) ? head + trimmed[at] : head;
|
|
20
|
+
return TaLocation.parent(path);
|
|
18
21
|
}
|
|
19
22
|
FolderPickerUtil.parent = parent;
|
|
20
23
|
function child(path, name) {
|
|
21
|
-
|
|
22
|
-
return path.endsWith(separator) ? path + name : path + separator + name;
|
|
24
|
+
return TaLocation.child(path, name);
|
|
23
25
|
}
|
|
24
26
|
FolderPickerUtil.child = child;
|
|
25
27
|
/** The folders to offer: no files, no hidden ones (a path typed in still opens those). */
|
|
@@ -27,33 +29,141 @@ export var FolderPickerUtil;
|
|
|
27
29
|
return entries.filter(entry => entry.kind === 'directory' && !entry.name.startsWith('.'));
|
|
28
30
|
}
|
|
29
31
|
FolderPickerUtil.folders = folders;
|
|
32
|
+
/** Where the tab of this computer starts: `initial` when it is a path of it, else the server's, else the root. */
|
|
33
|
+
function localStart(initial, serverCwd) {
|
|
34
|
+
if (!TaLocation.isRemote(initial)) {
|
|
35
|
+
return initial;
|
|
36
|
+
}
|
|
37
|
+
return serverCwd && !TaLocation.isRemote(serverCwd) ? serverCwd : '/';
|
|
38
|
+
}
|
|
39
|
+
FolderPickerUtil.localStart = localStart;
|
|
40
|
+
/** What the user typed, as a location of the machine shown: a path there, or a whole location. */
|
|
41
|
+
function typed(input, host) {
|
|
42
|
+
const text = input.trim();
|
|
43
|
+
return host && !TaLocation.isRemote(text) ? TaLocation.ssh(host, text.startsWith('/') ? text : `/${text}`) : text;
|
|
44
|
+
}
|
|
45
|
+
FolderPickerUtil.typed = typed;
|
|
30
46
|
})(FolderPickerUtil || (FolderPickerUtil = {}));
|
|
31
|
-
/**
|
|
32
|
-
|
|
47
|
+
/** What the host of the picker is doing while it connects, from the events of TaRemoteServer. */
|
|
48
|
+
function useConnecting(bench, host) {
|
|
49
|
+
const t = useT();
|
|
50
|
+
const [step, setStep] = React.useState();
|
|
51
|
+
React.useEffect(() => {
|
|
52
|
+
setStep(undefined);
|
|
53
|
+
return bench === null || bench === void 0 ? void 0 : bench.onRemoteEvent((event) => {
|
|
54
|
+
var _a;
|
|
55
|
+
if (event.type === 'progress' && event.host === host) {
|
|
56
|
+
setStep(t(`ta.remote.step.${event.step}`, { host, detail: (_a = event.detail) !== null && _a !== void 0 ? _a : '' }));
|
|
57
|
+
}
|
|
58
|
+
else if (event.type === 'connection' && event.host === host) {
|
|
59
|
+
setStep(undefined);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}, [bench, host, t]);
|
|
63
|
+
return step;
|
|
64
|
+
}
|
|
65
|
+
/** This computer and the hosts of ssh, as tabs; `+` names another host. */
|
|
66
|
+
function Machines({ host, hosts, onPick }) {
|
|
67
|
+
const t = useT();
|
|
68
|
+
const [adding, setAdding] = React.useState(false);
|
|
69
|
+
const [name, setName] = React.useState('');
|
|
70
|
+
const shown = host && !hosts.some(known => known.host === host) ? [{ host, source: 'recent', connected: false }, ...hosts] : hosts;
|
|
71
|
+
const [problem, setProblem] = React.useState();
|
|
72
|
+
const add = () => {
|
|
73
|
+
const read = TaLocation.readHost(name);
|
|
74
|
+
if ('error' in read) {
|
|
75
|
+
setProblem(RemoteHostsUtil.problem(read, name, t));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
setAdding(false);
|
|
79
|
+
setName('');
|
|
80
|
+
setProblem(undefined);
|
|
81
|
+
onPick(read.host);
|
|
82
|
+
};
|
|
83
|
+
return (React.createElement(React.Fragment, null,
|
|
84
|
+
React.createElement("div", { className: "ta-chips ta-folder-machines", role: "tablist", "aria-label": t('ta.remote.local') },
|
|
85
|
+
React.createElement("button", { type: "button", role: "tab", "aria-selected": !host, className: "ta-chip-filter", onClick: () => onPick(undefined) },
|
|
86
|
+
React.createElement(Icon, { icon: Monitor, size: 13 }),
|
|
87
|
+
t('ta.remote.local')),
|
|
88
|
+
shown.map(known => (React.createElement("button", { key: known.host, type: "button", role: "tab", "aria-selected": known.host === host, className: "ta-chip-filter", title: known.connected ? `${known.host} · ${t('ta.remote.connected')}` : known.host, onClick: () => onPick(known.host) },
|
|
89
|
+
React.createElement(Icon, { icon: Server, size: 13 }),
|
|
90
|
+
known.host,
|
|
91
|
+
known.connected && React.createElement("span", { className: "ta-remote-dot" })))),
|
|
92
|
+
adding ? (React.createElement("form", { className: "ta-folder-add", onSubmit: event => {
|
|
93
|
+
event.preventDefault();
|
|
94
|
+
add();
|
|
95
|
+
} },
|
|
96
|
+
React.createElement("input", { autoFocus: true, spellCheck: false, value: name, placeholder: t('ta.remote.addHint'), "aria-label": t('ta.remote.add'), "aria-invalid": problem ? true : undefined, onChange: event => {
|
|
97
|
+
setName(event.target.value);
|
|
98
|
+
setProblem(undefined);
|
|
99
|
+
}, onBlur: () => !name.trim() && setAdding(false), onKeyDown: event => {
|
|
100
|
+
if (event.key === 'Escape') {
|
|
101
|
+
event.stopPropagation();
|
|
102
|
+
setAdding(false);
|
|
103
|
+
}
|
|
104
|
+
} }))) : (React.createElement(IconButton, { icon: Plus, label: t('ta.remote.add'), onClick: () => setAdding(true) }))),
|
|
105
|
+
problem && React.createElement("div", { className: "ta-folder-failed" }, problem)));
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Picks a directory, of the machine of the server or of a host it reaches with ssh, folder by folder or by
|
|
109
|
+
* a path typed in, to open a conversation there.
|
|
110
|
+
*/
|
|
111
|
+
export function FolderPicker({ list, initial, onPick, onClose, remote: bench }) {
|
|
112
|
+
var _a;
|
|
33
113
|
const t = useT();
|
|
34
114
|
const [path, setPath] = React.useState(initial);
|
|
35
|
-
const [input, setInput] = React.useState(initial);
|
|
115
|
+
const [input, setInput] = React.useState(TaLocation.path(initial));
|
|
36
116
|
const [folders, setFolders] = React.useState();
|
|
37
117
|
const [failed, setFailed] = React.useState();
|
|
38
118
|
const [busy, setBusy] = React.useState(false);
|
|
119
|
+
const [hosts, setHosts] = React.useState([]);
|
|
120
|
+
/** The machine being shown, even before its first directory came. */
|
|
121
|
+
const [host, setHost] = React.useState(TaLocation.host(initial));
|
|
39
122
|
/** A directory is being read: picking now would take the one before. */
|
|
40
123
|
const [loading, setLoading] = React.useState(true);
|
|
124
|
+
const connecting = useConnecting(bench, loading ? host : undefined);
|
|
41
125
|
const latest = React.useRef(0);
|
|
126
|
+
/** The machine whose folders are listed: a failure on another one leaves none listed. */
|
|
127
|
+
const listed = React.useRef(undefined);
|
|
128
|
+
/** Where `This computer` goes: the directory of this machine shown last. */
|
|
129
|
+
const local = React.useRef(FolderPickerUtil.localStart(initial, (_a = bench === null || bench === void 0 ? void 0 : bench.state.server) === null || _a === void 0 ? void 0 : _a.cwd));
|
|
42
130
|
const go = React.useCallback((next) => {
|
|
131
|
+
var _a;
|
|
43
132
|
const request = ++latest.current;
|
|
44
133
|
setFailed(undefined);
|
|
45
134
|
setLoading(true);
|
|
46
|
-
|
|
47
|
-
|
|
135
|
+
setHost(TaLocation.host(next));
|
|
136
|
+
setInput(TaLocation.path(next));
|
|
137
|
+
// A host's home directory is known once connected.
|
|
138
|
+
const resolved = bench && ((_a = TaLocation.parse(next)) === null || _a === void 0 ? void 0 : _a.path) === '' ? bench.remote.resolveLocation(next) : Promise.resolve(next);
|
|
139
|
+
resolved
|
|
140
|
+
.then(async (location) => ({ location, entries: await list(location) }))
|
|
141
|
+
.then(({ location, entries }) => {
|
|
48
142
|
if (request === latest.current) {
|
|
49
|
-
setPath(
|
|
50
|
-
setInput(
|
|
143
|
+
setPath(location);
|
|
144
|
+
setInput(TaLocation.path(location));
|
|
51
145
|
setFolders(FolderPickerUtil.folders(entries));
|
|
146
|
+
listed.current = TaLocation.host(location);
|
|
147
|
+
if (!TaLocation.isRemote(location)) {
|
|
148
|
+
local.current = location;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}, error => {
|
|
152
|
+
if (request !== latest.current) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const host = TaLocation.host(next);
|
|
156
|
+
if (host !== listed.current) {
|
|
157
|
+
setFolders(undefined);
|
|
52
158
|
}
|
|
53
|
-
|
|
159
|
+
setFailed(host && error instanceof Error ? error.message : t('ta.folder.failed', { path: next }));
|
|
160
|
+
})
|
|
54
161
|
.finally(() => request === latest.current && setLoading(false));
|
|
55
|
-
}, [list]);
|
|
162
|
+
}, [bench, list, t]);
|
|
56
163
|
React.useEffect(() => go(initial), [go, initial]);
|
|
164
|
+
React.useEffect(() => {
|
|
165
|
+
bench === null || bench === void 0 ? void 0 : bench.remote.listHosts().then(setHosts, () => undefined);
|
|
166
|
+
}, [bench]);
|
|
57
167
|
const up = FolderPickerUtil.parent(path);
|
|
58
168
|
const pick = () => {
|
|
59
169
|
setBusy(true);
|
|
@@ -65,40 +175,52 @@ export function FolderPicker({ list, initial, onPick, onClose }) {
|
|
|
65
175
|
React.createElement("div", { className: "ta-modal-head" },
|
|
66
176
|
React.createElement("span", { className: "ta-modal-title" }, t('ta.folder.title')),
|
|
67
177
|
React.createElement(IconButton, { icon: X, label: t('ta.close'), onClick: onClose })),
|
|
178
|
+
bench && React.createElement(Machines, { host: host, hosts: hosts, onPick: next => go(next ? TaLocation.ssh(next) : local.current) }),
|
|
68
179
|
React.createElement("form", { className: "ta-folder-bar", onSubmit: event => {
|
|
69
180
|
event.preventDefault();
|
|
70
181
|
if (input.trim()) {
|
|
71
|
-
go(
|
|
182
|
+
go(FolderPickerUtil.typed(input, host));
|
|
72
183
|
}
|
|
73
184
|
} },
|
|
74
185
|
React.createElement(IconButton, { icon: CornerLeftUp, label: t('ta.folder.up'), disabled: !up, onClick: () => up && go(up) }),
|
|
75
186
|
React.createElement("label", { className: "ta-field ta-field-small" },
|
|
76
187
|
React.createElement("input", { autoFocus: true, spellCheck: false, value: input, "aria-label": t('ta.folder.path'), title: t('ta.folder.path'), onChange: event => setInput(event.target.value) }))),
|
|
77
188
|
React.createElement("ul", { className: "ta-folder-list" },
|
|
78
|
-
folders === undefined && !failed && (React.createElement("li", { className: "ta-folder-note" },
|
|
79
|
-
React.createElement("span", { className: "ta-spinner" })
|
|
80
|
-
|
|
81
|
-
|
|
189
|
+
(folders === undefined || (loading && connecting)) && !failed && (React.createElement("li", { className: "ta-folder-note" },
|
|
190
|
+
React.createElement("span", { className: "ta-spinner" }),
|
|
191
|
+
connecting && React.createElement("span", { className: "ta-folder-step" }, connecting))),
|
|
192
|
+
!(loading && connecting) &&
|
|
193
|
+
(folders === null || folders === void 0 ? void 0 : folders.map(folder => (React.createElement("li", { key: folder.name },
|
|
82
194
|
React.createElement("button", { type: "button", className: "ta-folder-item", onClick: () => go(FolderPickerUtil.child(path, folder.name)) },
|
|
83
195
|
React.createElement(Icon, { icon: Folder, size: 16 }),
|
|
84
196
|
React.createElement("span", { className: "ta-folder-name" }, folder.name),
|
|
85
|
-
React.createElement(Icon, { icon: ChevronRight, size: 14, className: "ta-folder-chevron" }))))),
|
|
86
|
-
(folders === null || folders === void 0 ? void 0 : folders.length) === 0 && React.createElement("li", { className: "ta-folder-note" }, t('ta.folder.empty'))
|
|
87
|
-
|
|
197
|
+
React.createElement(Icon, { icon: ChevronRight, size: 14, className: "ta-folder-chevron" })))))),
|
|
198
|
+
(folders === null || folders === void 0 ? void 0 : folders.length) === 0 && !connecting && React.createElement("li", { className: "ta-folder-note" }, t('ta.folder.empty')),
|
|
199
|
+
folders === undefined && failed && host && (React.createElement("li", { className: "ta-folder-unreachable" },
|
|
200
|
+
React.createElement("strong", null, t('ta.remote.failed', { host })),
|
|
201
|
+
React.createElement("span", null, failed)))),
|
|
202
|
+
failed && !(folders === undefined && host) && React.createElement("div", { className: "ta-folder-failed" }, failed),
|
|
88
203
|
React.createElement("div", { className: "ta-dialog-actions" },
|
|
89
204
|
React.createElement("button", { type: "button", className: "ta-button", onClick: onClose }, t('ta.cancel')),
|
|
90
|
-
React.createElement("button", { type: "button", className: "ta-button ta-primary", disabled: busy || loading || folders === undefined, onClick: pick }, t('ta.folder.open'))))), document.body);
|
|
205
|
+
React.createElement("button", { type: "button", className: "ta-button ta-primary", disabled: busy || loading || folders === undefined || TaLocation.host(path) !== host, onClick: pick }, t('ta.folder.open'))))), document.body);
|
|
206
|
+
}
|
|
207
|
+
/** The name of a directory, with the host of one of another machine. */
|
|
208
|
+
export function DirectoryName({ cwd }) {
|
|
209
|
+
const host = TaLocation.host(cwd);
|
|
210
|
+
return (React.createElement(React.Fragment, null,
|
|
211
|
+
React.createElement(Icon, { icon: host ? Server : Folder, size: 14 }),
|
|
212
|
+
React.createElement("span", { className: "ta-ellipsis" }, MessageUtil.basename(cwd) || cwd),
|
|
213
|
+
host && React.createElement("span", { className: "ta-host-tag" }, host)));
|
|
91
214
|
}
|
|
92
215
|
/** The directory a new conversation will work in, beside the + of its message box: a click picks another. */
|
|
93
|
-
export function DirectoryButton({ cwd, list, onPick }) {
|
|
216
|
+
export function DirectoryButton({ cwd, list, onPick, remote }) {
|
|
94
217
|
const t = useT();
|
|
95
218
|
const [picking, setPicking] = React.useState(false);
|
|
96
219
|
return (React.createElement(React.Fragment, null,
|
|
97
220
|
React.createElement("button", { type: "button", className: "ta-cwd-chip", title: t('ta.chat.cwdTitle', { path: cwd }), onClick: () => setPicking(true) },
|
|
98
|
-
React.createElement(
|
|
99
|
-
React.createElement("span", { className: "ta-ellipsis" }, MessageUtil.basename(cwd) || cwd),
|
|
221
|
+
React.createElement(DirectoryName, { cwd: cwd }),
|
|
100
222
|
React.createElement(Icon, { icon: ChevronDown, size: 13 })),
|
|
101
|
-
picking && (React.createElement(FolderPicker, { list: list, initial: cwd, onClose: () => setPicking(false), onPick: async (path) => {
|
|
223
|
+
picking && (React.createElement(FolderPicker, { list: list, initial: cwd, remote: remote, onClose: () => setPicking(false), onPick: async (path) => {
|
|
102
224
|
await onPick(path);
|
|
103
225
|
setPicking(false);
|
|
104
226
|
} }))));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folder-picker.js","sourceRoot":"","sources":["../../../src/browser/components/folder-picker.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"folder-picker.js","sourceRoot":"","sources":["../../../src/browser/components/folder-picker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The machines conversations can work on (`ssh://` directories): those of ~/.ssh/config and those added,
|
|
4
|
+
* whether Ta is connected to each, and the ports forwarded from them. Connecting checks a host the way a
|
|
5
|
+
* conversation would: ssh signs in, Ta installs what it needs there.
|
|
6
|
+
*/
|
|
7
|
+
export declare function RemoteHosts(): React.JSX.Element;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { TaLocation } from '@celljs/ta-protocol';
|
|
2
|
+
import { Plug, Plus, Server, Trash2, Unplug, X } from 'lucide-react';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { useNotices, useWorkbench } from '../hooks.js';
|
|
5
|
+
import { useT } from '../i18n/use-t.js';
|
|
6
|
+
import { RemoteHostsUtil } from './folder-picker.js';
|
|
7
|
+
import { Icon, IconButton } from './icon.js';
|
|
8
|
+
import { Row } from './settings-controls.js';
|
|
9
|
+
/** The hosts and forwarded ports of TaRemoteServer, read again when a host connects or disconnects. */
|
|
10
|
+
function useRemote() {
|
|
11
|
+
const [workbench, bench] = useWorkbench();
|
|
12
|
+
const [hosts, setHosts] = React.useState([]);
|
|
13
|
+
const [ports, setPorts] = React.useState([]);
|
|
14
|
+
const read = React.useCallback(async () => {
|
|
15
|
+
const [listed, forwarded] = await Promise.all([bench.remote.listHosts(), bench.remote.listForwardedPorts()]);
|
|
16
|
+
setHosts(listed);
|
|
17
|
+
setPorts(forwarded);
|
|
18
|
+
}, [bench]);
|
|
19
|
+
React.useEffect(() => {
|
|
20
|
+
if (workbench.status !== 'online') {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
read().catch(() => undefined);
|
|
24
|
+
return bench.onRemoteEvent(event => event.type === 'connection' && void read().catch(() => undefined));
|
|
25
|
+
}, [workbench.status, bench, read]);
|
|
26
|
+
return { bench, hosts, ports, read };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The machines conversations can work on (`ssh://` directories): those of ~/.ssh/config and those added,
|
|
30
|
+
* whether Ta is connected to each, and the ports forwarded from them. Connecting checks a host the way a
|
|
31
|
+
* conversation would: ssh signs in, Ta installs what it needs there.
|
|
32
|
+
*/
|
|
33
|
+
export function RemoteHosts() {
|
|
34
|
+
const t = useT();
|
|
35
|
+
const [, notices] = useNotices();
|
|
36
|
+
const { bench, hosts, ports, read } = useRemote();
|
|
37
|
+
const [text, setText] = React.useState('');
|
|
38
|
+
const [busy, setBusy] = React.useState();
|
|
39
|
+
const run = async (host, action) => {
|
|
40
|
+
setBusy(host);
|
|
41
|
+
try {
|
|
42
|
+
await action();
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
notices.error(error);
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
setBusy(undefined);
|
|
49
|
+
await read().catch(() => undefined);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const add = () => {
|
|
53
|
+
const read = TaLocation.readHost(text);
|
|
54
|
+
if ('error' in read) {
|
|
55
|
+
notices.notify(RemoteHostsUtil.problem(read, text, t), { level: 'warning' });
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
setText('');
|
|
59
|
+
void run(read.host, () => bench.remote.addHost(read.host));
|
|
60
|
+
};
|
|
61
|
+
return (React.createElement(React.Fragment, null,
|
|
62
|
+
React.createElement(Row, { label: t('ta.remote.add'), description: t('ta.remote.description'), stacked: true },
|
|
63
|
+
React.createElement("form", { className: "ta-trusted-add", onSubmit: event => {
|
|
64
|
+
event.preventDefault();
|
|
65
|
+
add();
|
|
66
|
+
} },
|
|
67
|
+
React.createElement("input", { className: "ta-input", value: text, placeholder: t('ta.remote.addHint'), "aria-label": t('ta.remote.add'), spellCheck: false, onChange: event => setText(event.target.value) }),
|
|
68
|
+
React.createElement("button", { type: "submit", className: "ta-button", disabled: !text.trim() },
|
|
69
|
+
React.createElement(Icon, { icon: Plus, size: 14 }),
|
|
70
|
+
" ",
|
|
71
|
+
t('ta.remote.add')))),
|
|
72
|
+
hosts.length === 0 && React.createElement(Row, { label: t('ta.remote.none') }),
|
|
73
|
+
hosts.map(host => (React.createElement(Row, { key: host.host, label: host.host, description: React.createElement("span", { className: "ta-remote-state" },
|
|
74
|
+
React.createElement("span", { className: `ta-remote-light${host.connected ? ' ta-on' : ''}` }),
|
|
75
|
+
[
|
|
76
|
+
t(host.connected ? 'ta.remote.connected' : 'ta.remote.disconnected'),
|
|
77
|
+
t(host.source === 'config' ? 'ta.remote.fromConfig' : 'ta.remote.added'),
|
|
78
|
+
].join(' · ')) },
|
|
79
|
+
host.connected ? (React.createElement("button", { type: "button", className: "ta-button", disabled: busy === host.host, onClick: () => run(host.host, () => bench.remote.disconnect(host.host)) },
|
|
80
|
+
React.createElement(Icon, { icon: Unplug, size: 14 }),
|
|
81
|
+
" ",
|
|
82
|
+
t('ta.remote.disconnect'))) : (React.createElement("button", { type: "button", className: "ta-button", disabled: busy === host.host, onClick: () => run(host.host, async () => {
|
|
83
|
+
await bench.remote.resolveLocation(TaLocation.ssh(host.host));
|
|
84
|
+
notices.notify(t('ta.remote.connectedTo', { host: host.host }), { level: 'success' });
|
|
85
|
+
}) },
|
|
86
|
+
busy === host.host ? React.createElement("span", { className: "ta-spinner" }) : React.createElement(Icon, { icon: Plug, size: 14 }),
|
|
87
|
+
" ",
|
|
88
|
+
t('ta.remote.connect'))),
|
|
89
|
+
host.source === 'recent' && (React.createElement(IconButton, { icon: Trash2, label: t('ta.remote.remove', { host: host.host }), disabled: busy === host.host, onClick: () => run(host.host, () => bench.remote.removeHost(host.host)) }))))),
|
|
90
|
+
ports.map(port => (React.createElement(Row, { key: `${port.host}:${port.remotePort}`, label: t('ta.remote.port', { host: port.host, port: port.remotePort }), description: `localhost:${port.localPort}` },
|
|
91
|
+
React.createElement(Icon, { icon: Server, size: 14, className: "ta-muted" }),
|
|
92
|
+
React.createElement(IconButton, { icon: X, label: t('ta.remote.closePort'), onClick: () => run(port.host, () => bench.remote.closeForwardedPort(port.host, port.remotePort)) }))))));
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=remote-hosts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-hosts.js","sourceRoot":"","sources":["../../../src/browser/components/remote-hosts.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* What ssh asks while ta serve connects to a host, one question at a time, in every page that is open (the
|
|
4
|
+
* first answer counts); a line at the bottom while a host connects, which may take a while the first
|
|
5
|
+
* time (it installs Node.js there); and a notice when a connection is lost.
|
|
6
|
+
*/
|
|
7
|
+
export declare function RemotePrompts(): React.JSX.Element;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { KeyRound, Server, ShieldQuestion } from 'lucide-react';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { createPortal } from 'react-dom';
|
|
4
|
+
import { useNotices, useWorkbench } from '../hooks.js';
|
|
5
|
+
import { useT } from '../i18n/use-t.js';
|
|
6
|
+
import { Icon } from './icon.js';
|
|
7
|
+
/** Asks what ssh asks: a password or a passphrase (not shown), whether to trust a new host, or a line of text. */
|
|
8
|
+
function PromptDialog({ prompt, onAnswer }) {
|
|
9
|
+
const t = useT();
|
|
10
|
+
const [value, setValue] = React.useState('');
|
|
11
|
+
const confirm = prompt.kind === 'confirm';
|
|
12
|
+
return createPortal(React.createElement("div", { className: "ta-modal-scrim" },
|
|
13
|
+
React.createElement("button", { type: "button", className: "ta-overlay-close", "aria-label": t('ta.cancel'), tabIndex: -1, onClick: () => onAnswer(null) }),
|
|
14
|
+
React.createElement("form", { className: "ta-modal ta-confirm ta-remote-prompt", role: "alertdialog", "aria-modal": "true", "aria-label": t('ta.remote.prompt.title', { host: prompt.host }), onKeyDown: event => event.key === 'Escape' && onAnswer(null), onSubmit: event => {
|
|
15
|
+
event.preventDefault();
|
|
16
|
+
onAnswer(confirm ? 'yes' : value);
|
|
17
|
+
} },
|
|
18
|
+
React.createElement("div", { className: "ta-confirm-title" },
|
|
19
|
+
React.createElement(Icon, { icon: confirm ? ShieldQuestion : prompt.kind === 'secret' ? KeyRound : Server, size: 16 }),
|
|
20
|
+
t('ta.remote.prompt.title', { host: prompt.host })),
|
|
21
|
+
React.createElement("pre", { className: "ta-remote-message" }, prompt.message),
|
|
22
|
+
!confirm && (React.createElement("label", { className: "ta-field" },
|
|
23
|
+
React.createElement("input", { autoFocus: true, type: prompt.kind === 'secret' ? 'password' : 'text', autoComplete: "off", spellCheck: false, value: value, "aria-label": prompt.message, onChange: event => setValue(event.target.value) }))),
|
|
24
|
+
React.createElement("div", { className: "ta-dialog-actions" },
|
|
25
|
+
React.createElement("button", { type: "button", className: "ta-button", onClick: () => onAnswer(confirm ? 'no' : null) }, t('ta.cancel')),
|
|
26
|
+
React.createElement("button", { type: "submit", className: "ta-button ta-primary", autoFocus: confirm }, t(confirm ? 'ta.remote.prompt.trust' : 'ta.remote.prompt.continue'))))), document.body);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* What ssh asks while ta serve connects to a host, one question at a time, in every page that is open (the
|
|
30
|
+
* first answer counts); a line at the bottom while a host connects, which may take a while the first
|
|
31
|
+
* time (it installs Node.js there); and a notice when a connection is lost.
|
|
32
|
+
*/
|
|
33
|
+
export function RemotePrompts() {
|
|
34
|
+
const t = useT();
|
|
35
|
+
const [, bench] = useWorkbench();
|
|
36
|
+
const [, notices] = useNotices();
|
|
37
|
+
const [prompts, setPrompts] = React.useState([]);
|
|
38
|
+
const [steps, setSteps] = React.useState({});
|
|
39
|
+
const connected = React.useRef(new Set());
|
|
40
|
+
React.useEffect(() => bench.onRemoteEvent((event) => {
|
|
41
|
+
if (event.type === 'prompt') {
|
|
42
|
+
setPrompts(shown => (shown.some(prompt => prompt.promptId === event.prompt.promptId) ? shown : [...shown, event.prompt]));
|
|
43
|
+
}
|
|
44
|
+
else if (event.type === 'prompt_closed') {
|
|
45
|
+
setPrompts(shown => shown.filter(prompt => prompt.promptId !== event.promptId));
|
|
46
|
+
}
|
|
47
|
+
else if (event.type === 'progress') {
|
|
48
|
+
setSteps(shown => { var _a; return ({ ...shown, [event.host]: t(`ta.remote.step.${event.step}`, { host: event.host, detail: (_a = event.detail) !== null && _a !== void 0 ? _a : '' }) }); });
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
setSteps(({ [event.host]: _gone, ...rest }) => rest);
|
|
52
|
+
// Lost, not closed on purpose; a connection that failed is the caller's to tell.
|
|
53
|
+
if (!event.connected && event.error && connected.current.has(event.host)) {
|
|
54
|
+
notices.notify(t('ta.remote.lost', { host: event.host }), { level: 'warning', detail: event.error });
|
|
55
|
+
}
|
|
56
|
+
connected.current[event.connected ? 'add' : 'delete'](event.host);
|
|
57
|
+
}
|
|
58
|
+
}), [bench, notices, t]);
|
|
59
|
+
const [prompt] = prompts;
|
|
60
|
+
const answer = (value) => {
|
|
61
|
+
setPrompts(shown => shown.slice(1));
|
|
62
|
+
void bench.remote.answer(prompt.promptId, value).catch(() => undefined);
|
|
63
|
+
};
|
|
64
|
+
const lines = Object.values(steps);
|
|
65
|
+
return (React.createElement(React.Fragment, null,
|
|
66
|
+
prompt && React.createElement(PromptDialog, { key: prompt.promptId, prompt: prompt, onAnswer: answer }),
|
|
67
|
+
lines.length > 0 &&
|
|
68
|
+
createPortal(React.createElement("div", { className: "ta-remote-status", role: "status" },
|
|
69
|
+
React.createElement("span", { className: "ta-spinner" }),
|
|
70
|
+
lines.join(' · ')), document.body)));
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=remote-prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-prompts.js","sourceRoot":"","sources":["../../../src/browser/components/remote-prompts.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Blocks, FolderOpen, Globe, Info, Keyboard, KeyRound, Languages, Layers, Link2, LogOut, Menu, MessagesSquare, Monitor, Moon, Palette, Puzzle, RefreshCw, Search, Smartphone, Sparkles, Sun, Trash2, Volume2, Wrench, X, } from 'lucide-react';
|
|
1
|
+
import { Blocks, FolderOpen, Globe, Info, Keyboard, KeyRound, Languages, Layers, Link2, LogOut, Menu, MessagesSquare, Monitor, Moon, Palette, Puzzle, RefreshCw, Search, Server, Smartphone, Sparkles, Sun, Trash2, Volume2, Wrench, X, } from 'lucide-react';
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { useNotices, useSettings, useWebExtensions, useWorkbench } from '../hooks.js';
|
|
4
4
|
import { useT } from '../i18n/use-t.js';
|
|
@@ -7,6 +7,7 @@ import { AgentControl, ScopeBar, useAgentSettings } from './agent-settings-view.
|
|
|
7
7
|
import { AuthDialog } from './auth-view.js';
|
|
8
8
|
import { Icon, IconButton } from './icon.js';
|
|
9
9
|
import { RelayDialog } from './relay-view.js';
|
|
10
|
+
import { RemoteHosts } from './remote-hosts.js';
|
|
10
11
|
import { Keys, Row, row, Segmented, Switch } from './settings-controls.js';
|
|
11
12
|
import { TrustedDomains } from './trusted-domains.js';
|
|
12
13
|
import { WorkingDirectoryPicker } from './working-directory.js';
|
|
@@ -206,6 +207,12 @@ function useParts(scope, onScope, onClose, onDialog) {
|
|
|
206
207
|
React.createElement(Switch, { label: t(builtin.title), checked: !settings.builtinsOff.includes(builtin.name), onChange: on => toggleBuiltin(builtin.name, on) })))),
|
|
207
208
|
],
|
|
208
209
|
},
|
|
210
|
+
{
|
|
211
|
+
id: 'remote',
|
|
212
|
+
title: t('ta.remote.title'),
|
|
213
|
+
icon: Server,
|
|
214
|
+
rows: [row('remote', [t('ta.remote.title'), t('ta.remote.description'), 'ssh'], React.createElement(RemoteHosts, null))],
|
|
215
|
+
},
|
|
209
216
|
{
|
|
210
217
|
id: 'shortcuts',
|
|
211
218
|
title: t('ta.settings.shortcuts'),
|