ds-harness-remote 0.4.26 → 0.5.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 (165) hide show
  1. package/README.md +6 -6
  2. package/dist/acp/adapter.d.ts +19 -0
  3. package/dist/acp/adapter.d.ts.map +1 -0
  4. package/dist/acp/adapter.js +14 -0
  5. package/dist/acp/adapter.js.map +1 -0
  6. package/dist/acp/adapters/antigravity/executor.d.ts +20 -0
  7. package/dist/acp/adapters/antigravity/executor.d.ts.map +1 -0
  8. package/dist/acp/adapters/antigravity/executor.js +99 -0
  9. package/dist/acp/adapters/antigravity/executor.js.map +1 -0
  10. package/dist/acp/adapters/antigravity/image-store.d.ts +9 -0
  11. package/dist/acp/adapters/antigravity/image-store.d.ts.map +1 -0
  12. package/dist/acp/adapters/antigravity/image-store.js +116 -0
  13. package/dist/acp/adapters/antigravity/image-store.js.map +1 -0
  14. package/dist/acp/adapters/antigravity/index.d.ts +5 -0
  15. package/dist/acp/adapters/antigravity/index.d.ts.map +1 -0
  16. package/dist/acp/adapters/antigravity/index.js +5 -0
  17. package/dist/acp/adapters/antigravity/index.js.map +1 -0
  18. package/dist/acp/adapters/antigravity/models.d.ts +35 -0
  19. package/dist/acp/adapters/antigravity/models.d.ts.map +1 -0
  20. package/dist/acp/adapters/antigravity/models.js +59 -0
  21. package/dist/acp/adapters/antigravity/models.js.map +1 -0
  22. package/dist/acp/adapters/antigravity/service.d.ts +35 -0
  23. package/dist/acp/adapters/antigravity/service.d.ts.map +1 -0
  24. package/dist/acp/adapters/antigravity/service.js +67 -0
  25. package/dist/acp/adapters/antigravity/service.js.map +1 -0
  26. package/dist/acp/adapters/antigravity/transcript-loader.d.ts +21 -0
  27. package/dist/acp/adapters/antigravity/transcript-loader.d.ts.map +1 -0
  28. package/dist/acp/adapters/antigravity/transcript-loader.js +356 -0
  29. package/dist/acp/adapters/antigravity/transcript-loader.js.map +1 -0
  30. package/dist/acp/adapters/antigravity/transcript-watcher.d.ts +28 -0
  31. package/dist/acp/adapters/antigravity/transcript-watcher.d.ts.map +1 -0
  32. package/dist/acp/adapters/antigravity/transcript-watcher.js +157 -0
  33. package/dist/acp/adapters/antigravity/transcript-watcher.js.map +1 -0
  34. package/dist/acp/adapters/antigravity/types.d.ts +56 -0
  35. package/dist/acp/adapters/antigravity/types.d.ts.map +1 -0
  36. package/dist/acp/adapters/antigravity/types.js +2 -0
  37. package/dist/acp/adapters/antigravity/types.js.map +1 -0
  38. package/dist/acp/adapters/antigravity-process.d.ts +69 -0
  39. package/dist/acp/adapters/antigravity-process.d.ts.map +1 -0
  40. package/dist/acp/adapters/antigravity-process.js +566 -0
  41. package/dist/acp/adapters/antigravity-process.js.map +1 -0
  42. package/dist/acp/adapters/antigravity.d.ts +8 -0
  43. package/dist/acp/adapters/antigravity.d.ts.map +1 -0
  44. package/dist/acp/adapters/antigravity.js +9 -0
  45. package/dist/acp/adapters/antigravity.js.map +1 -0
  46. package/dist/acp/adapters/cursor-process.d.ts +75 -0
  47. package/dist/acp/adapters/cursor-process.d.ts.map +1 -0
  48. package/dist/acp/adapters/cursor-process.js +273 -0
  49. package/dist/acp/adapters/cursor-process.js.map +1 -0
  50. package/dist/acp/adapters/cursor.d.ts +8 -0
  51. package/dist/acp/adapters/cursor.d.ts.map +1 -0
  52. package/dist/acp/adapters/cursor.js +8 -0
  53. package/dist/acp/adapters/cursor.js.map +1 -0
  54. package/dist/acp/gateway.d.ts +108 -0
  55. package/dist/acp/gateway.d.ts.map +1 -0
  56. package/dist/acp/gateway.js +1040 -0
  57. package/dist/acp/gateway.js.map +1 -0
  58. package/dist/acp/image-content.d.ts +19 -0
  59. package/dist/acp/image-content.d.ts.map +1 -0
  60. package/dist/acp/image-content.js +76 -0
  61. package/dist/acp/image-content.js.map +1 -0
  62. package/dist/acp/method-policy.d.ts +239 -0
  63. package/dist/acp/method-policy.d.ts.map +1 -0
  64. package/dist/acp/method-policy.js +102 -0
  65. package/dist/acp/method-policy.js.map +1 -0
  66. package/dist/acp/peer-bridge.d.ts +59 -0
  67. package/dist/acp/peer-bridge.d.ts.map +1 -0
  68. package/dist/acp/peer-bridge.js +367 -0
  69. package/dist/acp/peer-bridge.js.map +1 -0
  70. package/dist/acp/virtual-harness.d.ts +181 -0
  71. package/dist/acp/virtual-harness.d.ts.map +1 -0
  72. package/dist/acp/virtual-harness.js +1556 -0
  73. package/dist/acp/virtual-harness.js.map +1 -0
  74. package/dist/acp/workspace-tools.d.ts +13 -0
  75. package/dist/acp/workspace-tools.d.ts.map +1 -0
  76. package/dist/acp/workspace-tools.js +46 -0
  77. package/dist/acp/workspace-tools.js.map +1 -0
  78. package/dist/acp.d.ts.map +1 -1
  79. package/dist/acp.js +1 -0
  80. package/dist/acp.js.map +1 -1
  81. package/dist/api-proxy-switch.d.ts +2 -0
  82. package/dist/api-proxy-switch.d.ts.map +1 -1
  83. package/dist/api-proxy-switch.js +9 -0
  84. package/dist/api-proxy-switch.js.map +1 -1
  85. package/dist/cli.d.ts.map +1 -1
  86. package/dist/cli.js +4 -3
  87. package/dist/cli.js.map +1 -1
  88. package/dist/client-runtime.d.ts +25 -1
  89. package/dist/client-runtime.d.ts.map +1 -1
  90. package/dist/client-runtime.js +222 -8
  91. package/dist/client-runtime.js.map +1 -1
  92. package/dist/client.github.js +327 -190
  93. package/dist/client.js +327 -190
  94. package/dist/client.js.map +1 -1
  95. package/dist/codex/domain.d.ts +4 -1
  96. package/dist/codex/domain.d.ts.map +1 -1
  97. package/dist/codex/domain.js +54 -4
  98. package/dist/codex/domain.js.map +1 -1
  99. package/dist/codex/virtual-harness.d.ts.map +1 -1
  100. package/dist/codex/virtual-harness.js +3 -0
  101. package/dist/codex/virtual-harness.js.map +1 -1
  102. package/dist/codex-workspace-bridge.d.ts +7 -105
  103. package/dist/codex-workspace-bridge.d.ts.map +1 -1
  104. package/dist/codex-workspace-bridge.js +10 -498
  105. package/dist/codex-workspace-bridge.js.map +1 -1
  106. package/dist/config.d.ts +28 -10
  107. package/dist/config.d.ts.map +1 -1
  108. package/dist/config.js +49 -5
  109. package/dist/config.js.map +1 -1
  110. package/dist/connection-controller.d.ts.map +1 -1
  111. package/dist/connection-controller.js +7 -4
  112. package/dist/connection-controller.js.map +1 -1
  113. package/dist/control-runtime.d.ts +1 -0
  114. package/dist/control-runtime.d.ts.map +1 -1
  115. package/dist/control-runtime.js +65 -10
  116. package/dist/control-runtime.js.map +1 -1
  117. package/dist/harness-version.d.ts.map +1 -1
  118. package/dist/harness-version.js +16 -3
  119. package/dist/harness-version.js.map +1 -1
  120. package/dist/index.d.ts +4 -0
  121. package/dist/index.d.ts.map +1 -1
  122. package/dist/index.js +13197 -8204
  123. package/dist/index.js.map +4 -4
  124. package/dist/loopback-host.d.ts +2 -2
  125. package/dist/loopback-host.d.ts.map +1 -1
  126. package/dist/loopback-host.js +41 -16
  127. package/dist/loopback-host.js.map +1 -1
  128. package/dist/remote-typert-gateway.d.ts.map +1 -1
  129. package/dist/remote-typert-gateway.js +7 -4
  130. package/dist/remote-typert-gateway.js.map +1 -1
  131. package/dist/rpc-router.d.ts +6 -5
  132. package/dist/rpc-router.d.ts.map +1 -1
  133. package/dist/rpc-router.js +49 -18
  134. package/dist/rpc-router.js.map +1 -1
  135. package/dist/server-api.d.ts +2 -0
  136. package/dist/server-api.d.ts.map +1 -1
  137. package/dist/server-api.js +5 -0
  138. package/dist/server-api.js.map +1 -1
  139. package/dist/server-connection.d.ts.map +1 -1
  140. package/dist/server-connection.js +15 -0
  141. package/dist/server-connection.js.map +1 -1
  142. package/dist/service.d.ts +30 -1
  143. package/dist/service.d.ts.map +1 -1
  144. package/dist/service.js +114 -12
  145. package/dist/service.js.map +1 -1
  146. package/dist/session-format-compat.d.ts +1 -0
  147. package/dist/session-format-compat.d.ts.map +1 -1
  148. package/dist/session-format-compat.js +14 -0
  149. package/dist/session-format-compat.js.map +1 -1
  150. package/dist/tui-command.js +2 -0
  151. package/dist/tui-command.js.map +1 -1
  152. package/dist/typert-gateway-switch.d.ts +2 -0
  153. package/dist/typert-gateway-switch.d.ts.map +1 -1
  154. package/dist/typert-gateway-switch.js +16 -0
  155. package/dist/typert-gateway-switch.js.map +1 -1
  156. package/dist/version.d.ts +1 -1
  157. package/dist/version.d.ts.map +1 -1
  158. package/dist/version.js +1 -1
  159. package/dist/version.js.map +1 -1
  160. package/dist/workspace-bridge.d.ts +117 -0
  161. package/dist/workspace-bridge.d.ts.map +1 -0
  162. package/dist/workspace-bridge.js +512 -0
  163. package/dist/workspace-bridge.js.map +1 -0
  164. package/dsh-plugin.json +1 -1
  165. package/package.json +1 -1
package/dist/client.js CHANGED
@@ -23,18 +23,18 @@
23
23
  mod
24
24
  ));
25
25
 
