@lemoncat7/dsh-ssh 1.14.1 → 1.16.19

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 (109) hide show
  1. package/README.md +14 -2
  2. package/docs/compatibility-0.2.2-rc.1.md +13 -0
  3. package/docs/releases/1.15.0.md +16 -0
  4. package/docs/releases/1.16.0.md +19 -0
  5. package/docs/releases/1.16.1.md +7 -0
  6. package/docs/releases/1.16.10.md +8 -0
  7. package/docs/releases/1.16.11.md +5 -0
  8. package/docs/releases/1.16.12.md +9 -0
  9. package/docs/releases/1.16.13.md +7 -0
  10. package/docs/releases/1.16.14.md +7 -0
  11. package/docs/releases/1.16.15.md +5 -0
  12. package/docs/releases/1.16.16.md +5 -0
  13. package/docs/releases/1.16.17.md +5 -0
  14. package/docs/releases/1.16.18.md +5 -0
  15. package/docs/releases/1.16.19.md +21 -0
  16. package/docs/releases/1.16.2.md +7 -0
  17. package/docs/releases/1.16.3.md +11 -0
  18. package/docs/releases/1.16.4.md +10 -0
  19. package/docs/releases/1.16.5.md +9 -0
  20. package/docs/releases/1.16.6.md +7 -0
  21. package/docs/releases/1.16.7.md +7 -0
  22. package/docs/releases/1.16.8.md +19 -0
  23. package/docs/releases/1.16.9.md +7 -0
  24. package/lib/api.d.ts.map +1 -1
  25. package/lib/api.js +19 -1
  26. package/lib/api.js.map +1 -1
  27. package/lib/client-api.d.ts +1 -0
  28. package/lib/client-api.d.ts.map +1 -1
  29. package/lib/client-api.js.map +1 -1
  30. package/lib/client.d.ts.map +1 -1
  31. package/lib/client.js +382 -143
  32. package/lib/client.js.map +4 -4
  33. package/lib/commands-panel.js +1 -1
  34. package/lib/commands-panel.js.map +1 -1
  35. package/lib/domain.d.ts +3 -0
  36. package/lib/domain.d.ts.map +1 -1
  37. package/lib/domain.js +2 -0
  38. package/lib/domain.js.map +1 -1
  39. package/lib/file-transfer-tools.js +4 -3
  40. package/lib/file-transfer-tools.js.map +1 -1
  41. package/lib/file-transfer-workspace.d.ts.map +1 -1
  42. package/lib/file-transfer-workspace.js +4 -4
  43. package/lib/file-transfer-workspace.js.map +1 -1
  44. package/lib/host-action-menu.d.ts +10 -0
  45. package/lib/host-action-menu.d.ts.map +1 -0
  46. package/lib/host-action-menu.js +32 -0
  47. package/lib/host-action-menu.js.map +1 -0
  48. package/lib/host-select.d.ts +9 -0
  49. package/lib/host-select.d.ts.map +1 -0
  50. package/lib/host-select.js +92 -0
  51. package/lib/host-select.js.map +1 -0
  52. package/lib/locales/messages.d.ts +216 -0
  53. package/lib/locales/messages.d.ts.map +1 -1
  54. package/lib/locales/messages.js +54 -0
  55. package/lib/locales/messages.js.map +1 -1
  56. package/lib/profile-editor.d.ts.map +1 -1
  57. package/lib/profile-editor.js +4 -1
  58. package/lib/profile-editor.js.map +1 -1
  59. package/lib/remote-workspace-tree.d.ts +4 -0
  60. package/lib/remote-workspace-tree.d.ts.map +1 -1
  61. package/lib/remote-workspace-tree.js +97 -34
  62. package/lib/remote-workspace-tree.js.map +1 -1
  63. package/lib/settings-pane.js +1 -1
  64. package/lib/settings-pane.js.map +1 -1
  65. package/lib/sftp-client.d.ts +3 -1
  66. package/lib/sftp-client.d.ts.map +1 -1
  67. package/lib/sftp-client.js +11 -10
  68. package/lib/sftp-client.js.map +1 -1
  69. package/lib/sftp-path-mapping.d.ts +9 -0
  70. package/lib/sftp-path-mapping.d.ts.map +1 -0
  71. package/lib/sftp-path-mapping.js +36 -0
  72. package/lib/sftp-path-mapping.js.map +1 -0
  73. package/lib/sftp.js +1 -1
  74. package/lib/sftp.js.map +1 -1
  75. package/lib/split-icon.d.ts +4 -0
  76. package/lib/split-icon.d.ts.map +1 -0
  77. package/lib/split-icon.js +5 -0
  78. package/lib/split-icon.js.map +1 -0
  79. package/lib/sync-panel.js +1 -1
  80. package/lib/sync-panel.js.map +1 -1
  81. package/lib/terminal-desk-state.d.ts +71 -0
  82. package/lib/terminal-desk-state.d.ts.map +1 -0
  83. package/lib/terminal-desk-state.js +205 -0
  84. package/lib/terminal-desk-state.js.map +1 -0
  85. package/lib/terminal-desk.d.ts +16 -0
  86. package/lib/terminal-desk.d.ts.map +1 -0
  87. package/lib/terminal-desk.js +197 -0
  88. package/lib/terminal-desk.js.map +1 -0
  89. package/lib/terminal-session.d.ts +5 -1
  90. package/lib/terminal-session.d.ts.map +1 -1
  91. package/lib/terminal-session.js +52 -18
  92. package/lib/terminal-session.js.map +1 -1
  93. package/lib/terminal-transport.d.ts.map +1 -1
  94. package/lib/terminal-transport.js +7 -4
  95. package/lib/terminal-transport.js.map +1 -1
  96. package/lib/terminal-workspace-state.d.ts +45 -0
  97. package/lib/terminal-workspace-state.d.ts.map +1 -0
  98. package/lib/terminal-workspace-state.js +110 -0
  99. package/lib/terminal-workspace-state.js.map +1 -0
  100. package/lib/terminal-workspace.d.ts +2 -1
  101. package/lib/terminal-workspace.d.ts.map +1 -1
  102. package/lib/terminal-workspace.js +43 -19
  103. package/lib/terminal-workspace.js.map +1 -1
  104. package/lib/terminal.d.ts +10 -3
  105. package/lib/terminal.d.ts.map +1 -1
  106. package/lib/terminal.js +33 -4
  107. package/lib/terminal.js.map +1 -1
  108. package/lib/tools.js.map +1 -1
  109. package/package.json +35 -34
