@celljs/ta-web 4.6.1 → 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.
Files changed (147) hide show
  1. package/README.en.md +90 -0
  2. package/README.md +12 -6
  3. package/esm/browser/chat/chat-view.js +1 -1
  4. package/esm/browser/chat/chat-view.js.map +1 -1
  5. package/esm/browser/components/account-menu.d.ts +3 -2
  6. package/esm/browser/components/account-menu.js +21 -16
  7. package/esm/browser/components/account-menu.js.map +1 -1
  8. package/esm/browser/components/app-view.js +3 -1
  9. package/esm/browser/components/app-view.js.map +1 -1
  10. package/esm/browser/components/chat-list.d.ts +3 -1
  11. package/esm/browser/components/chat-list.js +6 -1
  12. package/esm/browser/components/chat-list.js.map +1 -1
  13. package/esm/browser/components/folder-picker.d.ts +37 -6
  14. package/esm/browser/components/folder-picker.js +155 -33
  15. package/esm/browser/components/folder-picker.js.map +1 -1
  16. package/esm/browser/components/remote-hosts.d.ts +7 -0
  17. package/esm/browser/components/remote-hosts.js +94 -0
  18. package/esm/browser/components/remote-hosts.js.map +1 -0
  19. package/esm/browser/components/remote-prompts.d.ts +7 -0
  20. package/esm/browser/components/remote-prompts.js +72 -0
  21. package/esm/browser/components/remote-prompts.js.map +1 -0
  22. package/esm/browser/components/settings-view.js +8 -1
  23. package/esm/browser/components/settings-view.js.map +1 -1
  24. package/esm/browser/components/web-composer.d.ts +4 -1
  25. package/esm/browser/components/web-composer.js +2 -2
  26. package/esm/browser/components/web-composer.js.map +1 -1
  27. package/esm/browser/components/working-directory.js +1 -1
  28. package/esm/browser/components/working-directory.js.map +1 -1
  29. package/esm/browser/extension/icons.js +3 -1
  30. package/esm/browser/extension/icons.js.map +1 -1
  31. package/esm/browser/extension/web-extension-api.d.ts +4 -2
  32. package/esm/browser/extension/web-extensions.js +11 -1
  33. package/esm/browser/extension/web-extensions.js.map +1 -1
  34. package/esm/browser/i18n/locales.d.ts +32 -1
  35. package/esm/browser/i18n/messages.d.ts +31 -0
  36. package/esm/browser/i18n/messages.js +75 -13
  37. package/esm/browser/i18n/messages.js.map +1 -1
  38. package/esm/browser/style/base.d.ts +1 -1
  39. package/esm/browser/style/base.js +6 -1
  40. package/esm/browser/style/base.js.map +1 -1
  41. package/esm/browser/style/layout.d.ts +1 -1
  42. package/esm/browser/style/layout.js +48 -15
  43. package/esm/browser/style/layout.js.map +1 -1
  44. package/esm/browser/util/message.d.ts +1 -0
  45. package/esm/browser/util/message.js +7 -5
  46. package/esm/browser/util/message.js.map +1 -1
  47. package/esm/browser/workbench-protocol.d.ts +7 -1
  48. package/esm/browser/workbench-protocol.js.map +1 -1
  49. package/esm/browser/workbench.d.ts +7 -1
  50. package/esm/browser/workbench.js +23 -0
  51. package/esm/browser/workbench.js.map +1 -1
  52. package/lib/browser/chat/chat-view.js +1 -1
  53. package/lib/browser/chat/chat-view.js.map +1 -1
  54. package/lib/browser/components/account-menu.d.ts +3 -2
  55. package/lib/browser/components/account-menu.d.ts.map +1 -1
  56. package/lib/browser/components/account-menu.js +21 -16
  57. package/lib/browser/components/account-menu.js.map +1 -1
  58. package/lib/browser/components/app-view.d.ts.map +1 -1
  59. package/lib/browser/components/app-view.js +3 -1
  60. package/lib/browser/components/app-view.js.map +1 -1
  61. package/lib/browser/components/chat-list.d.ts +3 -1
  62. package/lib/browser/components/chat-list.d.ts.map +1 -1
  63. package/lib/browser/components/chat-list.js +6 -1
  64. package/lib/browser/components/chat-list.js.map +1 -1
  65. package/lib/browser/components/folder-picker.d.ts +37 -6
  66. package/lib/browser/components/folder-picker.d.ts.map +1 -1
  67. package/lib/browser/components/folder-picker.js +156 -33
  68. package/lib/browser/components/folder-picker.js.map +1 -1
  69. package/lib/browser/components/folder-picker.spec.js +15 -0
  70. package/lib/browser/components/folder-picker.spec.js.map +1 -1
  71. package/lib/browser/components/remote-hosts.d.ts +8 -0
  72. package/lib/browser/components/remote-hosts.d.ts.map +1 -0
  73. package/lib/browser/components/remote-hosts.js +130 -0
  74. package/lib/browser/components/remote-hosts.js.map +1 -0
  75. package/lib/browser/components/remote-prompts.d.ts +8 -0
  76. package/lib/browser/components/remote-prompts.d.ts.map +1 -0
  77. package/lib/browser/components/remote-prompts.js +108 -0
  78. package/lib/browser/components/remote-prompts.js.map +1 -0
  79. package/lib/browser/components/settings-view.d.ts.map +1 -1
  80. package/lib/browser/components/settings-view.js +7 -0
  81. package/lib/browser/components/settings-view.js.map +1 -1
  82. package/lib/browser/components/web-composer.d.ts +4 -1
  83. package/lib/browser/components/web-composer.d.ts.map +1 -1
  84. package/lib/browser/components/web-composer.js +2 -2
  85. package/lib/browser/components/web-composer.js.map +1 -1
  86. package/lib/browser/components/working-directory.js +1 -1
  87. package/lib/browser/components/working-directory.js.map +1 -1
  88. package/lib/browser/extension/icons.d.ts.map +1 -1
  89. package/lib/browser/extension/icons.js +2 -0
  90. package/lib/browser/extension/icons.js.map +1 -1
  91. package/lib/browser/extension/web-extension-api.d.ts +4 -2
  92. package/lib/browser/extension/web-extension-api.d.ts.map +1 -1
  93. package/lib/browser/extension/web-extensions.d.ts.map +1 -1
  94. package/lib/browser/extension/web-extensions.js +11 -1
  95. package/lib/browser/extension/web-extensions.js.map +1 -1
  96. package/lib/browser/i18n/locales.d.ts +32 -1
  97. package/lib/browser/i18n/locales.d.ts.map +1 -1
  98. package/lib/browser/i18n/messages.d.ts +31 -0
  99. package/lib/browser/i18n/messages.d.ts.map +1 -1
  100. package/lib/browser/i18n/messages.js +75 -13
  101. package/lib/browser/i18n/messages.js.map +1 -1
  102. package/lib/browser/notices/notices.spec.js +1 -1
  103. package/lib/browser/notices/notices.spec.js.map +1 -1
  104. package/lib/browser/style/base.d.ts +1 -1
  105. package/lib/browser/style/base.d.ts.map +1 -1
  106. package/lib/browser/style/base.js +6 -1
  107. package/lib/browser/style/base.js.map +1 -1
  108. package/lib/browser/style/layout.d.ts +1 -1
  109. package/lib/browser/style/layout.d.ts.map +1 -1
  110. package/lib/browser/style/layout.js +48 -15
  111. package/lib/browser/style/layout.js.map +1 -1
  112. package/lib/browser/util/message.d.ts +1 -0
  113. package/lib/browser/util/message.d.ts.map +1 -1
  114. package/lib/browser/util/message.js +7 -5
  115. package/lib/browser/util/message.js.map +1 -1
  116. package/lib/browser/util/message.spec.js +2 -0
  117. package/lib/browser/util/message.spec.js.map +1 -1
  118. package/lib/browser/workbench-protocol.d.ts +7 -1
  119. package/lib/browser/workbench-protocol.d.ts.map +1 -1
  120. package/lib/browser/workbench-protocol.js.map +1 -1
  121. package/lib/browser/workbench.d.ts +7 -1
  122. package/lib/browser/workbench.d.ts.map +1 -1
  123. package/lib/browser/workbench.js +23 -0
  124. package/lib/browser/workbench.js.map +1 -1
  125. package/package.json +7 -7
  126. package/src/browser/chat/chat-view.tsx +1 -1
  127. package/src/browser/components/account-menu.tsx +23 -20
  128. package/src/browser/components/app-view.tsx +2 -0
  129. package/src/browser/components/chat-list.tsx +9 -2
  130. package/src/browser/components/folder-picker.spec.ts +17 -0
  131. package/src/browser/components/folder-picker.tsx +221 -39
  132. package/src/browser/components/remote-hosts.tsx +149 -0
  133. package/src/browser/components/remote-prompts.tsx +111 -0
  134. package/src/browser/components/settings-view.tsx +8 -0
  135. package/src/browser/components/web-composer.tsx +17 -3
  136. package/src/browser/components/working-directory.tsx +1 -1
  137. package/src/browser/extension/icons.ts +4 -0
  138. package/src/browser/extension/web-extension-api.ts +4 -2
  139. package/src/browser/extension/web-extensions.ts +12 -2
  140. package/src/browser/i18n/messages.ts +75 -13
  141. package/src/browser/notices/notices.spec.ts +1 -1
  142. package/src/browser/style/base.ts +6 -1
  143. package/src/browser/style/layout.ts +48 -15
  144. package/src/browser/util/message.spec.ts +2 -0
  145. package/src/browser/util/message.ts +7 -4
  146. package/src/browser/workbench-protocol.ts +8 -0
  147. package/src/browser/workbench.ts +29 -0
