@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
package/dist/config.js DELETED
@@ -1,127 +0,0 @@
1
- import { hostname } from 'node:os';
2
- import s from '@deepseek-ai/schemastery';
3
- import { z } from 'zod';
4
- export { DEFAULT_REMOTE_SERVER_URL } from './defaults.js';
5
- /**
6
- * Schemastery schema for the plugin entry. On DSH 0.1.7-rc.1 and newer the
7
- * whole section is `.volatile()` (DSH-0.1.7-RC1-04): the Loader hands `apply`
8
- * a single live reference whose `.get()` always returns the latest committed
9
- * value, and the settings service persists edits in the active profile's
10
- * `cordis.patch.yml` under this entry id. On older hosts the helper above keeps
11
- * the plain schema required by the namespace-registration API.
12
- */
13
- const entryConfigSchema = s.object({
14
- enabled: s.boolean(),
15
- role: s.union(['host', 'client', 'both']),
16
- serverUrl: s.string(),
17
- deviceName: s.string(),
18
- terminal: s.object({ enabled: s.boolean() }),
19
- hostControl: s.object({ enabled: s.boolean(), paused: s.boolean() }),
20
- loopback: s.object({ ports: s.array(s.number()) }),
21
- forceRelay: s.boolean(),
22
- logLevel: s.union(['debug', 'info', 'warn', 'error']),
23
- reconnect: s.union([
24
- s.boolean(),
25
- s.object({
26
- initialDelayMs: s.number(),
27
- maxDelayMs: s.number(),
28
- jitter: s.number(),
29
- }),
30
- ]),
31
- codex: s.object({
32
- enabled: s.boolean(),
33
- binary: s.string(),
34
- }),
35
- acp: s.object({ enabled: s.boolean(), backends: s.array(s.object({ id: s.string(), enabled: s.boolean(), command: s.string(), args: s.array(s.string()), cwd: s.string() })) }),
36
- });
37
- /**
38
- * Mark the entry as live-editable when the host Schemastery supports the
39
- * 0.1.7 volatile schema mode. Older DSH releases ship an earlier Schemastery
40
- * where the method does not exist; their settings registry expects the plain
41
- * schema and must still be able to import the plugin without throwing.
42
- */
43
- export function withVolatileSchema(schema) {
44
- const volatile = schema.volatile;
45
- return typeof volatile === 'function'
46
- ? volatile.call(schema)
47
- : schema;
48
- }
49
- export const Config = withVolatileSchema(entryConfigSchema);
50
- const reconnectSchema = z.union([
51
- z.boolean(),
52
- z.object({
53
- initialDelayMs: z.number().int().min(100).max(60_000).optional(),
54
- maxDelayMs: z.number().int().min(1_000).max(300_000).optional(),
55
- jitter: z.number().min(0).max(1).optional(),
56
- }).strict(),
57
- ]);
58
- const configSchema = z.object({
59
- enabled: z.boolean().optional(),
60
- role: z.enum(['host', 'client', 'both']).optional(),
61
- serverUrl: z.string().url().optional(),
62
- deviceName: z.string().trim().min(1).max(80).optional(),
63
- terminal: z.object({ enabled: z.boolean().optional() }).strict().optional(),
64
- hostControl: z.object({ enabled: z.boolean().optional(), paused: z.boolean().optional() }).strict().optional(),
65
- loopback: z.object({ ports: z.array(z.number().int().min(1024).max(65535)).max(16).optional() }).strict().optional(),
66
- forceRelay: z.boolean().optional(),
67
- logLevel: z.enum(['debug', 'info', 'warn', 'error']).optional(),
68
- reconnect: reconnectSchema.optional(),
69
- codex: z.object({
70
- enabled: z.boolean().optional(),
71
- binary: z.string().trim().min(1).max(4096).optional(),
72
- }).strict().optional(),
73
- acp: z.object({ enabled: z.boolean().optional(), backends: z.array(z.object({ id: z.string().trim().regex(/^[a-z0-9][a-z0-9._-]{0,31}$/i), enabled: z.boolean().optional(), command: z.string().trim().min(1).max(4096).optional(), args: z.array(z.string().max(4096)).max(32).optional(), cwd: z.string().max(4096).optional() }).strict()).max(12).optional(), backend: z.string().trim().regex(/^[a-z0-9][a-z0-9._-]{0,31}$/i).optional(), command: z.string().trim().min(1).max(4096).optional(), args: z.array(z.string().max(4096)).max(32).optional(), cwd: z.string().max(4096).optional() }).strict().optional(),
74
- }).strict();
75
- export function resolveConfig(input = {}, env = process.env) {
76
- const parsed = configSchema.parse(input);
77
- const reconnect = typeof parsed.reconnect === 'object' ? parsed.reconnect : {};
78
- const configuredServerUrl = parsed.serverUrl ?? env.DSH_REMOTE_SERVER;
79
- const serverUrl = configuredServerUrl === undefined ? undefined : normalizeServerUrl(configuredServerUrl);
80
- const initialDelayMs = reconnect.initialDelayMs ?? 1_000;
81
- const maxDelayMs = reconnect.maxDelayMs ?? 30_000;
82
- if (maxDelayMs < initialDelayMs) {
83
- throw new TypeError('reconnect.maxDelayMs must be greater than or equal to reconnect.initialDelayMs');
84
- }
85
- return {
86
- enabled: parsed.enabled ?? true,
87
- role: parsed.role ?? 'host',
88
- ...(serverUrl === undefined ? {} : { serverUrl }),
89
- deviceName: parsed.deviceName ?? hostname(),
90
- // `paused` keeps this machine unreachable without releasing its credentials:
91
- // it must survive a restart, or "do not connect me" would quietly expire.
92
- hostControl: { enabled: parsed.hostControl?.enabled ?? true, paused: parsed.hostControl?.paused ?? false },
93
- terminal: { enabled: parsed.terminal?.enabled ?? (env.DSH_REMOTE_TERMINAL_ENABLED === undefined || env.DSH_REMOTE_TERMINAL_ENABLED === 'true') },
94
- loopback: { ports: [...new Set(parsed.loopback?.ports ?? [])] },
95
- forceRelay: parsed.forceRelay ?? false,
96
- logLevel: parsed.logLevel ?? 'info',
97
- reconnect: {
98
- enabled: parsed.reconnect !== false,
99
- initialDelayMs,
100
- maxDelayMs,
101
- jitter: reconnect.jitter ?? 0.2,
102
- },
103
- codex: {
104
- enabled: parsed.codex?.enabled ?? true,
105
- binary: parsed.codex?.binary ?? 'codex',
106
- },
107
- acp: { enabled: parsed.acp?.enabled ?? true, backends: [...new Set(['codex', 'cursor', 'kimi', ...(parsed.acp?.backends?.map(item => item.id) ?? [])])].map(id => { const d = parsed.acp?.backends?.find(x => x.id === id); const legacy = parsed.acp?.backend === id ? parsed.acp : undefined; return { id, enabled: d?.enabled ?? legacy?.enabled ?? true, command: d?.command ?? legacy?.command ?? { codex: 'codex', cursor: 'agent', kimi: 'kimi' }[id] ?? id, args: d?.args ?? legacy?.args ?? ['acp'], ...(d?.cwd ?? legacy?.cwd ? { cwd: d?.cwd ?? legacy?.cwd } : {}) }; }) },
108
- };
109
- }
110
- export function normalizeServerUrl(value) {
111
- const url = new URL(value);
112
- const local = url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.hostname === '::1';
113
- if (url.protocol !== 'https:' && !(local && url.protocol === 'http:')) {
114
- throw new TypeError('serverUrl must use HTTPS (HTTP is allowed only for localhost)');
115
- }
116
- if (url.username !== '' || url.password !== '') {
117
- throw new TypeError('serverUrl must not contain credentials');
118
- }
119
- if (url.search !== '' || url.hash !== '') {
120
- throw new TypeError('serverUrl must not contain query parameters or fragments');
121
- }
122
- if (url.pathname !== '' && url.pathname !== '/') {
123
- throw new TypeError('serverUrl must be an origin without a path');
124
- }
125
- return url.origin;
126
- }
127
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1,44 +0,0 @@
1
- import { type RemoteMessage } from '@dsh-remote/protocol';
2
- import type { IdentityStore } from './identity-store.js';
3
- import type { SafeLogger } from './logging.js';
4
- import type { RpcRouter } from './rpc-router.js';
5
- import type { AuthenticatedPeerChannel } from './types.js';
6
- export interface PeerConnectionContext {
7
- connectionId: string;
8
- peerDeviceId: string;
9
- }
10
- export interface ConnectedPeer {
11
- deviceId: string;
12
- mode?: 'LAN' | 'P2P' | 'TURN' | 'Relay';
13
- }
14
- export type RpcRouterFactory = (context: PeerConnectionContext, send: (message: RemoteMessage) => Promise<void>) => RpcRouter;
15
- export declare class ConnectionController {
16
- private readonly identities;
17
- private readonly createRouter;
18
- private readonly logger?;
19
- private readonly active;
20
- private acceptQueue;
21
- constructor(identities: IdentityStore, createRouter: RpcRouterFactory, logger?: SafeLogger | undefined);
22
- accept(channel: AuthenticatedPeerChannel): Promise<void>;
23
- private acceptOne;
24
- isOnline(): boolean;
25
- connectionCount(): number;
26
- peerDeviceIds(): string[];
27
- connectedPeers(): ConnectedPeer[];
28
- peerDeviceId(): string | undefined;
29
- connectionMode(): 'LAN' | 'P2P' | 'TURN' | 'Relay' | 'Disconnected';
30
- send(message: RemoteMessage): Promise<void>;
31
- revoke(deviceId: string): Promise<void>;
32
- closeConnection(connectionId: string, code?: string): Promise<boolean>;
33
- close(): Promise<void>;
34
- private handle;
35
- private sendTo;
36
- private sendConnection;
37
- private disconnect;
38
- private isActive;
39
- }
40
- export declare class ConnectionRejectedError extends Error {
41
- readonly code: string;
42
- constructor(code: string, message: string);
43
- }
44
- //# sourceMappingURL=connection-controller.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connection-controller.d.ts","sourceRoot":"","sources":["../src/connection-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAQ1D,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;CACxC;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC7B,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,KAC5C,SAAS,CAAA;AAEd,qBAAa,oBAAoB;IAK7B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAN1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,WAAW,CAAmC;gBAGnC,UAAU,EAAE,aAAa,EACzB,YAAY,EAAE,gBAAgB,EAC9B,MAAM,CAAC,EAAE,UAAU,YAAA;IAGtC,MAAM,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;YAM1C,SAAS;IAsDvB,QAAQ,IAAI,OAAO;IAEnB,eAAe,IAAI,MAAM;IAEzB,aAAa,IAAI,MAAM,EAAE;IAIzB,cAAc,IAAI,aAAa,EAAE;IAejC,YAAY,IAAI,MAAM,GAAG,SAAS;IAKlC,cAAc,IAAI,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,cAAc;IAK7D,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvC,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOtE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAKd,MAAM;YAwBN,MAAM;YAMN,cAAc;YAcd,UAAU;IAgBxB,OAAO,CAAC,QAAQ;CAGjB;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CACnD"}
@@ -1,185 +0,0 @@
1
- import { MAX_SECURE_MESSAGE_BYTES, createRpcError, encodeMessage, } from '@dsh-remote/protocol';
2
- export class ConnectionController {
3
- identities;
4
- createRouter;
5
- logger;
6
- active = new Map();
7
- acceptQueue = Promise.resolve();
8
- constructor(identities, createRouter, logger) {
9
- this.identities = identities;
10
- this.createRouter = createRouter;
11
- this.logger = logger;
12
- }
13
- accept(channel) {
14
- const operation = this.acceptQueue.then(() => this.acceptOne(channel));
15
- this.acceptQueue = operation.catch(() => undefined);
16
- return operation;
17
- }
18
- async acceptOne(channel) {
19
- if (channel.security?.protocol !== 'Noise_IK_25519_ChaChaPoly_SHA256'
20
- || channel.security.connectionId === ''
21
- || channel.security.membershipId === '') {
22
- await channel.close('SECURE_CHANNEL_FAILED');
23
- throw new ConnectionRejectedError('SECURE_CHANNEL_FAILED', 'The channel is missing its authenticated Noise or membership context.');
24
- }
25
- if (!this.identities.isTrusted(channel.peerDeviceId, channel.peerIdentityKey)) {
26
- await channel.close('PEER_IDENTITY_MISMATCH');
27
- throw new ConnectionRejectedError('PEER_IDENTITY_MISMATCH', 'The peer identity does not match local trust.');
28
- }
29
- const connectionId = channel.security.connectionId;
30
- const connectionConflict = this.active.get(connectionId);
31
- if (connectionConflict !== undefined && connectionConflict.channel.peerDeviceId !== channel.peerDeviceId) {
32
- await channel.close('SECURE_CHANNEL_FAILED');
33
- throw new ConnectionRejectedError('SECURE_CHANNEL_FAILED', 'The connection id is already bound to another peer.');
34
- }
35
- const replaced = [...this.active.values()].filter(connection => (connection.channel.peerDeviceId === channel.peerDeviceId
36
- || connection.channel.security.connectionId === connectionId));
37
- if (replaced.length > 0) {
38
- this.logger?.warn('replacing active peer connection', {
39
- peerDeviceId: shortId(channel.peerDeviceId),
40
- replacedCount: replaced.length,
41
- replacedPeerDeviceIds: replaced.map(connection => shortId(connection.channel.peerDeviceId)),
42
- });
43
- }
44
- await Promise.all(replaced.map(connection => this.disconnect(connection, 'CONNECTION_REPLACED')));
45
- const router = this.createRouter({ connectionId, peerDeviceId: channel.peerDeviceId }, message => this.sendTo(connectionId, channel, message));
46
- const connection = {
47
- channel,
48
- router,
49
- unsubscribe: () => undefined,
50
- };
51
- this.active.set(connectionId, connection);
52
- try {
53
- connection.unsubscribe = channel.onMessage(message => { void this.handle(connection, message); });
54
- }
55
- catch (error) {
56
- await this.disconnect(connection);
57
- throw error;
58
- }
59
- this.logger?.info('peer connection accepted', {
60
- peerDeviceId: shortId(channel.peerDeviceId),
61
- connectionId: shortId(connectionId),
62
- mode: channel.mode,
63
- });
64
- }
65
- isOnline() { return this.active.size > 0; }
66
- connectionCount() { return this.active.size; }
67
- peerDeviceIds() {
68
- return this.connectedPeers().map(peer => peer.deviceId);
69
- }
70
- connectedPeers() {
71
- const peers = [];
72
- const seen = new Set();
73
- for (const connection of this.active.values()) {
74
- const deviceId = connection.channel.peerDeviceId;
75
- if (seen.has(deviceId))
76
- continue;
77
- seen.add(deviceId);
78
- peers.push({
79
- deviceId,
80
- ...(connection.channel.mode === undefined ? {} : { mode: connection.channel.mode }),
81
- });
82
- }
83
- return peers;
84
- }
85
- peerDeviceId() {
86
- const peers = this.peerDeviceIds();
87
- return peers.length === 1 ? peers[0] : undefined;
88
- }
89
- connectionMode() {
90
- const connection = this.active.values().next().value;
91
- return connection?.channel.mode ?? (connection === undefined ? 'Disconnected' : 'Relay');
92
- }
93
- async send(message) {
94
- await Promise.all([...this.active.values()].map(connection => this.sendConnection(connection, message)));
95
- }
96
- async revoke(deviceId) {
97
- const revoked = [...this.active.values()].filter(connection => connection.channel.peerDeviceId === deviceId);
98
- await Promise.all(revoked.map(connection => this.disconnect(connection, 'DEVICE_REVOKED')));
99
- }
100
- async closeConnection(connectionId, code) {
101
- const connection = this.active.get(connectionId);
102
- if (connection === undefined)
103
- return false;
104
- await this.disconnect(connection, code);
105
- return true;
106
- }
107
- async close() {
108
- await this.acceptQueue;
109
- await Promise.all([...this.active.values()].map(connection => this.disconnect(connection)));
110
- }
111
- async handle(connection, message) {
112
- if (!this.isActive(connection))
113
- return;
114
- try {
115
- const response = await connection.router.handle(message);
116
- if (!this.isActive(connection))
117
- return;
118
- const outbound = encodeMessage(response).byteLength <= MAX_SECURE_MESSAGE_BYTES
119
- ? response
120
- : createRpcError(message.id, 'RESPONSE_TOO_LARGE', 'The Host response is too large for the secure Remote channel. Request a smaller page.', { maxBytes: MAX_SECURE_MESSAGE_BYTES }, true);
121
- await connection.channel.send(outbound);
122
- }
123
- catch (error) {
124
- this.logger?.warn('peer message handling failed; disconnecting', {
125
- peerDeviceId: shortId(connection.channel.peerDeviceId),
126
- reason: diagnosticReason(error),
127
- });
128
- await this.disconnect(connection);
129
- }
130
- }
131
- async sendTo(connectionId, channel, message) {
132
- const connection = this.active.get(connectionId);
133
- if (connection === undefined || connection.channel !== channel)
134
- return;
135
- await this.sendConnection(connection, message);
136
- }
137
- async sendConnection(connection, message) {
138
- if (!this.isActive(connection))
139
- return;
140
- try {
141
- await connection.channel.send(message);
142
- }
143
- catch (error) {
144
- this.logger?.warn('peer send failed; disconnecting', {
145
- peerDeviceId: shortId(connection.channel.peerDeviceId),
146
- messageType: message.type,
147
- reason: diagnosticReason(error),
148
- });
149
- await this.disconnect(connection);
150
- }
151
- }
152
- async disconnect(connection, code) {
153
- if (!this.isActive(connection))
154
- return;
155
- this.active.delete(connection.channel.security.connectionId);
156
- connection.unsubscribe();
157
- try {
158
- await connection.router.closePeerStreams();
159
- }
160
- finally {
161
- await connection.channel.close(code);
162
- }
163
- this.logger?.info('peer connection disconnected', {
164
- peerDeviceId: shortId(connection.channel.peerDeviceId),
165
- connectionId: shortId(connection.channel.security.connectionId),
166
- code: code ?? 'closed',
167
- });
168
- }
169
- isActive(connection) {
170
- return this.active.get(connection.channel.security.connectionId) === connection;
171
- }
172
- }
173
- export class ConnectionRejectedError extends Error {
174
- code;
175
- constructor(code, message) {
176
- super(message);
177
- this.code = code;
178
- }
179
- }
180
- function diagnosticReason(error) {
181
- const message = error instanceof Error ? error.message : String(error);
182
- return message.replace(/[\r\n]+/g, ' ').slice(0, 160) || 'Unknown peer connection failure.';
183
- }
184
- function shortId(value) { return value.length <= 12 ? value : `${value.slice(0, 8)}…${value.slice(-4)}`; }
185
- //# sourceMappingURL=connection-controller.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connection-controller.js","sourceRoot":"","sources":["../src/connection-controller.ts"],"names":[],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- import type { IncomingHttpHeaders, IncomingMessage, ServerResponse } from 'node:http';
2
- import type { RpcResult } from '@deepseek-ai/dsh-host-apiproxy/api';
3
- /** Namespaced loopback RPC prefix shared by the Host runtime and browser UI. */
4
- export declare const CONTROL_RPC_PREFIX = "/ds-harness-remote";
5
- /** Loopback control endpoint carrying the status event stream. */
6
- export declare const STATUS_STREAM_ENDPOINT = "status.events";
7
- /** Full URL path of the loopback status event stream. */
8
- export declare const STATUS_STREAM_PATH = "/ds-harness-remote/status.events";
9
- interface HostConnectionHandleLike {
10
- requestRejection?(request: {
11
- headers: IncomingHttpHeaders;
12
- }): number | undefined;
13
- rpc: {
14
- handle(channel: string, handler: ControlRouteHandler, options: {
15
- authority: 'loopback' | 'trusted-host';
16
- }): () => Promise<void>;
17
- };
18
- }
19
- export interface HostWebServerLike {
20
- register(route: {
21
- kind: 'prefix';
22
- path: string;
23
- handler(req: IncomingMessage, res: ServerResponse): void | Promise<void>;
24
- }): () => void | Promise<void>;
25
- }
26
- export type ControlRouteHandler = (endpoint: string, payload: unknown, signal: AbortSignal) => Promise<RpcResult<unknown>>;
27
- /** Long-lived loopback response owner for the status event stream. */
28
- export interface ControlStatusStreamLike {
29
- handle(response: ServerResponse): Promise<void>;
30
- close(): void;
31
- }
32
- export declare function registerControlRoute(connection: HostConnectionHandleLike, handler: ControlRouteHandler, webServer?: HostWebServerLike, statusStream?: ControlStatusStreamLike): () => Promise<void>;
33
- export {};
34
- //# sourceMappingURL=control-route.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"control-route.d.ts","sourceRoot":"","sources":["../src/control-route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AAEnE,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,uBAAuB,CAAA;AAEtD,kEAAkE;AAClE,eAAO,MAAM,sBAAsB,kBAAkB,CAAA;AAErD,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,qCAAoD,CAAA;AAKnF,UAAU,wBAAwB;IAChC,gBAAgB,CAAC,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,mBAAmB,CAAA;KAAE,GAAG,MAAM,GAAG,SAAS,CAAA;IAChF,GAAG,EAAE;QACH,MAAM,CACJ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE;YAAE,SAAS,EAAE,UAAU,GAAG,cAAc,CAAA;SAAE,GAClD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KACvB,CAAA;CACF;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE;QACd,IAAI,EAAE,QAAQ,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KACzE,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/B;AAED,MAAM,MAAM,mBAAmB,GAAG,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;AAEhC,sEAAsE;AACtE,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/C,KAAK,IAAI,IAAI,CAAA;CACd;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,wBAAwB,EACpC,OAAO,EAAE,mBAAmB,EAC5B,SAAS,CAAC,EAAE,iBAAiB,EAC7B,YAAY,CAAC,EAAE,uBAAuB,GACrC,MAAM,OAAO,CAAC,IAAI,CAAC,CAkBrB"}
@@ -1,136 +0,0 @@
1
- /** Namespaced loopback RPC prefix shared by the Host runtime and browser UI. */
2
- export const CONTROL_RPC_PREFIX = '/ds-harness-remote';
3
- /** Loopback control endpoint carrying the status event stream. */
4
- export const STATUS_STREAM_ENDPOINT = 'status.events';
5
- /** Full URL path of the loopback status event stream. */
6
- export const STATUS_STREAM_PATH = `${CONTROL_RPC_PREFIX}/${STATUS_STREAM_ENDPOINT}`;
7
- const ENDPOINT_SEGMENT_PATTERN = /^[A-Za-z0-9_$.-]+$/;
8
- const INVALID_REQUEST_RPC_ID = 'invalid-request';
9
- export function registerControlRoute(connection, handler, webServer, statusStream) {
10
- if (webServer !== undefined && connection.requestRejection !== undefined) {
11
- const dispose = webServer.register({
12
- kind: 'prefix',
13
- path: CONTROL_RPC_PREFIX,
14
- handler: (req, res) => handleControlRequest(connection, handler, req, res, statusStream),
15
- });
16
- return async () => {
17
- statusStream?.close();
18
- await dispose();
19
- };
20
- }
21
- // A plain RPC channel owns POST only, so the browser falls back to unary
22
- // status reads on hosts that do not expose the Web server route.
23
- return connection.rpc.handle(CONTROL_RPC_PREFIX, handler, {
24
- authority: 'loopback',
25
- });
26
- }
27
- async function handleControlRequest(connection, handler, req, res, statusStream) {
28
- const rejection = connection.requestRejection?.(req);
29
- if (rejection !== undefined) {
30
- res.writeHead(rejection);
31
- res.end(rejection === 401 ? 'unauthorized' : 'forbidden');
32
- return;
33
- }
34
- const endpoint = endpointFromPath(CONTROL_RPC_PREFIX, new URL(req.url ?? '/', 'http://dsh.internal').pathname);
35
- if (req.method === 'GET' && endpoint === STATUS_STREAM_ENDPOINT && statusStream !== undefined) {
36
- await statusStream.handle(res);
37
- return;
38
- }
39
- if (req.method !== 'POST' || endpoint === undefined) {
40
- writeText(res, 404, 'not found');
41
- return;
42
- }
43
- if (contentType(req.headers) !== 'application/json') {
44
- writeText(res, 415, 'content type must be application/json');
45
- return;
46
- }
47
- let body;
48
- try {
49
- body = await readJsonBody(req);
50
- }
51
- catch {
52
- writeText(res, 400, 'body is not JSON');
53
- return;
54
- }
55
- const message = clientRequest(body);
56
- if (message === undefined) {
57
- writeJson(res, 200, errorResponse(rpcId(body), {
58
- code: 'gateway/bad-request',
59
- message: 'invalid client-request message',
60
- details: { issues: [] },
61
- }));
62
- return;
63
- }
64
- if (message.method !== endpoint) {
65
- writeJson(res, 200, errorResponse(message.rpcId, {
66
- code: 'gateway/bad-request',
67
- message: `method ${JSON.stringify(message.method)} does not match endpoint ${JSON.stringify(endpoint)}`,
68
- details: { issues: [] },
69
- }));
70
- return;
71
- }
72
- try {
73
- const result = await handler(endpoint, message.payload, requestSignal(req));
74
- writeJson(res, 200, fullResponse(message.rpcId, result));
75
- }
76
- catch (error) {
77
- writeText(res, 500, `handler failure: ${String(error)}`);
78
- }
79
- }
80
- function endpointFromPath(channel, pathname) {
81
- if (!pathname.startsWith(`${channel}/`))
82
- return undefined;
83
- const endpoint = pathname.slice(channel.length + 1);
84
- if (endpoint.split('/').some(segment => segment === '' || segment === '.' || segment === '..' || !ENDPOINT_SEGMENT_PATTERN.test(segment))) {
85
- return undefined;
86
- }
87
- return endpoint;
88
- }
89
- function contentType(headers) {
90
- const raw = headers['content-type'];
91
- const value = Array.isArray(raw) ? raw[0] : raw;
92
- return value?.split(';', 1)[0]?.trim().toLowerCase();
93
- }
94
- async function readJsonBody(req) {
95
- const chunks = [];
96
- for await (const chunk of req)
97
- chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
98
- return JSON.parse(Buffer.concat(chunks).toString('utf8'));
99
- }
100
- function requestSignal(req) {
101
- const abort = new AbortController();
102
- req.on('close', () => {
103
- if (!req.complete)
104
- abort.abort();
105
- });
106
- return abort.signal;
107
- }
108
- function clientRequest(value) {
109
- if (typeof value !== 'object' || value === null || Array.isArray(value))
110
- return undefined;
111
- const record = value;
112
- if (record.type !== 'client-request' || typeof record.rpcId !== 'string' || typeof record.method !== 'string')
113
- return undefined;
114
- return { type: 'client-request', rpcId: record.rpcId, method: record.method, payload: record.payload };
115
- }
116
- function rpcId(value) {
117
- if (typeof value !== 'object' || value === null || Array.isArray(value))
118
- return INVALID_REQUEST_RPC_ID;
119
- const record = value;
120
- return typeof record.rpcId === 'string' ? record.rpcId : INVALID_REQUEST_RPC_ID;
121
- }
122
- function errorResponse(rpcId, error) {
123
- return fullResponse(rpcId, { ok: false, error });
124
- }
125
- function fullResponse(rpcId, result) {
126
- return { type: 'server-response', rpcId, result };
127
- }
128
- function writeJson(res, status, body) {
129
- res.writeHead(status, { 'content-type': 'application/json' });
130
- res.end(JSON.stringify(body));
131
- }
132
- function writeText(res, status, body) {
133
- res.writeHead(status);
134
- res.end(body);
135
- }
136
- //# sourceMappingURL=control-route.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"control-route.js","sourceRoot":"","sources":["../src/control-route.ts"],"names":[],"mappings":"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"}