@blue-soda/dsh-remote 0.5.6 → 0.5.7

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 (232) hide show
  1. package/README.md +2 -2
  2. package/cordis.patch.yml +30 -30
  3. package/dist/client.github.js +1 -1
  4. package/dist/client.js +1 -1
  5. package/dist/index.js +321 -57
  6. package/dist/index.js.map +3 -3
  7. package/dsh-plugin.json +41 -41
  8. package/package.json +165 -165
  9. package/dist/acp.d.ts +0 -75
  10. package/dist/acp.d.ts.map +0 -1
  11. package/dist/acp.js +0 -61
  12. package/dist/acp.js.map +0 -1
  13. package/dist/api-proxy-switch.d.ts +0 -33
  14. package/dist/api-proxy-switch.d.ts.map +0 -1
  15. package/dist/api-proxy-switch.js +0 -109
  16. package/dist/api-proxy-switch.js.map +0 -1
  17. package/dist/atomic-file.d.ts +0 -16
  18. package/dist/atomic-file.d.ts.map +0 -1
  19. package/dist/atomic-file.js +0 -81
  20. package/dist/atomic-file.js.map +0 -1
  21. package/dist/bin/doctor.d.ts +0 -3
  22. package/dist/bin/doctor.d.ts.map +0 -1
  23. package/dist/bin/doctor.js +0 -13
  24. package/dist/bin/doctor.js.map +0 -1
  25. package/dist/cli.d.ts +0 -32
  26. package/dist/cli.d.ts.map +0 -1
  27. package/dist/cli.js +0 -289
  28. package/dist/cli.js.map +0 -1
  29. package/dist/client-runtime.d.ts +0 -375
  30. package/dist/client-runtime.d.ts.map +0 -1
  31. package/dist/client-runtime.js +0 -1768
  32. package/dist/client-runtime.js.map +0 -1
  33. package/dist/client-secure-transport.d.ts +0 -23
  34. package/dist/client-secure-transport.d.ts.map +0 -1
  35. package/dist/client-secure-transport.js +0 -144
  36. package/dist/client-secure-transport.js.map +0 -1
  37. package/dist/client-target-store.d.ts +0 -40
  38. package/dist/client-target-store.d.ts.map +0 -1
  39. package/dist/client-target-store.js +0 -79
  40. package/dist/client-target-store.js.map +0 -1
  41. package/dist/client.d.ts +0 -13
  42. package/dist/client.d.ts.map +0 -1
  43. package/dist/codex/app-server.d.ts +0 -71
  44. package/dist/codex/app-server.d.ts.map +0 -1
  45. package/dist/codex/app-server.js +0 -268
  46. package/dist/codex/app-server.js.map +0 -1
  47. package/dist/codex/codex-image-codec.d.ts +0 -7
  48. package/dist/codex/codex-image-codec.d.ts.map +0 -1
  49. package/dist/codex/codex-image-codec.js +0 -288
  50. package/dist/codex/codex-image-codec.js.map +0 -1
  51. package/dist/codex/domain.d.ts +0 -102
  52. package/dist/codex/domain.d.ts.map +0 -1
  53. package/dist/codex/domain.js +0 -1323
  54. package/dist/codex/domain.js.map +0 -1
  55. package/dist/codex/method-policy.d.ts +0 -338
  56. package/dist/codex/method-policy.d.ts.map +0 -1
  57. package/dist/codex/method-policy.js +0 -141
  58. package/dist/codex/method-policy.js.map +0 -1
  59. package/dist/codex/peer-bridge.d.ts +0 -57
  60. package/dist/codex/peer-bridge.d.ts.map +0 -1
  61. package/dist/codex/peer-bridge.js +0 -299
  62. package/dist/codex/peer-bridge.js.map +0 -1
  63. package/dist/codex/permissions.d.ts +0 -4
  64. package/dist/codex/permissions.d.ts.map +0 -1
  65. package/dist/codex/permissions.js +0 -21
  66. package/dist/codex/permissions.js.map +0 -1
  67. package/dist/codex/session-id.d.ts +0 -10
  68. package/dist/codex/session-id.d.ts.map +0 -1
  69. package/dist/codex/session-id.js +0 -15
  70. package/dist/codex/session-id.js.map +0 -1
  71. package/dist/codex/virtual-harness.d.ts +0 -209
  72. package/dist/codex/virtual-harness.d.ts.map +0 -1
  73. package/dist/codex/virtual-harness.js +0 -2650
  74. package/dist/codex/virtual-harness.js.map +0 -1
  75. package/dist/codex-workspace-bridge.d.ts +0 -108
  76. package/dist/codex-workspace-bridge.d.ts.map +0 -1
  77. package/dist/codex-workspace-bridge.js +0 -502
  78. package/dist/codex-workspace-bridge.js.map +0 -1
  79. package/dist/config.d.ts +0 -99
  80. package/dist/config.d.ts.map +0 -1
  81. package/dist/config.js +0 -127
  82. package/dist/config.js.map +0 -1
  83. package/dist/connection-controller.d.ts +0 -44
  84. package/dist/connection-controller.d.ts.map +0 -1
  85. package/dist/connection-controller.js +0 -185
  86. package/dist/connection-controller.js.map +0 -1
  87. package/dist/control-route.d.ts +0 -34
  88. package/dist/control-route.d.ts.map +0 -1
  89. package/dist/control-route.js +0 -136
  90. package/dist/control-route.js.map +0 -1
  91. package/dist/control-runtime.d.ts +0 -138
  92. package/dist/control-runtime.d.ts.map +0 -1
  93. package/dist/control-runtime.js +0 -543
  94. package/dist/control-runtime.js.map +0 -1
  95. package/dist/control-stream.d.ts +0 -67
  96. package/dist/control-stream.d.ts.map +0 -1
  97. package/dist/control-stream.js +0 -179
  98. package/dist/control-stream.js.map +0 -1
  99. package/dist/defaults.d.ts +0 -9
  100. package/dist/defaults.d.ts.map +0 -1
  101. package/dist/defaults.js +0 -9
  102. package/dist/defaults.js.map +0 -1
  103. package/dist/file-viewer-bridge.d.ts +0 -30
  104. package/dist/file-viewer-bridge.d.ts.map +0 -1
  105. package/dist/file-viewer-bridge.js +0 -128
  106. package/dist/file-viewer-bridge.js.map +0 -1
  107. package/dist/file-viewer-contract.d.ts +0 -5
  108. package/dist/file-viewer-contract.d.ts.map +0 -1
  109. package/dist/file-viewer-contract.js +0 -4
  110. package/dist/file-viewer-contract.js.map +0 -1
  111. package/dist/harness-api-bridge.d.ts +0 -81
  112. package/dist/harness-api-bridge.d.ts.map +0 -1
  113. package/dist/harness-api-bridge.js +0 -862
  114. package/dist/harness-api-bridge.js.map +0 -1
  115. package/dist/harness-api-history.d.ts +0 -3
  116. package/dist/harness-api-history.d.ts.map +0 -1
  117. package/dist/harness-api-history.js +0 -59
  118. package/dist/harness-api-history.js.map +0 -1
  119. package/dist/harness-remote-bridge.d.ts +0 -60
  120. package/dist/harness-remote-bridge.d.ts.map +0 -1
  121. package/dist/harness-remote-bridge.js +0 -540
  122. package/dist/harness-remote-bridge.js.map +0 -1
  123. package/dist/harness-version.d.ts +0 -23
  124. package/dist/harness-version.d.ts.map +0 -1
  125. package/dist/harness-version.js +0 -95
  126. package/dist/harness-version.js.map +0 -1
  127. package/dist/identity-store.d.ts +0 -45
  128. package/dist/identity-store.d.ts.map +0 -1
  129. package/dist/identity-store.js +0 -186
  130. package/dist/identity-store.js.map +0 -1
  131. package/dist/ids.d.ts +0 -2
  132. package/dist/ids.d.ts.map +0 -1
  133. package/dist/ids.js +0 -17
  134. package/dist/ids.js.map +0 -1
  135. package/dist/index.d.ts +0 -78
  136. package/dist/index.d.ts.map +0 -1
  137. package/dist/logging.d.ts +0 -18
  138. package/dist/logging.d.ts.map +0 -1
  139. package/dist/logging.js +0 -30
  140. package/dist/logging.js.map +0 -1
  141. package/dist/loopback-host.d.ts +0 -20
  142. package/dist/loopback-host.d.ts.map +0 -1
  143. package/dist/loopback-host.js +0 -245
  144. package/dist/loopback-host.js.map +0 -1
  145. package/dist/loopback-preview.d.ts +0 -19
  146. package/dist/loopback-preview.d.ts.map +0 -1
  147. package/dist/loopback-preview.js +0 -232
  148. package/dist/loopback-preview.js.map +0 -1
  149. package/dist/native-rtc-helper.d.ts +0 -14
  150. package/dist/native-rtc-helper.d.ts.map +0 -1
  151. package/dist/native-rtc-helper.js +0 -575
  152. package/dist/native-rtc-helper.js.map +0 -1
  153. package/dist/remote-api-proxy.d.ts +0 -17
  154. package/dist/remote-api-proxy.d.ts.map +0 -1
  155. package/dist/remote-api-proxy.js +0 -451
  156. package/dist/remote-api-proxy.js.map +0 -1
  157. package/dist/remote-directory-browser.d.ts +0 -16
  158. package/dist/remote-directory-browser.d.ts.map +0 -1
  159. package/dist/remote-directory-browser.js +0 -48
  160. package/dist/remote-directory-browser.js.map +0 -1
  161. package/dist/remote-file-content-provider.d.ts +0 -48
  162. package/dist/remote-file-content-provider.d.ts.map +0 -1
  163. package/dist/remote-file-content-provider.js +0 -93
  164. package/dist/remote-file-content-provider.js.map +0 -1
  165. package/dist/remote-typert-gateway.d.ts +0 -20
  166. package/dist/remote-typert-gateway.d.ts.map +0 -1
  167. package/dist/remote-typert-gateway.js +0 -334
  168. package/dist/remote-typert-gateway.js.map +0 -1
  169. package/dist/rpc-binary-attachments.d.ts +0 -33
  170. package/dist/rpc-binary-attachments.d.ts.map +0 -1
  171. package/dist/rpc-binary-attachments.js +0 -142
  172. package/dist/rpc-binary-attachments.js.map +0 -1
  173. package/dist/rpc-router.d.ts +0 -31
  174. package/dist/rpc-router.d.ts.map +0 -1
  175. package/dist/rpc-router.js +0 -201
  176. package/dist/rpc-router.js.map +0 -1
  177. package/dist/safe-error.d.ts +0 -8
  178. package/dist/safe-error.d.ts.map +0 -1
  179. package/dist/safe-error.js +0 -20
  180. package/dist/safe-error.js.map +0 -1
  181. package/dist/server-api.d.ts +0 -109
  182. package/dist/server-api.d.ts.map +0 -1
  183. package/dist/server-api.js +0 -520
  184. package/dist/server-api.js.map +0 -1
  185. package/dist/server-connection.d.ts +0 -79
  186. package/dist/server-connection.d.ts.map +0 -1
  187. package/dist/server-connection.js +0 -1023
  188. package/dist/server-connection.js.map +0 -1
  189. package/dist/server-credentials.d.ts +0 -55
  190. package/dist/server-credentials.d.ts.map +0 -1
  191. package/dist/server-credentials.js +0 -108
  192. package/dist/server-credentials.js.map +0 -1
  193. package/dist/service.d.ts +0 -151
  194. package/dist/service.d.ts.map +0 -1
  195. package/dist/service.js +0 -448
  196. package/dist/service.js.map +0 -1
  197. package/dist/session-format-compat.d.ts +0 -3
  198. package/dist/session-format-compat.d.ts.map +0 -1
  199. package/dist/session-format-compat.js +0 -183
  200. package/dist/session-format-compat.js.map +0 -1
  201. package/dist/status-stream.d.ts +0 -48
  202. package/dist/status-stream.d.ts.map +0 -1
  203. package/dist/status-stream.js +0 -133
  204. package/dist/status-stream.js.map +0 -1
  205. package/dist/terminal-policy.d.ts +0 -21
  206. package/dist/terminal-policy.d.ts.map +0 -1
  207. package/dist/terminal-policy.js +0 -68
  208. package/dist/terminal-policy.js.map +0 -1
  209. package/dist/tui-command.d.ts +0 -13
  210. package/dist/tui-command.d.ts.map +0 -1
  211. package/dist/tui-command.js +0 -392
  212. package/dist/tui-command.js.map +0 -1
  213. package/dist/typert-gateway-contract.d.ts +0 -59
  214. package/dist/typert-gateway-contract.d.ts.map +0 -1
  215. package/dist/typert-gateway-contract.js +0 -2
  216. package/dist/typert-gateway-contract.js.map +0 -1
  217. package/dist/typert-gateway-switch.d.ts +0 -85
  218. package/dist/typert-gateway-switch.d.ts.map +0 -1
  219. package/dist/typert-gateway-switch.js +0 -448
  220. package/dist/typert-gateway-switch.js.map +0 -1
  221. package/dist/types.d.ts +0 -20
  222. package/dist/types.d.ts.map +0 -1
  223. package/dist/types.js +0 -2
  224. package/dist/types.js.map +0 -1
  225. package/dist/version.d.ts +0 -12
  226. package/dist/version.d.ts.map +0 -1
  227. package/dist/version.js +0 -12
  228. package/dist/version.js.map +0 -1
  229. package/dist/werift-rtc.d.ts +0 -121
  230. package/dist/werift-rtc.d.ts.map +0 -1
  231. package/dist/werift-rtc.js +0 -490
  232. package/dist/werift-rtc.js.map +0 -1