@@ -1,28 +1,59 @@
1
- import type { TaDirEntry } from '@celljs/ta-protocol';
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 `path`; undefined at a root (`/`, `C:\\`). */
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
- /** Picks a directory of the server, folder by folder or by a path typed in, to open a conversation there. */
19
- export declare function FolderPicker({ list, initial, onPick, onClose }: FolderPickerProps): React.ReactElement;
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 { ChevronDown, ChevronRight, CornerLeftUp, Folder, X } from 'lucide-react';
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 `path`; undefined at a root (`/`, `C:\\`). */
18
+ /** The directory above; undefined at a root (`/`, `C:\`, the root of a host). */
10
19
  function parent(path) {
11
- const trimmed = path.replace(/[\\/]+$/, '');
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
- const separator = path.includes('/') || !path.includes('\\') ? '/' : '\\';
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
- /** Picks a directory of the server, folder by folder or by a path typed in, to open a conversation there. */
32
- export function FolderPicker({ list, initial, onPick, onClose }) {
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
- list(next)
47
- .then(entries => {
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(next);
50
- setInput(next);
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
- }, () => request === latest.current && setFailed(next))
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(input.trim());
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
- folders === null || folders === void 0 ? void 0 :
81
- folders.map(folder => (React.createElement("li", { key: folder.name },
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
- failed && React.createElement("div", { className: "ta-folder-failed" }, t('ta.folder.failed', { path: failed })),
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(Icon, { icon: Folder, size: 14 }),
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'),