ds-harness-remote 0.5.7 → 0.5.10

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 (234) hide show
  1. package/dist/acp/adapter.d.ts +1 -1
  2. package/dist/acp/adapter.d.ts.map +1 -1
  3. package/dist/acp/adapters/antigravity/transcript-loader.d.ts.map +1 -1
  4. package/dist/acp/adapters/antigravity/transcript-loader.js +4 -1
  5. package/dist/acp/adapters/antigravity/transcript-loader.js.map +1 -1
  6. package/dist/acp/adapters/claude-history.d.ts +3 -0
  7. package/dist/acp/adapters/claude-history.d.ts.map +1 -0
  8. package/dist/acp/adapters/claude-history.js +118 -0
  9. package/dist/acp/adapters/claude-history.js.map +1 -0
  10. package/dist/acp/adapters/claude-process.d.ts +21 -0
  11. package/dist/acp/adapters/claude-process.d.ts.map +1 -0
  12. package/dist/acp/adapters/claude-process.js +147 -0
  13. package/dist/acp/adapters/claude-process.js.map +1 -0
  14. package/dist/acp/adapters/cursor-process.d.ts +9 -4
  15. package/dist/acp/adapters/cursor-process.d.ts.map +1 -1
  16. package/dist/acp/adapters/cursor-process.js +31 -3
  17. package/dist/acp/adapters/cursor-process.js.map +1 -1
  18. package/dist/acp/adapters/opencode-process.d.ts +67 -0
  19. package/dist/acp/adapters/opencode-process.d.ts.map +1 -0
  20. package/dist/acp/adapters/opencode-process.js +272 -0
  21. package/dist/acp/adapters/opencode-process.js.map +1 -0
  22. package/dist/acp/adapters/opencode.d.ts +8 -0
  23. package/dist/acp/adapters/opencode.d.ts.map +1 -0
  24. package/dist/acp/adapters/opencode.js +8 -0
  25. package/dist/acp/adapters/opencode.js.map +1 -0
  26. package/dist/acp/adapters/pi-process.d.ts +42 -0
  27. package/dist/acp/adapters/pi-process.d.ts.map +1 -0
  28. package/dist/acp/adapters/pi-process.js +410 -0
  29. package/dist/acp/adapters/pi-process.js.map +1 -0
  30. package/dist/acp/gateway.d.ts +10 -0
  31. package/dist/acp/gateway.d.ts.map +1 -1
  32. package/dist/acp/gateway.js +344 -103
  33. package/dist/acp/gateway.js.map +1 -1
  34. package/dist/acp/method-policy.d.ts +19 -19
  35. package/dist/acp/method-policy.js +5 -5
  36. package/dist/acp/method-policy.js.map +1 -1
  37. package/dist/acp/pi-tool-result.d.ts +9 -0
  38. package/dist/acp/pi-tool-result.d.ts.map +1 -0
  39. package/dist/acp/pi-tool-result.js +22 -0
  40. package/dist/acp/pi-tool-result.js.map +1 -0
  41. package/dist/acp/virtual-catalog.d.ts +50 -0
  42. package/dist/acp/virtual-catalog.d.ts.map +1 -0
  43. package/dist/acp/virtual-catalog.js +103 -0
  44. package/dist/acp/virtual-catalog.js.map +1 -0
  45. package/dist/acp/virtual-contract.d.ts +165 -0
  46. package/dist/acp/virtual-contract.d.ts.map +1 -0
  47. package/dist/acp/virtual-contract.js +216 -0
  48. package/dist/acp/virtual-contract.js.map +1 -0
  49. package/dist/acp/virtual-event-carrier.d.ts +50 -0
  50. package/dist/acp/virtual-event-carrier.d.ts.map +1 -0
  51. package/dist/acp/virtual-event-carrier.js +222 -0
  52. package/dist/acp/virtual-event-carrier.js.map +1 -0
  53. package/dist/acp/virtual-harness.d.ts +13 -112
  54. package/dist/acp/virtual-harness.d.ts.map +1 -1
  55. package/dist/acp/virtual-harness.js +129 -911
  56. package/dist/acp/virtual-harness.js.map +1 -1
  57. package/dist/acp/virtual-live.d.ts +78 -0
  58. package/dist/acp/virtual-live.d.ts.map +1 -0
  59. package/dist/acp/virtual-live.js +513 -0
  60. package/dist/acp/virtual-live.js.map +1 -0
  61. package/dist/acp/workspace-tools.js +2 -2
  62. package/dist/acp/workspace-tools.js.map +1 -1
  63. package/dist/acp.d.ts.map +1 -1
  64. package/dist/acp.js +1 -0
  65. package/dist/acp.js.map +1 -1
  66. package/dist/client/header.d.ts +10 -0
  67. package/dist/client/header.d.ts.map +1 -0
  68. package/dist/client/header.js +169 -0
  69. package/dist/client/header.js.map +1 -0
  70. package/dist/client/icons.d.ts +3 -0
  71. package/dist/client/icons.d.ts.map +1 -0
  72. package/dist/client/icons.js +3 -0
  73. package/dist/client/icons.js.map +1 -0
  74. package/dist/client/navigation.d.ts +5 -0
  75. package/dist/client/navigation.d.ts.map +1 -0
  76. package/dist/client/navigation.js +30 -0
  77. package/dist/client/navigation.js.map +1 -0
  78. package/dist/client/presentation.d.ts +17 -0
  79. package/dist/client/presentation.d.ts.map +1 -0
  80. package/dist/client/presentation.js +208 -0
  81. package/dist/client/presentation.js.map +1 -0
  82. package/dist/client/progress.d.ts +10 -0
  83. package/dist/client/progress.d.ts.map +1 -0
  84. package/dist/client/progress.js +82 -0
  85. package/dist/client/progress.js.map +1 -0
  86. package/dist/client/settings.d.ts +10 -0
  87. package/dist/client/settings.d.ts.map +1 -0
  88. package/dist/client/settings.js +335 -0
  89. package/dist/client/settings.js.map +1 -0
  90. package/dist/client/shell.d.ts +6 -0
  91. package/dist/client/shell.d.ts.map +1 -0
  92. package/dist/client/shell.js +128 -0
  93. package/dist/client/shell.js.map +1 -0
  94. package/dist/client/types.d.ts +264 -0
  95. package/dist/client/types.d.ts.map +1 -0
  96. package/dist/client/types.js +2 -0
  97. package/dist/client/types.js.map +1 -0
  98. package/dist/client/workspaces.d.ts +11 -0
  99. package/dist/client/workspaces.d.ts.map +1 -0
  100. package/dist/client/workspaces.js +1179 -0
  101. package/dist/client/workspaces.js.map +1 -0
  102. package/dist/client-capabilities.d.ts +6 -0
  103. package/dist/client-capabilities.d.ts.map +1 -0
  104. package/dist/client-capabilities.js +88 -0
  105. package/dist/client-capabilities.js.map +1 -0
  106. package/dist/client-codex-streams.d.ts +23 -0
  107. package/dist/client-codex-streams.d.ts.map +1 -0
  108. package/dist/client-codex-streams.js +156 -0
  109. package/dist/client-codex-streams.js.map +1 -0
  110. package/dist/client-connection.d.ts +38 -0
  111. package/dist/client-connection.d.ts.map +1 -0
  112. package/dist/client-connection.js +210 -0
  113. package/dist/client-connection.js.map +1 -0
  114. package/dist/client-control.d.ts +48 -0
  115. package/dist/client-control.d.ts.map +1 -0
  116. package/dist/client-control.js +273 -0
  117. package/dist/client-control.js.map +1 -0
  118. package/dist/client-locale.d.ts +8 -0
  119. package/dist/client-locale.d.ts.map +1 -1
  120. package/dist/client-locale.js +16 -0
  121. package/dist/client-locale.js.map +1 -1
  122. package/dist/client-runtime-contract.d.ts +161 -0
  123. package/dist/client-runtime-contract.d.ts.map +1 -0
  124. package/dist/client-runtime-contract.js +127 -0
  125. package/dist/client-runtime-contract.js.map +1 -0
  126. package/dist/client-runtime.d.ts +24 -126
  127. package/dist/client-runtime.d.ts.map +1 -1
  128. package/dist/client-runtime.js +171 -867
  129. package/dist/client-runtime.js.map +1 -1
  130. package/dist/client-secure-transport.d.ts +1 -0
  131. package/dist/client-secure-transport.d.ts.map +1 -1
  132. package/dist/client-secure-transport.js +35 -16
  133. package/dist/client-secure-transport.js.map +1 -1
  134. package/dist/client-workspace-queries.d.ts +12 -0
  135. package/dist/client-workspace-queries.d.ts.map +1 -0
  136. package/dist/client-workspace-queries.js +66 -0
  137. package/dist/client-workspace-queries.js.map +1 -0
  138. package/dist/client.d.ts.map +1 -1
  139. package/dist/client.github.js +2091 -1896
  140. package/dist/client.js +2091 -1896
  141. package/dist/client.js.map +1 -1
  142. package/dist/codex/domain.d.ts.map +1 -1
  143. package/dist/codex/domain.js +67 -46
  144. package/dist/codex/domain.js.map +1 -1
  145. package/dist/codex/method-policy.d.ts +9 -9
  146. package/dist/codex/virtual-catalog.d.ts +90 -0
  147. package/dist/codex/virtual-catalog.d.ts.map +1 -0
  148. package/dist/codex/virtual-catalog.js +317 -0
  149. package/dist/codex/virtual-catalog.js.map +1 -0
  150. package/dist/codex/virtual-contract.d.ts +96 -0
  151. package/dist/codex/virtual-contract.d.ts.map +1 -0
  152. package/dist/codex/virtual-contract.js +192 -0
  153. package/dist/codex/virtual-contract.js.map +1 -0
  154. package/dist/codex/virtual-event-carrier.d.ts +52 -0
  155. package/dist/codex/virtual-event-carrier.d.ts.map +1 -0
  156. package/dist/codex/virtual-event-carrier.js +212 -0
  157. package/dist/codex/virtual-event-carrier.js.map +1 -0
  158. package/dist/codex/virtual-harness.d.ts +16 -117
  159. package/dist/codex/virtual-harness.d.ts.map +1 -1
  160. package/dist/codex/virtual-harness.js +123 -1909
  161. package/dist/codex/virtual-harness.js.map +1 -1
  162. package/dist/codex/virtual-history.d.ts +74 -0
  163. package/dist/codex/virtual-history.d.ts.map +1 -0
  164. package/dist/codex/virtual-history.js +546 -0
  165. package/dist/codex/virtual-history.js.map +1 -0
  166. package/dist/codex/virtual-live.d.ts +75 -0
  167. package/dist/codex/virtual-live.d.ts.map +1 -0
  168. package/dist/codex/virtual-live.js +563 -0
  169. package/dist/codex/virtual-live.js.map +1 -0
  170. package/dist/codex/virtual-values.d.ts +29 -0
  171. package/dist/codex/virtual-values.d.ts.map +1 -0
  172. package/dist/codex/virtual-values.js +75 -0
  173. package/dist/codex/virtual-values.js.map +1 -0
  174. package/dist/config.js +4 -4
  175. package/dist/config.js.map +1 -1
  176. package/dist/control-runtime.js +2 -2
  177. package/dist/control-runtime.js.map +1 -1
  178. package/dist/harness-remote-bridge.d.ts +2 -1
  179. package/dist/harness-remote-bridge.d.ts.map +1 -1
  180. package/dist/harness-remote-bridge.js +13 -5
  181. package/dist/harness-remote-bridge.js.map +1 -1
  182. package/dist/index.d.ts.map +1 -1
  183. package/dist/index.js +23304 -15332
  184. package/dist/index.js.map +4 -4
  185. package/dist/plugin-route-dispatcher.d.ts +2 -2
  186. package/dist/plugin-route-dispatcher.d.ts.map +1 -1
  187. package/dist/plugin-route-dispatcher.js +2 -2
  188. package/dist/plugin-route-dispatcher.js.map +1 -1
  189. package/dist/remote-terminal-controller.d.ts +90 -0
  190. package/dist/remote-terminal-controller.d.ts.map +1 -0
  191. package/dist/remote-terminal-controller.js +494 -0
  192. package/dist/remote-terminal-controller.js.map +1 -0
  193. package/dist/remote-terminal-provider.d.ts +46 -0
  194. package/dist/remote-terminal-provider.d.ts.map +1 -0
  195. package/dist/remote-terminal-provider.js +147 -0
  196. package/dist/remote-terminal-provider.js.map +1 -0
  197. package/dist/remote-typert-gateway.js +7 -1
  198. package/dist/remote-typert-gateway.js.map +1 -1
  199. package/dist/server-api.d.ts +3 -0
  200. package/dist/server-api.d.ts.map +1 -1
  201. package/dist/server-api.js +24 -9
  202. package/dist/server-api.js.map +1 -1
  203. package/dist/server-connection.d.ts +1 -0
  204. package/dist/server-connection.d.ts.map +1 -1
  205. package/dist/server-connection.js +8 -1
  206. package/dist/server-connection.js.map +1 -1
  207. package/dist/service.d.ts +1 -1
  208. package/dist/service.d.ts.map +1 -1
  209. package/dist/service.js +15 -8
  210. package/dist/service.js.map +1 -1
  211. package/dist/terminal-carrier-compat.d.ts +14 -0
  212. package/dist/terminal-carrier-compat.d.ts.map +1 -0
  213. package/dist/terminal-carrier-compat.js +259 -0
  214. package/dist/terminal-carrier-compat.js.map +1 -0
  215. package/dist/terminal-policy.d.ts +6 -0
  216. package/dist/terminal-policy.d.ts.map +1 -1
  217. package/dist/terminal-policy.js +24 -6
  218. package/dist/terminal-policy.js.map +1 -1
  219. package/dist/typert-gateway-contract.d.ts +6 -1
  220. package/dist/typert-gateway-contract.d.ts.map +1 -1
  221. package/dist/typert-gateway-switch.d.ts +2 -1
  222. package/dist/typert-gateway-switch.d.ts.map +1 -1
  223. package/dist/typert-gateway-switch.js +39 -18
  224. package/dist/typert-gateway-switch.js.map +1 -1
  225. package/dist/version.d.ts +1 -1
  226. package/dist/version.d.ts.map +1 -1
  227. package/dist/version.js +1 -1
  228. package/dist/version.js.map +1 -1
  229. package/dist/workspace-bridge.d.ts +6 -89
  230. package/dist/workspace-bridge.d.ts.map +1 -1
  231. package/dist/workspace-bridge.js +37 -294
  232. package/dist/workspace-bridge.js.map +1 -1
  233. package/dsh-plugin.json +1 -1
  234. package/package.json +24 -20
