@lemoncat7/dsh-ssh 1.6.0 → 1.8.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 (150) hide show
  1. package/ARCHITECTURE.md +9 -0
  2. package/README.md +18 -2
  3. package/docs/dialog-consistency.md +26 -0
  4. package/docs/releases/1.7.0.md +11 -0
  5. package/docs/releases/1.8.0.md +13 -0
  6. package/lib/activity-panel.d.ts.map +1 -1
  7. package/lib/activity-panel.js +14 -8
  8. package/lib/activity-panel.js.map +1 -1
  9. package/lib/adaptive-workspace.d.ts.map +1 -1
  10. package/lib/adaptive-workspace.js +5 -2
  11. package/lib/adaptive-workspace.js.map +1 -1
  12. package/lib/api.d.ts.map +1 -1
  13. package/lib/api.js +17 -1
  14. package/lib/api.js.map +1 -1
  15. package/lib/client.d.ts.map +1 -1
  16. package/lib/client.js +320 -188
  17. package/lib/client.js.map +4 -4
  18. package/lib/commands-panel.d.ts.map +1 -1
  19. package/lib/commands-panel.js +28 -11
  20. package/lib/commands-panel.js.map +1 -1
  21. package/lib/confirmation-dialog.d.ts +12 -0
  22. package/lib/confirmation-dialog.d.ts.map +1 -0
  23. package/lib/confirmation-dialog.js +41 -0
  24. package/lib/confirmation-dialog.js.map +1 -0
  25. package/lib/connector.d.ts.map +1 -1
  26. package/lib/connector.js +6 -4
  27. package/lib/connector.js.map +1 -1
  28. package/lib/docked-panel-compat.d.ts +1 -1
  29. package/lib/docked-panel-compat.d.ts.map +1 -1
  30. package/lib/docked-panel-compat.js +3 -2
  31. package/lib/docked-panel-compat.js.map +1 -1
  32. package/lib/domain.d.ts +8 -0
  33. package/lib/domain.d.ts.map +1 -1
  34. package/lib/domain.js.map +1 -1
  35. package/lib/file-entry-delete-dialog.d.ts.map +1 -1
  36. package/lib/file-entry-delete-dialog.js +5 -2
  37. package/lib/file-entry-delete-dialog.js.map +1 -1
  38. package/lib/file-transfer-workspace.d.ts.map +1 -1
  39. package/lib/file-transfer-workspace.js +48 -30
  40. package/lib/file-transfer-workspace.js.map +1 -1
  41. package/lib/ftp-profile-editor.d.ts.map +1 -1
  42. package/lib/ftp-profile-editor.js +19 -12
  43. package/lib/ftp-profile-editor.js.map +1 -1
  44. package/lib/gist-sync.d.ts +4 -2
  45. package/lib/gist-sync.d.ts.map +1 -1
  46. package/lib/gist-sync.js +49 -12
  47. package/lib/gist-sync.js.map +1 -1
  48. package/lib/group-proxy-editor.d.ts +10 -0
  49. package/lib/group-proxy-editor.d.ts.map +1 -0
  50. package/lib/group-proxy-editor.js +33 -0
  51. package/lib/group-proxy-editor.js.map +1 -0
  52. package/lib/group-proxy.d.ts +7 -0
  53. package/lib/group-proxy.d.ts.map +1 -0
  54. package/lib/group-proxy.js +29 -0
  55. package/lib/group-proxy.js.map +1 -0
  56. package/lib/html-file-preview.d.ts.map +1 -1
  57. package/lib/html-file-preview.js +4 -1
  58. package/lib/html-file-preview.js.map +1 -1
  59. package/lib/i18n.d.ts +17 -0
  60. package/lib/i18n.d.ts.map +1 -0
  61. package/lib/i18n.js +36 -0
  62. package/lib/i18n.js.map +1 -0
  63. package/lib/locales/messages.d.ts +2726 -0
  64. package/lib/locales/messages.d.ts.map +1 -0
  65. package/lib/locales/messages.js +2689 -0
  66. package/lib/locales/messages.js.map +1 -0
  67. package/lib/markdown-preview-editor.d.ts.map +1 -1
  68. package/lib/markdown-preview-editor.js +7 -1
  69. package/lib/markdown-preview-editor.js.map +1 -1
  70. package/lib/native-directory-button.d.ts.map +1 -1
  71. package/lib/native-directory-button.js +6 -3
  72. package/lib/native-directory-button.js.map +1 -1
  73. package/lib/preview-refresh-control.d.ts.map +1 -1
  74. package/lib/preview-refresh-control.js +4 -1
  75. package/lib/preview-refresh-control.js.map +1 -1
  76. package/lib/profile-editor.d.ts.map +1 -1
  77. package/lib/profile-editor.js +14 -8
  78. package/lib/profile-editor.js.map +1 -1
  79. package/lib/project-session-dialog.d.ts.map +1 -1
  80. package/lib/project-session-dialog.js +7 -4
  81. package/lib/project-session-dialog.js.map +1 -1
  82. package/lib/remote-path-input.d.ts.map +1 -1
  83. package/lib/remote-path-input.js +10 -7
  84. package/lib/remote-path-input.js.map +1 -1
  85. package/lib/remote-workspace-tree.d.ts +1 -0
  86. package/lib/remote-workspace-tree.d.ts.map +1 -1
  87. package/lib/remote-workspace-tree.js +19 -21
  88. package/lib/remote-workspace-tree.js.map +1 -1
  89. package/lib/resizable-split.d.ts.map +1 -1
  90. package/lib/resizable-split.js +4 -1
  91. package/lib/resizable-split.js.map +1 -1
  92. package/lib/sftp-client.d.ts +2 -1
  93. package/lib/sftp-client.d.ts.map +1 -1
  94. package/lib/sftp-client.js +55 -31
  95. package/lib/sftp-client.js.map +1 -1
  96. package/lib/ssh-locale-binding.d.ts +9 -0
  97. package/lib/ssh-locale-binding.d.ts.map +1 -0
  98. package/lib/ssh-locale-binding.js +29 -0
  99. package/lib/ssh-locale-binding.js.map +1 -0
  100. package/lib/store.d.ts +4 -0
  101. package/lib/store.d.ts.map +1 -1
  102. package/lib/store.js +13 -0
  103. package/lib/store.js.map +1 -1
  104. package/lib/terminal-bootstrap-echo.d.ts +15 -0
  105. package/lib/terminal-bootstrap-echo.d.ts.map +1 -0
  106. package/lib/terminal-bootstrap-echo.js +62 -0
  107. package/lib/terminal-bootstrap-echo.js.map +1 -0
  108. package/lib/terminal-directory.d.ts +3 -0
  109. package/lib/terminal-directory.d.ts.map +1 -0
  110. package/lib/terminal-directory.js +28 -0
  111. package/lib/terminal-directory.js.map +1 -0
  112. package/lib/terminal-session.d.ts +2 -1
  113. package/lib/terminal-session.d.ts.map +1 -1
  114. package/lib/terminal-session.js +22 -7
  115. package/lib/terminal-session.js.map +1 -1
  116. package/lib/terminal-shell-integration.d.ts +6 -0
  117. package/lib/terminal-shell-integration.d.ts.map +1 -0
  118. package/lib/terminal-shell-integration.js +53 -0
  119. package/lib/terminal-shell-integration.js.map +1 -0
  120. package/lib/terminal-workspace.d.ts +2 -1
  121. package/lib/terminal-workspace.d.ts.map +1 -1
  122. package/lib/terminal-workspace.js +10 -5
  123. package/lib/terminal-workspace.js.map +1 -1
  124. package/lib/terminal.d.ts +4 -0
  125. package/lib/terminal.d.ts.map +1 -1
  126. package/lib/terminal.js +31 -1
  127. package/lib/terminal.js.map +1 -1
  128. package/lib/ui-components.d.ts +3 -1
  129. package/lib/ui-components.d.ts.map +1 -1
  130. package/lib/ui-components.js +19 -10
  131. package/lib/ui-components.js.map +1 -1
  132. package/lib/use-file-preview.d.ts.map +1 -1
  133. package/lib/use-file-preview.js +2 -1
  134. package/lib/use-file-preview.js.map +1 -1
  135. package/lib/use-markdown-draft.d.ts.map +1 -1
  136. package/lib/use-markdown-draft.js +6 -5
  137. package/lib/use-markdown-draft.js.map +1 -1
  138. package/lib/use-ssh-locale.d.ts +4 -0
  139. package/lib/use-ssh-locale.d.ts.map +1 -0
  140. package/lib/use-ssh-locale.js +7 -0
  141. package/lib/use-ssh-locale.js.map +1 -0
  142. package/lib/use-workspace-refresh.d.ts +3 -0
  143. package/lib/use-workspace-refresh.d.ts.map +1 -0
  144. package/lib/use-workspace-refresh.js +44 -0
  145. package/lib/use-workspace-refresh.js.map +1 -0
  146. package/lib/workspace-refresh.d.ts +14 -0
  147. package/lib/workspace-refresh.d.ts.map +1 -0
  148. package/lib/workspace-refresh.js +36 -0
  149. package/lib/workspace-refresh.js.map +1 -0
  150. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-ssh-locale.js","sourceRoot":"","sources":["../src/use-ssh-locale.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAkB,MAAM,WAAW,CAAA;AAErD,+FAA+F;AAC/F,MAAM,UAAU,YAAY;IAC1B,OAAO,oBAAoB,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,WAAW,CAAC,CAAA;AAChG,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function refreshWorkspace(): void;