@@ -0,0 +1,10 @@
1
+ import { type KeyboardEvent, type ReactNode } from 'react';
2
+ /** Keep SSH-owned tokens while escaping clipping and external stacking contexts. */
3
+ export declare function HostActionMenu({ anchor, label, children, onKeyDown }: {
4
+ anchor: HTMLElement | null;
5
+ label: string;
6
+ children: ReactNode;
7
+ onKeyDown(event: KeyboardEvent<HTMLElement>): void;
8
+ }): JSX.Element;
9
+ export declare function TerminalActionIcon(): JSX.Element;
10
+ //# sourceMappingURL=host-action-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-action-menu.d.ts","sourceRoot":"","sources":["../src/host-action-menu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEnF,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,IAAI,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAqB1M;AAED,wBAAgB,kBAAkB,IAAI,GAAG,CAAC,OAAO,CAEhD"}
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useLayoutEffect, useRef } from 'react';
3
+ /** Keep SSH-owned tokens while escaping clipping and external stacking contexts. */
4
+ export function HostActionMenu({ anchor, label, children, onKeyDown }) {
5
+ const ref = useRef(null);
6
+ useLayoutEffect(() => {
7
+ const menu = ref.current;
8
+ if (!menu || !anchor)
9
+ return;
10
+ menu.setAttribute('popover', 'manual');
11
+ menu.showPopover();
12
+ const place = () => {
13
+ const rect = anchor.getBoundingClientRect();
14
+ const width = menu.offsetWidth, height = menu.offsetHeight;
15
+ const left = Math.max(8, Math.min(rect.right - width, window.innerWidth - width - 8));
16
+ const top = rect.bottom + height + 6 <= window.innerHeight - 8 ? rect.bottom + 6 : Math.max(8, rect.top - height - 6);
17
+ menu.style.left = `${left}px`;
18
+ menu.style.top = `${top}px`;
19
+ };
20
+ place();
21
+ menu.querySelector('button:not(:disabled)')?.focus({ preventScroll: true });
22
+ window.addEventListener('resize', place);
23
+ document.addEventListener('scroll', place, true);
24
+ return () => { window.removeEventListener('resize', place); document.removeEventListener('scroll', place, true); if (menu.matches(':popover-open'))
25
+ menu.hidePopover(); };
26
+ }, [anchor]);
27
+ return _jsx("div", { ref: ref, className: "dsh-ssh-tree-menu dsh-ssh-host-popover", role: "menu", "aria-label": label, onKeyDown: onKeyDown, children: children });
28
+ }
29
+ export function TerminalActionIcon() {
30
+ return _jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.7", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "m4 6 6 6-6 6m9 0h7" }) });
31
+ }
32
+ //# sourceMappingURL=host-action-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-action-menu.js","sourceRoot":"","sources":["../src/host-action-menu.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAsC,MAAM,OAAO,CAAA;AAEnF,oFAAoF;AACpF,MAAM,UAAU,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAA0H;IAC3L,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IACxC,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAA;QACxB,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QAC5B,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QACtC,IAAI,CAAC,WAAW,EAAE,CAAA;QAClB,MAAM,KAAK,GAAG,GAAS,EAAE;YACvB,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAA;YAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC,YAAY,CAAA;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;YACrF,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC,CAAA;YACrH,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC;YAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAA;QAC5D,CAAC,CAAA;QACD,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,aAAa,CAAoB,uBAAuB,CAAC,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QAC9F,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QACxC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;QAChD,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;YAAE,IAAI,CAAC,WAAW,EAAE,CAAA,CAAC,CAAC,CAAA;IAC1K,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IACZ,OAAO,cAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAC,wCAAwC,EAAC,IAAI,EAAC,MAAM,gBAAa,KAAK,EAAE,SAAS,EAAE,SAAS,YAAG,QAAQ,GAAO,CAAA;AAChJ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,iBAAa,MAAM,YAAC,eAAM,CAAC,EAAC,oBAAoB,GAAG,GAAM,CAAA;AAClN,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type ProfileView } from './client-api.js';
2
+ /** Search selects a saved host by ID; typed text is never a connection target. */
3
+ export declare function HostSelect({ profiles, value, onChange, onEditingChange }: {
4
+ profiles: ProfileView[];
5
+ value: string;
6
+ onChange(id: string): void;
7
+ onEditingChange?(editing: boolean): void;
8
+ }): JSX.Element;
9
+ //# sourceMappingURL=host-select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-select.d.ts","sourceRoot":"","sources":["../src/host-select.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAIlE,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE;IAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,eAAe,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CA2DxM"}
@@ -0,0 +1,92 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useId, useLayoutEffect, useRef, useState } from 'react';
3
+ import { IconChevronDownOutlineRegular } from '@deepseek-ai/dsh-client-ui-primitives';
4
+ import { profileAddress } from './client-api.js';
5
+ import { t } from './i18n.js';
6
+ import { useSshLocale } from './use-ssh-locale.js';
7
+ /** Search selects a saved host by ID; typed text is never a connection target. */
8
+ export function HostSelect({ profiles, value, onChange, onEditingChange }) {
9
+ useSshLocale();
10
+ const id = useId();
11
+ const root = useRef(null);
12
+ const input = useRef(null);
13
+ const menu = useRef(null);
14
+ const [open, setOpen] = useState(false);
15
+ const [query, setQuery] = useState('');
16
+ const [active, setActive] = useState(0);
17
+ const selected = profiles.find(profile => profile.id === value);
18
+ const words = query.toLocaleLowerCase().trim().split(/\s+/).filter(Boolean);
19
+ const matches = profiles.filter(profile => {
20
+ const text = `${profile.name} ${profileAddress(profile)} ${profile.group ?? ''} ${profile.tags.join(' ')}`.toLocaleLowerCase();
21
+ return words.every(word => text.includes(word));
22
+ });
23
+ const activeIndex = Math.min(active, Math.max(0, matches.length - 1));
24
+ const dismiss = () => { setOpen(false); setQuery(''); onEditingChange?.(false); };
25
+ const expand = () => { setQuery(''); setActive(Math.max(0, profiles.findIndex(profile => profile.id === value))); setOpen(true); };
26
+ const choose = (profile) => { onChange(profile.id); dismiss(); input.current?.focus(); };
27
+ useEffect(() => {
28
+ if (!open)
29
+ return;
30
+ const outside = (event) => { if (event.target instanceof Node && !root.current?.contains(event.target))
31
+ dismiss(); };
32
+ document.addEventListener('pointerdown', outside);
33
+ return () => document.removeEventListener('pointerdown', outside);
34
+ }, [open, onEditingChange]);
35
+ useLayoutEffect(() => {
36
+ const element = menu.current;
37
+ if (!open || !element)
38
+ return;
39
+ element.setAttribute('popover', 'manual');
40
+ element.showPopover();
41
+ const place = () => {
42
+ const rect = input.current.getBoundingClientRect();
43
+ const below = window.innerHeight - rect.bottom - 10, above = rect.top - 10;
44
+ const upward = below < 180 && above > below;
45
+ element.style.left = `${Math.max(8, Math.min(rect.left, window.innerWidth - rect.width - 8))}px`;
46
+ element.style.width = `${Math.min(rect.width, window.innerWidth - 16)}px`;
47
+ element.style.maxHeight = `${Math.min(320, Math.max(80, upward ? above : below))}px`;
48
+ element.style.top = upward ? 'auto' : `${rect.bottom + 5}px`;
49
+ element.style.bottom = upward ? `${window.innerHeight - rect.top + 5}px` : 'auto';
50
+ };
51
+ place();
52
+ const scroll = (event) => { if (!(event.target instanceof Node) || !element.contains(event.target))
53
+ place(); };
54
+ window.addEventListener('resize', place);
55
+ document.addEventListener('scroll', scroll, true);
56
+ return () => { window.removeEventListener('resize', place); document.removeEventListener('scroll', scroll, true); if (element.matches(':popover-open'))
57
+ element.hidePopover(); };
58
+ }, [open]);
59
+ useEffect(() => { if (open)
60
+ document.getElementById(`${id}-${activeIndex}`)?.scrollIntoView({ block: 'nearest' }); }, [open, activeIndex, query, id]);
61
+ return _jsxs("div", { className: "dsh-ssh-host-select", ref: root, onBlur: event => { if (!event.currentTarget.contains(event.relatedTarget))
62
+ dismiss(); }, children: [_jsx("input", { ref: input, role: "combobox", "aria-label": t('client.host'), "aria-autocomplete": "list", "aria-expanded": open, "aria-controls": open ? id : undefined, "aria-activedescendant": open && matches.length ? `${id}-${activeIndex}` : undefined, autoComplete: "off", spellCheck: false, placeholder: t('host-select.search'), value: open ? query : selected ? `${selected.name} · ${profileAddress(selected)}` : '', onFocus: expand, onClick: () => { if (!open)
63
+ expand(); }, onChange: event => { setQuery(event.target.value); setActive(0); setOpen(true); onEditingChange?.(true); }, onKeyDown: event => {
64
+ if (event.nativeEvent.isComposing)
65
+ return;
66
+ if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
67
+ event.preventDefault();
68
+ if (!open)
69
+ expand();
70
+ else
71
+ setActive((activeIndex + (event.key === 'ArrowDown' ? 1 : -1) + matches.length) % Math.max(1, matches.length));
72
+ }
73
+ else if (event.key === 'Enter' && open) {
74
+ event.preventDefault();
75
+ if (matches[activeIndex])
76
+ choose(matches[activeIndex]);
77
+ }
78
+ else if (event.key === 'Escape' && open) {
79
+ event.preventDefault();
80
+ event.stopPropagation();
81
+ dismiss();
82
+ }
83
+ else if (event.key === 'Tab')
84
+ dismiss();
85
+ } }), _jsx("button", { type: "button", className: "dsh-ssh-host-select-toggle", tabIndex: -1, "aria-label": t('host-select.show'), "aria-expanded": open, onPointerDown: event => event.preventDefault(), onClick: () => { if (open)
86
+ dismiss();
87
+ else {
88
+ input.current?.focus();
89
+ expand();
90
+ } }, children: _jsx(IconChevronDownOutlineRegular, { size: 15 }) }), open && _jsx("div", { ref: menu, id: id, role: "listbox", "aria-label": t('host-select.matches'), className: "dsh-ssh-host-options dsh-ssh-scroll-surface", onMouseDown: event => event.preventDefault(), children: matches.length ? matches.map((profile, index) => _jsxs("button", { type: "button", role: "option", tabIndex: -1, id: `${id}-${index}`, "aria-selected": profile.id === value, "data-active": index === activeIndex, onPointerMove: () => setActive(index), onClick: () => choose(profile), children: [_jsxs("span", { children: [_jsx("strong", { children: profile.name }), _jsx("small", { children: profileAddress(profile) })] }), profile.group && _jsx("em", { children: profile.group })] }, profile.id)) : _jsx("p", { role: "status", children: profiles.length ? t('host-select.noMatches') : t('host-select.empty') }) })] });
91
+ }
92
+ //# sourceMappingURL=host-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-select.js","sourceRoot":"","sources":["../src/host-select.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3E,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAA;AACrF,OAAO,EAAE,cAAc,EAAoB,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAAE,CAAC,EAAE,MAAM,WAAW,CAAA;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,kFAAkF;AAClF,MAAM,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAoH;IACzL,YAAY,EAAE,CAAA;IACd,MAAM,EAAE,GAAG,KAAK,EAAE,CAAA;IAClB,MAAM,IAAI,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IACzC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACtC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,CAAA;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC3E,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QACxC,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAA;QAC9H,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IACF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;IACrE,MAAM,OAAO,GAAG,GAAS,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,CAAA;IACtF,MAAM,MAAM,GAAG,GAAS,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC,CAAA;IACvI,MAAM,MAAM,GAAG,CAAC,OAAoB,EAAQ,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,CAAA,CAAC,CAAC,CAAA;IAC1G,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,MAAM,OAAO,GAAG,CAAC,KAAmB,EAAQ,EAAE,GAAG,IAAI,KAAK,CAAC,MAAM,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAA,CAAC,CAAC,CAAA;QACvI,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;QACjD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;IACnE,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAA;IAC3B,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAM;QAC7B,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QACzC,OAAO,CAAC,WAAW,EAAE,CAAA;QACrB,MAAM,KAAK,GAAG,GAAS,EAAE;YACvB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAQ,CAAC,qBAAqB,EAAE,CAAA;YACnD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,EAAE,CAAA;YAC1E,MAAM,MAAM,GAAG,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,KAAK,CAAA;YAC3C,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;YAChG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,IAAI,CAAA;YACzE,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAA;YACpF,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAA;YAC5D,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;QACnF,CAAC,CAAA;QACD,KAAK,EAAE,CAAA;QACP,MAAM,MAAM,GAAG,CAAC,KAAY,EAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,KAAK,EAAE,CAAA,CAAC,CAAC,CAAA;QAC1H,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;QAC3F,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;YAAE,OAAO,CAAC,WAAW,EAAE,CAAA,CAAC,CAAC,CAAA;IACjL,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IACV,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI;QAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,WAAW,EAAE,CAAC,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAA;IACpJ,OAAO,eAAK,SAAS,EAAC,qBAAqB,EAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,aAA4B,CAAC;YAAE,OAAO,EAAE,CAAA,CAAC,CAAC,aAC1J,gBAAO,GAAG,EAAE,KAAK,EAAE,IAAI,EAAC,UAAU,gBAAa,CAAC,CAAC,aAAa,CAAC,uBAAoB,MAAM,mBAAgB,IAAI,mBAAiB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,2BAAyB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,YAAY,EAAC,KAAK,EAAC,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,MAAM,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI;oBAAE,MAAM,EAAE,CAAA,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE;oBAClkB,IAAI,KAAK,CAAC,WAAW,CAAC,WAAW;wBAAE,OAAM;oBACzC,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;wBAAC,KAAK,CAAC,cAAc,EAAE,CAAC;wBAAC,IAAI,CAAC,IAAI;4BAAE,MAAM,EAAE,CAAC;;4BAAM,SAAS,CAAC,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;oBAAC,CAAC;yBACzN,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,IAAI,EAAE,CAAC;wBAAC,KAAK,CAAC,cAAc,EAAE,CAAC;wBAAC,IAAI,OAAO,CAAC,WAAW,CAAC;4BAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAE,CAAC,CAAA;oBAAC,CAAC;yBACtH,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,EAAE,CAAC;wBAAC,KAAK,CAAC,cAAc,EAAE,CAAC;wBAAC,KAAK,CAAC,eAAe,EAAE,CAAC;wBAAC,OAAO,EAAE,CAAA;oBAAC,CAAC;yBAClG,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK;wBAAE,OAAO,EAAE,CAAA;gBACzC,CAAC,GAAI,EACL,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,4BAA4B,EAAC,QAAQ,EAAE,CAAC,CAAC,gBAAc,CAAC,CAAC,kBAAkB,CAAC,mBAAiB,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,IAAI;oBAAE,OAAO,EAAE,CAAC;qBAAM,CAAC;oBAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;oBAAC,MAAM,EAAE,CAAA;gBAAC,CAAC,CAAC,CAAC,YAAE,KAAC,6BAA6B,IAAC,IAAI,EAAE,EAAE,GAAI,GAAS,EACzT,IAAI,IAAI,cAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAC,SAAS,gBAAa,CAAC,CAAC,qBAAqB,CAAC,EAAE,SAAS,EAAC,6CAA6C,EAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,YACvL,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,kBAAQ,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,mBAAkC,OAAO,CAAC,EAAE,KAAK,KAAK,iBAAe,KAAK,KAAK,WAAW,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,aAAE,2BAAM,2BAAS,OAAO,CAAC,IAAI,GAAU,EAAA,0BAAQ,cAAc,CAAC,OAAO,CAAC,GAAS,IAAO,EAAC,OAAO,CAAC,KAAK,IAAI,uBAAK,OAAO,CAAC,KAAK,GAAM,KAA1R,OAAO,CAAC,EAAE,CAA0R,CAAC,CAAC,CAAC,CAAC,YAAG,IAAI,EAAC,QAAQ,YAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAK,GAC/f,IACF,CAAA;AACR,CAAC"}
@@ -1,6 +1,218 @@
1
1
  /** UI-only catalog. Selected English translations adapted from knownasmobin/dsh-ssh PR #2 (MIT).
2
2
  * Semantic keys and explicit parameters must never be used for protocol or persisted data. */
