@blue-soda/dsh-remote 0.4.28

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 (225) hide show
  1. package/LICENSE +29 -0
  2. package/README.md +81 -0
  3. package/bin/ds-harness-remote.js +11 -0
  4. package/cordis.patch.yml +32 -0
  5. package/dist/acp.d.ts +75 -0
  6. package/dist/acp.d.ts.map +1 -0
  7. package/dist/acp.js +61 -0
  8. package/dist/acp.js.map +1 -0
  9. package/dist/api-proxy-switch.d.ts +33 -0
  10. package/dist/api-proxy-switch.d.ts.map +1 -0
  11. package/dist/api-proxy-switch.js +109 -0
  12. package/dist/api-proxy-switch.js.map +1 -0
  13. package/dist/bin/doctor.d.ts +3 -0
  14. package/dist/bin/doctor.d.ts.map +1 -0
  15. package/dist/bin/doctor.js +13 -0
  16. package/dist/bin/doctor.js.map +1 -0
  17. package/dist/cli.d.ts +32 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +289 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/client-runtime.d.ts +239 -0
  22. package/dist/client-runtime.d.ts.map +1 -0
  23. package/dist/client-runtime.js +1391 -0
  24. package/dist/client-runtime.js.map +1 -0
  25. package/dist/client-secure-transport.d.ts +23 -0
  26. package/dist/client-secure-transport.d.ts.map +1 -0
  27. package/dist/client-secure-transport.js +143 -0
  28. package/dist/client-secure-transport.js.map +1 -0
  29. package/dist/client.d.ts +13 -0
  30. package/dist/client.d.ts.map +1 -0
  31. package/dist/client.github.js +4231 -0
  32. package/dist/client.js +4231 -0
  33. package/dist/codex/app-server.d.ts +71 -0
  34. package/dist/codex/app-server.d.ts.map +1 -0
  35. package/dist/codex/app-server.js +268 -0
  36. package/dist/codex/app-server.js.map +1 -0
  37. package/dist/codex/codex-image-codec.d.ts +7 -0
  38. package/dist/codex/codex-image-codec.d.ts.map +1 -0
  39. package/dist/codex/codex-image-codec.js +288 -0
  40. package/dist/codex/codex-image-codec.js.map +1 -0
  41. package/dist/codex/domain.d.ts +93 -0
  42. package/dist/codex/domain.d.ts.map +1 -0
  43. package/dist/codex/domain.js +1282 -0
  44. package/dist/codex/domain.js.map +1 -0
  45. package/dist/codex/method-policy.d.ts +338 -0
  46. package/dist/codex/method-policy.d.ts.map +1 -0
  47. package/dist/codex/method-policy.js +141 -0
  48. package/dist/codex/method-policy.js.map +1 -0
  49. package/dist/codex/peer-bridge.d.ts +57 -0
  50. package/dist/codex/peer-bridge.d.ts.map +1 -0
  51. package/dist/codex/peer-bridge.js +299 -0
  52. package/dist/codex/peer-bridge.js.map +1 -0
  53. package/dist/codex/permissions.d.ts +4 -0
  54. package/dist/codex/permissions.d.ts.map +1 -0
  55. package/dist/codex/permissions.js +21 -0
  56. package/dist/codex/permissions.js.map +1 -0
  57. package/dist/codex/session-id.d.ts +10 -0
  58. package/dist/codex/session-id.d.ts.map +1 -0
  59. package/dist/codex/session-id.js +15 -0
  60. package/dist/codex/session-id.js.map +1 -0
  61. package/dist/codex/virtual-harness.d.ts +209 -0
  62. package/dist/codex/virtual-harness.d.ts.map +1 -0
  63. package/dist/codex/virtual-harness.js +2616 -0
  64. package/dist/codex/virtual-harness.js.map +1 -0
  65. package/dist/codex-workspace-bridge.d.ts +108 -0
  66. package/dist/codex-workspace-bridge.d.ts.map +1 -0
  67. package/dist/codex-workspace-bridge.js +502 -0
  68. package/dist/codex-workspace-bridge.js.map +1 -0
  69. package/dist/config.d.ts +99 -0
  70. package/dist/config.d.ts.map +1 -0
  71. package/dist/config.js +127 -0
  72. package/dist/config.js.map +1 -0
  73. package/dist/connection-controller.d.ts +44 -0
  74. package/dist/connection-controller.d.ts.map +1 -0
  75. package/dist/connection-controller.js +185 -0
  76. package/dist/connection-controller.js.map +1 -0
  77. package/dist/control-route.d.ts +34 -0
  78. package/dist/control-route.d.ts.map +1 -0
  79. package/dist/control-route.js +136 -0
  80. package/dist/control-route.js.map +1 -0
  81. package/dist/control-runtime.d.ts +138 -0
  82. package/dist/control-runtime.d.ts.map +1 -0
  83. package/dist/control-runtime.js +543 -0
  84. package/dist/control-runtime.js.map +1 -0
  85. package/dist/control-stream.d.ts +67 -0
  86. package/dist/control-stream.d.ts.map +1 -0
  87. package/dist/control-stream.js +179 -0
  88. package/dist/control-stream.js.map +1 -0
  89. package/dist/defaults.d.ts +9 -0
  90. package/dist/defaults.d.ts.map +1 -0
  91. package/dist/defaults.js +9 -0
  92. package/dist/defaults.js.map +1 -0
  93. package/dist/file-viewer-bridge.d.ts +30 -0
  94. package/dist/file-viewer-bridge.d.ts.map +1 -0
  95. package/dist/file-viewer-bridge.js +128 -0
  96. package/dist/file-viewer-bridge.js.map +1 -0
  97. package/dist/file-viewer-contract.d.ts +5 -0
  98. package/dist/file-viewer-contract.d.ts.map +1 -0
  99. package/dist/file-viewer-contract.js +4 -0
  100. package/dist/file-viewer-contract.js.map +1 -0
  101. package/dist/harness-api-bridge.d.ts +79 -0
  102. package/dist/harness-api-bridge.d.ts.map +1 -0
  103. package/dist/harness-api-bridge.js +852 -0
  104. package/dist/harness-api-bridge.js.map +1 -0
  105. package/dist/harness-api-history.d.ts +3 -0
  106. package/dist/harness-api-history.d.ts.map +1 -0
  107. package/dist/harness-api-history.js +59 -0
  108. package/dist/harness-api-history.js.map +1 -0
  109. package/dist/harness-remote-bridge.d.ts +52 -0
  110. package/dist/harness-remote-bridge.d.ts.map +1 -0
  111. package/dist/harness-remote-bridge.js +529 -0
  112. package/dist/harness-remote-bridge.js.map +1 -0
  113. package/dist/harness-version.d.ts +23 -0
  114. package/dist/harness-version.d.ts.map +1 -0
  115. package/dist/harness-version.js +95 -0
  116. package/dist/harness-version.js.map +1 -0
  117. package/dist/identity-store.d.ts +45 -0
  118. package/dist/identity-store.d.ts.map +1 -0
  119. package/dist/identity-store.js +183 -0
  120. package/dist/identity-store.js.map +1 -0
  121. package/dist/ids.d.ts +2 -0
  122. package/dist/ids.d.ts.map +1 -0
  123. package/dist/ids.js +17 -0
  124. package/dist/ids.js.map +1 -0
  125. package/dist/index.d.ts +78 -0
  126. package/dist/index.d.ts.map +1 -0
  127. package/dist/index.js +28870 -0
  128. package/dist/index.js.map +7 -0
  129. package/dist/logging.d.ts +18 -0
  130. package/dist/logging.d.ts.map +1 -0
  131. package/dist/logging.js +30 -0
  132. package/dist/logging.js.map +1 -0
  133. package/dist/loopback-host.d.ts +20 -0
  134. package/dist/loopback-host.d.ts.map +1 -0
  135. package/dist/loopback-host.js +245 -0
  136. package/dist/loopback-host.js.map +1 -0
  137. package/dist/loopback-preview.d.ts +19 -0
  138. package/dist/loopback-preview.d.ts.map +1 -0
  139. package/dist/loopback-preview.js +232 -0
  140. package/dist/loopback-preview.js.map +1 -0
  141. package/dist/native-rtc-helper.d.ts +14 -0
  142. package/dist/native-rtc-helper.d.ts.map +1 -0
  143. package/dist/native-rtc-helper.js +575 -0
  144. package/dist/native-rtc-helper.js.map +1 -0
  145. package/dist/remote-api-proxy.d.ts +17 -0
  146. package/dist/remote-api-proxy.d.ts.map +1 -0
  147. package/dist/remote-api-proxy.js +400 -0
  148. package/dist/remote-api-proxy.js.map +1 -0
  149. package/dist/remote-directory-browser.d.ts +16 -0
  150. package/dist/remote-directory-browser.d.ts.map +1 -0
  151. package/dist/remote-directory-browser.js +48 -0
  152. package/dist/remote-directory-browser.js.map +1 -0
  153. package/dist/remote-file-content-provider.d.ts +48 -0
  154. package/dist/remote-file-content-provider.d.ts.map +1 -0
  155. package/dist/remote-file-content-provider.js +93 -0
  156. package/dist/remote-file-content-provider.js.map +1 -0
  157. package/dist/remote-typert-gateway.d.ts +20 -0
  158. package/dist/remote-typert-gateway.d.ts.map +1 -0
  159. package/dist/remote-typert-gateway.js +332 -0
  160. package/dist/remote-typert-gateway.js.map +1 -0
  161. package/dist/rpc-router.d.ts +31 -0
  162. package/dist/rpc-router.d.ts.map +1 -0
  163. package/dist/rpc-router.js +201 -0
  164. package/dist/rpc-router.js.map +1 -0
  165. package/dist/safe-error.d.ts +8 -0
  166. package/dist/safe-error.d.ts.map +1 -0
  167. package/dist/safe-error.js +20 -0
  168. package/dist/safe-error.js.map +1 -0
  169. package/dist/server-api.d.ts +109 -0
  170. package/dist/server-api.d.ts.map +1 -0
  171. package/dist/server-api.js +520 -0
  172. package/dist/server-api.js.map +1 -0
  173. package/dist/server-connection.d.ts +79 -0
  174. package/dist/server-connection.d.ts.map +1 -0
  175. package/dist/server-connection.js +1023 -0
  176. package/dist/server-connection.js.map +1 -0
  177. package/dist/server-credentials.d.ts +55 -0
  178. package/dist/server-credentials.d.ts.map +1 -0
  179. package/dist/server-credentials.js +105 -0
  180. package/dist/server-credentials.js.map +1 -0
  181. package/dist/service.d.ts +141 -0
  182. package/dist/service.d.ts.map +1 -0
  183. package/dist/service.js +432 -0
  184. package/dist/service.js.map +1 -0
  185. package/dist/session-format-compat.d.ts +3 -0
  186. package/dist/session-format-compat.d.ts.map +1 -0
  187. package/dist/session-format-compat.js +183 -0
  188. package/dist/session-format-compat.js.map +1 -0
  189. package/dist/status-stream.d.ts +48 -0
  190. package/dist/status-stream.d.ts.map +1 -0
  191. package/dist/status-stream.js +133 -0
  192. package/dist/status-stream.js.map +1 -0
  193. package/dist/terminal-policy.d.ts +21 -0
  194. package/dist/terminal-policy.d.ts.map +1 -0
  195. package/dist/terminal-policy.js +68 -0
  196. package/dist/terminal-policy.js.map +1 -0
  197. package/dist/tui-command.d.ts +13 -0
  198. package/dist/tui-command.d.ts.map +1 -0
  199. package/dist/tui-command.js +390 -0
  200. package/dist/tui-command.js.map +1 -0
  201. package/dist/typert-gateway-contract.d.ts +59 -0
  202. package/dist/typert-gateway-contract.d.ts.map +1 -0
  203. package/dist/typert-gateway-contract.js +2 -0
  204. package/dist/typert-gateway-contract.js.map +1 -0
  205. package/dist/typert-gateway-switch.d.ts +85 -0
  206. package/dist/typert-gateway-switch.d.ts.map +1 -0
  207. package/dist/typert-gateway-switch.js +315 -0
  208. package/dist/typert-gateway-switch.js.map +1 -0
  209. package/dist/types.d.ts +20 -0
  210. package/dist/types.d.ts.map +1 -0
  211. package/dist/types.js +2 -0
  212. package/dist/types.js.map +1 -0
  213. package/dist/version.d.ts +12 -0
  214. package/dist/version.d.ts.map +1 -0
  215. package/dist/version.js +12 -0
  216. package/dist/version.js.map +1 -0
  217. package/dist/werift-rtc.d.ts +121 -0
  218. package/dist/werift-rtc.d.ts.map +1 -0
  219. package/dist/werift-rtc.js +490 -0
  220. package/dist/werift-rtc.js.map +1 -0
  221. package/dsh-plugin.json +41 -0
  222. package/locale/en.json +6 -0
  223. package/locale/zh.json +6 -0
  224. package/package.json +165 -0
  225. package/public.d.ts +26 -0