2
+ export declare function useWorkspaceRefresh(refresh: () => Promise<boolean | void>): void;
3
+ //# sourceMappingURL=use-workspace-refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-workspace-refresh.d.ts","sourceRoot":"","sources":["../src/use-workspace-refresh.ts"],"names":[],"mappings":"AAiBA,wBAAgB,gBAAgB,IAAI,IAAI,CAAY;AAEpD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,CAoBhF"}
@@ -0,0 +1,44 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { api } from './client-api.js';
3
+ import { WorkspaceRefresh } from './workspace-refresh.js';
4
+ const monitor = new WorkspaceRefresh(async () => {
5
+ const controller = new AbortController();
6
+ const timeout = setTimeout(() => controller.abort(), 8000);
7
+ try {
8
+ const { revision } = await api('/workspace-revision', { cache: 'no-store', signal: controller.signal });
9
+ if (typeof revision !== 'string')
10
+ throw new Error('Invalid workspace revision');
11
+ return revision;
12
+ }
13
+ finally {
14
+ clearTimeout(timeout);
15
+ }
16
+ });
17
+ let users = 0;
18
+ let timer;
19
+ const check = () => { if (!document.hidden)
20
+ void monitor.check(); };
21
+ export function refreshWorkspace() { check(); }
22
+ export function useWorkspaceRefresh(refresh) {
23
+ const callback = useRef(refresh);
24
+ callback.current = refresh;
25
+ useEffect(() => {
26
+ const unsubscribe = monitor.subscribe(() => callback.current());
27
+ if (++users === 1) {
28
+ timer = setInterval(check, 5000);
29
+ document.addEventListener('visibilitychange', check);
30
+ window.addEventListener('focus', check);
31
+ }
32
+ check();
33
+ return () => {
34
+ unsubscribe();
35
+ if (--users === 0) {
36
+ clearInterval(timer);
37
+ timer = undefined;
38
+ document.removeEventListener('visibilitychange', check);
39
+ window.removeEventListener('focus', check);
40
+ }
41
+ };
42
+ }, []);
43
+ }
44
+ //# sourceMappingURL=use-workspace-refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-workspace-refresh.js","sourceRoot":"","sources":["../src/use-workspace-refresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAEzD,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,KAAK,IAAI,EAAE;IAC9C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAA;IAC1D,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,GAAG,CAAuB,qBAAqB,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QAC7H,IAAI,OAAO,QAAQ,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;QAC/E,OAAO,QAAQ,CAAA;IACjB,CAAC;YAAS,CAAC;QAAC,YAAY,CAAC,OAAO,CAAC,CAAA;IAAC,CAAC;AACrC,CAAC,CAAC,CAAA;AACF,IAAI,KAAK,GAAG,CAAC,CAAA;AACb,IAAI,KAAiD,CAAA;AACrD,MAAM,KAAK,GAAG,GAAS,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;IAAE,KAAK,OAAO,CAAC,KAAK,EAAE,CAAA,CAAC,CAAC,CAAA;AAExE,MAAM,UAAU,gBAAgB,KAAW,KAAK,EAAE,CAAA,CAAC,CAAC;AAEpD,MAAM,UAAU,mBAAmB,CAAC,OAAsC;IACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAChC,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;QAC/D,IAAI,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;YAClB,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YAChC,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;YACpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QACzC,CAAC;QACD,KAAK,EAAE,CAAA;QACP,OAAO,GAAG,EAAE;YACV,WAAW,EAAE,CAAA;YACb,IAAI,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;gBAClB,aAAa,CAAC,KAAK,CAAC,CAAC;gBAAC,KAAK,GAAG,SAAS,CAAA;gBACvC,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;gBACvD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC"}
@@ -0,0 +1,14 @@
1
+ type Listener = () => Promise<boolean | void>;
2
+ /** One cheap version check shared by all mounted workspace consumers. */
3
+ export declare class WorkspaceRefresh {
4
+ private readonly readRevision;
5
+ private readonly listeners;
6
+ private revision;
7
+ private running;
8
+ constructor(readRevision: () => Promise<string>);
9
+ subscribe(listener: Listener): () => void;
10
+ check(): Promise<void>;
11
+ private poll;
12
+ }
13
+ export {};
14
+ //# sourceMappingURL=workspace-refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-refresh.d.ts","sourceRoot":"","sources":["../src/workspace-refresh.ts"],"names":[],"mappings":"AAAA,KAAK,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;AAE7C,yEAAyE;AACzE,qBAAa,gBAAgB;IAIf,OAAO,CAAC,QAAQ,CAAC,YAAY;IAHzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,OAAO,CAA2B;gBACb,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC;IAEhE,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI;IAKzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAOR,IAAI;CASnB"}
@@ -0,0 +1,36 @@
1
+ /** One cheap version check shared by all mounted workspace consumers. */
2
+ export class WorkspaceRefresh {
3
+ readRevision;
4
+ listeners = new Set();
5
+ revision;
6
+ running;
7
+ constructor(readRevision) {
8
+ this.readRevision = readRevision;
9
+ }
10
+ subscribe(listener) {
11
+ this.listeners.add(listener);
12
+ return () => { this.listeners.delete(listener); if (!this.listeners.size)
13
+ this.revision = undefined; };
14
+ }
15
+ check() {
16
+ if (this.running)
17
+ return this.running;
18
+ if (!this.listeners.size)
19
+ return Promise.resolve();
20
+ this.running = this.poll().finally(() => { this.running = undefined; });
21
+ return this.running;
22
+ }
23
+ async poll() {
24
+ try {
25
+ const next = await this.readRevision();
26
+ if (!this.listeners.size || next === this.revision)
27
+ return;
28
+ const results = await Promise.allSettled([...this.listeners].map(listener => listener()));
29
+ // Failed refreshes are retried on the next check, even if the version is unchanged.
30
+ if (this.listeners.size && results.every(result => result.status === 'fulfilled' && result.value !== false))
31
+ this.revision = next;
32
+ }
33
+ catch { /* Background checks must not replace editors with network errors. */ }
34
+ }
35
+ }
36
+ //# sourceMappingURL=workspace-refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-refresh.js","sourceRoot":"","sources":["../src/workspace-refresh.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,MAAM,OAAO,gBAAgB;IAIE;IAHZ,SAAS,GAAG,IAAI,GAAG,EAAY,CAAA;IACxC,QAAQ,CAAoB;IAC5B,OAAO,CAA2B;IAC1C,YAA6B,YAAmC;QAAnC,iBAAY,GAAZ,YAAY,CAAuB;IAAG,CAAC;IAEpE,SAAS,CAAC,QAAkB;QAC1B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI;YAAE,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAA,CAAC,CAAC,CAAA;IACvG,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO,CAAA;QACrC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAClD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA,CAAC,CAAC,CAAC,CAAA;QACtE,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;YACtC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ;gBAAE,OAAM;YAC1D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;YACzF,oFAAoF;YACpF,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;gBAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACnI,CAAC;QAAC,MAAM,CAAC,CAAC,qEAAqE,CAAC,CAAC;IACnF,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lemoncat7/dsh-ssh",
3
- "version": "1.6.0",
3
+ "version": "1.8.0",
4
4
  "description": "Secure SSH, FTP/FTPS/SFTP file transfer, browser terminals, proxies, port forwarding, and session-scoped AI access for DeepSeek Harness",
5
5
  "keywords": [
6
6
  "deepseek-harness",