26
- // ../../node_modules/qrcode/lib/can-promise.js
26
+ // node_modules/qrcode/lib/can-promise.js
27
27
  var require_can_promise = __commonJS({
28
- "../../node_modules/qrcode/lib/can-promise.js"(exports, module) {
28
+ "node_modules/qrcode/lib/can-promise.js"(exports, module) {
29
29
  module.exports = function() {
30
30
  return typeof Promise == "function" && Promise.prototype && Promise.prototype.then;
31
31
  };
32
32
  }
33
33
  });
34
34
 
35
- // ../../node_modules/qrcode/lib/core/utils.js
35
+ // node_modules/qrcode/lib/core/utils.js
36
36
  var require_utils = __commonJS({
37
- "../../node_modules/qrcode/lib/core/utils.js"(exports) {
37
+ "node_modules/qrcode/lib/core/utils.js"(exports) {
38
38
  var toSJISFunction, CODEWORDS_COUNT = [
39
39
  0,
40
40
  // Not used
@@ -107,9 +107,9 @@
107
107
  }
108
108
  });
109
109
 
110
- // ../../node_modules/qrcode/lib/core/error-correction-level.js
110
+ // node_modules/qrcode/lib/core/error-correction-level.js
111
111
  var require_error_correction_level = __commonJS({
112
- "../../node_modules/qrcode/lib/core/error-correction-level.js"(exports) {
112
+ "node_modules/qrcode/lib/core/error-correction-level.js"(exports) {
113
113
  exports.L = { bit: 1 };
114
114
  exports.M = { bit: 0 };
115
115
  exports.Q = { bit: 3 };
@@ -149,9 +149,9 @@
149
149
  }
150
150
  });
151
151
 
152
- // ../../node_modules/qrcode/lib/core/bit-buffer.js
152
+ // node_modules/qrcode/lib/core/bit-buffer.js
153
153
  var require_bit_buffer = __commonJS({
154
- "../../node_modules/qrcode/lib/core/bit-buffer.js"(exports, module) {
154
+ "node_modules/qrcode/lib/core/bit-buffer.js"(exports, module) {
155
155
  function BitBuffer() {
156
156
  this.buffer = [], this.length = 0;
157
157
  }
@@ -176,9 +176,9 @@
176
176
  }
177
177
  });
178
178
 
179
- // ../../node_modules/qrcode/lib/core/bit-matrix.js
179
+ // node_modules/qrcode/lib/core/bit-matrix.js
180
180
  var require_bit_matrix = __commonJS({
181
- "../../node_modules/qrcode/lib/core/bit-matrix.js"(exports, module) {
181
+ "node_modules/qrcode/lib/core/bit-matrix.js"(exports, module) {
182
182
  function BitMatrix(size) {
183
183
  if (!size || size < 1)
184
184
  throw new Error("BitMatrix size must be defined and greater than 0");
@@ -201,9 +201,9 @@
201
201
  }
202
202
  });
203
203
 
204
- // ../../node_modules/qrcode/lib/core/alignment-pattern.js
204
+ // node_modules/qrcode/lib/core/alignment-pattern.js
205
205
  var require_alignment_pattern = __commonJS({
206
- "../../node_modules/qrcode/lib/core/alignment-pattern.js"(exports) {
206
+ "node_modules/qrcode/lib/core/alignment-pattern.js"(exports) {
207
207
  var getSymbolSize = require_utils().getSymbolSize;
208
208
  exports.getRowColCoords = function(version) {
209
209
  if (version === 1) return [];
@@ -224,9 +224,9 @@
224
224
  }
225
225
  });
226
226
 
227
- // ../../node_modules/qrcode/lib/core/finder-pattern.js
227
+ // node_modules/qrcode/lib/core/finder-pattern.js
228
228
  var require_finder_pattern = __commonJS({
229
- "../../node_modules/qrcode/lib/core/finder-pattern.js"(exports) {
229
+ "node_modules/qrcode/lib/core/finder-pattern.js"(exports) {
230
230
  var getSymbolSize = require_utils().getSymbolSize, FINDER_PATTERN_SIZE = 7;
231
231
  exports.getPositions = function(version) {
232
232
  let size = getSymbolSize(version);
@@ -242,9 +242,9 @@
242
242
  }
243
243
  });
244
244
 
245
- // ../../node_modules/qrcode/lib/core/mask-pattern.js
245
+ // node_modules/qrcode/lib/core/mask-pattern.js
246
246
  var require_mask_pattern = __commonJS({
247
- "../../node_modules/qrcode/lib/core/mask-pattern.js"(exports) {
247
+ "node_modules/qrcode/lib/core/mask-pattern.js"(exports) {
248
248
  exports.Patterns = {
249
249
  PATTERN000: 0,
250
250
  PATTERN001: 1,
@@ -342,9 +342,9 @@
342
342
  }
343
343
  });
344
344
 
345
- // ../../node_modules/qrcode/lib/core/error-correction-code.js
345
+ // node_modules/qrcode/lib/core/error-correction-code.js
346
346
  var require_error_correction_code = __commonJS({
347
- "../../node_modules/qrcode/lib/core/error-correction-code.js"(exports) {
347
+ "node_modules/qrcode/lib/core/error-correction-code.js"(exports) {
348
348
  var ECLevel = require_error_correction_level(), EC_BLOCKS_TABLE = [
349
349
  // L M Q H
350
350
  1,
@@ -701,9 +701,9 @@
701
701
  }
702
702
  });
703
703
 
704
- // ../../node_modules/qrcode/lib/core/galois-field.js
704
+ // node_modules/qrcode/lib/core/galois-field.js
705
705
  var require_galois_field = __commonJS({
706
- "../../node_modules/qrcode/lib/core/galois-field.js"(exports) {
706
+ "node_modules/qrcode/lib/core/galois-field.js"(exports) {
707
707
  var EXP_TABLE = new Uint8Array(512), LOG_TABLE = new Uint8Array(256);
708
708
  (function() {
709
709
  let x = 1;
@@ -725,9 +725,9 @@
725
725
  }
726
726
  });
727
727
 
728
- // ../../node_modules/qrcode/lib/core/polynomial.js
728
+ // node_modules/qrcode/lib/core/polynomial.js
729
729
  var require_polynomial = __commonJS({
730
- "../../node_modules/qrcode/lib/core/polynomial.js"(exports) {
730
+ "node_modules/qrcode/lib/core/polynomial.js"(exports) {
731
731
  var GF = require_galois_field();
732
732
  exports.mul = function(p1, p2) {
733
733
  let coeff = new Uint8Array(p1.length + p2.length - 1);
@@ -757,9 +757,9 @@
757
757
  }
758
758
  });
759
759
 
760
- // ../../node_modules/qrcode/lib/core/reed-solomon-encoder.js
760
+ // node_modules/qrcode/lib/core/reed-solomon-encoder.js
761
761
  var require_reed_solomon_encoder = __commonJS({
762
- "../../node_modules/qrcode/lib/core/reed-solomon-encoder.js"(exports, module) {
762
+ "node_modules/qrcode/lib/core/reed-solomon-encoder.js"(exports, module) {
763
763
  var Polynomial = require_polynomial();
764
764
  function ReedSolomonEncoder(degree) {
765
765
  this.genPoly = void 0, this.degree = degree, this.degree && this.initialize(this.degree);
@@ -783,18 +783,18 @@
783
783
  }
784
784
  });
785
785
 
786
- // ../../node_modules/qrcode/lib/core/version-check.js
786
+ // node_modules/qrcode/lib/core/version-check.js
787
787
  var require_version_check = __commonJS({
788
- "../../node_modules/qrcode/lib/core/version-check.js"(exports) {
788
+ "node_modules/qrcode/lib/core/version-check.js"(exports) {
789
789
  exports.isValid = function(version) {
790
790
  return !isNaN(version) && version >= 1 && version <= 40;
791
791
  };
792
792
  }
793
793
  });
794
794
 
795
- // ../../node_modules/qrcode/lib/core/regex.js
795
+ // node_modules/qrcode/lib/core/regex.js
796
796
  var require_regex = __commonJS({
797
- "../../node_modules/qrcode/lib/core/regex.js"(exports) {
797
+ "node_modules/qrcode/lib/core/regex.js"(exports) {
798
798
  var numeric = "[0-9]+", alphanumeric = "[A-Z $%*+\\-./:]+", kanji = "(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";
799
799
  kanji = kanji.replace(/u/g, "\\u");
800
800
  var byte = "(?:(?![A-Z0-9 $%*+\\-./:]|" + kanji + `)(?:.|[\r
@@ -817,9 +817,9 @@
817
817
  }
818
818
  });
819
819
 
820
- // ../../node_modules/qrcode/lib/core/mode.js
820
+ // node_modules/qrcode/lib/core/mode.js
821
821
  var require_mode = __commonJS({
822
- "../../node_modules/qrcode/lib/core/mode.js"(exports) {
822
+ "node_modules/qrcode/lib/core/mode.js"(exports) {
823
823
  var VersionCheck = require_version_check(), Regex = require_regex();
824
824
  exports.NUMERIC = {
825
825
  id: "Numeric",
@@ -888,9 +888,9 @@
888
888
  }
889
889
  });
890
890
 
891
- // ../../node_modules/qrcode/lib/core/version.js
891
+ // node_modules/qrcode/lib/core/version.js
892
892
  var require_version = __commonJS({
893
- "../../node_modules/qrcode/lib/core/version.js"(exports) {
893
+ "node_modules/qrcode/lib/core/version.js"(exports) {
894
894
  var Utils = require_utils(), ECCode = require_error_correction_code(), ECLevel = require_error_correction_level(), Mode = require_mode(), VersionCheck = require_version_check(), G18 = 7973, G18_BCH = Utils.getBCHDigit(G18);
895
895
  function getBestVersionForDataLength(mode, length, errorCorrectionLevel) {
896
896
  for (let currentVersion = 1; currentVersion <= 40; currentVersion++)
@@ -957,9 +957,9 @@
957
957
  }
958
958
  });
959
959
 
960
- // ../../node_modules/qrcode/lib/core/format-info.js
960
+ // node_modules/qrcode/lib/core/format-info.js
961
961
  var require_format_info = __commonJS({
962
- "../../node_modules/qrcode/lib/core/format-info.js"(exports) {
962
+ "node_modules/qrcode/lib/core/format-info.js"(exports) {
963
963
  var Utils = require_utils(), G15 = 1335, G15_MASK = 21522, G15_BCH = Utils.getBCHDigit(G15);
964
964
  exports.getEncodedBits = function(errorCorrectionLevel, mask) {
965
965
  let data = errorCorrectionLevel.bit << 3 | mask, d = data << 10;
@@ -970,9 +970,9 @@
970
970
  }
971
971
  });
972
972
 
973
- // ../../node_modules/qrcode/lib/core/numeric-data.js
973
+ // node_modules/qrcode/lib/core/numeric-data.js
974
974
  var require_numeric_data = __commonJS({
975
- "../../node_modules/qrcode/lib/core/numeric-data.js"(exports, module) {
975
+ "node_modules/qrcode/lib/core/numeric-data.js"(exports, module) {
976
976
  var Mode = require_mode();
977
977
  function NumericData(data) {
978
978
  this.mode = Mode.NUMERIC, this.data = data.toString();
@@ -997,9 +997,9 @@
997
997
  }
998
998
  });
999
999
 
1000
- // ../../node_modules/qrcode/lib/core/alphanumeric-data.js
1000
+ // node_modules/qrcode/lib/core/alphanumeric-data.js
1001
1001
  var require_alphanumeric_data = __commonJS({
1002
- "../../node_modules/qrcode/lib/core/alphanumeric-data.js"(exports, module) {
1002
+ "node_modules/qrcode/lib/core/alphanumeric-data.js"(exports, module) {
1003
1003
  var Mode = require_mode(), ALPHA_NUM_CHARS = [
1004
1004
  "0",
1005
1005
  "1",
@@ -1071,9 +1071,9 @@
1071
1071
  }
1072
1072
  });
1073
1073
 
1074
- // ../../node_modules/qrcode/lib/core/byte-data.js
1074
+ // node_modules/qrcode/lib/core/byte-data.js
1075
1075
  var require_byte_data = __commonJS({
1076
- "../../node_modules/qrcode/lib/core/byte-data.js"(exports, module) {
1076
+ "node_modules/qrcode/lib/core/byte-data.js"(exports, module) {
1077
1077
  var Mode = require_mode();
1078
1078
  function ByteData(data) {
1079
1079
  this.mode = Mode.BYTE, typeof data == "string" ? this.data = new TextEncoder().encode(data) : this.data = new Uint8Array(data);
@@ -1095,9 +1095,9 @@
1095
1095
  }
1096
1096
  });
1097
1097
 
1098
- // ../../node_modules/qrcode/lib/core/kanji-data.js
1098
+ // node_modules/qrcode/lib/core/kanji-data.js
1099
1099
  var require_kanji_data = __commonJS({
1100
- "../../node_modules/qrcode/lib/core/kanji-data.js"(exports, module) {
1100
+ "node_modules/qrcode/lib/core/kanji-data.js"(exports, module) {
1101
1101
  var Mode = require_mode(), Utils = require_utils();
1102
1102
  function KanjiData(data) {
1103
1103
  this.mode = Mode.KANJI, this.data = data;
@@ -1131,9 +1131,9 @@ Make sure your charset is UTF-8`
1131
1131
  }
1132
1132
  });
1133
1133
 
1134
- // ../../node_modules/dijkstrajs/dijkstra.js
1134
+ // node_modules/dijkstrajs/dijkstra.js
1135
1135
  var require_dijkstra = __commonJS({
1136
- "../../node_modules/dijkstrajs/dijkstra.js"(exports, module) {
1136
+ "node_modules/dijkstrajs/dijkstra.js"(exports, module) {
1137
1137
  "use strict";
1138
1138
  var dijkstra = {
1139
1139
  single_source_shortest_paths: function(graph, s, d) {
@@ -1201,9 +1201,9 @@ Make sure your charset is UTF-8`
1201
1201
  }
1202
1202
  });
1203
1203
 
1204
- // ../../node_modules/qrcode/lib/core/segments.js
1204
+ // node_modules/qrcode/lib/core/segments.js
1205
1205
  var require_segments = __commonJS({
1206
- "../../node_modules/qrcode/lib/core/segments.js"(exports) {
1206
+ "node_modules/qrcode/lib/core/segments.js"(exports) {
1207
1207
  var Mode = require_mode(), NumericData = require_numeric_data(), AlphanumericData = require_alphanumeric_data(), ByteData = require_byte_data(), KanjiData = require_kanji_data(), Regex = require_regex(), Utils = require_utils(), dijkstra = require_dijkstra();
1208
1208
  function getStringByteLength(str) {
1209
1209
  return unescape(encodeURIComponent(str)).length;
@@ -1334,9 +1334,9 @@ Make sure your charset is UTF-8`
1334
1334
  }
1335
1335
  });
1336
1336
 
1337
- // ../../node_modules/qrcode/lib/core/qrcode.js
1337
+ // node_modules/qrcode/lib/core/qrcode.js
1338
1338
  var require_qrcode = __commonJS({
1339
- "../../node_modules/qrcode/lib/core/qrcode.js"(exports) {
1339
+ "node_modules/qrcode/lib/core/qrcode.js"(exports) {
1340
1340
  var Utils = require_utils(), ECLevel = require_error_correction_level(), BitBuffer = require_bit_buffer(), BitMatrix = require_bit_matrix(), AlignmentPattern = require_alignment_pattern(), FinderPattern = require_finder_pattern(), MaskPattern = require_mask_pattern(), ECCode = require_error_correction_code(), ReedSolomonEncoder = require_reed_solomon_encoder(), Version = require_version(), FormatInfo = require_format_info(), Mode = require_mode(), Segments = require_segments();
1341
1341
  function setupFinderPattern(matrix, version) {
1342
1342
  let size = matrix.size, pos = FinderPattern.getPositions(version);
@@ -1464,9 +1464,9 @@ Minimum version required to store current data is: ` + bestVersion + `.
1464
1464
  }
1465
1465
  });
1466
1466
 
1467
- // ../../node_modules/qrcode/lib/renderer/utils.js
1467
+ // node_modules/qrcode/lib/renderer/utils.js
1468
1468
  var require_utils2 = __commonJS({
1469
- "../../node_modules/qrcode/lib/renderer/utils.js"(exports) {
1469
+ "node_modules/qrcode/lib/renderer/utils.js"(exports) {
1470
1470
  function hex2rgba(hex) {
1471
1471
  if (typeof hex == "number" && (hex = hex.toString()), typeof hex != "string")
1472
1472
  throw new Error("Color should be defined as hex string");
@@ -1522,9 +1522,9 @@ Minimum version required to store current data is: ` + bestVersion + `.
1522
1522
  }
1523
1523
  });
1524
1524
 
1525
- // ../../node_modules/qrcode/lib/renderer/canvas.js
1525
+ // node_modules/qrcode/lib/renderer/canvas.js
1526
1526
  var require_canvas = __commonJS({
1527
- "../../node_modules/qrcode/lib/renderer/canvas.js"(exports) {
1527
+ "node_modules/qrcode/lib/renderer/canvas.js"(exports) {
1528
1528
  var Utils = require_utils2();
1529
1529
  function clearCanvas(ctx, canvas, size) {
1530
1530
  ctx.clearRect(0, 0, canvas.width, canvas.height), canvas.style || (canvas.style = {}), canvas.height = size, canvas.width = size, canvas.style.height = size + "px", canvas.style.width = size + "px";
@@ -1551,9 +1551,9 @@ Minimum version required to store current data is: ` + bestVersion + `.
1551
1551
  }
1552
1552
  });
1553
1553
 
1554
- // ../../node_modules/qrcode/lib/renderer/svg-tag.js
1554
+ // node_modules/qrcode/lib/renderer/svg-tag.js
1555
1555
  var require_svg_tag = __commonJS({
1556
- "../../node_modules/qrcode/lib/renderer/svg-tag.js"(exports) {
1556
+ "node_modules/qrcode/lib/renderer/svg-tag.js"(exports) {
1557
1557
  var Utils = require_utils2();
1558
1558
  function getColorAttrib(color, attrib) {
1559
1559
  let alpha = color.a / 255, str = attrib + '="' + color.hex + '"';
@@ -1579,9 +1579,9 @@ Minimum version required to store current data is: ` + bestVersion + `.
1579
1579
  }
1580
1580
  });
1581
1581
 
1582
- // ../../node_modules/qrcode/lib/browser.js
1582
+ // node_modules/qrcode/lib/browser.js
1583
1583
  var require_browser = __commonJS({
1584
- "../../node_modules/qrcode/lib/browser.js"(exports) {
1584
+ "node_modules/qrcode/lib/browser.js"(exports) {
1585
1585
  var canPromise = require_can_promise(), QRCode2 = require_qrcode(), CanvasRenderer = require_canvas(), SvgRenderer = require_svg_tag();
1586
1586
  function renderCanvas(renderFunc, canvas, text, opts, cb) {
1587
1587
  let args = [].slice.call(arguments, 1), argsNum = args.length, isLastArgCb = typeof args[argsNum - 1] == "function";
@@ -1758,7 +1758,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
1758
1758
  try {
1759
1759
  let value = JSON.parse(raw);
1760
1760
  if (typeof value.targetDeviceId != "string" || typeof value.workspaceId != "string") throw new Error("invalid");
1761
- if (value.backend !== void 0 && value.backend !== "harness" && value.backend !== "codex") throw new Error("invalid");
1761
+ if (value.backend !== void 0 && value.backend !== "harness" && value.backend !== "codex" && value.backend !== "cursor" && value.backend !== "antigravity") throw new Error("invalid");
1762
1762
  if (value.sessionId !== void 0 && typeof value.sessionId != "string") throw new Error("invalid");
1763
1763
  return value;
1764
1764
  } catch {
@@ -1771,8 +1771,8 @@ Minimum version required to store current data is: ` + bestVersion + `.
1771
1771
  }
1772
1772
  var localeNamespace = "ds-harness-remote", en = {
1773
1773
  terminalRemote: "Remote terminal",
1774
- terminalRemoteHint: "Allow trusted Remote devices to run an interactive shell as this Host user. Off by default; independent of Agent approvals. Toggling saves and applies immediately.",
1775
- terminalRemoteUnavailable: "Remote terminal is unavailable. Enable Remote terminal in the Host Remote settings, then restart the Host.",
1774
+ terminalRemoteHint: "Allow trusted Remote devices to run an interactive shell as this Host user. On by default; independent of Agent approvals. Toggling saves and applies immediately.",
1775
+ terminalRemoteUnavailable: "Remote terminal is unavailable. Enable Remote terminal in the Host Remote settings; the switch applies immediately.",
1776
1776
  previewPorts: "Remote preview ports",
1777
1777
  previewPortsHint: "Allow specific Host ports (1024\u201365535), separated by commas. Empty disables preview. HTTP, WebSocket and hot reload are supported.",
1778
1778
  developmentSave: "Save access settings",
@@ -1810,8 +1810,11 @@ Minimum version required to store current data is: ` + bestVersion + `.
1810
1810
  serverUrlHint: "HTTPS origin used for account authorization and encrypted relay.",
1811
1811
  serverSaved: "Server address saved. Restart DSH to apply it.",
1812
1812
  codexRemote: "Codex Remote",
1813
- codexRemoteHint: "Expose Codex projects through this Host. Restart DSH after changing this setting.",
1813
+ codexRemoteHint: "Connect to CodeX projects on this Host.",
1814
1814
  codexSaved: "Codex Remote setting saved. Restart DSH to apply it.",
1815
+ cursorRemote: "Cursor ACP adapter (experimental)",
1816
+ cursorRemoteHint: "Enable the Cursor `agent acp` backend for the Agent ACP gateway. Requires local `agent login`. Restart DSH after changing this setting.",
1817
+ cursorSaved: "Cursor ACP adapter setting saved. Restart DSH to apply it.",
1815
1818
  authorizeFromRemote: "Sign in from the Remote entry in the sidebar, then return here to manage this device.",
1816
1819
  authorizationMethod: "Authorization method",
1817
1820
  accountPassword: "Account password",
@@ -1918,11 +1921,17 @@ Minimum version required to store current data is: ` + bestVersion + `.
1918
1921
  exitRemote: "Exit",
1919
1922
  addRemoteWorkspace: "Add remote workspace",
1920
1923
  addCodexWorkspace: "Add CodeX workspace",
1924
+ addCursorWorkspace: "Add Cursor workspace",
1925
+ addAntigravityWorkspace: "Add Antigravity workspace",
1921
1926
  noCodexWorkspaces: "No CodeX workspaces yet.",
1927
+ noCursorWorkspaces: "No Cursor workspaces yet. Add a project directory to start.",
1928
+ noAntigravityWorkspaces: "No Antigravity workspaces yet. Add a project directory to start.",
1922
1929
  cancelAddWorkspace: "Cancel",
1923
1930
  confirmAddWorkspace: "Add and open",
1924
1931
  showAllWorkspaces: "Show all DSH workspaces",
1925
1932
  showAllCodexWorkspaces: "Show all CodeX workspaces",
1933
+ showAllCursorWorkspaces: "Show all Cursor workspaces",
1934
+ showAllAntigravityWorkspaces: "Show all Antigravity workspaces",
1926
1935
  remoteModeLabel: "Remote mode \xB7 {name}",
1927
1936
  remoteNetworkP2p: "P2P",
1928
1937
  remoteNetworkTurn: "TURN",
@@ -1980,13 +1989,14 @@ Minimum version required to store current data is: ` + bestVersion + `.
1980
1989
  startSignIn: "Start sign-in",
1981
1990
  allowControlCurrentDevice: "Allow control of this device",
1982
1991
  allowControlDevice: "Allow control of device",
1983
- allowRemoteTerminal: "Allow remote terminal",
1984
1992
  connectedClientCount: "{count} connected",
1985
- checkAcp: "Check ACP",
1993
+ checkAcp: "Check backend",
1986
1994
  checkingAcp: "Checking ACP\u2026",
1987
1995
  acpAvailable: "ACP available",
1988
1996
  acpUnavailable: "ACP unavailable",
1989
- acpHint: "Connect compatible coding agents through the Agent Client Protocol.",
1997
+ agentBackends: "More Coding Agents",
1998
+ acpDocumentation: "Read the documentation.",
1999
+ acpHint: "Connect through ACP. ",
1990
2000
  acpCheckPassed: "Check passed",
1991
2001
  acpCheckFailed: "Check failed",
1992
2002
  addAcp: "Add ACP",
@@ -2009,11 +2019,13 @@ Minimum version required to store current data is: ` + bestVersion + `.
2009
2019
  qrLoginExpired: "This QR code expired. Refresh it to continue.",
2010
2020
  refreshQrCode: "Refresh QR code",
2011
2021
  codexVirtualWorkspace: "CodeX virtual workspace",
2022
+ cursorVirtualWorkspace: "Cursor virtual workspace",
2023
+ antigravityVirtualWorkspace: "Antigravity virtual workspace",
2012
2024
  codexVirtualSessions: "Sessions"
2013
2025
  }, zh = {
2014
2026
  terminalRemote: "\u8FDC\u7A0B\u7EC8\u7AEF",
2015
- terminalRemoteHint: "\u5141\u8BB8\u53D7\u4FE1\u4EFB\u7684 Remote \u8BBE\u5907\u4EE5\u6B64 Host \u7528\u6237\u8EAB\u4EFD\u8FD0\u884C\u4EA4\u4E92\u5F0F Shell\u3002\u9ED8\u8BA4\u5173\u95ED\uFF0C\u72EC\u7ACB\u4E8E Agent \u5BA1\u6279\uFF1B\u5207\u6362\u540E\u7ACB\u5373\u4FDD\u5B58\u5E76\u751F\u6548\u3002",
2016
- terminalRemoteUnavailable: "\u8FDC\u7A0B\u7EC8\u7AEF\u4E0D\u53EF\u7528\u3002\u8BF7\u5728 Host \u7684 Remote \u8BBE\u7F6E\u4E2D\u5F00\u542F\u300C\u8FDC\u7A0B\u7EC8\u7AEF\u300D\uFF0C\u7136\u540E\u91CD\u542F Host\u3002",
2027
+ terminalRemoteHint: "\u5141\u8BB8\u53D7\u4FE1\u4EFB\u7684 Remote \u8BBE\u5907\u4EE5\u6B64 Host \u7528\u6237\u8EAB\u4EFD\u8FD0\u884C\u4EA4\u4E92\u5F0F Shell\u3002\u9ED8\u8BA4\u5F00\u542F\uFF0C\u72EC\u7ACB\u4E8E Agent \u5BA1\u6279\uFF1B\u5207\u6362\u540E\u7ACB\u5373\u4FDD\u5B58\u5E76\u751F\u6548\u3002",
2028
+ terminalRemoteUnavailable: "\u8FDC\u7A0B\u7EC8\u7AEF\u4E0D\u53EF\u7528\u3002\u8BF7\u5728 Host \u7684 Remote \u8BBE\u7F6E\u4E2D\u5F00\u542F\u300C\u8FDC\u7A0B\u7EC8\u7AEF\u300D\uFF0C\u5F00\u5173\u4F1A\u7ACB\u5373\u751F\u6548\u3002",
2017
2029
  previewPorts: "\u8FDC\u7A0B\u9884\u89C8\u7AEF\u53E3",
2018
2030
  previewPortsHint: "\u586B\u5199\u5141\u8BB8\u8BBF\u95EE\u7684 Host \u7AEF\u53E3\uFF081024\u201365535\uFF09\uFF0C\u4EE5\u9017\u53F7\u5206\u9694\u3002\u7559\u7A7A\u7981\u7528\u9884\u89C8\uFF1B\u652F\u6301 HTTP\u3001WebSocket \u548C\u70ED\u66F4\u65B0\u3002",
2019
2031
  developmentSave: "\u4FDD\u5B58\u8BBF\u95EE\u8BBE\u7F6E",
@@ -2051,8 +2063,11 @@ Minimum version required to store current data is: ` + bestVersion + `.
2051
2063
  serverUrlHint: "\u7528\u4E8E\u8D26\u53F7\u6388\u6743\u548C\u52A0\u5BC6\u4E2D\u7EE7\u7684 HTTPS \u5730\u5740\u3002",
2052
2064
  serverSaved: "Server \u5730\u5740\u5DF2\u4FDD\u5B58\uFF0C\u91CD\u542F DSH \u540E\u751F\u6548\u3002",
2053
2065
  codexRemote: "Codex Remote",
2054
- codexRemoteHint: "\u901A\u8FC7\u8FD9\u53F0 Host \u63D0\u4F9B Codex \u9879\u76EE\uFF1B\u4FEE\u6539\u540E\u9700\u91CD\u542F DSH \u751F\u6548\u3002",
2066
+ codexRemoteHint: "\u8FDE\u63A5\u8FD9\u53F0 Host \u4E0A\u7684 CodeX \u9879\u76EE\u3002",
2055
2067
  codexSaved: "Codex Remote \u8BBE\u7F6E\u5DF2\u4FDD\u5B58\uFF0C\u91CD\u542F DSH \u540E\u751F\u6548\u3002",
2068
+ cursorRemote: "Cursor ACP adapter\uFF08\u5B9E\u9A8C\u6027\uFF09",
2069
+ cursorRemoteHint: "\u4E3A Agent ACP gateway \u542F\u7528 Cursor `agent acp` backend\u3002\u9700\u672C\u673A\u5B8C\u6210 `agent login`\u3002\u4FEE\u6539\u540E\u9700\u91CD\u542F DSH \u751F\u6548\u3002",
2070
+ cursorSaved: "Cursor ACP adapter \u8BBE\u7F6E\u5DF2\u4FDD\u5B58\uFF0C\u91CD\u542F DSH \u540E\u751F\u6548\u3002",
2056
2071
  authorizeFromRemote: "\u8BF7\u4ECE\u4FA7\u680F Remote \u5165\u53E3\u767B\u5F55\uFF0C\u767B\u5F55\u540E\u53EF\u5728\u8FD9\u91CC\u7BA1\u7406\u5F53\u524D\u8BBE\u5907\u3002",
2057
2072
  authorizationMethod: "\u6388\u6743\u65B9\u5F0F",
2058
2073
  accountPassword: "\u8D26\u53F7\u5BC6\u7801",
@@ -2159,11 +2174,17 @@ Minimum version required to store current data is: ` + bestVersion + `.
2159
2174
  exitRemote: "\u9000\u51FA",
2160
2175
  addRemoteWorkspace: "\u6DFB\u52A0\u8FDC\u7A0B\u5DE5\u4F5C\u533A",
2161
2176
  addCodexWorkspace: "\u6DFB\u52A0 CodeX \u5DE5\u4F5C\u533A",
2177
+ addCursorWorkspace: "\u6DFB\u52A0 Cursor \u5DE5\u4F5C\u533A",
2178
+ addAntigravityWorkspace: "\u6DFB\u52A0 Antigravity \u5DE5\u4F5C\u533A",
2162
2179
  noCodexWorkspaces: "\u8FD8\u6CA1\u6709 CodeX \u5DE5\u4F5C\u533A\u3002",
2180
+ noCursorWorkspaces: "\u8FD8\u6CA1\u6709 Cursor \u5DE5\u4F5C\u533A\u3002\u6DFB\u52A0\u9879\u76EE\u76EE\u5F55\u5373\u53EF\u5F00\u59CB\u3002",
2181
+ noAntigravityWorkspaces: "\u8FD8\u6CA1\u6709 Antigravity \u5DE5\u4F5C\u533A\u3002\u6DFB\u52A0\u9879\u76EE\u76EE\u5F55\u5373\u53EF\u5F00\u59CB\u3002",
2163
2182
  cancelAddWorkspace: "\u53D6\u6D88",
2164
2183
  confirmAddWorkspace: "\u786E\u8BA4\u5E76\u6253\u5F00",
2165
2184
  showAllWorkspaces: "\u663E\u793A\u5168\u90E8 DSH \u5DE5\u4F5C\u533A",
2166
2185
  showAllCodexWorkspaces: "\u663E\u793A\u5168\u90E8 CodeX \u5DE5\u4F5C\u533A",
2186
+ showAllCursorWorkspaces: "\u663E\u793A\u5168\u90E8 Cursor \u5DE5\u4F5C\u533A",
2187
+ showAllAntigravityWorkspaces: "\u663E\u793A\u5168\u90E8 Antigravity \u5DE5\u4F5C\u533A",
2167
2188
  remoteModeLabel: "\u8FDC\u7A0B\u6A21\u5F0F \xB7 {name}",
2168
2189
  remoteNetworkP2p: "P2P",
2169
2190
  remoteNetworkTurn: "TURN",
@@ -2221,13 +2242,14 @@ Minimum version required to store current data is: ` + bestVersion + `.
2221
2242
  startSignIn: "\u5F00\u59CB\u767B\u5F55",
2222
2243
  allowControlCurrentDevice: "\u5141\u8BB8\u63A7\u5236\u5F53\u524D\u8BBE\u5907",
2223
2244
  allowControlDevice: "\u5141\u8BB8\u63A7\u5236\u8BBE\u5907",
2224
- allowRemoteTerminal: "\u5141\u8BB8\u8FDC\u7A0B\u7EC8\u7AEF",
2225
2245
  connectedClientCount: "{count} \u53F0\u5DF2\u8FDE\u63A5",
2226
- checkAcp: "\u68C0\u6D4B ACP",
2246
+ checkAcp: "\u68C0\u6D4B\u540E\u7AEF",
2227
2247
  checkingAcp: "\u6B63\u5728\u68C0\u6D4B ACP\u2026",
2228
2248
  acpAvailable: "ACP \u53EF\u7528",
2229
2249
  acpUnavailable: "ACP \u4E0D\u53EF\u7528",
2230
- acpHint: "\u901A\u8FC7 Agent Client Protocol \u8FDE\u63A5\u517C\u5BB9\u7684\u7F16\u7801 Agent\u3002",
2250
+ agentBackends: "\u66F4\u591A Coding Agent",
2251
+ acpDocumentation: "\u8BE6\u7EC6\u8BF7\u67E5\u9605\u3002",
2252
+ acpHint: "\u901A\u8FC7 ACP \u7EDF\u4E00\u63A5\u5165\uFF0C",
2231
2253
  acpCheckPassed: "\u68C0\u6D4B\u901A\u8FC7",
2232
2254
  acpCheckFailed: "\u68C0\u6D4B\u5931\u8D25",
2233
2255
  addAcp: "\u6DFB\u52A0 ACP",
@@ -2250,6 +2272,8 @@ Minimum version required to store current data is: ` + bestVersion + `.
2250
2272
  qrLoginExpired: "\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5\u3002",
2251
2273
  refreshQrCode: "\u5237\u65B0\u4E8C\u7EF4\u7801",
2252
2274
  codexVirtualWorkspace: "CodeX \u5DE5\u4F5C\u533A",
2275
+ cursorVirtualWorkspace: "Cursor \u5DE5\u4F5C\u533A",
2276
+ antigravityVirtualWorkspace: "Antigravity \u5DE5\u4F5C\u533A",
2253
2277
  codexVirtualSessions: "Sessions"
2254
2278
  }, defaultPreferredTransports = ["lan", "p2p", "turn", "relay"], controlRouteBackoffStepsMs = [1e3, 2e3, 5e3, 1e4, 3e4], ControlRouteUnavailableError = class extends Error {
2255
2279
  constructor(message) {
@@ -2263,7 +2287,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2263
2287
  controlUnavailable: !0,
2264
2288
  connected: !1,
2265
2289
  transport: "Disconnected",
2266
- remoteFeatures: { commandList: !1, fileViewer: !1, terminal: !1, codex: !1 },
2290
+ remoteFeatures: { commandList: !1, fileViewer: !1, terminal: !1, codex: !1, cursor: !1, antigravity: !1 },
2267
2291
  hostAuthorizationAvailable: !1
2268
2292
  };
2269
2293
  }
@@ -2444,8 +2468,8 @@ Minimum version required to store current data is: ` + bestVersion + `.
2444
2468
  }
2445
2469
  }
2446
2470
  function RemotePluginOptions(props) {
2447
- let { t } = props, [open, setOpen] = React.useState(props.view === "page"), [serverUrl, setServerUrl] = React.useState(""), [codexEnabled, setCodexEnabled] = React.useState(!0), [terminalEnabled, setTerminalEnabled] = React.useState(!1), [terminalBusy, setTerminalBusy] = React.useState(!1), [portsBusy, setPortsBusy] = React.useState(!1), [previewPorts, setPreviewPorts] = React.useState(""), role = "host", [registrationCode, setRegistrationCode] = React.useState(""), [associations, setAssociations] = React.useState({}), [loaded, setLoaded] = React.useState(!1), [writable, setWritable] = React.useState(!1), [busy, setBusy] = React.useState(!1), [codexBusy, setCodexBusy] = React.useState(!1), [acpBackends, setAcpBackends] = React.useState([]), [acpAvailability, setAcpAvailability] = React.useState({}), [acpChecking, setAcpChecking] = React.useState({}), [acpCheckResults, setAcpCheckResults] = React.useState({}), [addingAcp, setAddingAcp] = React.useState(!1), [acpName, setAcpName] = React.useState(""), [acpCommand, setAcpCommand] = React.useState(""), [acpArguments, setAcpArguments] = React.useState("acp"), [reconnectBusy, setReconnectBusy] = React.useState(!1), [hostStatus, setHostStatus] = React.useState(void 0), [hostName, setHostName] = React.useState(""), [hostDeviceId, setHostDeviceId] = React.useState(""), [notice, setNotice] = React.useState(void 0), [error, setError] = React.useState(void 0), [settingsView, setSettingsView] = React.useState(void 0), persistedServerUrl = settingsView?.config.serverUrl ?? "https://dsh.r2049.cn", association = associations.client ?? associations.host, serverDirty = settingsView !== void 0 && serverUrl !== persistedServerUrl, draftDirty = serverDirty, applyView = (view) => {
2448
- setSettingsView(view), setServerUrl(view.config.serverUrl ?? "https://dsh.r2049.cn"), setCodexEnabled(view.config.codex?.enabled ?? !0), setTerminalEnabled(view.config.terminal?.enabled ?? !1), setPreviewPorts((view.config.loopback?.ports ?? []).join(", ")), setAcpBackends((view.config.acp?.backends ?? []).map((item) => ({ id: item.id, enabled: item.enabled !== !1 }))), setAcpAvailability(view.acpAvailability ?? {}), setAssociations(view.associations ?? (view.association === void 0 ? {} : { host: view.association })), setWritable(view.writable), setLoaded(!0);
2471
+ let { t } = props, [open, setOpen] = React.useState(props.view === "page"), [serverUrl, setServerUrl] = React.useState(""), [portsBusy, setPortsBusy] = React.useState(!1), [previewPorts, setPreviewPorts] = React.useState(""), role = "host", [registrationCode, setRegistrationCode] = React.useState(""), [associations, setAssociations] = React.useState({}), [loaded, setLoaded] = React.useState(!1), [writable, setWritable] = React.useState(!1), [busy, setBusy] = React.useState(!1), [terminalEnabled, setTerminalEnabled] = React.useState(!1), [terminalBusy, setTerminalBusy] = React.useState(!1), [acpBackends, setAcpBackends] = React.useState([]), [acpAvailability, setAcpAvailability] = React.useState({}), [acpChecking, setAcpChecking] = React.useState({}), [acpCheckResults, setAcpCheckResults] = React.useState({}), [addingAcp, setAddingAcp] = React.useState(!1), [acpName, setAcpName] = React.useState(""), [acpCommand, setAcpCommand] = React.useState(""), [acpArguments, setAcpArguments] = React.useState("acp"), [reconnectBusy, setReconnectBusy] = React.useState(!1), [hostStatus, setHostStatus] = React.useState(void 0), [hostName, setHostName] = React.useState(""), [hostDeviceId, setHostDeviceId] = React.useState(""), [notice, setNotice] = React.useState(void 0), [error, setError] = React.useState(void 0), [settingsView, setSettingsView] = React.useState(void 0), persistedServerUrl = settingsView?.config.serverUrl ?? "https://dsh.r2049.cn", association = associations.client ?? associations.host, serverDirty = settingsView !== void 0 && serverUrl !== persistedServerUrl, draftDirty = serverDirty, applyView = (view) => {
2472
+ setSettingsView(view), setServerUrl(view.config.serverUrl ?? "https://dsh.r2049.cn"), setTerminalEnabled(view.config.terminal?.enabled ?? !0), setPreviewPorts((view.config.loopback?.ports ?? []).join(", ")), setAcpBackends((view.config.acp?.backends ?? []).map((item) => ({ id: item.id, enabled: item.enabled !== !1 }))), setAcpAvailability(view.acpAvailability ?? {}), setAssociations(view.associations ?? (view.association === void 0 ? {} : { host: view.association })), setWritable(view.writable), setLoaded(!0);
2449
2473
  }, load = async () => {
2450
2474
  let [view, status] = await Promise.all([
2451
2475
  props.control("settings.get"),
@@ -2506,17 +2530,6 @@ Minimum version required to store current data is: ` + bestVersion + `.
2506
2530
  } finally {
2507
2531
  setBusy(!1);
2508
2532
  }
2509
- }, setCodexRemote = async (enabled) => {
2510
- let previous = codexEnabled;
2511
- setCodexEnabled(enabled), setCodexBusy(!0), setError(void 0), setNotice(void 0);
2512
- try {
2513
- let view = await props.control("settings.codex.set", { enabled });
2514
- applyView(view), setNotice({ key: "codexSaved" });
2515
- } catch (reason) {
2516
- setCodexEnabled(previous), setError(messageOf(reason));
2517
- } finally {
2518
- setCodexBusy(!1);
2519
- }
2520
2533
  }, setTerminalRemote = async (enabled) => {
2521
2534
  let previous = terminalEnabled, portsDraft = previewPorts;
2522
2535
  setTerminalEnabled(enabled), setTerminalBusy(!0), setError(void 0), setNotice(void 0);
@@ -2539,20 +2552,18 @@ Minimum version required to store current data is: ` + bestVersion + `.
2539
2552
  setPortsBusy(!1);
2540
2553
  }
2541
2554
  }, checkAcp = async (backend) => {
2542
- setAcpChecking((current) => ({ ...current, [backend]: !0 })), setAcpCheckResults((current) => ({ ...current, [backend]: void 0 })), setError(void 0);
2543
- try {
2544
- let view = await props.control("settings.get");
2545
- applyView(view);
2546
- let available = view.acpAvailability?.[backend] === !0;
2547
- if (!available) {
2548
- let disabledView = await props.control("settings.acp.set", { backend, enabled: !1 });
2549
- applyView(disabledView);
2555
+ if (!acpChecking[backend]) {
2556
+ setAcpChecking((current) => ({ ...current, [backend]: !0 })), setAcpCheckResults((current) => ({ ...current, [backend]: void 0 })), setError(void 0);
2557
+ try {
2558
+ let view = await props.control("settings.get");
2559
+ applyView(view);
2560
+ let available = view.acpAvailability?.[backend] === !0;
2561
+ !available && view.writable && view.config.acp?.backends?.some((item) => item.id === backend && item.enabled !== !1) && applyView(await props.control("settings.acp.set", { backend, enabled: !1 })), setAcpCheckResults((current) => ({ ...current, [backend]: available })), setNotice({ key: available ? "acpAvailable" : "acpUnavailable" }), window.setTimeout(() => setAcpCheckResults((current) => ({ ...current, [backend]: void 0 })), 5e3);
2562
+ } catch (reason) {
2563
+ setError(messageOf(reason));
2564
+ } finally {
2565
+ setAcpChecking((current) => ({ ...current, [backend]: !1 }));
2550
2566
  }
2551
- setAcpCheckResults((current) => ({ ...current, [backend]: available })), setNotice({ key: available ? "acpAvailable" : "acpUnavailable" }), window.setTimeout(() => setAcpCheckResults((current) => ({ ...current, [backend]: void 0 })), 5e3);
2552
- } catch (reason) {
2553
- setError(messageOf(reason));
2554
- } finally {
2555
- setAcpChecking((current) => ({ ...current, [backend]: !1 }));
2556
2567
  }
2557
2568
  }, addAcp = async () => {
2558
2569
  setBusy(!0), setError(void 0);
@@ -2624,23 +2635,6 @@ Minimum version required to store current data is: ` + bestVersion + `.
2624
2635
  ),
2625
2636
  React.createElement("small", null, t("previewPortsHint"))
2626
2637
  )
2627
- ), codexSetting = React.createElement(
2628
- "div",
2629
- { className: "dshRemoteAuthorizationSetting" },
2630
- React.createElement(
2631
- "div",
2632
- null,
2633
- React.createElement("strong", null, t("codexRemote")),
2634
- React.createElement("p", null, t("codexRemoteHint"))
2635
- ),
2636
- React.createElement("input", {
2637
- type: "checkbox",
2638
- role: "switch",
2639
- disabled: busy || codexBusy || !writable,
2640
- "aria-label": t("codexRemote"),
2641
- checked: codexEnabled,
2642
- onChange: (event) => void setCodexRemote(event.target.checked)
2643
- })
2644
2638
  ), acpSetting = React.createElement(
2645
2639
  "details",
2646
2640
  { className: "dshRemoteAuthorizationSetting dshRemoteAcpSetting" },
@@ -2650,8 +2644,13 @@ Minimum version required to store current data is: ` + bestVersion + `.
2650
2644
  React.createElement(
2651
2645
  "div",
2652
2646
  { className: "dshRemoteAcpSummaryText" },
2653
- React.createElement("strong", null, "ACP Agent backends"),
2654
- React.createElement("p", null, t("acpHint"))
2647
+ React.createElement("strong", null, t("agentBackends")),
2648
+ React.createElement("p", null, t("acpHint"), React.createElement("a", {
2649
+ href: "https://github.com/liguobao/ds-harness-remote/blob/feat/cursor-remote/docs/acp-remote.md",
2650
+ target: "_blank",
2651
+ rel: "noopener noreferrer",
2652
+ onClick: (event) => event.stopPropagation()
2653
+ }, t("acpDocumentation")))
2655
2654
  )
2656
2655
  ),
2657
2656
  React.createElement(
@@ -2660,7 +2659,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2660
2659
  acpBackends.map((item) => React.createElement(
2661
2660
  "div",
2662
2661
  { key: item.id, className: "dshRemoteAuthorizationSetting" },
2663
- React.createElement("span", null, item.id),
2662
+ React.createElement("div", null, React.createElement("strong", null, item.id === "codex" ? "CodeX" : item.id === "cursor" ? "Cursor" : item.id === "antigravity" ? "AGY" : item.id), null),
2664
2663
  React.createElement(
2665
2664
  "span",
2666
2665
  { className: "dshRemoteAcpCheckCell" },
@@ -2672,14 +2671,15 @@ Minimum version required to store current data is: ` + bestVersion + `.
2672
2671
  acpChecking[item.id] ? t("checkingAcp") : acpCheckResults[item.id] === void 0 ? t("checkAcp") : t(acpCheckResults[item.id] ? "acpCheckPassed" : "acpCheckFailed")
2673
2672
  )
2674
2673
  ),
2675
- ["codex", "cursor", "kimi"].includes(item.id) ? null : React.createElement("a", { href: `#remove-acp-${item.id}`, className: "dshRemoteAcpRemoveLink", onClick: (event) => {
2674
+ ["codex", "cursor", "antigravity"].includes(item.id) ? null : React.createElement("a", { href: `#remove-acp-${item.id}`, className: "dshRemoteAcpRemoveLink", onClick: (event) => {
2676
2675
  event.preventDefault(), removeAcp(item.id);
2677
2676
  } }, t("removeAcp")),
2678
2677
  React.createElement("input", {
2679
2678
  type: "checkbox",
2680
2679
  role: "switch",
2681
- checked: item.enabled && acpAvailability[item.id] === !0,
2682
- disabled: busy || !writable || !acpAvailability[item.id],
2680
+ checked: settingsView?.config.acp?.enabled === !0 && item.enabled && acpAvailability[item.id] === !0,
2681
+ "aria-label": item.id,
2682
+ disabled: busy || !writable || acpChecking[item.id] === !0 || acpAvailability[item.id] !== !0,
2683
2683
  onChange: (event) => void props.control("settings.acp.set", { backend: item.id, enabled: event.target.checked }).then((view) => {
2684
2684
  applyView(view), setAcpBackends((view.config.acp?.backends ?? []).map((v) => ({ id: v.id, enabled: v.enabled !== !1 })));
2685
2685
  }).catch((reason) => setError(messageOf(reason)))
@@ -2775,7 +2775,6 @@ Minimum version required to store current data is: ` + bestVersion + `.
2775
2775
  React.createElement("p", null, t("serverUrlHint"))
2776
2776
  ),
2777
2777
  developmentSetting,
2778
- codexSetting,
2779
2778
  acpSetting,
2780
2779
  React.createElement(
2781
2780
  "div",
@@ -2879,7 +2878,6 @@ Minimum version required to store current data is: ` + bestVersion + `.
2879
2878
  React.createElement("p", null, t("serverUrlHint"))
2880
2879
  ),
2881
2880
  developmentSetting,
2882
- codexSetting,
2883
2881
  acpSetting,
2884
2882
  React.createElement("p", { className: "dshRemoteSettingsState" }, t("authorizeFromRemote")),
2885
2883
  writable ? null : React.createElement("p", { className: "dshRemoteError" }, t("readOnly")),
@@ -2898,7 +2896,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2898
2896
  );
2899
2897
  }
2900
2898
  function RemoteWorkspaceAction(props) {
2901
- let { t } = props, [open, setOpen] = React.useState(!1), [status, setStatus] = React.useState(void 0), [devices, setDevices] = React.useState([]), [selectedHost, setSelectedHost] = React.useState(void 0), [connectingHost, setConnectingHost] = React.useState(void 0), [workspaces, setWorkspaces] = React.useState([]), [codexWorkspaces, setCodexWorkspaces] = React.useState([]), [workspaceBackend, setWorkspaceBackend] = React.useState("harness"), [codexWorkspaceId, setCodexWorkspaceId] = React.useState(void 0), [directory, setDirectory] = React.useState(void 0), [path, setPath] = React.useState(""), [addingWorkspace, setAddingWorkspace] = React.useState(!1), [showAllWorkspaces, setShowAllWorkspaces] = React.useState(!1), [showAllCodexWorkspaces, setShowAllCodexWorkspaces] = React.useState(!1), [devicesOpen, setDevicesOpen] = React.useState(!1), workspaceListId = "dsh-remote-workspace-list", codexWorkspaceHeadingId = "dsh-remote-codex-workspace-heading", codexWorkspaceListId = "dsh-remote-codex-workspace-list", [busy, setBusy] = React.useState(!1), [terminalEnabled, setTerminalEnabled] = React.useState(!1), [terminalBusy, setTerminalBusy] = React.useState(!1), [needsAuthorization, setNeedsAuthorization] = React.useState(!1), [email, setEmail] = React.useState(""), [password, setPassword] = React.useState(""), [loginServerUrl, setLoginServerUrl] = React.useState("https://dsh.r2049.cn"), [loginMethod, setLoginMethod] = React.useState(props.preferredQrProvider), [loginMethodManuallySelected, setLoginMethodManuallySelected] = React.useState(!1), [qrSession, setQrSession] = React.useState(void 0), [qrImage, setQrImage] = React.useState(void 0), [qrExpired, setQrExpired] = React.useState(!1), [progress, setProgress] = React.useState(void 0), progressRun = React.useRef(0), qrFlowRun = React.useRef(0), [notice, setNotice] = React.useState(void 0), [error, setError] = React.useState(void 0);
2899
+ let { t } = props, [open, setOpen] = React.useState(!1), [status, setStatus] = React.useState(void 0), [devices, setDevices] = React.useState([]), [selectedHost, setSelectedHost] = React.useState(void 0), [connectingHost, setConnectingHost] = React.useState(void 0), [workspaces, setWorkspaces] = React.useState([]), [codexWorkspaces, setCodexWorkspaces] = React.useState([]), [cursorWorkspaces, setCursorWorkspaces] = React.useState([]), [antigravityWorkspaces, setAntigravityWorkspaces] = React.useState([]), [workspaceBackend, setWorkspaceBackend] = React.useState("harness"), [codexWorkspaceId, setCodexWorkspaceId] = React.useState(void 0), [cursorWorkspaceId, setCursorWorkspaceId] = React.useState(void 0), [antigravityWorkspaceId, setAntigravityWorkspaceId] = React.useState(void 0), [directory, setDirectory] = React.useState(void 0), [path, setPath] = React.useState(""), [addingWorkspace, setAddingWorkspace] = React.useState(!1), [showAllWorkspaces, setShowAllWorkspaces] = React.useState(!1), [showAllCodexWorkspaces, setShowAllCodexWorkspaces] = React.useState(!1), [devicesOpen, setDevicesOpen] = React.useState(!1), [showAllCursorWorkspaces, setShowAllCursorWorkspaces] = React.useState(!1), [showAllAntigravityWorkspaces, setShowAllAntigravityWorkspaces] = React.useState(!1), workspaceListId = "dsh-remote-workspace-list", codexWorkspaceHeadingId = "dsh-remote-codex-workspace-heading", codexWorkspaceListId = "dsh-remote-codex-workspace-list", cursorWorkspaceHeadingId = "dsh-remote-cursor-workspace-heading", cursorWorkspaceListId = "dsh-remote-cursor-workspace-list", antigravityWorkspaceHeadingId = "dsh-remote-antigravity-workspace-heading", antigravityWorkspaceListId = "dsh-remote-antigravity-workspace-list", [busy, setBusy] = React.useState(!1), [needsAuthorization, setNeedsAuthorization] = React.useState(!1), [email, setEmail] = React.useState(""), [password, setPassword] = React.useState(""), [loginServerUrl, setLoginServerUrl] = React.useState("https://dsh.r2049.cn"), [loginMethod, setLoginMethod] = React.useState(props.preferredQrProvider), [loginMethodManuallySelected, setLoginMethodManuallySelected] = React.useState(!1), [qrSession, setQrSession] = React.useState(void 0), [qrImage, setQrImage] = React.useState(void 0), [qrExpired, setQrExpired] = React.useState(!1), [progress, setProgress] = React.useState(void 0), progressRun = React.useRef(0), qrFlowRun = React.useRef(0), [notice, setNotice] = React.useState(void 0), [error, setError] = React.useState(void 0);
2902
2900
  React.useEffect(() => {
2903
2901
  open || setDevicesOpen(!1);
2904
2902
  }, [open]), React.useEffect(() => {
@@ -2926,9 +2924,6 @@ Minimum version required to store current data is: ` + bestVersion + `.
2926
2924
  props.control("status").then(setStatus).catch(() => {
2927
2925
  });
2928
2926
  }, []), React.useEffect(() => {
2929
- status?.hostAuthorizationAvailable === !0 && props.control("settings.get").then((view) => setTerminalEnabled(view.config.terminal?.enabled === !0)).catch(() => {
2930
- });
2931
- }, [status?.hostAuthorizationAvailable]), React.useEffect(() => {
2932
2927
  status?.serverUrl !== void 0 && loginServerUrl === "https://dsh.r2049.cn" && setLoginServerUrl(status.serverUrl);
2933
2928
  }, [status?.serverUrl]), React.useEffect(() => {
2934
2929
  let remoteActive = status?.mode === "remote";
@@ -2999,7 +2994,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
2999
2994
  disabled: busy,
3000
2995
  onClick: () => selectLoginMethod(provider)
3001
2996
  }, t(provider === "github" ? "githubLogin" : "zhihuLogin")), selectHost = async (host) => {
3002
- setBusy(!0), setError(void 0), setConnectingHost(host), setCodexWorkspaces([]), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1);
2997
+ setBusy(!0), setError(void 0), setConnectingHost(host), setCodexWorkspaces([]), setCursorWorkspaces([]), setAntigravityWorkspaces([]), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1), setShowAllCursorWorkspaces(!1), setShowAllAntigravityWorkspaces(!1);
3003
2998
  try {
3004
2999
  let result = await runConnectHostProgress(
3005
3000
  status?.preferredTransports,
@@ -3013,13 +3008,23 @@ Minimum version required to store current data is: ` + bestVersion + `.
3013
3008
  targetDeviceId: host.deviceId
3014
3009
  }), nextCodexWorkspaces = await props.control("codex.workspaces.list", {
3015
3010
  targetDeviceId: host.deviceId
3011
+ }).catch(() => []), nextCursorWorkspaces = await props.control("cursor.workspaces.list", {
3012
+ targetDeviceId: host.deviceId
3013
+ }).catch(() => []), nextAntigravityWorkspaces = await props.control("antigravity.workspaces.list", {
3014
+ targetDeviceId: host.deviceId
3016
3015
  }).catch(() => []), nextStatus = await props.control("status").catch(() => {
3017
3016
  });
3018
- return nextStatus !== void 0 && setStatus(nextStatus), { workspaces: nextWorkspaces, codexWorkspaces: nextCodexWorkspaces, status: nextStatus };
3017
+ return nextStatus !== void 0 && setStatus(nextStatus), {
3018
+ workspaces: nextWorkspaces,
3019
+ codexWorkspaces: nextCodexWorkspaces,
3020
+ cursorWorkspaces: nextCursorWorkspaces,
3021
+ antigravityWorkspaces: nextAntigravityWorkspaces,
3022
+ status: nextStatus
3023
+ };
3019
3024
  },
3020
3025
  (result2) => connectedProgress(result2.status)
3021
3026
  );
3022
- setWorkspaces(result.workspaces), setCodexWorkspaces(result.codexWorkspaces), setWorkspaceBackend("harness"), setCodexWorkspaceId(void 0), setSelectedHost(host), setPath(""), setAddingWorkspace(!1), setDirectory(void 0);
3027
+ setWorkspaces(result.workspaces), setCodexWorkspaces(result.codexWorkspaces), setCursorWorkspaces(result.cursorWorkspaces), setAntigravityWorkspaces(result.antigravityWorkspaces), setWorkspaceBackend("harness"), setCodexWorkspaceId(void 0), setCursorWorkspaceId(void 0), setAntigravityWorkspaceId(void 0), setSelectedHost(host), setPath(""), setAddingWorkspace(!1), setDirectory(void 0);
3023
3028
  } catch (reason) {
3024
3029
  setError(messageOf(reason));
3025
3030
  } finally {
@@ -3033,7 +3038,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3033
3038
  targetDeviceId: selectedHost.deviceId,
3034
3039
  ...nextPath === void 0 ? {} : { path: nextPath }
3035
3040
  });
3036
- setDirectory(listing), setCodexWorkspaceId(void 0), setPath(listing.path);
3041
+ setDirectory(listing), setCodexWorkspaceId(void 0), setCursorWorkspaceId(void 0), setAntigravityWorkspaceId(void 0), setPath(listing.path);
3037
3042
  } catch (reason) {
3038
3043
  setError(messageOf(reason));
3039
3044
  } finally {
@@ -3041,25 +3046,29 @@ Minimum version required to store current data is: ` + bestVersion + `.
3041
3046
  }
3042
3047
  }
3043
3048
  }, startAddingWorkspace = (backend) => {
3044
- setAddingWorkspace(!0), setWorkspaceBackend(backend), setCodexWorkspaceId(void 0), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1), setDirectory(void 0), setPath(""), browseDirectory();
3049
+ setAddingWorkspace(!0), setWorkspaceBackend(backend), setCodexWorkspaceId(void 0), setCursorWorkspaceId(void 0), setAntigravityWorkspaceId(void 0), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1), setShowAllCursorWorkspaces(!1), setShowAllAntigravityWorkspaces(!1), setDirectory(void 0), setPath(""), browseDirectory();
3045
3050
  }, cancelAddingWorkspace = () => {
3046
- setAddingWorkspace(!1), setWorkspaceBackend("harness"), setCodexWorkspaceId(void 0), setDirectory(void 0), setPath("");
3051
+ setAddingWorkspace(!1), setWorkspaceBackend("harness"), setCodexWorkspaceId(void 0), setCursorWorkspaceId(void 0), setAntigravityWorkspaceId(void 0), setDirectory(void 0), setPath("");
3047
3052
  }, refreshRemote = async () => {
3048
3053
  setBusy(!0), setNotice(void 0), setError(void 0);
3049
3054
  try {
3050
3055
  let nextStatus = await props.control("status");
3051
3056
  if (setStatus(nextStatus), !nextStatus.available) {
3052
- setDevices([]), setNeedsAuthorization(!1), setSelectedHost(void 0), setWorkspaces([]), setCodexWorkspaces([]), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1), setWorkspaceBackend("harness"), setCodexWorkspaceId(void 0), setPath(""), setAddingWorkspace(!1), setDirectory(void 0);
3057
+ setDevices([]), setNeedsAuthorization(!1), setSelectedHost(void 0), setWorkspaces([]), setCodexWorkspaces([]), setCursorWorkspaces([]), setAntigravityWorkspaces([]), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1), setShowAllCursorWorkspaces(!1), setShowAllAntigravityWorkspaces(!1), setWorkspaceBackend("harness"), setCodexWorkspaceId(void 0), setCursorWorkspaceId(void 0), setAntigravityWorkspaceId(void 0), setPath(""), setAddingWorkspace(!1), setDirectory(void 0);
3053
3058
  return;
3054
3059
  }
3055
3060
  try {
3056
3061
  let nextDevices = await props.control("devices");
3057
3062
  if (setDevices(nextDevices), setNeedsAuthorization(!1), selectedHost !== void 0) {
3058
3063
  let nextSelectedHost = nextDevices.find((device) => device.deviceId === selectedHost.deviceId);
3059
- nextSelectedHost === void 0 ? (setSelectedHost(void 0), setWorkspaces([]), setCodexWorkspaces([]), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1), setWorkspaceBackend("harness"), setCodexWorkspaceId(void 0), setPath(""), setAddingWorkspace(!1), setDirectory(void 0)) : setSelectedHost(nextSelectedHost);
3064
+ nextSelectedHost === void 0 ? (setSelectedHost(void 0), setWorkspaces([]), setCodexWorkspaces([]), setCursorWorkspaces([]), setAntigravityWorkspaces([]), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1), setShowAllCursorWorkspaces(!1), setShowAllAntigravityWorkspaces(!1), setWorkspaceBackend("harness"), setCodexWorkspaceId(void 0), setCursorWorkspaceId(void 0), setAntigravityWorkspaceId(void 0), setPath(""), setAddingWorkspace(!1), setDirectory(void 0)) : (setSelectedHost(nextSelectedHost), props.control("workspaces.list", { targetDeviceId: nextSelectedHost.deviceId }).then((w) => setWorkspaces(w)).catch(() => {
3065
+ }), props.control("codex.workspaces.list", { targetDeviceId: nextSelectedHost.deviceId }).then((w) => setCodexWorkspaces(w)).catch(() => {
3066
+ }), props.control("cursor.workspaces.list", { targetDeviceId: nextSelectedHost.deviceId }).then((w) => setCursorWorkspaces(w)).catch(() => {
3067
+ }), props.control("antigravity.workspaces.list", { targetDeviceId: nextSelectedHost.deviceId }).then((w) => setAntigravityWorkspaces(w)).catch(() => {
3068
+ }));
3060
3069
  }
3061
3070
  } catch {
3062
- setDevices([]), setNeedsAuthorization(!0), setSelectedHost(void 0), setWorkspaces([]), setCodexWorkspaces([]), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1), setWorkspaceBackend("harness"), setCodexWorkspaceId(void 0), setPath(""), setAddingWorkspace(!1), setDirectory(void 0);
3071
+ setDevices([]), setNeedsAuthorization(!0), setSelectedHost(void 0), setWorkspaces([]), setCodexWorkspaces([]), setCursorWorkspaces([]), setAntigravityWorkspaces([]), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1), setShowAllCursorWorkspaces(!1), setShowAllAntigravityWorkspaces(!1), setWorkspaceBackend("harness"), setCodexWorkspaceId(void 0), setCursorWorkspaceId(void 0), setAntigravityWorkspaceId(void 0), setPath(""), setAddingWorkspace(!1), setDirectory(void 0);
3063
3072
  }
3064
3073
  } catch (reason) {
3065
3074
  setError(messageOf(reason));
@@ -3067,14 +3076,14 @@ Minimum version required to store current data is: ` + bestVersion + `.
3067
3076
  setBusy(!1);
3068
3077
  }
3069
3078
  }, show = async () => {
3070
- setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1), setOpen(!0), await refreshRemote();
3079
+ setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1), setShowAllCursorWorkspaces(!1), setShowAllAntigravityWorkspaces(!1), setOpen(!0), await refreshRemote();
3071
3080
  };
3072
3081
  React.useEffect(() => {
3073
3082
  if (!(!open || selectedHost !== void 0))
3074
3083
  return props.statusFeed.subscribe(setStatus);
3075
3084
  }, [open, selectedHost]);
3076
3085
  let chooseAnotherHost = () => {
3077
- setSelectedHost(void 0), setWorkspaces([]), setCodexWorkspaces([]), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1), setWorkspaceBackend("harness"), setCodexWorkspaceId(void 0), setDirectory(void 0), setPath(""), setAddingWorkspace(!1), setError(void 0);
3086
+ setSelectedHost(void 0), setWorkspaces([]), setCodexWorkspaces([]), setCursorWorkspaces([]), setAntigravityWorkspaces([]), setShowAllWorkspaces(!1), setShowAllCodexWorkspaces(!1), setShowAllCursorWorkspaces(!1), setShowAllAntigravityWorkspaces(!1), setWorkspaceBackend("harness"), setCodexWorkspaceId(void 0), setCursorWorkspaceId(void 0), setAntigravityWorkspaceId(void 0), setDirectory(void 0), setPath(""), setAddingWorkspace(!1), setError(void 0);
3078
3087
  }, signInClient = async () => {
3079
3088
  if (!(email.trim() === "" || password === "" || loginServerUrl.trim() === "")) {
3080
3089
  setBusy(!0), setError(void 0);
@@ -3107,17 +3116,6 @@ Minimum version required to store current data is: ` + bestVersion + `.
3107
3116
  } finally {
3108
3117
  setBusy(!1);
3109
3118
  }
3110
- }, setRemoteTerminal = async (enabled) => {
3111
- let previous = terminalEnabled;
3112
- setTerminalEnabled(enabled), setTerminalBusy(!0), setError(void 0);
3113
- try {
3114
- let view = await props.control("settings.development.set", { terminalEnabled: enabled });
3115
- setTerminalEnabled(view.config.terminal?.enabled === !0);
3116
- } catch (reason) {
3117
- setTerminalEnabled(previous), setError(messageOf(reason));
3118
- } finally {
3119
- setTerminalBusy(!1);
3120
- }
3121
3119
  }, logoutRemote = async () => {
3122
3120
  setBusy(!0), setError(void 0);
3123
3121
  try {
@@ -3128,8 +3126,8 @@ Minimum version required to store current data is: ` + bestVersion + `.
3128
3126
  setBusy(!1);
3129
3127
  }
3130
3128
  }, openWorkspace = async (selection) => {
3131
- let targetBackend = selection?.backend ?? workspaceBackend, targetPath = (selection?.path ?? path).trim(), targetCodexWorkspaceId = selection?.backend === "codex" ? selection.workspaceId : selection === void 0 ? codexWorkspaceId : void 0, createWorkspace = selection === void 0 && addingWorkspace;
3132
- if (!(selectedHost === void 0 || targetPath === "" || !createWorkspace && targetBackend === "codex" && targetCodexWorkspaceId === void 0)) {
3129
+ let targetBackend = selection?.backend ?? workspaceBackend, targetPath = (selection?.path ?? path).trim(), targetCodexWorkspaceId = selection?.backend === "codex" ? selection.workspaceId : selection === void 0 ? codexWorkspaceId : void 0, targetCursorWorkspaceId = selection?.backend === "cursor" ? selection.workspaceId : selection === void 0 ? cursorWorkspaceId : void 0, targetAntigravityWorkspaceId = selection?.backend === "antigravity" ? selection.workspaceId : selection === void 0 ? antigravityWorkspaceId : void 0, createWorkspace = selection === void 0 && addingWorkspace;
3130
+ if (!(selectedHost === void 0 || targetPath === "" || !createWorkspace && targetBackend === "codex" && targetCodexWorkspaceId === void 0 || !createWorkspace && targetBackend === "cursor" && targetCursorWorkspaceId === void 0 && targetPath === "" || !createWorkspace && targetBackend === "antigravity" && targetAntigravityWorkspaceId === void 0 && targetPath === "")) {
3133
3131
  setBusy(!0), setError(void 0);
3134
3132
  try {
3135
3133
  let nextStatus = await (targetBackend === "codex" ? createWorkspace ? props.control("codex.workspace.create", {
@@ -3138,6 +3136,18 @@ Minimum version required to store current data is: ` + bestVersion + `.
3138
3136
  }) : props.control("codex.workspace.open", {
3139
3137
  targetDeviceId: selectedHost.deviceId,
3140
3138
  workspaceId: targetCodexWorkspaceId
3139
+ }) : targetBackend === "cursor" ? createWorkspace || targetCursorWorkspaceId === void 0 ? props.control("cursor.workspace.create", {
3140
+ targetDeviceId: selectedHost.deviceId,
3141
+ path: targetPath
3142
+ }) : props.control("cursor.workspace.open", {
3143
+ targetDeviceId: selectedHost.deviceId,
3144
+ workspaceId: targetCursorWorkspaceId
3145
+ }) : targetBackend === "antigravity" ? createWorkspace || targetAntigravityWorkspaceId === void 0 ? props.control("antigravity.workspace.create", {
3146
+ targetDeviceId: selectedHost.deviceId,
3147
+ path: targetPath
3148
+ }) : props.control("antigravity.workspace.open", {
3149
+ targetDeviceId: selectedHost.deviceId,
3150
+ workspaceId: targetAntigravityWorkspaceId
3141
3151
  }) : props.control("workspace.open", {
3142
3152
  targetDeviceId: selectedHost.deviceId,
3143
3153
  path: targetPath
@@ -3147,7 +3157,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3147
3157
  setError(messageOf(reason)), setBusy(!1);
3148
3158
  }
3149
3159
  }
3150
- }, remoteLabel = status?.mode === "remote" ? t("activeRemote", { name: status.target?.name ?? t("host") }) : t("remoteEntry"), visibleWorkspaces = showAllWorkspaces ? workspaces : workspaces.slice(0, 3), visibleCodexWorkspaces = showAllCodexWorkspaces ? codexWorkspaces : codexWorkspaces.slice(0, 3), codexAvailable = status?.remoteFeatures?.codex === !0, selectedHostDetails = selectedHost === void 0 ? void 0 : [
3160
+ }, remoteLabel = status?.mode === "remote" ? t("activeRemote", { name: status.target?.name ?? t("host") }) : t("remoteEntry"), visibleWorkspaces = showAllWorkspaces ? workspaces : workspaces.slice(0, 3), visibleCodexWorkspaces = showAllCodexWorkspaces ? codexWorkspaces : codexWorkspaces.slice(0, 3), visibleCursorWorkspaces = showAllCursorWorkspaces ? cursorWorkspaces : cursorWorkspaces.slice(0, 3), visibleAntigravityWorkspaces = showAllAntigravityWorkspaces ? antigravityWorkspaces : antigravityWorkspaces.slice(0, 3), codexAvailable = status?.remoteFeatures?.codex === !0, cursorAvailable = status?.remoteFeatures?.cursor === !0, antigravityAvailable = status?.remoteFeatures?.antigravity === !0, selectedHostDetails = selectedHost === void 0 ? void 0 : [
3151
3161
  formatPlatform(selectedHost.platform),
3152
3162
  selectedHost.harnessVersion === void 0 ? void 0 : t("harnessVersion", { version: selectedHost.harnessVersion }),
3153
3163
  selectedHost.clientVersion === void 0 ? void 0 : t("pluginVersion", { version: selectedHost.clientVersion })
@@ -3422,33 +3432,16 @@ Minimum version required to store current data is: ` + bestVersion + `.
3422
3432
  React.createElement("strong", null, t("chooseHost")),
3423
3433
  status?.hostAuthorizationAvailable ? React.createElement(
3424
3434
  "div",
3425
- { className: "dshRemoteHostControlToggles" },
3426
- React.createElement(
3427
- "label",
3428
- { className: "dshRemoteHostControlToggle" },
3429
- React.createElement("span", null, t("allowControlDevice")),
3430
- React.createElement("input", {
3431
- type: "checkbox",
3432
- role: "switch",
3433
- disabled: busy,
3434
- "aria-label": t("allowControlDevice"),
3435
- checked: status.host?.authorized === !0,
3436
- onChange: (event) => void setCurrentDeviceControl(event.target.checked)
3437
- })
3438
- ),
3439
- React.createElement(
3440
- "label",
3441
- { className: "dshRemoteHostControlToggle" },
3442
- React.createElement("span", null, t("allowRemoteTerminal")),
3443
- React.createElement("input", {
3444
- type: "checkbox",
3445
- role: "switch",
3446
- disabled: busy || terminalBusy,
3447
- "aria-label": t("allowRemoteTerminal"),
3448
- checked: terminalEnabled,
3449
- onChange: (event) => void setRemoteTerminal(event.target.checked)
3450
- })
3451
- )
3435
+ { className: "dshRemoteHostControlToggle" },
3436
+ React.createElement("span", null, t("allowControlDevice")),
3437
+ React.createElement("input", {
3438
+ type: "checkbox",
3439
+ role: "switch",
3440
+ disabled: busy,
3441
+ "aria-label": t("allowControlDevice"),
3442
+ checked: status.host?.authorized === !0,
3443
+ onChange: (event) => void setCurrentDeviceControl(event.target.checked)
3444
+ })
3452
3445
  ) : null,
3453
3446
  connectedMenu
3454
3447
  )
@@ -3500,7 +3493,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3500
3493
  React.createElement(
3501
3494
  "div",
3502
3495
  { className: "dshRemoteSectionHeading dshRemoteWorkspaceHeading" },
3503
- React.createElement("strong", null, t(addingWorkspace ? workspaceBackend === "codex" ? "addCodexWorkspace" : "addRemoteWorkspace" : "existingWorkspaces")),
3496
+ React.createElement("strong", null, t(addingWorkspace ? workspaceBackend === "codex" ? "addCodexWorkspace" : workspaceBackend === "cursor" ? "addCursorWorkspace" : workspaceBackend === "antigravity" ? "addAntigravityWorkspace" : "addRemoteWorkspace" : "existingWorkspaces")),
3504
3497
  addingWorkspace ? React.createElement("button", {
3505
3498
  type: "button",
3506
3499
  className: "dshRemoteCancelWorkspace",
@@ -3562,7 +3555,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3562
3555
  className: workspaceBackend === "harness" && path === workspace.path ? "isSelected" : "",
3563
3556
  "aria-pressed": workspaceBackend === "harness" && path === workspace.path,
3564
3557
  onClick: () => {
3565
- setWorkspaceBackend("harness"), setCodexWorkspaceId(void 0), setPath(workspace.path);
3558
+ setWorkspaceBackend("harness"), setCodexWorkspaceId(void 0), setCursorWorkspaceId(void 0), setPath(workspace.path);
3566
3559
  },
3567
3560
  onDoubleClick: () => void openWorkspace({ backend: "harness", path: workspace.path })
3568
3561
  },
@@ -3580,7 +3573,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3580
3573
  }, React.createElement("span", { "aria-hidden": !0 }, "\u2026"))
3581
3574
  )
3582
3575
  ),
3583
- !codexAvailable && codexWorkspaces.length === 0 ? null : React.createElement(
3576
+ codexAvailable ? React.createElement(
3584
3577
  "section",
3585
3578
  { className: "dshRemoteCodexWorkspaceGroup" },
3586
3579
  React.createElement(
@@ -3621,7 +3614,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3621
3614
  className: workspaceBackend === "codex" && codexWorkspaceId === workspace.workspaceId ? "isSelected" : "",
3622
3615
  "aria-pressed": workspaceBackend === "codex" && codexWorkspaceId === workspace.workspaceId,
3623
3616
  onClick: () => {
3624
- setWorkspaceBackend("codex"), setCodexWorkspaceId(workspace.workspaceId), setPath(workspace.path);
3617
+ setWorkspaceBackend("codex"), setCodexWorkspaceId(workspace.workspaceId), setCursorWorkspaceId(void 0), setPath(workspace.path);
3625
3618
  },
3626
3619
  onDoubleClick: () => void openWorkspace({
3627
3620
  backend: "codex",
@@ -3641,7 +3634,131 @@ Minimum version required to store current data is: ` + bestVersion + `.
3641
3634
  "aria-label": t("showAllCodexWorkspaces"),
3642
3635
  onClick: () => setShowAllCodexWorkspaces(!0)
3643
3636
  }, React.createElement("span", { "aria-hidden": !0 }, "\u2026"))
3644
- )
3637
+ ) : null,
3638
+ cursorAvailable ? React.createElement(
3639
+ "section",
3640
+ { className: "dshRemoteCodexWorkspaceGroup" },
3641
+ React.createElement(
3642
+ "div",
3643
+ {
3644
+ id: cursorWorkspaceHeadingId,
3645
+ className: "dshRemoteWorkspaceSourceHeading"
3646
+ },
3647
+ React.createElement(
3648
+ "span",
3649
+ { className: "dshRemoteWorkspaceSourceText" },
3650
+ React.createElement("strong", null, t("cursorVirtualWorkspace"))
3651
+ ),
3652
+ cursorAvailable ? React.createElement("button", {
3653
+ type: "button",
3654
+ className: "dshRemoteAddWorkspace",
3655
+ disabled: busy,
3656
+ title: t("addCursorWorkspace"),
3657
+ "aria-label": t("addCursorWorkspace"),
3658
+ onClick: () => startAddingWorkspace("cursor")
3659
+ }, React.createElement("svg", {
3660
+ className: "dshRemoteAddWorkspaceIcon",
3661
+ viewBox: "0 0 16 16",
3662
+ "aria-hidden": !0,
3663
+ focusable: !1
3664
+ }, React.createElement("path", { d: "M8 3v10M3 8h10", fill: "none", stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round" }))) : null
3665
+ ),
3666
+ React.createElement("div", {
3667
+ id: cursorWorkspaceListId,
3668
+ className: "dshRemoteDirectoryList dshRemoteCodexWorkspaceList",
3669
+ "aria-labelledby": cursorWorkspaceHeadingId
3670
+ }, visibleCursorWorkspaces.length === 0 ? React.createElement("p", null, t("noCursorWorkspaces")) : visibleCursorWorkspaces.map((workspace) => React.createElement(
3671
+ "button",
3672
+ {
3673
+ type: "button",
3674
+ key: workspace.workspaceId,
3675
+ disabled: busy,
3676
+ className: workspaceBackend === "cursor" && cursorWorkspaceId === workspace.workspaceId ? "isSelected" : "",
3677
+ "aria-pressed": workspaceBackend === "cursor" && cursorWorkspaceId === workspace.workspaceId,
3678
+ onClick: () => {
3679
+ setWorkspaceBackend("cursor"), setCursorWorkspaceId(workspace.workspaceId), setCodexWorkspaceId(void 0), setAntigravityWorkspaceId(void 0), setPath(workspace.path);
3680
+ },
3681
+ onDoubleClick: () => void openWorkspace({
3682
+ backend: "cursor",
3683
+ path: workspace.path,
3684
+ workspaceId: workspace.workspaceId
3685
+ })
3686
+ },
3687
+ React.createElement("img", { className: "dshRemoteWorkspaceIcon", src: deepSeekWorkspaceIcon, alt: "", "aria-hidden": !0 }),
3688
+ React.createElement("span", null, workspace.title),
3689
+ React.createElement("small", null, `${workspace.path} \xB7 ${workspace.sessionCount}`)
3690
+ ))),
3691
+ cursorWorkspaces.length <= 3 || showAllCursorWorkspaces ? null : React.createElement("button", {
3692
+ type: "button",
3693
+ className: "dshRemoteWorkspaceMore",
3694
+ disabled: busy,
3695
+ "aria-controls": cursorWorkspaceListId,
3696
+ "aria-label": t("showAllCursorWorkspaces"),
3697
+ onClick: () => setShowAllCursorWorkspaces(!0)
3698
+ }, React.createElement("span", { "aria-hidden": !0 }, "\u2026"))
3699
+ ) : null,
3700
+ antigravityAvailable ? React.createElement(
3701
+ "section",
3702
+ { className: "dshRemoteCodexWorkspaceGroup" },
3703
+ React.createElement(
3704
+ "div",
3705
+ {
3706
+ id: antigravityWorkspaceHeadingId,
3707
+ className: "dshRemoteWorkspaceSourceHeading"
3708
+ },
3709
+ React.createElement(
3710
+ "span",
3711
+ { className: "dshRemoteWorkspaceSourceText" },
3712
+ React.createElement("strong", null, t("antigravityVirtualWorkspace"))
3713
+ ),
3714
+ antigravityAvailable ? React.createElement("button", {
3715
+ type: "button",
3716
+ className: "dshRemoteAddWorkspace",
3717
+ disabled: busy,
3718
+ title: t("addAntigravityWorkspace"),
3719
+ "aria-label": t("addAntigravityWorkspace"),
3720
+ onClick: () => startAddingWorkspace("antigravity")
3721
+ }, React.createElement("svg", {
3722
+ className: "dshRemoteAddWorkspaceIcon",
3723
+ viewBox: "0 0 16 16",
3724
+ "aria-hidden": !0,
3725
+ focusable: !1
3726
+ }, React.createElement("path", { d: "M8 3v10M3 8h10", fill: "none", stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round" }))) : null
3727
+ ),
3728
+ React.createElement("div", {
3729
+ id: antigravityWorkspaceListId,
3730
+ className: "dshRemoteDirectoryList dshRemoteCodexWorkspaceList",
3731
+ "aria-labelledby": antigravityWorkspaceHeadingId
3732
+ }, visibleAntigravityWorkspaces.length === 0 ? React.createElement("p", null, t("noAntigravityWorkspaces")) : visibleAntigravityWorkspaces.map((workspace) => React.createElement(
3733
+ "button",
3734
+ {
3735
+ type: "button",
3736
+ key: workspace.workspaceId,
3737
+ disabled: busy,
3738
+ className: workspaceBackend === "antigravity" && antigravityWorkspaceId === workspace.workspaceId ? "isSelected" : "",
3739
+ "aria-pressed": workspaceBackend === "antigravity" && antigravityWorkspaceId === workspace.workspaceId,
3740
+ onClick: () => {
3741
+ setWorkspaceBackend("antigravity"), setAntigravityWorkspaceId(workspace.workspaceId), setCodexWorkspaceId(void 0), setCursorWorkspaceId(void 0), setPath(workspace.path);
3742
+ },
3743
+ onDoubleClick: () => void openWorkspace({
3744
+ backend: "antigravity",
3745
+ path: workspace.path,
3746
+ workspaceId: workspace.workspaceId
3747
+ })
3748
+ },
3749
+ React.createElement("img", { className: "dshRemoteWorkspaceIcon", src: deepSeekWorkspaceIcon, alt: "", "aria-hidden": !0 }),
3750
+ React.createElement("span", null, workspace.title),
3751
+ React.createElement("small", null, `${workspace.path} \xB7 ${workspace.sessionCount}`)
3752
+ ))),
3753
+ antigravityWorkspaces.length <= 3 || showAllAntigravityWorkspaces ? null : React.createElement("button", {
3754
+ type: "button",
3755
+ className: "dshRemoteWorkspaceMore",
3756
+ disabled: busy,
3757
+ "aria-controls": antigravityWorkspaceListId,
3758
+ "aria-label": t("showAllAntigravityWorkspaces"),
3759
+ onClick: () => setShowAllAntigravityWorkspaces(!0)
3760
+ }, React.createElement("span", { "aria-hidden": !0 }, "\u2026"))
3761
+ ) : null
3645
3762
  ),
3646
3763
  React.createElement(
3647
3764
  "footer",
@@ -3649,7 +3766,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
3649
3766
  React.createElement("div", null, React.createElement("span", null, t("currentDirectory")), React.createElement("strong", null, path || "\u2014")),
3650
3767
  React.createElement("button", {
3651
3768
  type: "button",
3652
- disabled: busy || path.trim() === "" || !addingWorkspace && workspaceBackend === "codex" && codexWorkspaceId === void 0,
3769
+ disabled: busy || path.trim() === "" || !addingWorkspace && workspaceBackend === "codex" && codexWorkspaceId === void 0 || !addingWorkspace && workspaceBackend === "cursor" && cursorWorkspaceId === void 0 && path === "" || !addingWorkspace && workspaceBackend === "antigravity" && antigravityWorkspaceId === void 0 && path === "",
3653
3770
  onClick: () => void openWorkspace()
3654
3771
  }, t(busy ? "openingWorkspace" : addingWorkspace ? "confirmAddWorkspace" : "openWorkspace"))
3655
3772
  )
@@ -3822,7 +3939,15 @@ Minimum version required to store current data is: ` + bestVersion + `.
3822
3939
  }, [status?.mode]), React.useEffect(() => (document.documentElement.classList.toggle(
3823
3940
  "dshRemoteCodexTargetActive",
3824
3941
  status?.mode === "remote" && status.backend === "codex"
3825
- ), () => document.documentElement.classList.remove("dshRemoteCodexTargetActive")), [status?.mode, status?.backend]), React.useEffect(() => {
3942
+ ), document.documentElement.classList.toggle(
3943
+ "dshRemoteCursorTargetActive",
3944
+ status?.mode === "remote" && status.backend === "cursor"
3945
+ ), document.documentElement.classList.toggle(
3946
+ "dshRemoteAntigravityTargetActive",
3947
+ status?.mode === "remote" && status.backend === "antigravity"
3948
+ ), () => {
3949
+ document.documentElement.classList.remove("dshRemoteCodexTargetActive"), document.documentElement.classList.remove("dshRemoteCursorTargetActive"), document.documentElement.classList.remove("dshRemoteAntigravityTargetActive");
3950
+ }), [status?.mode, status?.backend]), React.useEffect(() => {
3826
3951
  if (!routeOpen) return;
3827
3952
  let closeOnEscape = (event) => {
3828
3953
  event.key === "Escape" && setRouteOpen(!1);
@@ -4032,7 +4157,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
4032
4157
  ".dshRemoteClientLogin{width:min(440px,100%);display:flex;flex-direction:column;gap:8px}.dshRemoteClientLogin input{min-height:40px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-3);color:inherit;padding:0 12px;font:inherit}.dshRemoteClientLogin button{align-self:flex-start;min-height:40px;border:0;border-radius:8px;background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-1);padding:8px 16px;cursor:pointer}",
4033
4158
  ".dshRemoteQrLogin{width:min(440px,100%);display:flex;flex-direction:column;align-items:center;gap:8px;padding:6px 0 2px;text-align:center}.dshRemoteQrLogin img,.dshRemoteQrPlaceholder{box-sizing:border-box;width:200px;height:200px;border:1px solid var(--dsw-alias-border-l2);border-radius:12px;background:#fff;padding:8px}.dshRemoteQrOpen{display:flex;flex-direction:column;align-items:center;gap:5px;color:var(--dsw-alias-label-secondary);font-size:12px;text-decoration:none}.dshRemoteQrOpen:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}.dshRemoteQrOpen:hover img{border-color:var(--dsw-alias-label-dimmed)}.dshRemoteQrOpen:focus-visible{border-radius:12px;outline:2px solid var(--dsw-alias-brand-primary);outline-offset:3px}.dshRemoteQrPlaceholder{display:flex;align-items:center;justify-content:center;color:var(--dsw-alias-label-secondary)}.dshRemoteQrLogin>strong{font-size:14px}.dshRemoteQrLogin>p{max-width:48ch;margin:0;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.5}.dshRemoteQrLogin>.dshRemoteServiceAddress{margin-top:2px;color:var(--dsw-alias-label-tertiary)}.dshRemoteServiceAddress>a{color:var(--dsw-alias-label-secondary);text-decoration:none}.dshRemoteServiceAddress>a:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}.dshRemoteQrLogin>button,.dshRemoteClientLogin>.dshRemoteLoginSwitch{min-height:32px;border:0;background:transparent;color:var(--dsw-alias-label-secondary);padding:4px 8px;font:inherit;font-size:12px;cursor:pointer}.dshRemoteQrLogin>button:hover,.dshRemoteClientLogin>.dshRemoteLoginSwitch:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}.dshRemoteClientLogin>.dshRemoteLoginSwitch{align-self:flex-start;background:transparent;color:var(--dsw-alias-label-secondary);padding-left:0}",
4034
4159
  ".dshRemoteLoginHeading{box-sizing:border-box;width:100%;display:flex;align-items:baseline;gap:10px;overflow:hidden;white-space:nowrap}.dshRemoteLoginTitle{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dshRemoteLoginHeading>span{flex:0 0 auto;color:var(--dsw-alias-label-secondary);font-size:13px;font-weight:400}.dshRemoteLoginTabs{box-sizing:border-box;width:100%}.dshRemoteLoginTabs>button{min-width:0;flex:1;display:flex;align-items:center;justify-content:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.dshRemoteLoginTabs>button.isActive::after{right:0;left:0;border-radius:0}.dshRemoteClientLogin,.dshRemoteQrLogin{box-sizing:border-box;width:100%;height:300px;min-height:300px}.dshRemoteClientLogin{align-items:stretch;padding-top:16px}.dshRemoteClientLogin>button{align-self:stretch;width:100%}.dshRemoteQrLogin{padding-top:12px}",
4035
- '.dshRemoteHostControlToggles{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.dshRemoteHostControlToggle{display:flex;align-items:center;gap:7px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px;white-space:nowrap;cursor:default}.dshRemoteHostControlToggle>input{appearance:none;box-sizing:border-box;position:relative;width:32px;height:18px;flex:0 0 auto;margin:0;border:1px solid var(--dsw-alias-label-secondary);border-radius:999px;background:var(--dsw-alias-bg-layer-3);cursor:pointer;box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2);transition:background .16s ease-out,border-color .16s ease-out,box-shadow .16s ease-out}.dshRemoteHostControlToggle>input::after{content:"";position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background:var(--dsw-alias-label-secondary);transition:transform .16s ease-out,background .16s ease-out}.dshRemoteHostControlToggle>input:checked{border-color:var(--dsw-alias-state-success-primary);background:var(--dsw-alias-state-success-primary);box-shadow:none}.dshRemoteHostControlToggle>input:checked::after{transform:translateX(14px);background:var(--dsw-alias-bg-layer-1)}.dshRemoteHostControlToggle>input:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.dshRemoteHostControlToggle>input:disabled{opacity:.5;cursor:default}@media(prefers-reduced-motion:reduce){.dshRemoteHostControlToggle>input,.dshRemoteHostControlToggle>input::after{transition:none}}',
4160
+ '.dshRemoteHostControlToggle{display:flex;align-items:center;gap:7px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px;white-space:nowrap;cursor:default}.dshRemoteHostControlToggle>input{appearance:none;box-sizing:border-box;position:relative;width:32px;height:18px;flex:0 0 auto;margin:0;border:1px solid var(--dsw-alias-label-secondary);border-radius:999px;background:var(--dsw-alias-bg-layer-3);cursor:pointer;box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2);transition:background .16s ease-out,border-color .16s ease-out,box-shadow .16s ease-out}.dshRemoteHostControlToggle>input::after{content:"";position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background:var(--dsw-alias-label-secondary);transition:transform .16s ease-out,background .16s ease-out}.dshRemoteHostControlToggle>input:checked{border-color:var(--dsw-alias-state-success-primary);background:var(--dsw-alias-state-success-primary);box-shadow:none}.dshRemoteHostControlToggle>input:checked::after{transform:translateX(14px);background:var(--dsw-alias-bg-layer-1)}.dshRemoteHostControlToggle>input:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.dshRemoteHostControlToggle>input:disabled{opacity:.5;cursor:default}@media(prefers-reduced-motion:reduce){.dshRemoteHostControlToggle>input,.dshRemoteHostControlToggle>input::after{transition:none}}',
4036
4161
  ".dshRemoteAccountFooter{display:flex;align-items:center;justify-content:space-between;gap:12px;border-top:1px solid var(--dsw-alias-border-l2);padding-top:14px;color:var(--dsw-alias-label-secondary);font-size:12px}.dshRemoteAccountExit{flex:0 0 auto;border:0;background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer;padding:5px 0;font-size:12px;line-height:1.5;white-space:nowrap}.dshRemoteAccountExit:hover:not(:disabled){color:var(--dsw-alias-label-primary);text-decoration:underline}.dshRemoteAccountExit:disabled{opacity:.5;cursor:default;text-decoration:none}",
4037
4162
  ".dshRemoteLocalLink{align-self:flex-start;border:0;background:transparent;color:var(--dsw-alias-label-secondary);padding:4px 0;cursor:pointer}.dshRemoteLocalLink:hover{color:var(--dsw-alias-label-primary)}",
4038
4163
  "@keyframes dshRemotePageIn{from{opacity:0;transform:translateY(6px) scale(.99)}to{opacity:1;transform:none}}@media(prefers-reduced-motion:reduce){.dshRemotePage{animation:none}}@media(max-width:620px){.dshRemoteBackdrop{padding:12px}.dshRemotePage{max-height:calc(100vh - 24px)}.dshRemotePageHeader{gap:8px;padding:12px 16px}.dshRemotePage.hasSelectedHost .dshRemotePageBack{max-width:112px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dshRemoteSectionHeading{align-items:flex-start;flex-direction:column;gap:8px}.dshRemoteWorkspaceHeading{align-items:center;flex-direction:row}.dshRemoteSectionActions{width:100%;justify-content:space-between}.dshRemotePageBody{padding:20px 16px}.dshRemoteOpenBar{align-items:flex-end}.dshRemoteOpenBar>button{min-height:48px}}",
@@ -4091,11 +4216,23 @@ Minimum version required to store current data is: ` + bestVersion + `.
4091
4216
  if (disposed || opening || selection === void 0) return;
4092
4217
  let pending = selection, workspaceSnapshot = ctx.workspaces.list.getSnapshot();
4093
4218
  if (!workspacesReady(workspaceSnapshot) || !workspaceSnapshot.items.some((workspace) => workspace.workspaceId === pending.workspaceId)) return;
4094
- let sessionSnapshot = ctx.sessions.list.getSnapshot();
4095
- if (pending.backend === "codex" && pending.sessionId !== void 0 && sessionSnapshot.phase !== "ready") return;
4096
- opening = !0, unsubscribeWorkspaces?.(), unsubscribeSessions?.(), unsubscribeWorkspaces = void 0, unsubscribeSessions = void 0, (pending.backend === "codex" && pending.sessionId !== void 0 && sessionSnapshot.ids.includes(pending.sessionId) ? Promise.resolve(pending.sessionId) : ctx.workspaces.connectWorkspace(pending.workspaceId)).then(async (sessionId) => {
4097
- disposed || (ctx.sessions.open(sessionId), window.sessionStorage.removeItem(pendingWorkspaceSelectionKey), await control("workspace.selection.consume", pending).catch(() => {
4098
- }));
4219
+ let sessionSnapshot = ctx.sessions.list.getSnapshot(), isVirtualBackend = pending.backend === "codex" || pending.backend === "cursor" || pending.backend === "antigravity";
4220
+ if (isVirtualBackend && pending.sessionId !== void 0 && sessionSnapshot.phase !== "ready") return;
4221
+ opening = !0, unsubscribeWorkspaces?.(), unsubscribeSessions?.(), unsubscribeWorkspaces = void 0, unsubscribeSessions = void 0;
4222
+ let navigation = ctx.get("uiWorkspace"), connectWorkspace = (workspaceId) => navigation !== void 0 ? navigation.connectWorkspace(workspaceId) : ctx.workspaces.connectWorkspace(workspaceId);
4223
+ (isVirtualBackend && pending.sessionId !== void 0 && sessionSnapshot.ids.includes(pending.sessionId) ? Promise.resolve(pending.sessionId) : connectWorkspace(pending.workspaceId)).then(async (sessionId) => {
4224
+ if (!disposed) {
4225
+ if (navigation !== void 0)
4226
+ navigation.openSession(sessionId);
4227
+ else if (typeof ctx.workspaces.openSession == "function")
4228
+ ctx.workspaces.openSession(sessionId);
4229
+ else if (typeof ctx.sessions.open == "function")
4230
+ ctx.sessions.open(sessionId);
4231
+ else
4232
+ throw new Error("No supported Session open API is available.");
4233
+ window.sessionStorage.removeItem(pendingWorkspaceSelectionKey), await control("workspace.selection.consume", pending).catch(() => {
4234
+ });
4235
+ }
4099
4236
  }).catch((reason) => {
4100
4237
  disposed || console.warn("remote workspace selection failed:", reason);
4101
4238
  });