@@ -0,0 +1,315 @@
1
+ const REMOTE_COMMAND_METHODS = ['execute', 'list'];
2
+ const LOCAL_ONLY_NAMESPACES = new Set(['dynamicCordisRunner']);
3
+ const ALL_REMOTE_COMMANDS = { execute: true, list: true };
4
+ /** Keeps the official Gateway object stable while its selected Host changes. */
5
+ export class TypertGatewaySwitch {
6
+ runtime;
7
+ originalInvoke;
8
+ localInvoke;
9
+ originalStream;
10
+ localStream;
11
+ originalDispatch;
12
+ localDispatch;
13
+ originalOpen;
14
+ localOpen;
15
+ remoteInvoke;
16
+ remoteTarget;
17
+ remoteSupport = { execute: false, list: false };
18
+ target;
19
+ installed = false;
20
+ /** Defaults to reachable so a caller that never wires this keeps the old behaviour. */
21
+ remoteAvailability = () => true;
22
+ constructor(gateway) {
23
+ this.runtime = gateway;
24
+ this.originalInvoke = gateway.invoke;
25
+ this.localInvoke = this.originalInvoke.bind(gateway);
26
+ this.originalStream = gateway.stream;
27
+ this.localStream = gateway.stream?.bind(gateway);
28
+ this.originalDispatch = this.runtime.dispatchRpc;
29
+ this.localDispatch = this.runtime.dispatchRpc?.bind(gateway);
30
+ this.originalOpen = this.runtime.openWireStream;
31
+ this.localOpen = createLocalOpen(gateway, this.runtime);
32
+ }
33
+ /** Original local dispatcher, used by the Host bridge without switch recursion. */
34
+ local() {
35
+ const dispatch = this.localDispatch ?? (async (endpoint, payload, signal) => {
36
+ try {
37
+ const request = requestFromCarrier(endpoint, payload, signal);
38
+ return { ok: true, value: await this.localInvoke(request) };
39
+ }
40
+ catch (error) {
41
+ return { ok: false, error: this.failure(error) };
42
+ }
43
+ });
44
+ const open = this.localOpen ?? (async (endpoint, payload, signal) => {
45
+ if (this.localStream === undefined)
46
+ throw new Error('The local Harness Gateway does not support Remote streams.');
47
+ return this.localStream(requestFromCarrier(endpoint, payload, signal));
48
+ });
49
+ return {
50
+ invoke: this.localInvoke,
51
+ ...(this.localStream === undefined ? {} : { stream: this.localStream }),
52
+ dispatch,
53
+ open,
54
+ failure: error => this.failure(error),
55
+ supportsCarrier: this.localDispatch !== undefined && this.localOpen !== undefined,
56
+ };
57
+ }
58
+ supportsCarrier() {
59
+ return this.localDispatch !== undefined && this.localOpen !== undefined;
60
+ }
61
+ status() {
62
+ return this.remoteInvoke === undefined
63
+ ? { mode: 'local' }
64
+ : { mode: 'remote', ...(this.target === undefined ? {} : { target: { ...this.target } }) };
65
+ }
66
+ install() {
67
+ if (this.installed)
68
+ return;
69
+ this.runtime.invoke = request => this.selectInvoke(request);
70
+ if (this.originalStream !== undefined) {
71
+ this.runtime.stream = request => !this.routesToRemote(endpointOf(request))
72
+ ? this.localStream(request)
73
+ : this.withLocalFallback(endpointOf(request), () => this.remoteTarget.open(endpointOf(request), { args: request.args }, request.signal ?? new AbortController().signal), () => this.localStream(request));
74
+ }
75
+ if (this.originalDispatch !== undefined) {
76
+ this.runtime.dispatchRpc = (endpoint, payload, signal) => !this.routesToRemote(endpoint)
77
+ ? this.localDispatch(endpoint, payload, signal)
78
+ : this.withLocalFallback(endpoint, () => Promise.resolve(this.remoteTarget.dispatch(endpoint, payload, signal)), () => this.localDispatch(endpoint, payload, signal));
79
+ }
80
+ if (this.originalOpen !== undefined) {
81
+ const open = this.originalOpen;
82
+ const rc1 = usesRc1Arity(open);
83
+ this.runtime.openWireStream = (...callArgs) => {
84
+ const endpoint = callArgs[0];
85
+ if (!this.routesToRemote(endpoint)) {
86
+ return rc1
87
+ ? Reflect.apply(open, this.runtime, callArgs)
88
+ : open.call(this.runtime, endpoint, callArgs[1], callArgs[2]);
89
+ }
90
+ const signal = (rc1 ? callArgs[4] : callArgs[2]);
91
+ if (!rc1) {
92
+ // The legacy carrier returns an iterable, so a rejection cannot be caught and
93
+ // the local fallback stays unavailable on that arity.
94
+ return this.remoteTarget.open(endpoint, callArgs[1], signal ?? new AbortController().signal);
95
+ }
96
+ return this.withLocalFallback(endpoint, () => this.remoteTarget.open(endpoint, callArgs[1], signal ?? new AbortController().signal), () => Reflect.apply(open, this.runtime, callArgs));
97
+ };
98
+ }
99
+ this.installed = true;
100
+ }
101
+ selectRemote(remote, support = ALL_REMOTE_COMMANDS, target) {
102
+ if (!this.installed)
103
+ throw new Error('The Typert gateway switch is not installed.');
104
+ this.remoteInvoke = typeof remote === 'function' ? remote : request => remote.invoke(request);
105
+ this.remoteTarget = typeof remote === 'function' ? undefined : remote;
106
+ this.remoteSupport = { ...support };
107
+ this.target = target === undefined ? undefined : { ...target };
108
+ }
109
+ selectLocal() {
110
+ this.remoteInvoke = undefined;
111
+ this.remoteTarget = undefined;
112
+ this.remoteSupport = { execute: false, list: false };
113
+ this.target = undefined;
114
+ }
115
+ /**
116
+ * The local shell's carriers, for a remote target that owns only part of the
117
+ * endpoint space. The Codex virtual Harness owns the CodeX domain; the shell's own
118
+ * settings bootstrap, plugin registry and account reads must stay here, or the
119
+ * window describes the remote Host instead of this installation.
120
+ * @returns the captured local carriers, absent when the running release has none.
121
+ */
122
+ localCarrier() {
123
+ return {
124
+ ...(this.localDispatch === undefined ? {} : { dispatch: this.localDispatch }),
125
+ ...(this.localOpen === undefined ? {} : { open: this.localOpen }),
126
+ };
127
+ }
128
+ restore() {
129
+ if (!this.installed)
130
+ return;
131
+ this.selectLocal();
132
+ this.runtime.invoke = this.originalInvoke;
133
+ if (this.originalStream !== undefined)
134
+ this.runtime.stream = this.originalStream;
135
+ if (this.originalDispatch !== undefined)
136
+ this.runtime.dispatchRpc = this.originalDispatch;
137
+ if (this.originalOpen !== undefined)
138
+ this.runtime.openWireStream = this.originalOpen;
139
+ this.installed = false;
140
+ }
141
+ /**
142
+ * Whether the peer a remote target routes to is reachable right now.
143
+ *
144
+ * A remote-mode boot still needs its own local services — localizations, theme,
145
+ * the plugin registry — before any remote work can happen. Routing those to a
146
+ * peer that is not connected leaves them unanswered, so the whole shell fails to
147
+ * activate: a dropped connection becomes "the application is unavailable" and
148
+ * stays that way until the user restarts into local mode. Serve local while the
149
+ * peer is away; the live session takes over again as soon as it is reachable.
150
+ */
151
+ setRemoteAvailability(check) { this.remoteAvailability = check; }
152
+ routesToRemote(endpoint) {
153
+ return this.remoteTarget !== undefined && !isLocalOnlyEndpoint(endpoint) && this.remoteAvailability();
154
+ }
155
+ selectInvoke(request) {
156
+ if (isLocalOnlyEndpoint(endpointOf(request)))
157
+ return this.localInvoke(request);
158
+ if (this.remoteTarget !== undefined && this.remoteAvailability()) {
159
+ // A remote-mode boot still issues RPCs only the local shell can answer: the
160
+ // Desktop asks the local Web server for its locale bootstrap before any remote
161
+ // work happens. Sweeping those to the peer failed as "desktop welcome: Web RPC
162
+ // failed", the locale plugin failed with it, and 48 entries never activated.
163
+ // Serve locally when the peer does not implement the endpoint, or when it went
164
+ // away mid-call; a business error still propagates.
165
+ return this.remoteTarget.invoke(request).catch(error => {
166
+ if (!isUnansweredByPeer(error))
167
+ throw error;
168
+ console.warn(`[dsh-remote] serving ${endpointOf(request)} locally: the peer did not answer it`, error);
169
+ return this.localInvoke(request);
170
+ });
171
+ }
172
+ if (request.namespace !== 'commands' || !isRemoteCommandMethod(request.method) || this.remoteInvoke === undefined) {
173
+ return this.localInvoke(request);
174
+ }
175
+ if (!this.remoteAvailability())
176
+ return this.localInvoke(request);
177
+ if (this.remoteSupport[request.method])
178
+ return this.remoteInvoke(request);
179
+ if (request.method === 'list')
180
+ return Promise.resolve([]);
181
+ return this.localInvoke(request);
182
+ }
183
+ /**
184
+ * Run a remote call, and answer it locally when the peer turns out not to serve
185
+ * that endpoint. A remote-mode boot still issues RPCs only the local shell can
186
+ * answer: the Desktop asks the local Web server for its locale bootstrap over the
187
+ * remote mux before any remote work happens. Forwarding those swept them to a host
188
+ * that does not implement them, the locale plugin failed, and every entry
189
+ * depending on it stayed pending. A genuine business error still propagates.
190
+ * @param endpoint - endpoint being routed, for the diagnostic warning.
191
+ * @param remote - the remote carrier call.
192
+ * @param local - the local call used when the peer could not answer.
193
+ * @returns the remote or local result.
194
+ */
195
+ withLocalFallback(endpoint, remote, local) {
196
+ return remote().catch(error => {
197
+ if (!isUnansweredByPeer(error))
198
+ throw error;
199
+ console.warn(`[dsh-remote] serving ${endpoint} locally: the peer did not answer it`, error);
200
+ return local();
201
+ });
202
+ }
203
+ failure(error) {
204
+ const normalized = this.runtime.wireStream?.failure(error);
205
+ if (normalized !== undefined)
206
+ return normalized;
207
+ const source = error instanceof Error ? error : new Error('The Harness Gateway rejected the request.');
208
+ const code = 'code' in source && typeof source.code === 'string' ? source.code : 'internal';
209
+ const details = 'details' in source && isRecord(source.details) ? source.details : {};
210
+ return { code, message: source.message, details };
211
+ }
212
+ }
213
+ /**
214
+ * dsh 0.1.7-rc.1 moved the cancellation signal from the third parameter to the
215
+ * fifth; legacy releases keep `(endpoint, payload, signal)`.
216
+ * @param open - carrier opener captured from the running release.
217
+ * @returns whether the opener follows the rc.1 argument order.
218
+ */
219
+ function usesRc1Arity(open) {
220
+ return open.length >= 5;
221
+ }
222
+ /** An uplink nobody sends on, so a read-only stream opens without buffering. */
223
+ function endedUplink() {
224
+ return {
225
+ [Symbol.asyncIterator]() {
226
+ return { next: () => Promise.resolve({ done: true, value: undefined }) };
227
+ },
228
+ };
229
+ }
230
+ /** Controller aborted with the logical stream so the rc.1 carrier owns one lifetime. */
231
+ function linkControl(signal) {
232
+ const control = new AbortController();
233
+ if (signal.aborted)
234
+ control.abort(signal.reason);
235
+ else
236
+ signal.addEventListener('abort', () => control.abort(signal.reason), { once: true });
237
+ return control;
238
+ }
239
+ /**
240
+ * Adapt the running release's carrier opener to the plugin's 3-argument
241
+ * `(endpoint, payload, signal)` seam without leaking the argument displacement.
242
+ * @param gateway - official Gateway whose public `wireStream` is the fallback.
243
+ * @param runtime - Gateway object owning the private `openWireStream` dispatcher.
244
+ * @returns a local opener that carries the signal to the release's signal slot.
245
+ */
246
+ function createLocalOpen(gateway, runtime) {
247
+ const open = runtime.openWireStream;
248
+ if (open !== undefined) {
249
+ return usesRc1Arity(open)
250
+ ? (endpoint, payload, signal) => open
251
+ .call(runtime, endpoint, payload, endedUplink(), undefined, signal, linkControl(signal))
252
+ : (endpoint, payload, signal) => open.call(runtime, endpoint, payload, signal);
253
+ }
254
+ const wire = gateway.wireStream;
255
+ if (wire === undefined)
256
+ return undefined;
257
+ const wireOpen = wire.open;
258
+ if (usesRc1Arity(wireOpen)) {
259
+ const rc1 = wireOpen;
260
+ return (endpoint, payload, signal) => rc1.call(wire, endpoint, payload, endedUplink(), undefined, signal);
261
+ }
262
+ const legacy = wireOpen;
263
+ return (endpoint, payload, signal) => legacy.call(wire, endpoint, payload, signal);
264
+ }
265
+ function requestFromCarrier(endpoint, payload, signal) {
266
+ const segments = endpoint.split('/');
267
+ if (segments.length !== 2 || segments.some(segment => segment.length === 0)) {
268
+ throw new Error('The Harness Gateway endpoint is invalid.');
269
+ }
270
+ if (!isRecord(payload) || !isRecord(payload.args)) {
271
+ throw new Error('The Harness Gateway payload is invalid.');
272
+ }
273
+ return { namespace: segments[0], method: segments[1], args: payload.args, signal };
274
+ }
275
+ function endpointOf(request) {
276
+ return `${request.namespace}/${request.method}`;
277
+ }
278
+ function isLocalOnlyEndpoint(endpoint) {
279
+ const separator = endpoint.indexOf('/');
280
+ return separator > 0 && LOCAL_ONLY_NAMESPACES.has(endpoint.slice(0, separator));
281
+ }
282
+ function isRemoteCommandMethod(method) {
283
+ return REMOTE_COMMAND_METHODS.includes(method);
284
+ }
285
+ /**
286
+ * Whether the peer cannot answer this call at all, as opposed to answering with a
287
+ * refusal. An unimplemented endpoint (a local-only concern the switch forwarded
288
+ * anyway) and a connection that dropped mid-call are both permissionless to retry
289
+ * locally; a business error such as a denied permission is not.
290
+ * @param error - rejection from the remote carrier.
291
+ * @returns whether the local shell should answer the call instead.
292
+ */ function isUnansweredByPeer(error) {
293
+ // A wrapped carrier failure such as "Web RPC failed" often arrives with no code at
294
+ // all, and refusing to fall back there would leave the local shell unanswered. The
295
+ // warning emitted at the call site keeps the decision visible in DevTools.
296
+ if (!isRecord(error))
297
+ return error instanceof Error;
298
+ const code = typeof error.code === 'string' ? error.code : '';
299
+ return code === '' || UNANSWERED_BY_PEER_CODES.has(code);
300
+ }
301
+ const UNANSWERED_BY_PEER_CODES = new Set([
302
+ 'METHOD_NOT_ALLOWED',
303
+ 'METHOD_NOT_FOUND',
304
+ 'method-not-found',
305
+ 'not-implemented',
306
+ 'CONNECTION_FAILED',
307
+ 'CONNECTION_REPLACED',
308
+ 'NOT_CONNECTED',
309
+ 'UNAVAILABLE',
310
+ 'internal',
311
+ ]);
312
+ function isRecord(value) {
313
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
314
+ }
315
+ //# sourceMappingURL=typert-gateway-switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typert-gateway-switch.js","sourceRoot":"","sources":["../src/typert-gateway-switch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { RemoteMessage } from '@dsh-remote/protocol';
2
+ export interface AuthenticatedPeerChannel {
3
+ /**
4
+ * Attestation supplied by the Noise/control-plane integration. Implementors
5
+ * must expose this channel only after both the Noise IK transcript and the
6
+ * Server membership for this exact connection have been verified.
7
+ */
8
+ readonly security: {
9
+ protocol: 'Noise_IK_25519_ChaChaPoly_SHA256';
10
+ connectionId: string;
11
+ membershipId: string;
12
+ };
13
+ readonly peerDeviceId: string;
14
+ readonly peerIdentityKey: string;
15
+ readonly mode?: 'LAN' | 'P2P' | 'TURN' | 'Relay';
16
+ send(message: RemoteMessage): Promise<void>;
17
+ onMessage(handler: (message: RemoteMessage) => void): () => void;
18
+ close(code?: string): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzD,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,EAAE,kCAAkC,CAAA;QAC5C,YAAY,EAAE,MAAM,CAAA;QACpB,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;IACD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;IAChD,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAChE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACpC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Version of the `ds-harness-remote` distribution.
3
+ *
4
+ * This is reported to the Server during device registration (`clientVersion`
5
+ * in the Device Descriptor) and again in the WebSocket `hello` frame. The
6
+ * Harness version is read separately from `host.describe` at runtime.
7
+ * Keep it in sync with `packages/plugin/package.json` (`version`).
8
+ * If they diverge, `npm scripts` checks in `scripts/verify-version-sync.mjs`
9
+ * will fail fast during build/check/test.
10
+ */
11
+ export declare const PLUGIN_VERSION = "0.4.28";
12
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,WAAW,CAAA"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Version of the `ds-harness-remote` distribution.
3
+ *
4
+ * This is reported to the Server during device registration (`clientVersion`
5
+ * in the Device Descriptor) and again in the WebSocket `hello` frame. The
6
+ * Harness version is read separately from `host.describe` at runtime.
7
+ * Keep it in sync with `packages/plugin/package.json` (`version`).
8
+ * If they diverge, `npm scripts` checks in `scripts/verify-version-sync.mjs`
9
+ * will fail fast during build/check/test.
10
+ */
11
+ export const PLUGIN_VERSION = '0.4.28';
12
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAA"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Node RTC factory (webrtc-implementation-plan.md §6.2).
3
+ *
4
+ * Native libwebrtc is preferred when present because its ICE behavior matches
5
+ * browser Remote Web. werift remains the pure-TypeScript fallback for systems
6
+ * without a loadable native addon. Both backends are loaded lazily so DSH
7
+ * startup remains unaffected when WebRTC is unused or `forceRelay` is enabled.
8
+ */
9
+ import { type NetworkInterfaceInfo } from 'node:os';
10
+ import type { RtcIceCandidateInit, RtcIceServer, RtcPeerConnectionFactory, RtcStats } from '@dsh-remote/webrtc';
11
+ interface WeriftModule {
12
+ RTCPeerConnection: new (config?: WeriftConfig) => WeriftPeerConnection;
13
+ }
14
+ interface WeriftConfig {
15
+ iceServers?: Array<{
16
+ urls: string | string[];
17
+ username?: string;
18
+ credential?: string;
19
+ }>;
20
+ iceAdditionalHostAddresses?: string[];
21
+ iceFilterCandidatePair?: (pair: WeriftCandidatePair) => boolean;
22
+ iceUseIpv4?: boolean;
23
+ iceUseIpv6?: boolean;
24
+ iceUseLinkLocalAddress?: boolean;
25
+ iceInterfaceAddresses?: {
26
+ udp4?: string;
27
+ udp6?: string;
28
+ };
29
+ }
30
+ interface WeriftCandidate {
31
+ host?: string;
32
+ type?: string;
33
+ relatedAddress?: string;
34
+ }
35
+ interface WeriftCandidatePair {
36
+ localCandidate?: WeriftCandidate;
37
+ }
38
+ interface WeriftPeerConnection {
39
+ connectionState: string;
40
+ iceConnectionState: string;
41
+ iceGatheringState: string;
42
+ signalingState: string;
43
+ onconnectionstatechange: (() => void) | null;
44
+ oniceconnectionstatechange: (() => void) | null;
45
+ onicegatheringstatechange: (() => void) | null;
46
+ onicecandidate: ((event: {
47
+ candidate?: {
48
+ toJSON(): RtcIceCandidateInit;
49
+ };
50
+ }) => void) | null;
51
+ ondatachannel: ((event: {
52
+ channel: WeriftDataChannel;
53
+ }) => void) | null;
54
+ createDataChannel(label: string, options: {
55
+ ordered: boolean;
56
+ }): WeriftDataChannel;
57
+ createOffer(): Promise<{
58
+ type: 'offer' | 'answer';
59
+ sdp: string;
60
+ }>;
61
+ createAnswer(): Promise<{
62
+ type: 'offer' | 'answer';
63
+ sdp: string;
64
+ }>;
65
+ setLocalDescription(description?: {
66
+ type: string;
67
+ sdp?: string;
68
+ }): Promise<unknown>;
69
+ setRemoteDescription(description: {
70
+ type: string;
71
+ sdp?: string;
72
+ }): Promise<void>;
73
+ addIceCandidate(candidate?: RtcIceCandidateInit | null): Promise<void>;
74
+ getStats(): Promise<RtcStats>;
75
+ close(): Promise<void>;
76
+ }
77
+ interface WeriftDataChannel {
78
+ readonly label: string;
79
+ readonly ordered: boolean;
80
+ readyState: string;
81
+ bufferedAmount: number;
82
+ onopen: (() => void) | null;
83
+ onclose: (() => void) | null;
84
+ onerror: (() => void) | null;
85
+ onmessage: ((event: {
86
+ data: string | Uint8Array;
87
+ }) => void) | null;
88
+ send(data: Buffer | string): void;
89
+ close(): void;
90
+ }
91
+ /**
92
+ * Node RTC factory used by the Plugin/VS Code clients and Host. Native
93
+ * libwebrtc is preferred because its ICE behavior matches browser Remote Web;
94
+ * werift remains the no-native fallback for environments that cannot load it.
95
+ */
96
+ export declare function loadNodeRtcFactory(options?: WeriftFactoryOptions): Promise<RtcPeerConnectionFactory | undefined>;
97
+ /** Load (once) a werift-backed factory, or `undefined` when it cannot be loaded. */
98
+ export declare function loadWeriftFactory(options?: WeriftFactoryOptions): Promise<RtcPeerConnectionFactory | undefined>;
99
+ export interface WeriftFactoryOptions {
100
+ interfaces?: NodeJS.Dict<NetworkInterfaceInfo[] | undefined>;
101
+ preferredHostIpv4Candidates?: readonly string[];
102
+ routeTargets?: readonly string[];
103
+ routeProbeTimeoutMs?: number;
104
+ }
105
+ /** Synchronous factory for tests and callers that already resolved werift. */
106
+ export declare function buildWeriftFactory(werift: WeriftModule, options?: WeriftFactoryOptions): RtcPeerConnectionFactory;
107
+ /**
108
+ * Pick the safe IPv4 host addresses for ICE gathering.
109
+ *
110
+ * On macOS a host exposes many interfaces (WiFi `en0`, Thunderbolt `en1-4`,
111
+ * `bridge*`, Apple Wireless Direct Link `awdl0`/`llw0`, and several VPN `utun*`
112
+ * tunnels whose small MTUs drop large SCTP packets). Let werift/ICE compare
113
+ * real physical interfaces, but filter virtual and link-local Host candidates
114
+ * before they can become nominated paths.
115
+ */
116
+ export declare function detectHostIpv4Candidates(interfaces: NodeJS.Dict<NetworkInterfaceInfo[] | undefined>, preferredHostIpv4Candidates?: readonly string[]): string[];
117
+ export declare function detectRouteHostIpv4Candidates(targets: readonly string[], timeoutMs?: number): Promise<string[]>;
118
+ export declare function shouldAdvertiseCandidate(candidate: RtcIceCandidateInit, allowedHostIpv4: ReadonlySet<string>): boolean;
119
+ export declare function orderIceServersForWerift(iceServers: readonly RtcIceServer[]): RtcIceServer[];
120
+ export {};
121
+ //# sourceMappingURL=werift-rtc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"werift-rtc.d.ts","sourceRoot":"","sources":["../src/werift-rtc.ts"],"names":[],"mappings":"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"}