@@ -0,0 +1,210 @@
1
+ import { RemoteClientCore } from '@dsh-remote/client-core';
2
+ import { AdaptiveTransport } from '@dsh-remote/webrtc';
3
+ import { probeRemoteHostFeatures } from './client-capabilities.js';
4
+ import { assertAuthorizedHost, ClientModeError, diagnosticReason, DIRECT_LAN_PROGRESS_DISPLAY_MS, DIRECT_WEBRTC_NEGOTIATE_TIMEOUT_MS, iceServersForAttempt, preferredTransportsForAttempt, shortId, transportPreferenceForMode, webrtcDiagnosticsLogFields, websocketUrl, } from './client-runtime-contract.js';
5
+ import { ClientSecureTransport } from './client-secure-transport.js';
6
+ export class ClientConnection {
7
+ context;
8
+ constructor(context) {
9
+ this.context = context;
10
+ }
11
+ async connect(targetDeviceId, signal) {
12
+ signal?.throwIfAborted();
13
+ const progressRunId = this.context.connectionProgressRun + 1;
14
+ this.context.connectionProgressRun = progressRunId;
15
+ this.context.connectionProgress = { runId: progressRunId, targetDeviceId, phase: 'checking-host' };
16
+ const identity = this.context.requireIdentity();
17
+ let client;
18
+ try {
19
+ const serverDevice = (await this.context.server.listDevices()).find(device => device.deviceId === targetDeviceId);
20
+ if (serverDevice === undefined) {
21
+ throw new ClientModeError('MEMBERSHIP_REQUIRED', 'The selected Host is not authorized for this account.');
22
+ }
23
+ this.updateConnectionProgress(progressRunId, 'authorizing-peer');
24
+ const target = await this.authorizeHostPeer(serverDevice);
25
+ const presence = await this.context.server.presenceFor(targetDeviceId);
26
+ if (!presence.online)
27
+ throw new ClientModeError('HOST_OFFLINE', 'The selected Host is offline.', true);
28
+ const credentials = await this.context.server.authenticate(identity);
29
+ const rtcFactory = this.context.config.forceRelay
30
+ ? undefined
31
+ : await this.context.rtcFactoryProvider({ routeTargets: [this.context.server.baseUrl] }).catch(() => undefined);
32
+ if (!this.context.config.forceRelay && rtcFactory === undefined) {
33
+ this.context.logger.warn('remote Harness WebRTC backend unavailable; using relay', {
34
+ targetDeviceId: shortId(target.deviceId),
35
+ });
36
+ }
37
+ let webRtcFallback = false;
38
+ const createTransport = (attempt) => new AdaptiveTransport(websocketUrl(this.context.server.baseUrl), {
39
+ role: 'client',
40
+ deviceId: identity.deviceId,
41
+ accessToken: credentials.accessToken,
42
+ targetDeviceId,
43
+ forceRelay: this.context.config.forceRelay || attempt === 'relay',
44
+ preferredTransports: preferredTransportsForAttempt(attempt),
45
+ negotiateTimeoutMs: attempt === 'direct' ? DIRECT_WEBRTC_NEGOTIATE_TIMEOUT_MS : undefined,
46
+ ...(rtcFactory === undefined || attempt === 'relay' ? {} : { rtcFactory }),
47
+ fetchIceServers: async (connectionId) => iceServersForAttempt(attempt, await this.context.server.turnCredentials(connectionId)),
48
+ onWebRtcFallback: (error, diagnostics) => {
49
+ webRtcFallback = true;
50
+ this.context.logger.warn(attempt === 'direct'
51
+ ? 'remote Harness direct WebRTC failed; trying TURN'
52
+ : 'remote Harness TURN WebRTC failed; using relay', {
53
+ targetDeviceId: shortId(target.deviceId),
54
+ attempt,
55
+ reason: diagnosticReason(error),
56
+ });
57
+ if (diagnostics !== undefined) {
58
+ this.context.logger.debug('remote Harness WebRTC fallback diagnostics', {
59
+ targetDeviceId: shortId(target.deviceId),
60
+ attempt,
61
+ ...webrtcDiagnosticsLogFields(diagnostics),
62
+ });
63
+ }
64
+ },
65
+ });
66
+ const attempts = this.context.config.forceRelay || rtcFactory === undefined
67
+ ? ['relay']
68
+ : ['direct', 'turn', 'relay'];
69
+ let transport;
70
+ for (const attempt of attempts) {
71
+ webRtcFallback = false;
72
+ const stopProgressTimer = this.beginAttemptProgress(progressRunId, attempt);
73
+ try {
74
+ transport = createTransport(attempt);
75
+ client = new RemoteClientCore(new ClientSecureTransport(transport, identity, target), 60_000);
76
+ const attemptClient = client;
77
+ const onAbort = () => { void attemptClient.close(); };
78
+ signal?.addEventListener('abort', onAbort, { once: true });
79
+ try {
80
+ signal?.throwIfAborted();
81
+ await attemptClient.connect();
82
+ }
83
+ finally {
84
+ signal?.removeEventListener('abort', onAbort);
85
+ }
86
+ signal?.throwIfAborted();
87
+ }
88
+ finally {
89
+ stopProgressTimer();
90
+ }
91
+ if (attempt === 'relay' || !webRtcFallback)
92
+ break;
93
+ await client.close();
94
+ client = undefined;
95
+ transport = undefined;
96
+ if (attempt === 'turn') {
97
+ this.context.logger.info('remote Harness relay fallback re-established', {
98
+ targetDeviceId: shortId(target.deviceId),
99
+ });
100
+ }
101
+ }
102
+ if (client === undefined || transport === undefined) {
103
+ throw new ClientModeError('CONNECTION_FAILED', 'Unable to establish a remote transport.', true);
104
+ }
105
+ const connectedClient = client;
106
+ const connectedTransport = transport;
107
+ const connectedPreference = transportPreferenceForMode(connectedClient.getStats().mode);
108
+ this.updateConnectionProgress(progressRunId, 'connected', connectedPreference === undefined ? undefined : [connectedPreference]);
109
+ connectedClient.onClose(() => {
110
+ if (this.context.connected?.client !== connectedClient)
111
+ return;
112
+ void this.context.closePreview();
113
+ this.context.connected = undefined;
114
+ this.context.connectionProgress = undefined;
115
+ this.context.pendingWorkspaceSelection = undefined;
116
+ void this.context.closeCodexVirtual();
117
+ void this.context.closeCursorVirtual();
118
+ this.context.proxySwitch?.disconnectRemote();
119
+ this.context.gatewaySwitch.disconnectRemote();
120
+ void connectedClient.close().catch(() => undefined);
121
+ this.context.logger.warn('remote Harness transport closed; keeping Remote authority disconnected', {
122
+ targetDeviceId: shortId(target.deviceId),
123
+ });
124
+ });
125
+ const connectionDetails = await connectedTransport.connectionDetails().catch(() => undefined);
126
+ this.context.logger.info('remote Harness transport ready', {
127
+ targetDeviceId: shortId(target.deviceId),
128
+ transport: connectedClient.getStats().mode,
129
+ ...(connectionDetails === undefined ? {} : {
130
+ preferredTransports: connectionDetails.preferredTransports,
131
+ negotiatedCapabilities: connectionDetails.negotiatedCapabilities,
132
+ webRtcEnabled: connectionDetails.webRtcEnabled,
133
+ }),
134
+ });
135
+ if (connectionDetails?.webRtc?.diagnostics !== undefined) {
136
+ this.context.logger.debug('remote Harness transport diagnostics', {
137
+ targetDeviceId: shortId(target.deviceId),
138
+ ...webrtcDiagnosticsLogFields(connectionDetails.webRtc.diagnostics),
139
+ });
140
+ }
141
+ const features = await probeRemoteHostFeatures(connectedClient, serverDevice.clientVersion);
142
+ return {
143
+ client: connectedClient,
144
+ target,
145
+ transport: connectedTransport,
146
+ features,
147
+ progressRunId,
148
+ ...(serverDevice.clientVersion === undefined ? {} : { clientVersion: serverDevice.clientVersion }),
149
+ ...(serverDevice.harnessVersion === undefined ? {} : { harnessVersion: serverDevice.harnessVersion }),
150
+ };
151
+ }
152
+ catch (error) {
153
+ this.clearConnectionProgress(progressRunId);
154
+ await client?.close().catch(() => undefined);
155
+ throw error;
156
+ }
157
+ }
158
+ beginAttemptProgress(runId, attempt) {
159
+ if (attempt !== 'direct') {
160
+ this.updateConnectionProgress(runId, 'probing', [attempt]);
161
+ return () => undefined;
162
+ }
163
+ this.updateConnectionProgress(runId, 'probing', ['lan']);
164
+ // LAN and P2P candidates are gathered inside one ICE attempt. The
165
+ // linear Remote UI still needs a single active route, so advance the
166
+ // visible cue if direct negotiation takes longer than a local probe.
167
+ const timer = setTimeout(() => {
168
+ if (this.context.connectionProgress?.runId === runId && this.context.connectionProgress.phase === 'probing') {
169
+ this.updateConnectionProgress(runId, 'probing', ['p2p']);
170
+ }
171
+ }, DIRECT_LAN_PROGRESS_DISPLAY_MS);
172
+ return () => clearTimeout(timer);
173
+ }
174
+ updateConnectionProgress(runId, phase, activeTransports) {
175
+ if (this.context.connectionProgress?.runId !== runId)
176
+ return;
177
+ this.context.connectionProgress = {
178
+ runId,
179
+ targetDeviceId: this.context.connectionProgress.targetDeviceId,
180
+ phase,
181
+ ...(activeTransports === undefined ? {} : { activeTransports }),
182
+ };
183
+ }
184
+ clearConnectionProgress(runId) {
185
+ if (this.context.connectionProgress?.runId === runId)
186
+ this.context.connectionProgress = undefined;
187
+ }
188
+ async authorizeHostPeer(serverDevice) {
189
+ const descriptor = await this.context.server.deviceFor(serverDevice.deviceId);
190
+ assertAuthorizedHost(serverDevice, descriptor);
191
+ const existing = this.context.identities.trustedPeer(descriptor.deviceId);
192
+ if (existing !== undefined && existing.publicKey !== descriptor.identityKey) {
193
+ throw new ClientModeError('PEER_IDENTITY_MISMATCH', 'The authorized Host identity key changed unexpectedly.');
194
+ }
195
+ if (existing !== undefined
196
+ && existing.membershipId === descriptor.membershipId
197
+ && existing.name === descriptor.name
198
+ && existing.platform === descriptor.platform) {
199
+ return existing;
200
+ }
201
+ return this.context.identities.trustPeer({
202
+ deviceId: descriptor.deviceId,
203
+ name: descriptor.name,
204
+ platform: descriptor.platform,
205
+ publicKey: descriptor.identityKey,
206
+ membershipId: descriptor.membershipId,
207
+ });
208
+ }
209
+ }
210
+ //# sourceMappingURL=client-connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-connection.js","sourceRoot":"","sources":["../src/client-connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { RpcResult } from '@deepseek-ai/dsh-host-apiproxy/api';
2
+ import type { PluginRouteCallResult } from '@dsh-remote/protocol';
3
+ import type { AcpVirtualWorkspaceView } from './acp/virtual-harness.js';
4
+ import type { HarnessMode } from './api-proxy-switch.js';
5
+ import type { ConnectedRemote, HostAuthorizationControl, RemoteDeviceView, RemoteDirectoryListing, RemoteWorkspaceSelection, RemoteWorkspaceView } from './client-runtime-contract.js';
6
+ import type { CodexVirtualWorkspaceView } from './codex/virtual-harness.js';
7
+ import type { RemoteFileViewerEndpoint } from './file-viewer-contract.js';
8
+ import { LoopbackPreview } from './loopback-preview.js';
9
+ import type { OAuthProvider } from './server-api.js';
10
+ import { ClientServerApi } from './server-api.js';
11
+ /** Collaborates with one ClientModeRuntime; never creates a second session or connection state. */
12
+ export interface ClientControlContext {
13
+ readonly detailedStatus: () => Promise<Record<string, unknown>>;
14
+ readonly devices: () => Promise<RemoteDeviceView[]>;
15
+ readonly server: ClientServerApi;
16
+ readonly authorizeClientWithAccount: (email: string, password: string) => Promise<unknown>;
17
+ readonly startClientOAuthQrLogin: (provider: OAuthProvider) => Promise<unknown>;
18
+ readonly pollClientOAuthQrLogin: (qrId: string) => Promise<unknown>;
19
+ readonly activeRemote: () => ConnectedRemote | undefined;
20
+ preview: LoopbackPreview | undefined;
21
+ readonly listRemoteDirectory: (targetDeviceId: string, path?: string, signal?: AbortSignal) => Promise<RemoteDirectoryListing>;
22
+ readonly listRemoteWorkspaces: (targetDeviceId: string, signal?: AbortSignal) => Promise<RemoteWorkspaceView[]>;
23
+ readonly listCodexWorkspaces: (targetDeviceId: string, signal?: AbortSignal) => Promise<CodexVirtualWorkspaceView[]>;
24
+ readonly openRemoteWorkspace: (targetDeviceId: string, path: string, signal?: AbortSignal) => Promise<Record<string, unknown>>;
25
+ readonly openCodexWorkspace: (targetDeviceId: string, workspaceId: string, signal?: AbortSignal) => Promise<Record<string, unknown>>;
26
+ readonly createCodexWorkspace: (targetDeviceId: string, path: string, signal?: AbortSignal) => Promise<Record<string, unknown>>;
27
+ readonly listCursorWorkspaces: (targetDeviceId: string, signal?: AbortSignal, backend?: "cursor" | "antigravity" | "pi" | "opencode") => Promise<AcpVirtualWorkspaceView[]>;
28
+ readonly openCursorWorkspace: (targetDeviceId: string, workspaceId: string, signal?: AbortSignal, backend?: "cursor" | "antigravity" | "pi" | "opencode") => Promise<Record<string, unknown>>;
29
+ readonly createCursorWorkspace: (targetDeviceId: string, path: string, signal?: AbortSignal, backend?: "cursor" | "antigravity" | "pi" | "opencode") => Promise<Record<string, unknown>>;
30
+ readonly consumeWorkspaceSelection: (selection: RemoteWorkspaceSelection) => Record<string, unknown>;
31
+ readonly callRemoteFileViewer: (endpoint: RemoteFileViewerEndpoint, payload: unknown, signal?: AbortSignal) => Promise<unknown>;
32
+ readonly activeCodexRemote: () => ConnectedRemote | undefined;
33
+ readonly requireLocalCodex: () => Required<Pick<HostAuthorizationControl, "codexCall" | "codexRespond" | "codexOpenStream" | "codexCloseStream">>;
34
+ readonly localCodexAvailable: () => boolean;
35
+ readonly pluginRoute: (route: string, body: unknown, signal: AbortSignal) => Promise<PluginRouteCallResult>;
36
+ readonly openCodexStream: (payload: unknown, signal?: AbortSignal) => Promise<unknown>;
37
+ readonly nextCodexFrames: (payload: unknown, signal?: AbortSignal) => Promise<unknown>;
38
+ readonly closeCodexStream: (payload: unknown) => Promise<unknown>;
39
+ readonly host: HostAuthorizationControl | undefined;
40
+ readonly setHostAuthorization: (enabled: boolean) => Promise<unknown>;
41
+ readonly setMode: (mode: HarnessMode, targetDeviceId?: string, signal?: AbortSignal) => Promise<Record<string, unknown>>;
42
+ }
43
+ export declare class ClientControl {
44
+ private readonly context;
45
+ constructor(context: ClientControlContext);
46
+ handleControl(endpoint: string, payload: unknown, signal: AbortSignal): Promise<RpcResult<unknown>>;
47
+ }
48
+ //# sourceMappingURL=client-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-control.d.ts","sourceRoot":"","sources":["../src/client-control.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AAEnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,KAAK,EACV,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACpB,MAAM,8BAA8B,CAAA;AAErC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAC3E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,mGAAmG;AACnG,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAA;IACnD,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,0BAA0B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1F,QAAQ,CAAC,uBAAuB,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/E,QAAQ,CAAC,sBAAsB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACnE,QAAQ,CAAC,YAAY,EAAE,MAAM,eAAe,GAAG,SAAS,CAAA;IACxD,OAAO,EAAE,eAAe,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,mBAAmB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAA;IAC9H,QAAQ,CAAC,oBAAoB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAA;IAC/G,QAAQ,CAAC,mBAAmB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAA;IACpH,QAAQ,CAAC,mBAAmB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC9H,QAAQ,CAAC,kBAAkB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACpI,QAAQ,CAAC,oBAAoB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC/H,QAAQ,CAAC,oBAAoB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,IAAI,GAAG,UAAU,KAAK,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAA;IAC3K,QAAQ,CAAC,mBAAmB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,IAAI,GAAG,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC7L,QAAQ,CAAC,qBAAqB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,IAAI,GAAG,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACxL,QAAQ,CAAC,yBAAyB,EAAE,CAAC,SAAS,EAAE,wBAAwB,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpG,QAAQ,CAAC,oBAAoB,EAAE,CAAC,QAAQ,EAAE,wBAAwB,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/H,QAAQ,CAAC,iBAAiB,EAAE,MAAM,eAAe,GAAG,SAAS,CAAA;IAC7D,QAAQ,CAAC,iBAAiB,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,wBAAwB,EAAE,WAAW,GAAG,cAAc,GAAG,iBAAiB,GAAG,kBAAkB,CAAC,CAAC,CAAA;IACjJ,QAAQ,CAAC,mBAAmB,EAAE,MAAM,OAAO,CAAA;IAC3C,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAC3G,QAAQ,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACtF,QAAQ,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACtF,QAAQ,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACjE,QAAQ,CAAC,IAAI,EAAE,wBAAwB,GAAG,SAAS,CAAA;IACnD,QAAQ,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACrE,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CACzH;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,oBAAoB;IAEpD,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;CAkP1G"}
@@ -0,0 +1,273 @@
1
+ import { CodexRemoteClient } from '@dsh-remote/client-core';
2
+ import { probeRemoteHostFeatures } from './client-capabilities.js';
3
+ import { ClientModeError, fail, isRecord, ok, record } from './client-runtime-contract.js';
4
+ import { LoopbackPreview } from './loopback-preview.js';
5
+ import { isAllowedPluginRoute } from './plugin-route-bridge.js';
6
+ export class ClientControl {
7
+ context;
8
+ constructor(context) {
9
+ this.context = context;
10
+ }
11
+ async handleControl(endpoint, payload, signal) {
12
+ try {
13
+ if (endpoint === 'status')
14
+ return ok(await this.context.detailedStatus());
15
+ if (endpoint === 'devices')
16
+ return ok(await this.context.devices());
17
+ if (endpoint === 'client.account.providers')
18
+ return ok(await this.context.server.oauthProviders());
19
+ if (endpoint === 'client.account.login') {
20
+ const value = record(payload);
21
+ if (typeof value.email !== 'string' || typeof value.password !== 'string') {
22
+ throw new ClientModeError('INVALID_MESSAGE', 'Email and password are required.');
23
+ }
24
+ return ok(await this.context.authorizeClientWithAccount(value.email, value.password));
25
+ }
26
+ if (endpoint === 'client.account.qr.start') {
27
+ const value = record(payload);
28
+ const provider = value.provider ?? 'zhihu';
29
+ if (typeof provider !== 'string' || !/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/.test(provider)) {
30
+ throw new ClientModeError('INVALID_MESSAGE', 'An OAuth provider ID is required.');
31
+ }
32
+ return ok(await this.context.startClientOAuthQrLogin(provider));
33
+ }
34
+ if (endpoint === 'client.account.qr.poll') {
35
+ const value = record(payload);
36
+ if (typeof value.qrId !== 'string' || value.qrId.length < 20) {
37
+ throw new ClientModeError('INVALID_MESSAGE', 'A QR login session is required.');
38
+ }
39
+ return ok(await this.context.pollClientOAuthQrLogin(value.qrId));
40
+ }
41
+ if (endpoint === 'preview.open') {
42
+ const remote = this.context.activeRemote();
43
+ if (remote === undefined)
44
+ throw new ClientModeError('TRANSPORT_CLOSED', 'Connect to a Remote Host first.');
45
+ this.context.preview ??= new LoopbackPreview(remote.client);
46
+ return ok(await this.context.preview.open(record(payload).port));
47
+ }
48
+ if (endpoint === 'directory.list') {
49
+ const value = record(payload);
50
+ if (typeof value.targetDeviceId !== 'string')
51
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host is required.');
52
+ return ok(await this.context.listRemoteDirectory(value.targetDeviceId, typeof value.path === 'string' ? value.path : undefined, signal));
53
+ }
54
+ if (endpoint === 'workspaces.list') {
55
+ const value = record(payload);
56
+ if (typeof value.targetDeviceId !== 'string')
57
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host is required.');
58
+ return ok(await this.context.listRemoteWorkspaces(value.targetDeviceId, signal));
59
+ }
60
+ if (endpoint === 'codex.workspaces.list') {
61
+ const value = record(payload);
62
+ if (typeof value.targetDeviceId !== 'string')
63
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host is required.');
64
+ return ok(await this.context.listCodexWorkspaces(value.targetDeviceId, signal));
65
+ }
66
+ if (endpoint === 'workspace.open') {
67
+ const value = record(payload);
68
+ if (typeof value.targetDeviceId !== 'string' || typeof value.path !== 'string') {
69
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host and working directory are required.');
70
+ }
71
+ return ok(await this.context.openRemoteWorkspace(value.targetDeviceId, value.path, signal));
72
+ }
73
+ if (endpoint === 'codex.workspace.open') {
74
+ const value = record(payload);
75
+ if (typeof value.targetDeviceId !== 'string' || typeof value.workspaceId !== 'string') {
76
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host and CodeX Workspace are required.');
77
+ }
78
+ return ok(await this.context.openCodexWorkspace(value.targetDeviceId, value.workspaceId, signal));
79
+ }
80
+ if (endpoint === 'codex.workspace.create') {
81
+ const value = record(payload);
82
+ if (typeof value.targetDeviceId !== 'string' || typeof value.path !== 'string') {
83
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host and CodeX project directory are required.');
84
+ }
85
+ return ok(await this.context.createCodexWorkspace(value.targetDeviceId, value.path, signal));
86
+ }
87
+ if (endpoint === 'cursor.workspaces.list') {
88
+ const value = record(payload);
89
+ if (typeof value.targetDeviceId !== 'string')
90
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host is required.');
91
+ return ok(await this.context.listCursorWorkspaces(value.targetDeviceId, signal, 'cursor'));
92
+ }
93
+ if (endpoint === 'cursor.workspace.open') {
94
+ const value = record(payload);
95
+ if (typeof value.targetDeviceId !== 'string' || typeof value.workspaceId !== 'string') {
96
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host and Cursor Workspace are required.');
97
+ }
98
+ return ok(await this.context.openCursorWorkspace(value.targetDeviceId, value.workspaceId, signal, 'cursor'));
99
+ }
100
+ if (endpoint === 'cursor.workspace.create') {
101
+ const value = record(payload);
102
+ if (typeof value.targetDeviceId !== 'string' || typeof value.path !== 'string') {
103
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host and Cursor project directory are required.');
104
+ }
105
+ return ok(await this.context.createCursorWorkspace(value.targetDeviceId, value.path, signal, 'cursor'));
106
+ }
107
+ if (endpoint === 'antigravity.workspaces.list') {
108
+ const value = record(payload);
109
+ if (typeof value.targetDeviceId !== 'string')
110
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host is required.');
111
+ return ok(await this.context.listCursorWorkspaces(value.targetDeviceId, signal, 'antigravity'));
112
+ }
113
+ if (endpoint === 'antigravity.workspace.open') {
114
+ const value = record(payload);
115
+ if (typeof value.targetDeviceId !== 'string' || typeof value.workspaceId !== 'string') {
116
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host and Antigravity Workspace are required.');
117
+ }
118
+ return ok(await this.context.openCursorWorkspace(value.targetDeviceId, value.workspaceId, signal, 'antigravity'));
119
+ }
120
+ if (endpoint === 'antigravity.workspace.create') {
121
+ const value = record(payload);
122
+ if (typeof value.targetDeviceId !== 'string' || typeof value.path !== 'string') {
123
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host and Antigravity project directory are required.');
124
+ }
125
+ return ok(await this.context.createCursorWorkspace(value.targetDeviceId, value.path, signal, 'antigravity'));
126
+ }
127
+ if (endpoint === 'pi.workspaces.list') {
128
+ const value = record(payload);
129
+ if (typeof value.targetDeviceId !== 'string')
130
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host is required.');
131
+ return ok(await this.context.listCursorWorkspaces(value.targetDeviceId, signal, 'pi'));
132
+ }
133
+ if (endpoint === 'pi.workspace.open') {
134
+ const value = record(payload);
135
+ if (typeof value.targetDeviceId !== 'string' || typeof value.workspaceId !== 'string') {
136
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host and PI Workspace are required.');
137
+ }
138
+ return ok(await this.context.openCursorWorkspace(value.targetDeviceId, value.workspaceId, signal, 'pi'));
139
+ }
140
+ if (endpoint === 'pi.workspace.create') {
141
+ const value = record(payload);
142
+ if (typeof value.targetDeviceId !== 'string' || typeof value.path !== 'string') {
143
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host and PI project directory are required.');
144
+ }
145
+ return ok(await this.context.createCursorWorkspace(value.targetDeviceId, value.path, signal, 'pi'));
146
+ }
147
+ if (endpoint === 'opencode.workspaces.list') {
148
+ const value = record(payload);
149
+ if (typeof value.targetDeviceId !== 'string')
150
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host is required.');
151
+ return ok(await this.context.listCursorWorkspaces(value.targetDeviceId, signal, 'opencode'));
152
+ }
153
+ if (endpoint === 'opencode.workspace.open') {
154
+ const value = record(payload);
155
+ if (typeof value.targetDeviceId !== 'string' || typeof value.workspaceId !== 'string') {
156
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host and OpenCode Workspace are required.');
157
+ }
158
+ return ok(await this.context.openCursorWorkspace(value.targetDeviceId, value.workspaceId, signal, 'opencode'));
159
+ }
160
+ if (endpoint === 'opencode.workspace.create') {
161
+ const value = record(payload);
162
+ if (typeof value.targetDeviceId !== 'string' || typeof value.path !== 'string') {
163
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host and OpenCode project directory are required.');
164
+ }
165
+ return ok(await this.context.createCursorWorkspace(value.targetDeviceId, value.path, signal, 'opencode'));
166
+ }
167
+ if (endpoint === 'workspace.selection.consume') {
168
+ const value = record(payload);
169
+ if (typeof value.targetDeviceId !== 'string' || typeof value.workspaceId !== 'string') {
170
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host and Workspace are required.');
171
+ }
172
+ return ok(this.context.consumeWorkspaceSelection({
173
+ targetDeviceId: value.targetDeviceId,
174
+ workspaceId: value.workspaceId,
175
+ ...(value.backend === 'codex' || value.backend === 'cursor' || value.backend === 'antigravity' || value.backend === 'pi' || value.backend === 'opencode' ? { backend: value.backend } : {}),
176
+ ...(typeof value.sessionId === 'string' ? { sessionId: value.sessionId } : {}),
177
+ }));
178
+ }
179
+ if (endpoint === 'fileviewer.stat' || endpoint === 'fileviewer.readRange' || endpoint === 'fileviewer.list') {
180
+ const method = endpoint === 'fileviewer.stat'
181
+ ? 'stat'
182
+ : endpoint === 'fileviewer.readRange' ? 'readRange' : 'list';
183
+ return ok(await this.context.callRemoteFileViewer(method, payload, signal));
184
+ }
185
+ if (endpoint === 'codex.call') {
186
+ const value = record(payload);
187
+ if (typeof value.method !== 'string' || !('params' in value)) {
188
+ throw new ClientModeError('INVALID_MESSAGE', 'A Codex method and params are required.');
189
+ }
190
+ const remote = this.context.activeCodexRemote();
191
+ if (remote !== undefined)
192
+ return ok(await new CodexRemoteClient(remote.client).request(value.method, value.params, signal));
193
+ const host = this.context.requireLocalCodex();
194
+ return ok(await host.codexCall(value, signal));
195
+ }
196
+ if (endpoint === 'codex.probe') {
197
+ const local = this.context.localCodexAvailable();
198
+ let remoteSupported = false;
199
+ const remote = this.context.activeRemote();
200
+ if (remote !== undefined) {
201
+ try {
202
+ remote.features = await probeRemoteHostFeatures(remote.client, remote.clientVersion);
203
+ remoteSupported = remote.features.codex;
204
+ }
205
+ catch (error) {
206
+ if (!local)
207
+ throw error;
208
+ }
209
+ }
210
+ return ok({ supported: local || remoteSupported, local, remote: remoteSupported });
211
+ }
212
+ if (endpoint === 'codex.respond') {
213
+ const value = record(payload);
214
+ const remote = this.context.activeCodexRemote();
215
+ if (remote !== undefined)
216
+ return ok(await remote.client.rpc('codex.app.respond', value, signal));
217
+ const host = this.context.requireLocalCodex();
218
+ return ok(await host.codexRespond(value, signal));
219
+ }
220
+ if (endpoint === 'plugin.route') {
221
+ const value = record(payload);
222
+ if (typeof value.route !== 'string' || !isAllowedPluginRoute(value.route)) {
223
+ throw new ClientModeError('INVALID_MESSAGE', 'A valid plugin route is required.');
224
+ }
225
+ if (!isRecord(value.body))
226
+ throw new ClientModeError('INVALID_MESSAGE', 'A plugin route body object is required.');
227
+ return ok(await this.context.pluginRoute(value.route, value.body, signal));
228
+ }
229
+ if (endpoint === 'codex.stream.open')
230
+ return ok(await this.context.openCodexStream(payload, signal));
231
+ if (endpoint === 'codex.stream.next')
232
+ return ok(await this.context.nextCodexFrames(payload, signal));
233
+ if (endpoint === 'codex.stream.close')
234
+ return ok(await this.context.closeCodexStream(payload));
235
+ if (endpoint === 'host.account.login') {
236
+ if (this.context.host === undefined)
237
+ throw new ClientModeError('METHOD_NOT_ALLOWED', 'This plugin is not running as a Host.');
238
+ const value = record(payload);
239
+ if (typeof value.email !== 'string' || typeof value.password !== 'string') {
240
+ throw new ClientModeError('INVALID_MESSAGE', 'Email and password are required.');
241
+ }
242
+ return ok(await this.context.host.authorizeHostWithAccount(value.email, value.password));
243
+ }
244
+ if (endpoint === 'host.authorization.set') {
245
+ const value = record(payload);
246
+ if (typeof value.enabled !== 'boolean') {
247
+ throw new ClientModeError('INVALID_MESSAGE', 'Host authorization state is required.');
248
+ }
249
+ return ok(await this.context.setHostAuthorization(value.enabled));
250
+ }
251
+ if (endpoint === 'host.registration-code.submit') {
252
+ if (this.context.host === undefined)
253
+ throw new ClientModeError('METHOD_NOT_ALLOWED', 'This plugin is not running as a Host.');
254
+ const value = record(payload);
255
+ if (typeof value.code !== 'string' || value.code.trim() === '') {
256
+ throw new ClientModeError('INVALID_MESSAGE', 'A Host registration code is required.');
257
+ }
258
+ return ok(await this.context.host.authorizeHostWithCode(value.code));
259
+ }
260
+ if (endpoint === 'mode.set') {
261
+ const value = record(payload);
262
+ if (value.mode !== 'local' && value.mode !== 'remote')
263
+ throw new ClientModeError('INVALID_MESSAGE', 'Mode must be local or remote.');
264
+ return ok(await this.context.setMode(value.mode, typeof value.targetDeviceId === 'string' ? value.targetDeviceId : undefined, signal));
265
+ }
266
+ throw new ClientModeError('METHOD_NOT_FOUND', 'The remote-mode control method does not exist.');
267
+ }
268
+ catch (error) {
269
+ return fail(error);
270
+ }
271
+ }
272
+ }
273
+ //# sourceMappingURL=client-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-control.js","sourceRoot":"","sources":["../src/client-control.ts"],"names":[],"mappings":"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"}
@@ -153,15 +153,21 @@ export declare const en: {
153
153
  readonly addCodexWorkspace: "Add CodeX workspace";
154
154
  readonly addCursorWorkspace: "Add Cursor workspace";
155
155
  readonly addAntigravityWorkspace: "Add Antigravity workspace";
156
+ readonly addPiWorkspace: "Add PI workspace";
157
+ readonly addOpencodeWorkspace: "Add OpenCode workspace";
156
158
  readonly noCodexWorkspaces: "No CodeX workspaces yet.";
157
159
  readonly noCursorWorkspaces: "No Cursor workspaces yet. Add a project directory to start.";
158
160
  readonly noAntigravityWorkspaces: "No Antigravity workspaces yet. Add a project directory to start.";
161
+ readonly noPiWorkspaces: "No PI workspaces yet. Add a project directory to start.";
162
+ readonly noOpencodeWorkspaces: "No OpenCode workspaces yet. Add a project directory to start.";
159
163
  readonly cancelAddWorkspace: "Cancel";
160
164
  readonly confirmAddWorkspace: "Add and open";
161
165
  readonly showAllWorkspaces: "Show all DSH workspaces";
162
166
  readonly showAllCodexWorkspaces: "Show all CodeX workspaces";
163
167
  readonly showAllCursorWorkspaces: "Show all Cursor workspaces";
164
168
  readonly showAllAntigravityWorkspaces: "Show all Antigravity workspaces";
169
+ readonly showAllPiWorkspaces: "Show all PI workspaces";
170
+ readonly showAllOpencodeWorkspaces: "Show all OpenCode workspaces";
165
171
  readonly remoteModeLabel: "Remote mode · {name}";
166
172
  readonly remoteNetworkP2p: "P2P";
167
173
  readonly remoteNetworkTurn: "TURN";
@@ -256,6 +262,8 @@ export declare const en: {
256
262
  readonly codexVirtualWorkspace: "CodeX virtual workspace";
257
263
  readonly cursorVirtualWorkspace: "Cursor virtual workspace";
258
264
  readonly antigravityVirtualWorkspace: "Antigravity virtual workspace";
265
+ readonly piVirtualWorkspace: "PI virtual workspace";
266
+ readonly opencodeVirtualWorkspace: "OpenCode virtual workspace";
259
267
  readonly codexVirtualSessions: "Sessions";
260
268
  };
261
269
  export declare const zh: Record<keyof typeof en, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"client-locale.d.ts","sourceRoot":"","sources":["../src/client-locale.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe,sBAAsB,CAAA;AAElD,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmQL,CAAA;AAEV,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,CAmQ9C,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,EAAE,CAAA;AACvC,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAA;AAC5F,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,SAAS,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;CACzC"}
1
+ {"version":3,"file":"client-locale.d.ts","sourceRoot":"","sources":["../src/client-locale.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe,sBAAsB,CAAA;AAElD,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2QL,CAAA;AAEV,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,CA2Q9C,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,EAAE,CAAA;AACvC,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAA;AAC5F,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,SAAS,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;CACzC"}