3
3
  export declare const messages: {
4
+ readonly "desk.mountPurpose": {
5
+ readonly zh: "主要用于给当前 AI 会话挂载主机和项目目录,访问范围由会话权限控制。双击主机也可手动打开终端。";
6
+ readonly en: "Mount hosts and project directories for the current AI session, with access controlled by session permissions. Double-click a host to open a terminal manually.";
7
+ };
8
+ readonly "host-select.search": {
9
+ readonly zh: "输入主机名、地址或分组搜索";
10
+ readonly en: "Search host name, address or group";
11
+ };
12
+ readonly "host-select.show": {
13
+ readonly zh: "展开或收起主机列表";
14
+ readonly en: "Toggle host list";
15
+ };
16
+ readonly "host-select.matches": {
17
+ readonly zh: "匹配的主机";
18
+ readonly en: "Matching hosts";
19
+ };
20
+ readonly "host-select.noMatches": {
21
+ readonly zh: "没有匹配的主机,请换个关键词";
22
+ readonly en: "No matching hosts. Try another search.";
23
+ };
24
+ readonly "host-select.empty": {
25
+ readonly zh: "暂无主机,请先在主机与项目中添加";
26
+ readonly en: "No hosts yet. Add one in Hosts & Projects.";
27
+ };
28
+ readonly "sftp-client.pathMappings": {
29
+ readonly zh: "终端与 SFTP 目录映射";
30
+ readonly en: "Terminal to SFTP directory mappings";
31
+ };
32
+ readonly "sftp-client.pathMappingsHint": {
33
+ readonly zh: "仅用于终端目录跟随。每行填写:终端绝对路径 => SFTP 绝对路径。未匹配的路径保持原样。";
34
+ readonly en: "For terminal directory following only. One terminal absolute path => SFTP absolute path per line. Unmatched paths stay unchanged.";
35
+ };
36
+ readonly "sftp-client.followUnavailable": {
37
+ readonly zh: "SFTP 无法访问终端目录 {0},已保留当前列表。终端与 SFTP 的目录根可能不同,可在主机编辑中配置目录映射。详情:{1}";
38
+ readonly en: "SFTP cannot access terminal directory {0}; the current listing is retained. The terminal and SFTP may use different roots. Configure directory mappings in the host editor. Details: {1}";
39
+ };
40
+ readonly "desk.unavailableHost": {
41
+ readonly zh: "主机已移除或不可用";
42
+ readonly en: "Host removed or unavailable";
43
+ };
44
+ readonly "desk.projectActions": {
45
+ readonly zh: "{0} 的目录操作";
46
+ readonly en: "Directory actions for {0}";
47
+ };
48
+ readonly "desk.hostClickHint": {
49
+ readonly zh: "单击展开/收起固定目录,双击打开终端";
50
+ readonly en: "Click to toggle pinned directories; double-click to open a terminal";
51
+ };
52
+ readonly "desk.files": {
53
+ readonly zh: "文件";
54
+ readonly en: "Files";
55
+ };
56
+ readonly "desk.chooseTarget": {
57
+ readonly zh: "选择主机或项目开始使用";
58
+ readonly en: "Choose a host or project to begin";
59
+ };
60
+ readonly "desk.openTerminals": {
61
+ readonly zh: "已打开的终端";
62
+ readonly en: "Open terminals";
63
+ };
64
+ readonly "desk.phaseIdle": {
65
+ readonly zh: "未连接";
66
+ readonly en: "Disconnected";
67
+ };
68
+ readonly "desk.phaseConnecting": {
69
+ readonly zh: "连接中";
70
+ readonly en: "Connecting";
71
+ };
72
+ readonly "desk.phaseConnected": {
73
+ readonly zh: "已连接";
74
+ readonly en: "Connected";
75
+ };
76
+ readonly "desk.phaseError": {
77
+ readonly zh: "连接失败";
78
+ readonly en: "Connection failed";
79
+ };
80
+ readonly "desk.more": {
81
+ readonly zh: "更多";
82
+ readonly en: "More";
83
+ };
84
+ readonly "desk.filesOnly": {
85
+ readonly zh: "仅浏览文件";
86
+ readonly en: "Files only";
87
+ };
88
+ readonly "desk.terminalAndFiles": {
89
+ readonly zh: "终端与文件";
90
+ readonly en: "Terminal and files";
91
+ };
92
+ readonly "desk.connectionDetails": {
93
+ readonly zh: "连接详情";
94
+ readonly en: "Connection details";
95
+ };
96
+ readonly "desk.noTerminals": {
97
+ readonly zh: "双击主机或项目打开终端,也可以新建独立连接。";
98
+ readonly en: "Double-click a host or project, or open a new terminal.";
99
+ };
100
+ readonly "desk.paneNumber": {
101
+ readonly zh: "窗格 {0}";
102
+ readonly en: "Pane {0}";
103
+ };
104
+ readonly "desk.gridLayout": {
105
+ readonly zh: "四格分屏";
106
+ readonly en: "Four-pane grid";
107
+ };
108
+ readonly "desk.keepPanesTitle": {
109
+ readonly zh: "选择保留的终端";
110
+ readonly en: "Choose terminals to keep";
111
+ };
112
+ readonly "desk.keepPanesHint": {
113
+ readonly zh: "请选择保留 {0} 个终端。其余 {1} 个终端将关闭,可能中断正在运行的命令。";
114
+ readonly en: "Choose {0} terminals to keep. The other {1} terminals will close, which may interrupt running commands.";
115
+ };
116
+ readonly "desk.currentPane": {
117
+ readonly zh: "当前";
118
+ readonly en: "Current";
119
+ };
120
+ readonly "desk.willKeep": {
121
+ readonly zh: "保留";
122
+ readonly en: "Keep";
123
+ };
124
+ readonly "desk.willClose": {
125
+ readonly zh: "将关闭";
126
+ readonly en: "Will close";
127
+ };
128
+ readonly "desk.selectedPanes": {
129
+ readonly zh: "已选 {0} / {1} 个";
130
+ readonly en: "Selected {0} / {1}";
131
+ };
132
+ readonly "desk.confirmReduction": {
133
+ readonly zh: "保留所选并关闭其余终端";
134
+ readonly en: "Keep selected and close the rest";
135
+ };
136
+ readonly "desk.closeAllHint": {
137
+ readonly zh: "将关闭所有标签中的 {0} 个终端,包括当前未显示的终端,可能中断正在运行的命令。";
138
+ readonly en: "Close all {0} terminals across every tab, including hidden terminals. Running commands may be interrupted.";
139
+ };
140
+ readonly "desk.closeCount": {
141
+ readonly zh: "关闭 {0} 个终端";
142
+ readonly en: "Close {0} terminals";
143
+ };
144
+ readonly "desk.noFingerprint": {
145
+ readonly zh: "尚未保存主机指纹";
146
+ readonly en: "No saved host fingerprint";
147
+ };
148
+ readonly "desk.proxy": {
149
+ readonly zh: "代理方式";
150
+ readonly en: "Proxy";
151
+ };
152
+ readonly "desk.restartHint": {
153
+ readonly zh: "服务重启会断开连接;失效终端不会自动重跑命令。";
154
+ readonly en: "A server restart ends connections. Expired terminals never replay commands automatically.";
155
+ };
156
+ readonly "desk.projectDirectory": {
157
+ readonly zh: "项目或目录";
158
+ readonly en: "Project or directory";
159
+ };
160
+ readonly "desk.customDirectory": {
161
+ readonly zh: "自定义目录";
162
+ readonly en: "Custom directory";
163
+ };
164
+ readonly "desk.directory": {
165
+ readonly zh: "远端目录";
166
+ readonly en: "Remote directory";
167
+ };
168
+ readonly "desk.manualHint": {
169
+ readonly zh: "手动连接不会改变 AI 会话挂载或权限。";
170
+ readonly en: "Manual connections do not change AI session mounts or permissions.";
171
+ };
172
+ readonly "desk.noSession": {
173
+ readonly zh: "尚未选择会话";
174
+ readonly en: "No session selected";
175
+ };
176
+ readonly "desk.directExecution": {
177
+ readonly zh: "按当前授权直接执行";
178
+ readonly en: "Execute under current permissions";
179
+ };
180
+ readonly "desk.searchCatalogue": {
181
+ readonly zh: "搜索主机、分组、项目或目录";
182
+ readonly en: "Search hosts, groups, projects or paths";
183
+ };
184
+ readonly "desk.list": {
185
+ readonly zh: "列表";
186
+ readonly en: "List";
187
+ };
188
+ readonly "desk.cards": {
189
+ readonly zh: "卡片";
190
+ readonly en: "Cards";
191
+ };
192
+ readonly "desk.openTerminal": {
193
+ readonly zh: "打开终端";
194
+ readonly en: "Open terminal";
195
+ };
196
+ readonly "desk.openProjectHint": {
197
+ readonly zh: "单击选中,双击或 Enter 打开终端";
198
+ readonly en: "Select with one click; double-click or Enter to open a terminal";
199
+ };
200
+ readonly "desk.catalogueHint": {
201
+ readonly zh: "单击主机展开/收起固定目录,双击或 Enter 打开终端;挂载单独控制 AI 权限。";
202
+ readonly en: "Click a host to toggle pinned directories; double-click or Enter to open a terminal. Mount buttons control AI access separately.";
203
+ };
204
+ readonly "desk.accessHint": {
205
+ readonly zh: "查看当前会话的挂载与权限,切换终端不会改变授权";
206
+ readonly en: "Review current session mounts and permissions. Switching terminals does not change access.";
207
+ };
208
+ readonly "desk.aiMounts": {
209
+ readonly zh: "AI 挂载 {0}";
210
+ readonly en: "AI mounts {0}";
211
+ };
212
+ readonly 'terminal-session.retentionHint': {
213
+ readonly zh: "离开工作台保留连接;返回可继续操作。离开后无输入、输出或订阅满 30 分钟会回收。关闭标签或断开连接会立即结束终端。";
214
+ readonly en: "Leaving keeps the terminal connected. Return to resume. Detached terminals expire after 30 minutes without input, output or subscribers. Closing a tab or disconnecting ends the terminal.";
215
+ };
4
216
  readonly 'connection.timeout': {
5
217
  readonly zh: "SSH 连接超时";
6
218
  readonly en: "SSH connection timeout";
@@ -1765,6 +1977,10 @@ export declare const messages: {
1765
1977
  readonly zh: "FTP、FTPS 与 SFTP 之间直接流式互传";
1766
1978
  readonly en: "Direct streaming transfers between FTP, FTPS, and SFTP";
1767
1979
  };
1980
+ readonly "file-transfer-workspace.sessionAccessAction": {
1981
+ readonly zh: "会话访问";
1982
+ readonly en: "Session access";
1983
+ };
1768
1984
  readonly "file-transfer-workspace.sessionAccess": {
1769
1985
  readonly zh: "FTP 会话访问";
1770
1986
  readonly en: "FTP session access";
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/locales/messages.ts"],"names":[],"mappings":"AAAA;8FAC8F;AAC9F,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8yFX,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,QAAQ,CAAA"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/locales/messages.ts"],"names":[],"mappings":"AAAA;8FAC8F;AAC9F,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAo2FX,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,QAAQ,CAAA"}
@@ -1,6 +1,59 @@
1
1
  /** UI-only catalog. Selected English translations adapted from knownasmobin/dsh-ssh PR #2 (MIT).
2
2
  * Semantic keys and explicit parameters must never be used for protocol or persisted data. */
3
3
  export const messages = {
4
+ "desk.mountPurpose": { "zh": "主要用于给当前 AI 会话挂载主机和项目目录,访问范围由会话权限控制。双击主机也可手动打开终端。", "en": "Mount hosts and project directories for the current AI session, with access controlled by session permissions. Double-click a host to open a terminal manually." },
5
+ "host-select.search": { "zh": "输入主机名、地址或分组搜索", "en": "Search host name, address or group" },
6
+ "host-select.show": { "zh": "展开或收起主机列表", "en": "Toggle host list" },
7
+ "host-select.matches": { "zh": "匹配的主机", "en": "Matching hosts" },
8
+ "host-select.noMatches": { "zh": "没有匹配的主机,请换个关键词", "en": "No matching hosts. Try another search." },
9
+ "host-select.empty": { "zh": "暂无主机,请先在主机与项目中添加", "en": "No hosts yet. Add one in Hosts & Projects." },
10
+ "sftp-client.pathMappings": { "zh": "终端与 SFTP 目录映射", "en": "Terminal to SFTP directory mappings" },
11
+ "sftp-client.pathMappingsHint": { "zh": "仅用于终端目录跟随。每行填写:终端绝对路径 => SFTP 绝对路径。未匹配的路径保持原样。", "en": "For terminal directory following only. One terminal absolute path => SFTP absolute path per line. Unmatched paths stay unchanged." },
12
+ "sftp-client.followUnavailable": { "zh": "SFTP 无法访问终端目录 {0},已保留当前列表。终端与 SFTP 的目录根可能不同,可在主机编辑中配置目录映射。详情:{1}", "en": "SFTP cannot access terminal directory {0}; the current listing is retained. The terminal and SFTP may use different roots. Configure directory mappings in the host editor. Details: {1}" },
13
+ "desk.unavailableHost": { "zh": "主机已移除或不可用", "en": "Host removed or unavailable" },
14
+ "desk.projectActions": { "zh": "{0} 的目录操作", "en": "Directory actions for {0}" },
15
+ "desk.hostClickHint": { "zh": "单击展开/收起固定目录,双击打开终端", "en": "Click to toggle pinned directories; double-click to open a terminal" },
16
+ "desk.files": { "zh": "文件", "en": "Files" },
17
+ "desk.chooseTarget": { "zh": "选择主机或项目开始使用", "en": "Choose a host or project to begin" },
18
+ "desk.openTerminals": { "zh": "已打开的终端", "en": "Open terminals" },
19
+ "desk.phaseIdle": { "zh": "未连接", "en": "Disconnected" },
20
+ "desk.phaseConnecting": { "zh": "连接中", "en": "Connecting" },
21
+ "desk.phaseConnected": { "zh": "已连接", "en": "Connected" },
22
+ "desk.phaseError": { "zh": "连接失败", "en": "Connection failed" },
23
+ "desk.more": { "zh": "更多", "en": "More" },
24
+ "desk.filesOnly": { "zh": "仅浏览文件", "en": "Files only" },
25
+ "desk.terminalAndFiles": { "zh": "终端与文件", "en": "Terminal and files" },
26
+ "desk.connectionDetails": { "zh": "连接详情", "en": "Connection details" },
27
+ "desk.noTerminals": { "zh": "双击主机或项目打开终端,也可以新建独立连接。", "en": "Double-click a host or project, or open a new terminal." },
28
+ "desk.paneNumber": { "zh": "窗格 {0}", "en": "Pane {0}" },
29
+ "desk.gridLayout": { "zh": "四格分屏", "en": "Four-pane grid" },
30
+ "desk.keepPanesTitle": { "zh": "选择保留的终端", "en": "Choose terminals to keep" },
31
+ "desk.keepPanesHint": { "zh": "请选择保留 {0} 个终端。其余 {1} 个终端将关闭,可能中断正在运行的命令。", "en": "Choose {0} terminals to keep. The other {1} terminals will close, which may interrupt running commands." },
32
+ "desk.currentPane": { "zh": "当前", "en": "Current" },
33
+ "desk.willKeep": { "zh": "保留", "en": "Keep" },
34
+ "desk.willClose": { "zh": "将关闭", "en": "Will close" },
35
+ "desk.selectedPanes": { "zh": "已选 {0} / {1} 个", "en": "Selected {0} / {1}" },
36
+ "desk.confirmReduction": { "zh": "保留所选并关闭其余终端", "en": "Keep selected and close the rest" },
37
+ "desk.closeAllHint": { "zh": "将关闭所有标签中的 {0} 个终端,包括当前未显示的终端,可能中断正在运行的命令。", "en": "Close all {0} terminals across every tab, including hidden terminals. Running commands may be interrupted." },
38
+ "desk.closeCount": { "zh": "关闭 {0} 个终端", "en": "Close {0} terminals" },
39
+ "desk.noFingerprint": { "zh": "尚未保存主机指纹", "en": "No saved host fingerprint" },
40
+ "desk.proxy": { "zh": "代理方式", "en": "Proxy" },
41
+ "desk.restartHint": { "zh": "服务重启会断开连接;失效终端不会自动重跑命令。", "en": "A server restart ends connections. Expired terminals never replay commands automatically." },
42
+ "desk.projectDirectory": { "zh": "项目或目录", "en": "Project or directory" },
43
+ "desk.customDirectory": { "zh": "自定义目录", "en": "Custom directory" },
44
+ "desk.directory": { "zh": "远端目录", "en": "Remote directory" },
45
+ "desk.manualHint": { "zh": "手动连接不会改变 AI 会话挂载或权限。", "en": "Manual connections do not change AI session mounts or permissions." },
46
+ "desk.noSession": { "zh": "尚未选择会话", "en": "No session selected" },
47
+ "desk.directExecution": { "zh": "按当前授权直接执行", "en": "Execute under current permissions" },
48
+ "desk.searchCatalogue": { "zh": "搜索主机、分组、项目或目录", "en": "Search hosts, groups, projects or paths" },
49
+ "desk.list": { "zh": "列表", "en": "List" },
50
+ "desk.cards": { "zh": "卡片", "en": "Cards" },
51
+ "desk.openTerminal": { "zh": "打开终端", "en": "Open terminal" },
52
+ "desk.openProjectHint": { "zh": "单击选中,双击或 Enter 打开终端", "en": "Select with one click; double-click or Enter to open a terminal" },
53
+ "desk.catalogueHint": { "zh": "单击主机展开/收起固定目录,双击或 Enter 打开终端;挂载单独控制 AI 权限。", "en": "Click a host to toggle pinned directories; double-click or Enter to open a terminal. Mount buttons control AI access separately." },
54
+ "desk.accessHint": { "zh": "查看当前会话的挂载与权限,切换终端不会改变授权", "en": "Review current session mounts and permissions. Switching terminals does not change access." },
55
+ "desk.aiMounts": { "zh": "AI 挂载 {0}", "en": "AI mounts {0}" },
56
+ 'terminal-session.retentionHint': { zh: '离开工作台保留连接;返回可继续操作。离开后无输入、输出或订阅满 30 分钟会回收。关闭标签或断开连接会立即结束终端。', en: 'Leaving keeps the terminal connected. Return to resume. Detached terminals expire after 30 minutes without input, output or subscribers. Closing a tab or disconnecting ends the terminal.' },
4
57
  'connection.timeout': { zh: 'SSH 连接超时', en: 'SSH connection timeout' },
5
58
  'connection.timeoutMs': { zh: '连接超时(ms)', en: 'Connection timeout (ms)' },
6
59
  'connection.timeoutHint': { zh: '包含握手和认证等待,测试连接同样生效;不限制终端使用时长。', en: 'Includes handshake and authentication, including connection tests. Does not limit terminal lifetime.' },
@@ -1276,6 +1329,7 @@ export const messages = {
1276
1329
  "zh": "FTP、FTPS 与 SFTP 之间直接流式互传",
1277
1330
  "en": "Direct streaming transfers between FTP, FTPS, and SFTP"
1278
1331
  },
1332
+ "file-transfer-workspace.sessionAccessAction": { "zh": "会话访问", "en": "Session access" },
1279
1333
  "file-transfer-workspace.sessionAccess": {
1280
1334
  "zh": "FTP 会话访问",
1281
1335
  "en": "FTP session access"