@@ -1,543 +0,0 @@
1
- import { hostname } from 'node:os';
2
- import { existsSync } from 'node:fs';
3
- import { execFileSync } from 'node:child_process';
4
- import { resolveConfig } from './config.js';
5
- import { ClientModeError, } from './client-runtime.js';
6
- import { IdentityStore, serverStorageDirectory } from './identity-store.js';
7
- import { ClientServerApi, HostServerApi } from './server-api.js';
8
- import { ServerCredentialStore } from './server-credentials.js';
9
- import { registerControlRoute } from './control-route.js';
10
- import { ControlStatusStream } from './control-stream.js';
11
- import { codexBinaryCandidates } from './codex/domain.js';
12
- /** Loopback-only control plane shared by Local/Remote switching and plugin setup. */
13
- export class PluginControlRuntime {
14
- config;
15
- identityDirectory;
16
- settings;
17
- client;
18
- host;
19
- deepseekSession;
20
- constructor(config, identityDirectory, settings, client, host, deepseekSession = undefined) {
21
- this.config = config;
22
- this.identityDirectory = identityDirectory;
23
- this.settings = settings;
24
- this.client = client;
25
- this.host = host;
26
- this.deepseekSession = deepseekSession;
27
- }
28
- /**
29
- * The DeepSeek grant whose Server authorization this runtime already completed.
30
- *
31
- * The client polls this control endpoint while the browser page is open, and
32
- * every call used to re-run the authorization: that repeats a platform request
33
- * and re-registers the device, which rotates its tokens. The Host connection
34
- * using those tokens then fails with AUTH_INVALID, intermittently, right after a
35
- * sign-in. Verify once per grant instead.
36
- */
37
- verifiedDeepSeekToken;
38
- verifiedDeepSeekAuthorization;
39
- register(connection, webServer) {
40
- const statusStream = new ControlStatusStream(() => this.streamStatus());
41
- return registerControlRoute(connection, (endpoint, payload, signal) => this.handle(endpoint, payload, signal), webServer, statusStream);
42
- }
43
- /**
44
- * Read the value the status event stream pushes. It resolves through the same
45
- * endpoint handler as the unary `status` control call, so a pushed status and
46
- * a polled one can never diverge.
47
- */
48
- async streamStatus() {
49
- const result = await this.handle('status', {}, new AbortController().signal);
50
- if (!result.ok)
51
- throw new ClientModeError('STATUS_UNAVAILABLE', result.error.message);
52
- return result.value;
53
- }
54
- async handle(endpoint, payload, signal) {
55
- try {
56
- if (endpoint === 'settings.development.set')
57
- return ok(await this.setDevelopment(payload));
58
- if (endpoint === 'settings.get')
59
- return ok(await this.settingsView());
60
- if (endpoint === 'settings.configure')
61
- return ok(await this.configure(payload));
62
- if (endpoint === 'settings.server.set')
63
- return ok(await this.setServer(payload));
64
- if (endpoint === 'settings.role.set')
65
- return ok(await this.setRole(payload));
66
- if (endpoint === 'settings.codex.set')
67
- return ok(await this.setCodex(payload));
68
- if (endpoint === 'settings.acp.set')
69
- return ok(await this.setAcp(payload));
70
- if (endpoint === 'settings.acp.add')
71
- return ok(await this.addAcp(payload));
72
- if (endpoint === 'settings.acp.remove')
73
- return ok(await this.removeAcp(payload));
74
- if (endpoint === 'settings.logout')
75
- return ok(await this.logout());
76
- if (endpoint === 'authorization.local') {
77
- // Answer from what this installation already stores, without touching the
78
- // Server. The panel choice must not wait for a network round trip to
79
- // fail: that is what left the UI in an unanswerable state, and it lasted
80
- // as long as the Server's timeout.
81
- const client = this.client === undefined ? false : await this.client.hasStoredAuthorization();
82
- const host = this.host?.hasStoredAuthorization === undefined
83
- ? false
84
- : await this.host.hasStoredAuthorization();
85
- // Device discovery is a Client operation, so Client credentials decide.
86
- return ok({ stored: client, client, host });
87
- }
88
- if (endpoint === 'host.authorization.set' && this.client !== undefined) {
89
- const value = record(payload);
90
- if (typeof value.enabled !== 'boolean')
91
- throw new ClientModeError('INVALID_MESSAGE', 'Host authorization state is required.');
92
- const status = await this.client.setHostAuthorization(value.enabled);
93
- if (this.settings !== undefined) {
94
- const current = resolveConfig(this.settings.get());
95
- await this.settings.replace(editableConfig({
96
- ...current,
97
- // Releasing the authorization must not silently drop a pause.
98
- hostControl: { enabled: value.enabled, paused: current.hostControl?.paused ?? false },
99
- }));
100
- }
101
- return ok(status);
102
- }
103
- if (endpoint === 'host.connection.set') {
104
- const value = record(payload);
105
- if (typeof value.connected !== 'boolean')
106
- throw new ClientModeError('INVALID_MESSAGE', 'Host connection state is required.');
107
- return ok(await this.setHostConnection(value.connected));
108
- }
109
- if (endpoint === 'host.reconnect') {
110
- if (this.host === undefined)
111
- throw new ClientModeError('METHOD_NOT_ALLOWED', 'This plugin is not running as a Host.');
112
- this.host.reconnectHost();
113
- return ok(this.hostOnlyStatus());
114
- }
115
- if (this.client !== undefined)
116
- return this.client.handleControl(endpoint, payload, signal);
117
- if (endpoint === 'status')
118
- return ok(this.hostOnlyStatus());
119
- if (endpoint === 'devices')
120
- return ok([]);
121
- if (endpoint === 'host.account.login') {
122
- if (this.host === undefined)
123
- throw new ClientModeError('METHOD_NOT_ALLOWED', 'This plugin is not running as a Host.');
124
- const value = record(payload);
125
- if (typeof value.email !== 'string' || typeof value.password !== 'string') {
126
- throw new ClientModeError('INVALID_MESSAGE', 'Email and password are required.');
127
- }
128
- return ok(await this.host.authorizeHostWithAccount(value.email, value.password));
129
- }
130
- if (endpoint === 'host.registration-code.submit') {
131
- if (this.host === undefined)
132
- throw new ClientModeError('METHOD_NOT_ALLOWED', 'This plugin is not running as a Host.');
133
- const value = record(payload);
134
- if (typeof value.code !== 'string' || value.code.trim() === '') {
135
- throw new ClientModeError('INVALID_MESSAGE', 'A Host registration code is required.');
136
- }
137
- return ok(await this.host.authorizeHostWithCode(value.code));
138
- }
139
- if (endpoint === 'mode.set' && record(payload).mode === 'local')
140
- return ok(this.hostOnlyStatus());
141
- throw new ClientModeError('METHOD_NOT_ALLOWED', 'Remote Client mode is disabled by the plugin role.');
142
- }
143
- catch (error) {
144
- return fail(error);
145
- }
146
- }
147
- async configure(payload) {
148
- if (this.settings === undefined) {
149
- throw new ClientModeError('SETTINGS_UNAVAILABLE', 'DSH user settings are unavailable in this profile.');
150
- }
151
- const value = record(payload);
152
- if (value.role !== 'host' && value.role !== 'client') {
153
- throw new ClientModeError('INVALID_MESSAGE', 'Role must be Host or Client.');
154
- }
155
- if (typeof value.serverUrl !== 'string') {
156
- throw new ClientModeError('INVALID_MESSAGE', 'Server URL is required.');
157
- }
158
- const current = editableConfig(resolveConfig(this.settings.get()));
159
- const next = resolveConfig({ ...current, role: value.role, serverUrl: value.serverUrl });
160
- const identities = new IdentityStore({
161
- directory: serverStorageDirectory(this.identityDirectory, next.serverUrl, value.role),
162
- });
163
- const identity = await identities.loadOrCreate(hostname());
164
- const api = value.role === 'host'
165
- ? new HostServerApi(next.serverUrl, new ServerCredentialStore(identities.directory))
166
- : new ClientServerApi(next.serverUrl, new ServerCredentialStore(identities.directory));
167
- let authorization;
168
- if (value.role === 'host' && typeof value.registrationCode === 'string' && value.registrationCode.trim() !== '') {
169
- authorization = await api.authorizeHostWithCode(identity, value.registrationCode);
170
- }
171
- else if (value.provider === 'deepseek') {
172
- // Sign in with the DeepSeek account DSH is already using. The Server
173
- // confirms the grant with the platform, so it never trusts this claim.
174
- if (this.deepseekSession === undefined) {
175
- throw new ClientModeError('METHOD_NOT_ALLOWED', 'DeepSeek account sign-in is unavailable in this profile.');
176
- }
177
- const session = await this.deepseekSession.read();
178
- if (session === undefined) {
179
- // Signed out: start the official browser authorization rather than
180
- // telling the user to go find DSH's own account settings. Nothing is
181
- // authorized yet, so the settings are left untouched.
182
- const started = await this.deepseekSession.startSignIn({
183
- callbackOrigin: typeof value.callbackOrigin === 'string' ? value.callbackOrigin : '',
184
- loginSource: value.loginSource === 'desktop' ? 'desktop' : 'web',
185
- locale: typeof value.locale === 'string' ? value.locale : 'en',
186
- timezoneOffsetSeconds: typeof value.timezoneOffsetSeconds === 'number' ? value.timezoneOffsetSeconds : 0,
187
- });
188
- return {
189
- status: 'deepseek-sign-in-required',
190
- ...(started.authorizeUrl === undefined ? {} : { authorizeUrl: started.authorizeUrl }),
191
- };
192
- }
193
- // Verify a completed grant once. Re-verifying repeats a platform request and
194
- // re-registers the device, rotating the tokens the Host connection is already
195
- // using; polling this endpoint must not invalidate them.
196
- if (this.verifiedDeepSeekToken === session.token && this.verifiedDeepSeekAuthorization !== undefined) {
197
- authorization = this.verifiedDeepSeekAuthorization;
198
- }
199
- else {
200
- authorization = await api.authorizeWithDeepSeek(identity, session.token);
201
- this.verifiedDeepSeekToken = session.token;
202
- this.verifiedDeepSeekAuthorization = authorization;
203
- }
204
- }
205
- else {
206
- if (typeof value.email !== 'string' || typeof value.password !== 'string') {
207
- throw new ClientModeError('INVALID_MESSAGE', 'Email and password are required for account authorization.');
208
- }
209
- authorization = await api.authorizeWithAccount(identity, value.email, value.password);
210
- }
211
- if (value.role === 'client' && resolveConfig(this.settings.get()).hostControl?.enabled !== false) {
212
- await this.client?.authorizeHostByDefault();
213
- }
214
- await this.settings.replace(editableConfig(next));
215
- return {
216
- status: 'authorized',
217
- role: value.role,
218
- ...(authorization.account === undefined ? {} : { account: authorization.account }),
219
- settings: await this.settingsView(),
220
- };
221
- }
222
- async setServer(payload) {
223
- if (this.settings === undefined) {
224
- throw new ClientModeError('SETTINGS_UNAVAILABLE', 'DSH user settings are unavailable in this profile.');
225
- }
226
- const value = record(payload);
227
- if (typeof value.serverUrl !== 'string') {
228
- throw new ClientModeError('INVALID_MESSAGE', 'Server URL is required.');
229
- }
230
- const current = editableConfig(resolveConfig(this.settings.get()));
231
- const next = resolveConfig({ ...current, serverUrl: value.serverUrl });
232
- await this.settings.replace(editableConfig(next));
233
- return this.settingsView();
234
- }
235
- async setRole(payload) {
236
- if (this.settings === undefined) {
237
- throw new ClientModeError('SETTINGS_UNAVAILABLE', 'DSH user settings are unavailable in this profile.');
238
- }
239
- const role = record(payload).role;
240
- if (role !== 'host' && role !== 'client') {
241
- throw new ClientModeError('INVALID_MESSAGE', 'Role must be Host or Client.');
242
- }
243
- const current = editableConfig(resolveConfig(this.settings.get()));
244
- const currentRole = current.role === 'client' ? 'client' : 'host';
245
- if (role !== currentRole && current.serverUrl !== undefined
246
- && await this.association(current.serverUrl, role) === undefined) {
247
- await this.authorizeOwnedRole(current.serverUrl, currentRole, role);
248
- }
249
- await this.settings.replace({ ...current, role });
250
- return this.settingsView();
251
- }
252
- async setDevelopment(payload) {
253
- if (this.settings === undefined)
254
- throw new ClientModeError('SETTINGS_UNAVAILABLE', 'DSH user settings are unavailable in this profile.');
255
- const value = record(payload);
256
- if (value.terminalEnabled !== undefined && typeof value.terminalEnabled !== 'boolean')
257
- throw new ClientModeError('INVALID_MESSAGE', 'The terminal switch must be a boolean.');
258
- if (value.ports !== undefined && (!Array.isArray(value.ports) || value.ports.some((port) => !Number.isInteger(port))))
259
- throw new ClientModeError('INVALID_MESSAGE', 'Loopback ports must be integers.');
260
- if (value.terminalEnabled === undefined && value.ports === undefined)
261
- throw new ClientModeError('INVALID_MESSAGE', 'A terminal switch or loopback ports are required.');
262
- const current = editableConfig(resolveConfig(this.settings.get()));
263
- const next = resolveConfig({ ...current,
264
- terminal: { enabled: value.terminalEnabled === undefined ? (current.terminal?.enabled ?? true) : value.terminalEnabled },
265
- loopback: { ports: value.ports === undefined ? (current.loopback?.ports ?? []) : value.ports },
266
- });
267
- await this.settings.replace(editableConfig(next));
268
- if (value.terminalEnabled !== undefined)
269
- this.host?.setTerminalEnabled?.(value.terminalEnabled);
270
- if (value.ports !== undefined)
271
- this.host?.setLoopbackPorts?.(value.ports);
272
- return this.settingsView();
273
- }
274
- async setCodex(payload) {
275
- if (this.settings === undefined) {
276
- throw new ClientModeError('SETTINGS_UNAVAILABLE', 'DSH user settings are unavailable in this profile.');
277
- }
278
- const enabled = record(payload).enabled;
279
- if (typeof enabled !== 'boolean') {
280
- throw new ClientModeError('INVALID_MESSAGE', 'Codex Remote enabled must be a boolean.');
281
- }
282
- const binary = record(payload).binary;
283
- if (binary !== undefined && typeof binary !== 'string') {
284
- throw new ClientModeError('INVALID_MESSAGE', 'Codex binary must be a string.');
285
- }
286
- const current = editableConfig(resolveConfig(this.settings.get()));
287
- const next = resolveConfig({
288
- ...current,
289
- codex: {
290
- ...current.codex,
291
- enabled,
292
- // An emptied field means "find it yourself" again, which is also what
293
- // survives a desktop-app update that moves the binary.
294
- ...(binary === undefined ? {} : { binary: binary.trim() === '' ? 'codex' : binary.trim() }),
295
- },
296
- });
297
- await this.settings.replace(editableConfig(next));
298
- return this.settingsView();
299
- }
300
- async setAcp(payload) {
301
- if (this.settings === undefined)
302
- throw new ClientModeError('SETTINGS_UNAVAILABLE', 'DSH user settings are unavailable in this profile.');
303
- const value = record(payload);
304
- const backend = value.backend;
305
- const enabled = value.enabled;
306
- if (typeof backend !== 'string' || typeof enabled !== 'boolean')
307
- throw new ClientModeError('INVALID_MESSAGE', 'ACP backend and enabled are required.');
308
- const current = resolveConfig(this.settings.get());
309
- const backends = current.acp?.backends.map(item => item.id === backend ? { ...item, enabled } : item) ?? [];
310
- await this.settings.replace({ ...editableConfig(current), acp: { enabled: current.acp?.enabled ?? true, backends } });
311
- return this.settingsView();
312
- }
313
- async addAcp(payload) {
314
- if (this.settings === undefined)
315
- throw new ClientModeError('SETTINGS_UNAVAILABLE', 'DSH user settings are unavailable in this profile.');
316
- const value = record(payload);
317
- if (typeof value.id !== 'string' || typeof value.command !== 'string' || !Array.isArray(value.args) || !value.args.every(item => typeof item === 'string')) {
318
- throw new ClientModeError('INVALID_MESSAGE', 'ACP name, command, and arguments are required.');
319
- }
320
- const current = resolveConfig(this.settings.get());
321
- if (current.acp?.backends.some(item => item.id === value.id))
322
- throw new ClientModeError('INVALID_MESSAGE', 'ACP backend already exists.');
323
- const backends = [...(current.acp?.backends ?? []), { id: value.id, command: value.command, args: value.args, enabled: false }];
324
- const next = resolveConfig({ ...editableConfig(current), acp: { enabled: current.acp?.enabled ?? true, backends } });
325
- await this.settings.replace(editableConfig(next));
326
- return this.settingsView();
327
- }
328
- async removeAcp(payload) {
329
- if (this.settings === undefined)
330
- throw new ClientModeError('SETTINGS_UNAVAILABLE', 'DSH user settings are unavailable in this profile.');
331
- const id = record(payload).id;
332
- if (typeof id !== 'string' || ['codex', 'cursor', 'kimi'].includes(id))
333
- throw new ClientModeError('INVALID_MESSAGE', 'Only custom ACP backends can be removed.');
334
- const current = resolveConfig(this.settings.get());
335
- const backends = (current.acp?.backends ?? []).filter(item => item.id !== id);
336
- await this.settings.replace(editableConfig({ ...current, acp: { enabled: current.acp?.enabled ?? true, backends } }));
337
- return this.settingsView();
338
- }
339
- async authorizeOwnedRole(serverUrl, sourceRole, targetRole) {
340
- const sourceDirectory = serverStorageDirectory(this.identityDirectory, serverUrl, sourceRole);
341
- const sourceIdentity = await new IdentityStore({ directory: sourceDirectory }).loadOrCreate(hostname());
342
- const sourceStore = new ServerCredentialStore(sourceDirectory);
343
- if (await sourceStore.load(serverUrl, sourceIdentity.deviceId) === undefined)
344
- return;
345
- const sourceApi = sourceRole === 'host'
346
- ? new HostServerApi(serverUrl, sourceStore)
347
- : new ClientServerApi(serverUrl, sourceStore);
348
- const sourceCredentials = await sourceApi.authenticate(sourceIdentity);
349
- const targetDirectory = serverStorageDirectory(this.identityDirectory, serverUrl, targetRole);
350
- const targetIdentity = await new IdentityStore({ directory: targetDirectory }).loadOrCreate(hostname());
351
- const targetApi = targetRole === 'host'
352
- ? new HostServerApi(serverUrl, new ServerCredentialStore(targetDirectory))
353
- : new ClientServerApi(serverUrl, new ServerCredentialStore(targetDirectory));
354
- await targetApi.authorizeOwnedRole(targetIdentity, sourceCredentials.accessToken, sourceCredentials.account);
355
- }
356
- async logout() {
357
- if (this.settings === undefined) {
358
- throw new ClientModeError('SETTINGS_UNAVAILABLE', 'DSH user settings are unavailable in this profile.');
359
- }
360
- const config = resolveConfig(this.settings.get());
361
- // Signing out discards the credentials, so the next sign-in has to verify its
362
- // grant with the Server again rather than reuse a cached authorization.
363
- this.verifiedDeepSeekToken = undefined;
364
- this.verifiedDeepSeekAuthorization = undefined;
365
- if (config.serverUrl !== undefined) {
366
- await Promise.all([
367
- this.client?.clearClientAuthorization(),
368
- this.host?.clearHostAuthorization(),
369
- ]);
370
- await Promise.all(['host', 'client'].map(async (role) => {
371
- const directory = serverStorageDirectory(this.identityDirectory, config.serverUrl, role);
372
- await new ServerCredentialStore(directory).clear();
373
- }));
374
- }
375
- // Signing in borrows DSH's own DeepSeek authorization, so signing out must
376
- // release it as well: otherwise the next sign-in silently reuses the same
377
- // account and this sign-out has no observable effect. A failure is reported
378
- // through the flag rather than hidden, because the local credentials are
379
- // already gone at this point and the user should know what remains.
380
- let deepseekSignedOut = false;
381
- if (this.deepseekSession !== undefined) {
382
- try {
383
- deepseekSignedOut = await this.deepseekSession.signOut();
384
- }
385
- catch {
386
- deepseekSignedOut = false;
387
- }
388
- }
389
- return { ...(await this.settingsView()), deepseekSignedOut };
390
- }
391
- /**
392
- * Stop or resume this machine's remote availability without releasing its
393
- * authorization, and remember the choice so a restart respects it.
394
- *
395
- * This is the non-destructive counterpart of releasing the authorization: it
396
- * closes the connection, keeps the credentials and the device identity, and
397
- * therefore costs neither a re-authorization nor a device identity.
398
- * @param connected - whether this machine should accept remote connections.
399
- * @returns the refreshed status for the caller's view.
400
- */
401
- async setHostConnection(connected) {
402
- if (this.host === undefined) {
403
- throw new ClientModeError('METHOD_NOT_ALLOWED', 'This plugin is not running as a Host.');
404
- }
405
- if (connected)
406
- await this.host.resumeHostConnection?.();
407
- else
408
- await this.host.pauseHostConnection?.();
409
- if (this.settings !== undefined) {
410
- const current = resolveConfig(this.settings.get());
411
- await this.settings.replace(editableConfig({
412
- ...current,
413
- hostControl: { enabled: current.hostControl?.enabled ?? true, paused: !connected },
414
- }));
415
- }
416
- return this.client === undefined ? this.hostOnlyStatus() : await this.client.status();
417
- }
418
- async settingsView() {
419
- const config = this.settings === undefined ? editableConfig(this.config) : editableConfig(resolveConfig(this.settings.get()));
420
- const associations = await this.associations(config);
421
- const role = config.role === 'client' ? 'client' : 'host';
422
- const association = associations[role];
423
- const discovered = discoveredCodexBinary(config.codex?.binary ?? 'codex');
424
- return {
425
- config,
426
- deviceName: hostname(),
427
- writable: this.settings !== undefined,
428
- applies: 'restart',
429
- associations,
430
- acpAvailability: Object.fromEntries((config.acp?.backends ?? []).map(item => [item.id, commandAvailable(item.command ?? '')])),
431
- ...(association === undefined ? {} : { association }),
432
- ...(discovered === undefined ? {} : { discoveredCodexBinary: discovered }),
433
- };
434
- }
435
- async associations(config) {
436
- if (config.serverUrl === undefined)
437
- return {};
438
- const [host, client] = await Promise.all([
439
- this.association(config.serverUrl, 'host'),
440
- this.association(config.serverUrl, 'client'),
441
- ]);
442
- return {
443
- ...(host === undefined ? {} : { host }),
444
- ...(client === undefined ? {} : { client }),
445
- };
446
- }
447
- async association(serverUrl, role) {
448
- const identities = new IdentityStore({
449
- directory: serverStorageDirectory(this.identityDirectory, serverUrl, role),
450
- });
451
- const identity = await identities.loadOrCreate(hostname());
452
- const credentials = await new ServerCredentialStore(identities.directory).load(serverUrl, identity.deviceId);
453
- if (credentials === undefined)
454
- return undefined;
455
- return {
456
- method: credentials.authorizationMethod,
457
- ...(credentials.account === undefined ? {} : { account: credentials.account }),
458
- };
459
- }
460
- hostOnlyStatus() {
461
- return {
462
- mode: 'local',
463
- available: false,
464
- deviceName: hostname(),
465
- hostAuthorizationAvailable: this.host !== undefined,
466
- ...(this.host === undefined ? {} : { host: this.host.hostStatus() }),
467
- };
468
- }
469
- }
470
- function commandAvailable(command) {
471
- try {
472
- execFileSync(process.platform === 'win32' ? 'where' : 'which', [command], { stdio: 'ignore' });
473
- return true;
474
- }
475
- catch {
476
- return false;
477
- }
478
- }
479
- /**
480
- * The Codex binary discovery found for a configured command.
481
- *
482
- * Only the bundled candidates count here: the plain command is left to the
483
- * process `PATH` at spawn time, so reporting it would claim a discovery that was
484
- * never made. The settings UI shows this path so the user can see what will run
485
- * before enabling anything.
486
- * @param configured - the configured binary or command.
487
- * @returns the discovered absolute path, or undefined when nothing was found.
488
- */
489
- function discoveredCodexBinary(configured) {
490
- for (const candidate of codexBinaryCandidates(configured)) {
491
- if (candidate !== configured && existsSync(candidate))
492
- return candidate;
493
- }
494
- return undefined;
495
- }
496
- function editableConfig(config) {
497
- return {
498
- enabled: config.enabled,
499
- role: config.role,
500
- ...(config.serverUrl === undefined ? {} : { serverUrl: config.serverUrl }),
501
- terminal: config.terminal,
502
- hostControl: config.hostControl ?? { enabled: true, paused: false },
503
- loopback: config.loopback,
504
- forceRelay: config.forceRelay,
505
- logLevel: config.logLevel,
506
- reconnect: config.reconnect.enabled
507
- ? {
508
- initialDelayMs: config.reconnect.initialDelayMs,
509
- maxDelayMs: config.reconnect.maxDelayMs,
510
- jitter: config.reconnect.jitter,
511
- }
512
- : false,
513
- codex: {
514
- enabled: config.codex.enabled,
515
- binary: config.codex.binary,
516
- },
517
- ...(config.acp === undefined ? {} : { acp: { enabled: config.acp.enabled, backends: config.acp.backends } }),
518
- };
519
- }
520
- function isRecord(value) {
521
- return typeof value === 'object' && value !== null && !Array.isArray(value);
522
- }
523
- function record(value) {
524
- if (!isRecord(value))
525
- throw new ClientModeError('INVALID_MESSAGE', 'The control request payload is invalid.');
526
- return value;
527
- }
528
- function ok(value) { return { ok: true, value }; }
529
- function fail(error) {
530
- const source = error instanceof Error ? error : undefined;
531
- const remoteCode = source !== undefined && 'code' in source && typeof source.code === 'string'
532
- ? source.code
533
- : source instanceof ClientModeError ? source.code : undefined;
534
- return {
535
- ok: false,
536
- error: {
537
- code: 'internal',
538
- message: source?.message ?? 'The plugin control operation failed.',
539
- details: remoteCode === undefined ? {} : { remoteCode },
540
- },
541
- };
542
- }
543
- //# sourceMappingURL=control-runtime.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"control-runtime.js","sourceRoot":"","sources":["../src/control-runtime.ts"],"names":[],"mappings":"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"}
@@ -1,67 +0,0 @@
1
- /**
2
- * Loopback status event stream. One `text/event-stream` response per browser
3
- * control client, fed by an in-process sampler that writes a frame only when the
4
- * serialized Host status changes, so an idle Local-mode page receives nothing
5
- * but keep-alive comments.
6
- *
7
- * The stream is a push carrier for the same value the unary `status` control
8
- * endpoint returns; a reconnecting browser therefore receives the complete
9
- * current status as its first frame instead of waiting for the next change.
10
- */
11
- import type { ServerResponse } from 'node:http';
12
- /** Status sampling period used to detect a change without any client request. */
13
- export declare const STATUS_STREAM_SAMPLE_INTERVAL_MS = 1500;
14
- /** Comment-frame period that keeps an idle connection observable to both ends. */
15
- export declare const STATUS_STREAM_HEARTBEAT_INTERVAL_MS = 15000;
16
- /** Reconnect delay advertised to the browser through the SSE `retry` field. */
17
- export declare const STATUS_STREAM_RETRY_MS = 3000;
18
- /** Sampling and keep-alive periods of {@link ControlStatusStream}. */
19
- export interface ControlStatusStreamOptions {
20
- sampleIntervalMs?: number;
21
- heartbeatIntervalMs?: number;
22
- retryMs?: number;
23
- }
24
- /**
25
- * Owns the loopback status event stream: subscribers, change-detecting sampler,
26
- * and keep-alive frames. Sampling runs only while at least one subscriber is
27
- * attached and stops with the last disconnect.
28
- */
29
- export declare class ControlStatusStream {
30
- private readonly readStatus;
31
- private readonly subscribers;
32
- private readonly sampleIntervalMs;
33
- private readonly heartbeatIntervalMs;
34
- private readonly retryMs;
35
- private timer;
36
- private sampling;
37
- private payload;
38
- private writtenAt;
39
- private closed;
40
- /**
41
- * @param readStatus - reads the current status value, the same value the unary control endpoint returns.
42
- * @param options - sampling, keep-alive, and reconnect periods.
43
- */
44
- constructor(readStatus: () => Promise<unknown>, options?: ControlStatusStreamOptions);
45
- /**
46
- * Write the SSE response head, the current status as its first frame, and keep
47
- * pushing until the client disconnects or {@link close} runs.
48
- * @param response - the loopback route response, owned for the connection lifetime.
49
- */
50
- handle(response: ServerResponse): Promise<void>;
51
- /** End every open stream and stop sampling. */
52
- close(): void;
53
- /** Forget one subscriber; the last one to leave also stops the sampler. */
54
- private detach;
55
- private startSampling;
56
- private stopSampling;
57
- private sample;
58
- private readSnapshot;
59
- /**
60
- * Write the payload to every subscriber that has not seen it, or one
61
- * keep-alive comment when the whole connection set is idle.
62
- */
63
- private write;
64
- /** @returns true when the chunk reached a live response. */
65
- private writeChunk;
66
- }
67
- //# sourceMappingURL=control-stream.d.ts.map