@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
package/dist/cli.js ADDED
@@ -0,0 +1,289 @@
1
+ import { stat } from 'node:fs/promises';
2
+ import { hostname } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { DEFAULT_REMOTE_SERVER_URL, normalizeServerUrl } from './config.js';
5
+ import { IdentityStore, serverStorageDirectory, } from './identity-store.js';
6
+ import { ENABLED_QR_PROVIDERS, HostServerApi, ServerApiError, isEnabledQrProvider, oauthProviderName, } from './server-api.js';
7
+ import { ServerCredentialStore } from './server-credentials.js';
8
+ const QR_POLL_INTERVAL_MS = 2_000;
9
+ const TERMINAL_QR_MARGIN = 4;
10
+ /** TUI-friendly account bootstrap. Configuration remains owned by the DSH profile. */
11
+ export async function runCli(args = process.argv.slice(2), dependencies = {}) {
12
+ const runtime = resolveDependencies(dependencies);
13
+ const [command, ...rest] = args;
14
+ try {
15
+ if (command === 'login')
16
+ return await login(rest, runtime);
17
+ if (command === 'register')
18
+ return await register(rest, runtime);
19
+ if (command === 'status')
20
+ return await status(rest, runtime);
21
+ if (command === 'logout')
22
+ return await logout(rest, runtime);
23
+ if (command === 'help' || command === '--help' || command === '-h' || command === undefined) {
24
+ write(runtime.stdout, helpText());
25
+ return 0;
26
+ }
27
+ throw new CliUsageError(`Unknown command: ${command}`);
28
+ }
29
+ catch (error) {
30
+ write(runtime.stderr, `${cliErrorMessage(error)}\n`);
31
+ if (error instanceof CliUsageError)
32
+ write(runtime.stderr, `\n${helpText()}`);
33
+ return error instanceof CliUsageError ? 2 : 1;
34
+ }
35
+ }
36
+ async function register(args, runtime) {
37
+ if (args.length !== 1 || args[0] === undefined || args[0].trim() === '') {
38
+ throw new CliUsageError('Usage: ds-harness-remote register <server-token>');
39
+ }
40
+ const context = await hostContext(runtime);
41
+ await context.api.authorizeHostWithCode(context.identity, args[0]);
42
+ write(runtime.stdout, 'Remote Host registration complete. Restart dsh-tui to bring the Remote Host online.\n');
43
+ return 0;
44
+ }
45
+ async function login(args, runtime) {
46
+ const usage = `Usage: ds-harness-remote login [${ENABLED_QR_PROVIDERS.join('|')}]`;
47
+ if (args.length > 1)
48
+ throw new CliUsageError(usage);
49
+ const provider = args[0] ?? ENABLED_QR_PROVIDERS[0] ?? 'wechat';
50
+ if (!isEnabledQrProvider(provider)) {
51
+ throw new CliUsageError(`Login provider must be one of: ${ENABLED_QR_PROVIDERS.join(', ')}.`);
52
+ }
53
+ const context = await hostContext(runtime);
54
+ const session = await context.api.startOAuthQrLogin(provider);
55
+ const qr = await runtime.renderQr(session.scanUrl);
56
+ const providerName = oauthProviderName(provider);
57
+ write(runtime.stdout, `Using ${providerName} QR login. ${alternativeProviderHint(provider)}\n`);
58
+ write(runtime.stdout, 'Scan this QR code to authorize this Host:\n\n');
59
+ write(runtime.stdout, `${qr.trimEnd()}\n`);
60
+ write(runtime.stdout, `Authorization URL: ${terminalLink(session.scanUrl, runtime.stdout)}\n\nWaiting for authorization...\n`);
61
+ const deadline = runtime.now() + session.expiresIn * 1_000;
62
+ let identity = context.identity;
63
+ while (runtime.now() < deadline) {
64
+ let result;
65
+ try {
66
+ result = await context.api.pollOAuthQrLogin(identity, session.qrId, async () => {
67
+ identity = await context.identities.reset(context.deviceName);
68
+ return identity;
69
+ });
70
+ }
71
+ catch (error) {
72
+ if (!(error instanceof ServerApiError) || !error.retryable)
73
+ throw error;
74
+ await runtime.wait(Math.min(QR_POLL_INTERVAL_MS, Math.max(1, deadline - runtime.now())));
75
+ continue;
76
+ }
77
+ if (result.status === 'complete') {
78
+ write(runtime.stdout, `${authorizedMessage(result.authorization)} Restart dsh-tui to bring the Remote Host online.\n`);
79
+ return 0;
80
+ }
81
+ if (result.status === 'expired')
82
+ break;
83
+ await runtime.wait(Math.min(QR_POLL_INTERVAL_MS, Math.max(1, deadline - runtime.now())));
84
+ }
85
+ write(runtime.stderr, 'The QR login expired. Run the login command again to generate a new code.\n');
86
+ return 1;
87
+ }
88
+ async function status(args, runtime) {
89
+ if (args.length !== 0)
90
+ throw new CliUsageError('Usage: ds-harness-remote status');
91
+ const serverUrl = selectedServer();
92
+ const root = new IdentityStore({ env: runtime.env }).directory;
93
+ const directory = serverStorageDirectory(root, serverUrl, 'host');
94
+ const lines = [
95
+ 'Remote Host status',
96
+ `Server: ${serverUrl}`,
97
+ 'Host control: enabled (dsh-TUI default)',
98
+ ];
99
+ if (!await exists(join(directory, 'device.json'))) {
100
+ lines.push('Device: not initialized', 'Authorization: logged out', 'Credential: unavailable');
101
+ write(runtime.stdout, `${lines.join('\n')}\n\nRun "ds-harness-remote login" or use "/remote login" in dsh-TUI.\n`);
102
+ return 0;
103
+ }
104
+ const identities = runtime.createIdentityStore({ directory, env: runtime.env });
105
+ const identity = await identities.loadOrCreate(hostname());
106
+ const store = new ServerCredentialStore(directory);
107
+ const stored = await store.load(serverUrl, identity.deviceId);
108
+ lines.push(`Device: ${identity.name} (${identity.deviceId})`);
109
+ if (stored === undefined) {
110
+ lines.push('Authorization: logged out', 'Credential: unavailable');
111
+ write(runtime.stdout, `${lines.join('\n')}\n\nRun "ds-harness-remote login" or use "/remote login" in dsh-TUI.\n`);
112
+ return 0;
113
+ }
114
+ lines.push(`Authorization: logged in (${authorizationLabel(stored.authorizationMethod)})`);
115
+ if (stored.account !== undefined)
116
+ lines.push(`Account: ${stored.account}`);
117
+ const api = runtime.createHostApi(serverUrl, store);
118
+ api.bindIdentity(identity);
119
+ try {
120
+ await api.authenticate(identity);
121
+ lines.push('Credential: ready');
122
+ lines.push('Presence: published while dsh-tui is running');
123
+ write(runtime.stdout, `${lines.join('\n')}\n`);
124
+ return 0;
125
+ }
126
+ catch (error) {
127
+ lines.push(`Credential: unavailable (${statusErrorCode(error)})`);
128
+ write(runtime.stdout, `${lines.join('\n')}\n`);
129
+ return 1;
130
+ }
131
+ }
132
+ async function logout(args, runtime) {
133
+ if (args.length !== 0)
134
+ throw new CliUsageError('Usage: ds-harness-remote logout');
135
+ const serverUrl = selectedServer();
136
+ const root = new IdentityStore({ env: runtime.env }).directory;
137
+ const directory = serverStorageDirectory(root, serverUrl, 'host');
138
+ if (!await exists(join(directory, 'device.json'))) {
139
+ await new ServerCredentialStore(directory).clear();
140
+ write(runtime.stdout, 'This Host is already logged out.\n');
141
+ return 0;
142
+ }
143
+ const deviceName = hostname();
144
+ const identities = runtime.createIdentityStore({ directory, env: runtime.env });
145
+ await identities.loadOrCreate(deviceName);
146
+ // Clear the credentials and keep the device identity. Revoking and rotating
147
+ // would register a second device for this installation on the next login, and
148
+ // an account holds at most 256 devices. Signing in again reuses this device and
149
+ // the Server invalidates the previous tokens at that point.
150
+ await new ServerCredentialStore(directory).clear();
151
+ write(runtime.stdout, 'Remote Host logged out. This device stays registered and is reused on the next login. Restart dsh-tui.\n');
152
+ return 0;
153
+ }
154
+ async function hostContext(runtime) {
155
+ const serverUrl = selectedServer();
156
+ const root = new IdentityStore({ env: runtime.env }).directory;
157
+ const directory = serverStorageDirectory(root, serverUrl, 'host');
158
+ const deviceName = hostname();
159
+ const identities = runtime.createIdentityStore({ directory, env: runtime.env });
160
+ const identity = await identities.loadOrCreate(deviceName);
161
+ const api = runtime.createHostApi(serverUrl, new ServerCredentialStore(directory));
162
+ return { api, identities, identity, deviceName };
163
+ }
164
+ function selectedServer() {
165
+ return normalizeServerUrl(DEFAULT_REMOTE_SERVER_URL);
166
+ }
167
+ function resolveDependencies(input) {
168
+ return {
169
+ env: input.env ?? process.env,
170
+ stdout: input.stdout ?? process.stdout,
171
+ stderr: input.stderr ?? process.stderr,
172
+ now: input.now ?? Date.now,
173
+ wait: input.wait ?? (milliseconds => new Promise(resolve => setTimeout(resolve, milliseconds))),
174
+ renderQr: input.renderQr ?? renderTerminalQr,
175
+ createIdentityStore: input.createIdentityStore ?? (options => new IdentityStore(options)),
176
+ createHostApi: input.createHostApi ?? ((serverUrl, store) => new HostServerApi(serverUrl, store)),
177
+ };
178
+ }
179
+ export async function renderTerminalQr(url) {
180
+ // Keep the terminal-only renderer off the Host plugin startup path. The
181
+ // built-in compact renderer has only a one-module quiet zone and relies on
182
+ // half-height glyphs, which is difficult for phone cameras to recognize in
183
+ // some terminal profiles. Render square modules with an explicit standard
184
+ // four-module quiet zone instead.
185
+ const { default: QRCode } = await import('qrcode');
186
+ const modules = QRCode.create(url, { errorCorrectionLevel: 'M' }).modules;
187
+ const width = modules.size + TERMINAL_QR_MARGIN * 2;
188
+ const quietLine = `\u001B[47m${' '.repeat(width * 2)}\u001B[0m`;
189
+ const lines = Array.from({ length: TERMINAL_QR_MARGIN }, () => quietLine);
190
+ for (let row = 0; row < modules.size; row += 1) {
191
+ let line = `\u001B[47m${' '.repeat(TERMINAL_QR_MARGIN * 2)}`;
192
+ for (let column = 0; column < modules.size; column += 1) {
193
+ line += modules.get(row, column) === 1 ? '\u001B[40m ' : '\u001B[47m ';
194
+ }
195
+ line += `\u001B[47m${' '.repeat(TERMINAL_QR_MARGIN * 2)}\u001B[0m`;
196
+ lines.push(line);
197
+ }
198
+ lines.push(...Array.from({ length: TERMINAL_QR_MARGIN }, () => quietLine));
199
+ return lines.join('\n');
200
+ }
201
+ /** Square terminal modules at half the row count for fullscreen TUI scenes. */
202
+ export async function renderCompactTerminalQr(url) {
203
+ const { default: QRCode } = await import('qrcode');
204
+ const modules = QRCode.create(url, { errorCorrectionLevel: 'M' }).modules;
205
+ const size = modules.size + TERMINAL_QR_MARGIN * 2;
206
+ const lines = [];
207
+ const isBlack = (row, column) => {
208
+ const qrRow = row - TERMINAL_QR_MARGIN;
209
+ const qrColumn = column - TERMINAL_QR_MARGIN;
210
+ return qrRow >= 0 && qrRow < modules.size
211
+ && qrColumn >= 0 && qrColumn < modules.size
212
+ && modules.get(qrRow, qrColumn) === 1;
213
+ };
214
+ for (let row = 0; row < size; row += 2) {
215
+ let line = '\u001B[30;47m';
216
+ for (let column = 0; column < size; column += 1) {
217
+ const top = isBlack(row, column);
218
+ const bottom = isBlack(row + 1, column);
219
+ line += top ? bottom ? '█' : '▀' : bottom ? '▄' : ' ';
220
+ }
221
+ lines.push(`${line}\u001B[0m`);
222
+ }
223
+ return lines.join('\n');
224
+ }
225
+ function authorizedMessage(authorization) {
226
+ return authorization.account === undefined
227
+ ? 'Remote Host login complete.'
228
+ : `Remote Host login complete for ${authorization.account}.`;
229
+ }
230
+ function alternativeProviderHint(provider) {
231
+ const alternatives = ENABLED_QR_PROVIDERS.filter(candidate => candidate !== provider);
232
+ if (alternatives.length === 0)
233
+ return '';
234
+ return `Also supported: ${alternatives.map(candidate => `ds-harness-remote login ${candidate}`).join(', ')}`;
235
+ }
236
+ function authorizationLabel(method) {
237
+ if (method === 'host_registration_code')
238
+ return 'Host registration code';
239
+ if (method === 'owned_device')
240
+ return 'owned device';
241
+ return 'account';
242
+ }
243
+ function statusErrorCode(error) {
244
+ return error instanceof ServerApiError ? error.code : 'CONNECTION_FAILED';
245
+ }
246
+ function cliErrorMessage(error) {
247
+ const message = error instanceof Error ? error.message : 'The Remote command failed.';
248
+ const code = error instanceof Error && 'code' in error && typeof error.code === 'string'
249
+ ? error.code
250
+ : undefined;
251
+ return code === undefined ? message : `${message} (${code})`;
252
+ }
253
+ function helpText() {
254
+ return [
255
+ 'Usage:',
256
+ ' ds-harness-remote login [github|zhihu]',
257
+ ' ds-harness-remote register <server-token>',
258
+ ' ds-harness-remote status',
259
+ ' ds-harness-remote logout',
260
+ '',
261
+ 'Inside dsh-TUI, use /remote login, /remote status, or /remote logout.',
262
+ 'login defaults to Zhihu and authorizes this computer as a Remote Host with a terminal QR code.',
263
+ `The Server is ${DEFAULT_REMOTE_SERVER_URL}.`,
264
+ 'Host configuration is not exposed by this CLI yet. Restart dsh-tui after login or logout.',
265
+ '',
266
+ ].join('\n');
267
+ }
268
+ function write(target, value) {
269
+ target.write(value);
270
+ }
271
+ function terminalLink(url, target) {
272
+ if (target.isTTY !== true)
273
+ return url;
274
+ return `\u001B]8;;${url}\u0007${url}\u001B]8;;\u0007`;
275
+ }
276
+ async function exists(path) {
277
+ try {
278
+ await stat(path);
279
+ return true;
280
+ }
281
+ catch (error) {
282
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT')
283
+ return false;
284
+ throw error;
285
+ }
286
+ }
287
+ class CliUsageError extends Error {
288
+ }
289
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,239 @@
1
+ import type { ApiProxy, RpcResult } from '@deepseek-ai/dsh-host-apiproxy/api';
2
+ import type { CodexAppFrameData, CodexAppStreamClosedData } from '@dsh-remote/protocol';
3
+ import { RemoteClientCore } from '@dsh-remote/client-core';
4
+ import { type RtcPeerConnectionFactory } from '@dsh-remote/webrtc';
5
+ import { type HarnessMode } from './api-proxy-switch.js';
6
+ import type { ResolvedConfig } from './config.js';
7
+ import { type HostWebServerLike } from './control-route.js';
8
+ import type { IdentityStore } from './identity-store.js';
9
+ import type { TypertGatewayLike } from './typert-gateway-contract.js';
10
+ import type { SafeLogger } from './logging.js';
11
+ import { type CodexVirtualWorkspaceView } from './codex/virtual-harness.js';
12
+ import { ClientServerApi, type OAuthProvider } from './server-api.js';
13
+ import { type WeriftFactoryOptions } from './werift-rtc.js';
14
+ export interface RemoteHostFeatures {
15
+ commandList: boolean;
16
+ fileViewer: boolean;
17
+ terminal: boolean;
18
+ apiProxy: boolean;
19
+ remoteGateway: boolean;
20
+ sessionFormat?: 3;
21
+ codex: boolean;
22
+ }
23
+ export interface RemoteDirectoryEntry {
24
+ name: string;
25
+ path: string;
26
+ hidden: boolean;
27
+ }
28
+ export interface RemoteDirectoryListing {
29
+ path: string;
30
+ home: string;
31
+ crumbs: RemoteDirectoryEntry[];
32
+ entries: RemoteDirectoryEntry[];
33
+ truncated: boolean;
34
+ }
35
+ export interface RemoteWorkspaceView {
36
+ workspaceId: string;
37
+ path: string;
38
+ title: string;
39
+ }
40
+ export interface RemoteDeviceView {
41
+ deviceId: string;
42
+ name: string;
43
+ platform: string;
44
+ membershipId: string;
45
+ online: boolean;
46
+ lastSeenAt?: number;
47
+ clientVersion?: string;
48
+ harnessVersion?: string;
49
+ }
50
+ export interface HostConnectionRpc {
51
+ handle(channel: string, handler: (endpoint: string, payload: unknown, signal: AbortSignal) => Promise<RpcResult<unknown>>, options: {
52
+ authority: 'loopback' | 'trusted-host';
53
+ }): () => Promise<void>;
54
+ }
55
+ export interface HostConnectionHandle {
56
+ requestRejection?(request: {
57
+ headers: Record<string, string | string[] | undefined>;
58
+ }): number | undefined;
59
+ rpc: HostConnectionRpc;
60
+ }
61
+ export interface HostAuthorizationControl {
62
+ setTerminalEnabled?(enabled: boolean): void;
63
+ setLoopbackPorts?(ports: readonly number[]): void;
64
+ hostStatus(): {
65
+ deviceId?: string;
66
+ configured: boolean;
67
+ online: boolean;
68
+ reconnecting: boolean;
69
+ lastActiveAt?: number;
70
+ error?: string;
71
+ account?: string;
72
+ authorized: boolean;
73
+ accountRequired: boolean;
74
+ /** Whether the user asked this machine to stay unreachable while signed in. */
75
+ paused?: boolean;
76
+ connectedClients?: Array<{
77
+ deviceId: string;
78
+ name: string;
79
+ platform?: string;
80
+ mode?: 'LAN' | 'P2P' | 'TURN' | 'Relay';
81
+ }>;
82
+ };
83
+ hasStoredAuthorization?(): Promise<boolean>;
84
+ reconnectHost(): void;
85
+ /** Stop being reachable without releasing the authorization. */
86
+ pauseHostConnection?(): Promise<void>;
87
+ /** Resume with the same credentials and device identity. */
88
+ resumeHostConnection?(): Promise<void>;
89
+ clearHostAuthorization(): Promise<void>;
90
+ localHarnessVersion?(): string | undefined;
91
+ authorizeHostAsOwned(accessToken: string, account?: string): Promise<unknown>;
92
+ authorizeHostWithAccount(email: string, password: string): Promise<unknown>;
93
+ authorizeHostWithCode(code: string): Promise<unknown>;
94
+ codexStatus?(): {
95
+ available: boolean;
96
+ };
97
+ codexCall?(input: unknown, signal?: AbortSignal): Promise<unknown>;
98
+ codexRespond?(input: unknown, signal?: AbortSignal): Promise<{
99
+ resolved: true;
100
+ }>;
101
+ codexOpenStream?(input: unknown, publish: (event: 'codex.app.frame' | 'codex.app.stream.closed', data: CodexAppFrameData | CodexAppStreamClosedData) => Promise<void>, signal?: AbortSignal): Promise<unknown>;
102
+ codexCloseStream?(input: unknown): Promise<unknown>;
103
+ }
104
+ export declare class ClientModeRuntime {
105
+ private readonly config;
106
+ private readonly identities;
107
+ private readonly server;
108
+ private readonly logger;
109
+ private readonly host?;
110
+ private readonly rtcFactoryProvider;
111
+ private preview?;
112
+ private identity?;
113
+ private connected?;
114
+ /**
115
+ * Set when a remote session dropped and the runtime fell back to local.
116
+ *
117
+ * The mode then reads 'local', which is what every "return to local" control is
118
+ * gated on, so without this the user is left in a stale remote view with no way
119
+ * back except signing out.
120
+ */
121
+ private fellBackToLocal;
122
+ /**
123
+ * Identifies the live reconnect loop.
124
+ *
125
+ * A dropped transport starts one; anything else that settles the connection —
126
+ * the user returning to local, a logout, a fresh connect — bumps it so the loop
127
+ * stops instead of fighting the newer decision.
128
+ */
129
+ private remoteReconnectRun;
130
+ private pendingWorkspaceSelection?;
131
+ private codexVirtual?;
132
+ private readonly proxySwitch?;
133
+ private readonly gatewaySwitch;
134
+ private readonly codexStreams;
135
+ private connectionProgress?;
136
+ private connectionProgressRun;
137
+ private closed;
138
+ constructor(config: ResolvedConfig, identities: IdentityStore, server: ClientServerApi, apiProxy: ApiProxy | undefined, typertGateway: TypertGatewayLike, logger: SafeLogger, host?: HostAuthorizationControl | undefined, rtcFactoryProvider?: (options?: WeriftFactoryOptions) => Promise<RtcPeerConnectionFactory | undefined>);
139
+ start(): Promise<void>;
140
+ /**
141
+ * Whether this installation already holds stored Server credentials for its
142
+ * Client identity.
143
+ *
144
+ * This is the local answer to "is this installation signed in", available
145
+ * without contacting the Server, so the UI can choose its panel immediately
146
+ * instead of inferring the answer from a failed network round trip.
147
+ */
148
+ hasStoredAuthorization(): Promise<boolean>;
149
+ authorizeHostByDefault(): Promise<void>;
150
+ registerControl(connection: HostConnectionHandle, webServer?: HostWebServerLike): () => Promise<void>;
151
+ status(): Record<string, unknown>;
152
+ private closePreview;
153
+ private detailedStatus;
154
+ devices(): Promise<RemoteDeviceView[]>;
155
+ /**
156
+ * Device discovery is exposed through the local app control route. When this
157
+ * installation also runs a Host, keep that route closed after the Host's
158
+ * Server credential has become terminally invalid. The Client credential can
159
+ * remain usable for a short time after a revoke, so checking only
160
+ * `ClientServerApi.listDevices()` would otherwise leak the device directory
161
+ * from a Host that the user has already been told to re-authorize.
162
+ */
163
+ private assertHostAuthorizationForDeviceDiscovery;
164
+ authorizeClientWithAccount(email: string, password: string): Promise<unknown>;
165
+ startClientOAuthQrLogin(provider: OAuthProvider): Promise<unknown>;
166
+ pollClientOAuthQrLogin(qrId: string): Promise<unknown>;
167
+ /**
168
+ * Stop this Client from being authorized, keeping its device identity.
169
+ *
170
+ * The device is deliberately *not* revoked and the identity is deliberately
171
+ * *not* rotated. Signing out used to revoke the device, which forced a new
172
+ * identity on the next sign-in and registered a second device for the same
173
+ * installation; an account holds at most 256 devices, so signing out often
174
+ * enough could exhaust it. Keeping the row also means the next sign-in reuses
175
+ * it, and the server invalidates the previous tokens at that point.
176
+ *
177
+ * The cost, by choice: while signed out the device stays in the account and
178
+ * its old tokens stay valid until the next sign-in or their expiry, so signing
179
+ * out is no longer a way to cut a leaked token off immediately. Removing the
180
+ * device for good is an operator action on the server's state file.
181
+ */
182
+ clearClientAuthorization(): Promise<void>;
183
+ setHostAuthorization(enabled: boolean): Promise<unknown>;
184
+ setMode(mode: HarnessMode, targetDeviceId?: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
185
+ /**
186
+ * Re-establish a remote session whose transport closed.
187
+ *
188
+ * The UI keeps rendering the remote session after the transport is gone, so
189
+ * without this the user faces a session that silently ignores everything and has
190
+ * to exit and pick the Host again — which is what a suspended and resumed client
191
+ * used to require every time. Retry the same Host with backoff; a loop that is
192
+ * superseded, or one whose session came back another way, stops quietly.
193
+ * @param targetDeviceId - the Host the dropped session was bound to.
194
+ */
195
+ private reconnectRemoteSession;
196
+ listRemoteDirectory(targetDeviceId: string, path?: string, signal?: AbortSignal): Promise<RemoteDirectoryListing>;
197
+ listRemoteWorkspaces(targetDeviceId: string, signal?: AbortSignal): Promise<RemoteWorkspaceView[]>;
198
+ openRemoteWorkspace(targetDeviceId: string, path: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
199
+ listCodexWorkspaces(targetDeviceId: string, signal?: AbortSignal): Promise<CodexVirtualWorkspaceView[]>;
200
+ openCodexWorkspace(targetDeviceId: string, workspaceId: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
201
+ createCodexWorkspace(targetDeviceId: string, path: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
202
+ private consumeWorkspaceSelection;
203
+ close(): Promise<void>;
204
+ private callRemoteFileViewer;
205
+ private activeRemote;
206
+ private activeCodexRemote;
207
+ private openCodexStream;
208
+ private readonly publishLocalCodexFrame;
209
+ private appendCodexFrame;
210
+ private localCodexAvailable;
211
+ private requireLocalCodex;
212
+ private nextCodexFrames;
213
+ private closeCodexStream;
214
+ private closeCodexStreams;
215
+ private selectRemoteTarget;
216
+ private remoteTypertGateway;
217
+ private selectCodexTarget;
218
+ private closeCodexVirtual;
219
+ private assertRemoteCompatible;
220
+ private selectHarnessRemoteTransport;
221
+ private assertLocalHarnessCarrierAvailable;
222
+ private connect;
223
+ private ensureConnected;
224
+ private beginAttemptProgress;
225
+ private updateConnectionProgress;
226
+ private clearConnectionProgress;
227
+ handleControl(endpoint: string, payload: unknown, signal: AbortSignal): Promise<RpcResult<unknown>>;
228
+ private requireIdentity;
229
+ private authorizeHostPeer;
230
+ }
231
+ export declare class ClientModeError extends Error {
232
+ readonly code: string;
233
+ readonly retryable: boolean;
234
+ constructor(code: string, message: string, retryable?: boolean);
235
+ }
236
+ /** Conservative feature profile for Hosts that predate fine-grained capability discovery. */
237
+ export declare function remoteHostFeatures(clientVersion?: string): RemoteHostFeatures;
238
+ export declare function probeRemoteHostFeatures(client: RemoteClientCore, clientVersion?: string): Promise<RemoteHostFeatures>;
239
+ //# sourceMappingURL=client-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-runtime.d.ts","sourceRoot":"","sources":["../src/client-runtime.ts"],"names":[],"mappings":"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"}