@blue-soda/dsh-remote 0.5.6 → 0.5.8

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 +14 -3
  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 +1216 -396
  6. package/dist/index.js.map +4 -4
  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,375 +0,0 @@
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 { ClientTargetStore } from './client-target-store.js';
7
- import type { ResolvedConfig } from './config.js';
8
- import { type HostWebServerLike } from './control-route.js';
9
- import type { IdentityStore } from './identity-store.js';
10
- import type { TypertGatewayLike } from './typert-gateway-contract.js';
11
- import type { SafeLogger } from './logging.js';
12
- import { type CodexVirtualWorkspaceView } from './codex/virtual-harness.js';
13
- import { ClientServerApi, type OAuthProvider } from './server-api.js';
14
- import { type WeriftFactoryOptions } from './werift-rtc.js';
15
- export interface RemoteHostFeatures {
16
- commandList: boolean;
17
- fileViewer: boolean;
18
- terminal: boolean;
19
- apiProxy: boolean;
20
- remoteGateway: boolean;
21
- sessionFormat?: 3;
22
- codex: boolean;
23
- }
24
- export interface RemoteDirectoryEntry {
25
- name: string;
26
- path: string;
27
- hidden: boolean;
28
- }
29
- export interface RemoteDirectoryListing {
30
- path: string;
31
- home: string;
32
- crumbs: RemoteDirectoryEntry[];
33
- entries: RemoteDirectoryEntry[];
34
- truncated: boolean;
35
- }
36
- export interface RemoteWorkspaceView {
37
- workspaceId: string;
38
- path: string;
39
- title: string;
40
- }
41
- export interface RemoteDeviceView {
42
- deviceId: string;
43
- name: string;
44
- platform: string;
45
- membershipId: string;
46
- online: boolean;
47
- lastSeenAt?: number;
48
- clientVersion?: string;
49
- harnessVersion?: string;
50
- }
51
- export interface HostConnectionRpc {
52
- handle(channel: string, handler: (endpoint: string, payload: unknown, signal: AbortSignal) => Promise<RpcResult<unknown>>, options: {
53
- authority: 'loopback' | 'trusted-host';
54
- }): () => Promise<void>;
55
- }
56
- export interface HostConnectionHandle {
57
- requestRejection?(request: {
58
- headers: Record<string, string | string[] | undefined>;
59
- }): number | undefined;
60
- rpc: HostConnectionRpc;
61
- }
62
- export interface HostAuthorizationControl {
63
- setTerminalEnabled?(enabled: boolean): void;
64
- setLoopbackPorts?(ports: readonly number[]): void;
65
- hostStatus(): {
66
- deviceId?: string;
67
- configured: boolean;
68
- online: boolean;
69
- reconnecting: boolean;
70
- lastActiveAt?: number;
71
- error?: string;
72
- account?: string;
73
- authorized: boolean;
74
- accountRequired: boolean;
75
- /** Whether the user asked this machine to stay unreachable while signed in. */
76
- paused?: boolean;
77
- connectedClients?: Array<{
78
- deviceId: string;
79
- name: string;
80
- platform?: string;
81
- mode?: 'LAN' | 'P2P' | 'TURN' | 'Relay';
82
- }>;
83
- };
84
- hasStoredAuthorization?(): Promise<boolean>;
85
- reconnectHost(): void;
86
- /** Stop being reachable without releasing the authorization. */
87
- pauseHostConnection?(): Promise<void>;
88
- /** Resume with the same credentials and device identity. */
89
- resumeHostConnection?(): Promise<void>;
90
- clearHostAuthorization(): Promise<void>;
91
- localHarnessVersion?(): string | undefined;
92
- authorizeHostAsOwned(accessToken: string, account?: string): Promise<unknown>;
93
- authorizeHostWithAccount(email: string, password: string): Promise<unknown>;
94
- authorizeHostWithCode(code: string): Promise<unknown>;
95
- codexStatus?(): {
96
- available: boolean;
97
- };
98
- codexCall?(input: unknown, signal?: AbortSignal): Promise<unknown>;
99
- codexRespond?(input: unknown, signal?: AbortSignal): Promise<{
100
- resolved: true;
101
- }>;
102
- codexOpenStream?(input: unknown, publish: (event: 'codex.app.frame' | 'codex.app.stream.closed', data: CodexAppFrameData | CodexAppStreamClosedData) => Promise<void>, signal?: AbortSignal): Promise<unknown>;
103
- codexCloseStream?(input: unknown): Promise<unknown>;
104
- }
105
- /**
106
- * Whether a proof of life failed to reach the peer.
107
- *
108
- * The check asks for an answer, not for success, so the two outcomes are told apart by where the
109
- * error came from. An answer arrives as an error carrying the peer's own code (METHOD_NOT_FOUND,
110
- * FEATURE_NOT_SUPPORTED, ...). A local failure is either one of the core's own codes above or a raw
111
- * transport error with no code at all - a send that failed on a socket this process has not noticed
112
- * is closed. Counting that second kind as liveness would make the whole check useless exactly when
113
- * it matters.
114
- * @param error - the error the check rejected with.
115
- * @returns true when no answer arrived, so the transport must be treated as lost.
116
- */
117
- export declare function livenessProbeLost(error: unknown): boolean;
118
- export declare class ClientModeRuntime {
119
- private readonly config;
120
- private readonly identities;
121
- private readonly server;
122
- private readonly logger;
123
- private readonly host?;
124
- private readonly rtcFactoryProvider;
125
- private readonly targetStore?;
126
- private preview?;
127
- private identity?;
128
- private connected?;
129
- /**
130
- * Set when a remote session dropped and the runtime fell back to local.
131
- *
132
- * The mode then reads 'local', which is what every "return to local" control is
133
- * gated on, so without this the user is left in a stale remote view with no way
134
- * back except signing out.
135
- */
136
- private fellBackToLocal;
137
- /**
138
- * Identifies the live reconnect loop.
139
- *
140
- * A dropped transport starts one; anything else that settles the connection —
141
- * the user returning to local, a logout, a fresh connect — bumps it so the loop
142
- * stops instead of fighting the newer decision.
143
- */
144
- private remoteReconnectRun;
145
- private pendingWorkspaceSelection?;
146
- /**
147
- * Transport a running fast reconnect is replacing.
148
- *
149
- * The rebuild opens its own control connection and the Server closes the older one for the same
150
- * device, so that close belongs to our own replacement. Reading it as a lost peer is what made the
151
- * fast level escalate itself into the fallback before it could ever succeed.
152
- */
153
- private supersededClient?;
154
- /**
155
- * True while a fast reconnect is rebuilding the link.
156
- *
157
- * The probe must not judge the link in the middle of its own replacement: the Server closes the
158
- * older connection for the device, so a check that ran then would read our replacement's side effect
159
- * as a second miss and escalate the level that is busy recovering. The rebuild's own outcome decides
160
- * first; only once it has settled does the cadence resume judging.
161
- */
162
- private fastRebuildInFlight;
163
- /**
164
- * The last workspace the user opened for a Host.
165
- *
166
- * Kept so a reconnect can republish it: re-selecting the workspace is what makes the native UI
167
- * re-read its session list, and without it a list poisoned by the outage stays wrong even after
168
- * the link is back.
169
- */
170
- private lastWorkspaceSelection?;
171
- private codexVirtual?;
172
- private readonly proxySwitch?;
173
- private readonly gatewaySwitch;
174
- private readonly codexStreams;
175
- private connectionProgress?;
176
- private connectionProgressRun;
177
- /**
178
- * Host a boot is trying to restore, reported to the UI while the retry loop runs.
179
- *
180
- * Nothing is connected yet, so without this the window would show the local shell while the
181
- * user is still looking at the remote workspace they left.
182
- */
183
- /**
184
- * Recovery in progress, and which kind.
185
- *
186
- * `restore` is a start that is reconnecting to the recorded target, `fast` keeps the session on
187
- * screen while its link is rebuilt, and `fallback` is the last resort that returns the user to
188
- * the local shell. The UI shows all three, so a reconnect is never invisible, and the retry loop
189
- * stops as soon as the user asks for local.
190
- */
191
- private reconnecting?;
192
- /** Periodic proof of life for the live remote session; absent while nothing is connected. */
193
- private livenessTimer?;
194
- private livenessInFlight;
195
- private livenessFailures;
196
- private closed;
197
- constructor(config: ResolvedConfig, identities: IdentityStore, server: ClientServerApi, apiProxy: ApiProxy | undefined, typertGateway: TypertGatewayLike, logger: SafeLogger, host?: HostAuthorizationControl | undefined, rtcFactoryProvider?: (options?: WeriftFactoryOptions) => Promise<RtcPeerConnectionFactory | undefined>, targetStore?: ClientTargetStore | undefined);
198
- start(): Promise<void>;
199
- /**
200
- * Whether this installation already holds stored Server credentials for its
201
- * Client identity.
202
- *
203
- * This is the local answer to "is this installation signed in", available
204
- * without contacting the Server, so the UI can choose its panel immediately
205
- * instead of inferring the answer from a failed network round trip.
206
- */
207
- hasStoredAuthorization(): Promise<boolean>;
208
- authorizeHostByDefault(): Promise<void>;
209
- registerControl(connection: HostConnectionHandle, webServer?: HostWebServerLike): () => Promise<void>;
210
- status(): Record<string, unknown>;
211
- private closePreview;
212
- private detailedStatus;
213
- devices(): Promise<RemoteDeviceView[]>;
214
- /**
215
- * Device discovery is exposed through the local app control route. When this
216
- * installation also runs a Host, keep that route closed after the Host's
217
- * Server credential has become terminally invalid. The Client credential can
218
- * remain usable for a short time after a revoke, so checking only
219
- * `ClientServerApi.listDevices()` would otherwise leak the device directory
220
- * from a Host that the user has already been told to re-authorize.
221
- */
222
- private assertHostAuthorizationForDeviceDiscovery;
223
- authorizeClientWithAccount(email: string, password: string): Promise<unknown>;
224
- startClientOAuthQrLogin(provider: OAuthProvider): Promise<unknown>;
225
- pollClientOAuthQrLogin(qrId: string): Promise<unknown>;
226
- /**
227
- * Stop this Client from being authorized, keeping its device identity.
228
- *
229
- * The device is deliberately *not* revoked and the identity is deliberately
230
- * *not* rotated. Signing out used to revoke the device, which forced a new
231
- * identity on the next sign-in and registered a second device for the same
232
- * installation; an account holds at most 256 devices, so signing out often
233
- * enough could exhaust it. Keeping the row also means the next sign-in reuses
234
- * it, and the server invalidates the previous tokens at that point.
235
- *
236
- * The cost, by choice: while signed out the device stays in the account and
237
- * its old tokens stay valid until the next sign-in or their expiry, so signing
238
- * out is no longer a way to cut a leaked token off immediately. Removing the
239
- * device for good is an operator action on the server's state file.
240
- */
241
- clearClientAuthorization(): Promise<void>;
242
- setHostAuthorization(enabled: boolean): Promise<unknown>;
243
- setMode(mode: HarnessMode, targetDeviceId?: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
244
- /**
245
- * Prove the live remote link still answers, and act on the result.
246
- *
247
- * Only a missing answer counts as loss: the peer's own error (a refusal, an unknown method) came
248
- * back over the same link and therefore proves it is there.
249
- *
250
- * The two recovery levels differ in what the user keeps. The first miss rebuilds the link in
251
- * place, so the session, its workspace selection and the remote carriers all stay; the second
252
- * gives up and returns to the local shell.
253
- */
254
- private verifyRemoteLiveness;
255
- /**
256
- * Rebuild the link while the session stays on screen.
257
- *
258
- * This is what separates the two recovery levels: nothing is handed back to the local shell, so a
259
- * link that recovers does not cost the user the view they were working in.
260
- * @param targetDeviceId - the Host to rebuild the link to.
261
- */
262
- private enterFastReconnect;
263
- /**
264
- * Build a new transport for the session already on screen.
265
- *
266
- * The carriers hold the previous client, so they are rebound to the new one before the old client
267
- * is closed; leaving it open would keep pointing remote calls at a dead transport.
268
- * @param targetDeviceId - the Host to reconnect to.
269
- * @returns true when a new session is in place.
270
- */
271
- private reestablish;
272
- private rememberWorkspaceSelection;
273
- /**
274
- * Republish the workspace selection so the native UI re-reads its remote session list.
275
- *
276
- * The client half consumes status.workspaceSelection and reconnects that workspace; that refresh is
277
- * what replaces a list the outage had filled with local answers.
278
- * @param targetDeviceId - the Host the reconnect finished against.
279
- */
280
- private restoreWorkspaceSelection;
281
- private finishReconnect;
282
- /**
283
- * Check the live session now, outside the cadence.
284
- *
285
- * Used when the page becomes visible again, which is when a suspended client is most likely to be
286
- * holding a link that already ended.
287
- * @returns the status after the check.
288
- */
289
- verifyRemoteConnection(): Promise<Record<string, unknown>>;
290
- private armLivenessWatch;
291
- private stopLivenessWatch;
292
- /**
293
- * Shared cleanup for a session whose transport is gone.
294
- *
295
- * A close event and an exhausted liveness check must leave exactly the same state behind, so both
296
- * paths run this. The session is gone for good here, which is why the phase becomes 'fallback' and
297
- * the retry loop keeps the UI saying that it is reconnecting.
298
- * @param client - the client that was connected.
299
- * @param targetDeviceId - the Host it was bound to.
300
- */
301
- private handleRemoteTransportLost;
302
- /**
303
- * Re-establish a remote session whose transport closed.
304
- *
305
- * The UI keeps rendering the remote session after the transport is gone, so
306
- * without this the user faces a session that silently ignores everything and has
307
- * to exit and pick the Host again — which is what a suspended and resumed client
308
- * used to require every time. Retry the same Host with backoff; a loop that is
309
- * superseded, or one whose session came back another way, stops quietly.
310
- * @param targetDeviceId - the Host the dropped session was bound to.
311
- */
312
- private reconnectRemoteSession;
313
- /**
314
- * Persist the target a later boot may have to restore.
315
- *
316
- * A failure here must not fail a connect: the only cost is that a killed process comes back to
317
- * the local shell, which is where it would have been without this record.
318
- * @param target - the target to record.
319
- */
320
- private rememberTarget;
321
- /**
322
- * Reconnect to the target this device was last using, with the usual backoff.
323
- *
324
- * A resumed app can miss the transport close entirely - Android may reclaim the process - so
325
- * nothing would start the retry loop and the user would face a local shell behind a remote
326
- * workspace view. Restoring the recorded target gives that case the same loop a dropped
327
- * transport gets. A target recorded for another Server is left alone: it is not reachable
328
- * through the configured one.
329
- * @returns true when a retry loop was started.
330
- */
331
- restoreLastTarget(): Promise<boolean>;
332
- listRemoteDirectory(targetDeviceId: string, path?: string, signal?: AbortSignal): Promise<RemoteDirectoryListing>;
333
- listRemoteWorkspaces(targetDeviceId: string, signal?: AbortSignal): Promise<RemoteWorkspaceView[]>;
334
- openRemoteWorkspace(targetDeviceId: string, path: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
335
- listCodexWorkspaces(targetDeviceId: string, signal?: AbortSignal): Promise<CodexVirtualWorkspaceView[]>;
336
- openCodexWorkspace(targetDeviceId: string, workspaceId: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
337
- createCodexWorkspace(targetDeviceId: string, path: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
338
- private consumeWorkspaceSelection;
339
- close(): Promise<void>;
340
- private callRemoteFileViewer;
341
- private activeRemote;
342
- private activeCodexRemote;
343
- private openCodexStream;
344
- private readonly publishLocalCodexFrame;
345
- private appendCodexFrame;
346
- private localCodexAvailable;
347
- private requireLocalCodex;
348
- private nextCodexFrames;
349
- private closeCodexStream;
350
- private closeCodexStreams;
351
- private selectRemoteTarget;
352
- private remoteTypertGateway;
353
- private selectCodexTarget;
354
- private closeCodexVirtual;
355
- private assertRemoteCompatible;
356
- private selectHarnessRemoteTransport;
357
- private assertLocalHarnessCarrierAvailable;
358
- private connect;
359
- private ensureConnected;
360
- private beginAttemptProgress;
361
- private updateConnectionProgress;
362
- private clearConnectionProgress;
363
- handleControl(endpoint: string, payload: unknown, signal: AbortSignal): Promise<RpcResult<unknown>>;
364
- private requireIdentity;
365
- private authorizeHostPeer;
366
- }
367
- export declare class ClientModeError extends Error {
368
- readonly code: string;
369
- readonly retryable: boolean;
370
- constructor(code: string, message: string, retryable?: boolean);
371
- }
372
- /** Conservative feature profile for Hosts that predate fine-grained capability discovery. */
373
- export declare function remoteHostFeatures(clientVersion?: string): RemoteHostFeatures;
374
- export declare function probeRemoteHostFeatures(client: RemoteClientCore, clientVersion?: string): Promise<RemoteHostFeatures>;
375
- //# sourceMappingURL=client-runtime.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-runtime.d.ts","sourceRoot":"","sources":["../src/client-runtime.ts"],"names":[],"mappings":"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"}