@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
@@ -0,0 +1,95 @@
1
+ import { readFile, realpath as realpathEntrypoint } from 'node:fs/promises';
2
+ import { createRequire } from 'node:module';
3
+ import { dirname, isAbsolute, join } from 'node:path';
4
+ const LEGACY_PLACEHOLDER_VERSION = '0.0.1';
5
+ const HARNESS_PACKAGE_NAME = '@deepseek-ai/dsh';
6
+ export function normalizeHarnessVersion(value) {
7
+ if (typeof value !== 'string')
8
+ return undefined;
9
+ const version = value.trim();
10
+ if (version.length === 0 || version.length > 64 || /[\u0000-\u001f]/u.test(version))
11
+ return undefined;
12
+ return version;
13
+ }
14
+ export function selectHarnessVersion(reportedVersion, distributionVersion) {
15
+ if (reportedVersion !== undefined && reportedVersion !== LEGACY_PLACEHOLDER_VERSION)
16
+ return reportedVersion;
17
+ return distributionVersion;
18
+ }
19
+ /**
20
+ * Select the Typert Session wire generation used by supported DSH builds.
21
+ * Unknown builds stay on the established v0.1.2 profile; package peer ranges
22
+ * prevent them from being presented as supported installations.
23
+ */
24
+ export function harnessSessionGeneration(version) {
25
+ if (version === undefined)
26
+ return 'legacy';
27
+ const match = /^(?:dsh-)?v?(\d+)\.(\d+)\.(\d+)(?:-|$)/u.exec(version.trim());
28
+ if (match === null)
29
+ return 'legacy';
30
+ const major = Number(match[1]);
31
+ const minor = Number(match[2]);
32
+ const patch = Number(match[3]);
33
+ // 0.2.0 retains the existing Remote carrier; its on-disk format is unrelated.
34
+ return major === 0 && ((minor === 1 && patch >= 5) || minor === 2) ? 'v3' : 'legacy';
35
+ }
36
+ /** Read a candidate manifest, ignoring every package that is not the Harness CLI. */
37
+ async function readHarnessManifestVersion(manifestPath) {
38
+ try {
39
+ const manifest = JSON.parse(await readFile(manifestPath, 'utf8'));
40
+ if (manifest.name !== HARNESS_PACKAGE_NAME)
41
+ return undefined;
42
+ return normalizeHarnessVersion(manifest.version);
43
+ }
44
+ catch {
45
+ // Missing or malformed manifests simply mean this candidate does not hold the Harness package.
46
+ return undefined;
47
+ }
48
+ }
49
+ /**
50
+ * Compatibility fallback for Harness builds whose host.describe still returns
51
+ * the historical 0.0.1 placeholder.
52
+ *
53
+ * Both supported entrypoint layouts must be covered. A CLI/dsh-TUI entrypoint
54
+ * sits below the @deepseek-ai/dsh package root, so only its ancestor chain is
55
+ * worth walking. The 0.2.0 Desktop shell instead launches its own
56
+ * `@deepseek-ai/dsh-desktop-host` entrypoint from inside `app.asar`, where the
57
+ * ancestors carry only the desktop shell and runtime manifests while the
58
+ * Harness CLI package is a sibling; resolve that package through the
59
+ * entrypoint's module scope.
60
+ */
61
+ export async function readHarnessDistributionVersion(entrypoint = process.argv[1]) {
62
+ if (entrypoint === undefined || !isAbsolute(entrypoint))
63
+ return undefined;
64
+ // Global npm installs expose the CLI through a bin symlink. Resolve it before
65
+ // walking ancestors; otherwise `.../bin/dsh` never reaches the
66
+ // `@deepseek-ai/dsh` package manifest and the CLI Host reports no version.
67
+ let resolvedEntrypoint = entrypoint;
68
+ try {
69
+ resolvedEntrypoint = await realpathEntrypoint(entrypoint);
70
+ }
71
+ catch {
72
+ // Keep the original path for Desktop/app.asar and other virtual entries
73
+ // where the filesystem cannot resolve a real path.
74
+ }
75
+ if (!isAbsolute(resolvedEntrypoint))
76
+ return undefined;
77
+ let directory = dirname(resolvedEntrypoint);
78
+ for (let depth = 0; depth < 8; depth += 1) {
79
+ const version = await readHarnessManifestVersion(join(directory, 'package.json'));
80
+ if (version !== undefined)
81
+ return version;
82
+ const parent = dirname(directory);
83
+ if (parent === directory)
84
+ break;
85
+ directory = parent;
86
+ }
87
+ try {
88
+ return await readHarnessManifestVersion(createRequire(resolvedEntrypoint).resolve(`${HARNESS_PACKAGE_NAME}/package.json`));
89
+ }
90
+ catch {
91
+ // The entrypoint may not be a module path that can reach the Harness CLI package.
92
+ return undefined;
93
+ }
94
+ }
95
+ //# sourceMappingURL=harness-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-version.js","sourceRoot":"","sources":["../src/harness-version.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export interface HostIdentity {
2
+ schemaVersion: 1;
3
+ deviceId: string;
4
+ name: string;
5
+ publicKey: string;
6
+ privateKey: string;
7
+ fingerprint: string;
8
+ }
9
+ export interface TrustedPeer {
10
+ deviceId: string;
11
+ name: string;
12
+ platform: string;
13
+ publicKey: string;
14
+ fingerprint: string;
15
+ trustedAt: number;
16
+ membershipId?: string;
17
+ }
18
+ export interface IdentityStoreOptions {
19
+ directory?: string;
20
+ env?: NodeJS.ProcessEnv;
21
+ homeDirectory?: string;
22
+ }
23
+ export type RemoteDeviceRole = 'host' | 'client';
24
+ export declare class IdentityInvalidError extends Error {
25
+ readonly code = "IDENTITY_INVALID";
26
+ }
27
+ export declare class IdentityStore {
28
+ readonly directory: string;
29
+ private identity?;
30
+ private peers;
31
+ constructor(options?: IdentityStoreOptions);
32
+ loadOrCreate(deviceName: string): Promise<HostIdentity>;
33
+ current(): HostIdentity;
34
+ reset(deviceName: string): Promise<HostIdentity>;
35
+ listTrustedPeers(): TrustedPeer[];
36
+ trustedPeer(deviceId: string): TrustedPeer | undefined;
37
+ isTrusted(deviceId: string, publicKey: string): boolean;
38
+ trustPeer(input: Omit<TrustedPeer, 'fingerprint' | 'trustedAt'>): Promise<TrustedPeer>;
39
+ revokePeer(deviceId: string): Promise<boolean>;
40
+ private loadPeers;
41
+ private savePeers;
42
+ }
43
+ export declare function serverStorageDirectory(root: string, serverUrl: string, role: RemoteDeviceRole): string;
44
+ export declare function fingerprint(publicKey: string): string;
45
+ //# sourceMappingURL=identity-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-store.d.ts","sourceRoot":"","sources":["../src/identity-store.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,CAAC,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEhD,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,sBAAqB;CACnC;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,OAAO,CAAC,QAAQ,CAAC,CAAc;IAC/B,OAAO,CAAC,KAAK,CAAiC;gBAElC,OAAO,GAAE,oBAAyB;IAMxC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAsC7D,OAAO,IAAI,YAAY;IAKjB,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAOtD,gBAAgB,IAAI,WAAW,EAAE;IAIjC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAKtD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAIjD,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,aAAa,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAYtF,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAMtC,SAAS;YAiBT,SAAS;CAMxB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAItG;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGrD"}
@@ -0,0 +1,183 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { chmod, mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
4
+ import { dirname, join } from 'node:path';
5
+ import { fromBase64Url, generateKeyPair } from '@dsh-remote/crypto';
6
+ import { z } from 'zod';
7
+ import { uuidV7 } from './ids.js';
8
+ const identitySchema = z.object({
9
+ schemaVersion: z.literal(1),
10
+ deviceId: z.string().uuid(),
11
+ name: z.string().min(1).max(80),
12
+ publicKey: z.string().min(1),
13
+ }).strict();
14
+ const trustedPeerSchema = z.object({
15
+ deviceId: z.string().min(1),
16
+ name: z.string().min(1).max(80),
17
+ platform: z.string().min(1).max(40),
18
+ publicKey: z.string().min(1),
19
+ fingerprint: z.string().min(1),
20
+ trustedAt: z.number().int().nonnegative(),
21
+ membershipId: z.string().min(1).optional(),
22
+ }).strict();
23
+ const trustedPeersSchema = z.object({
24
+ schemaVersion: z.literal(1),
25
+ peers: z.array(trustedPeerSchema),
26
+ }).strict();
27
+ export class IdentityInvalidError extends Error {
28
+ code = 'IDENTITY_INVALID';
29
+ }
30
+ export class IdentityStore {
31
+ directory;
32
+ identity;
33
+ peers = new Map();
34
+ constructor(options = {}) {
35
+ const env = options.env ?? process.env;
36
+ const dshHome = env.DSH_HOME || join(options.homeDirectory ?? homedir(), '.dsh');
37
+ this.directory = options.directory ?? join(dshHome, 'remote');
38
+ }
39
+ async loadOrCreate(deviceName) {
40
+ await mkdir(this.directory, { recursive: true, mode: 0o700 });
41
+ await chmod(this.directory, 0o700);
42
+ const devicePath = join(this.directory, 'device.json');
43
+ const keyPath = join(this.directory, 'device.key');
44
+ const [hasDevice, hasKey] = await Promise.all([exists(devicePath), exists(keyPath)]);
45
+ if (hasDevice !== hasKey) {
46
+ throw new IdentityInvalidError('device identity is incomplete; repair it explicitly before reconnecting');
47
+ }
48
+ if (!hasDevice) {
49
+ const keys = generateKeyPair();
50
+ const record = { schemaVersion: 1, deviceId: uuidV7(), name: deviceName, publicKey: keys.publicKey };
51
+ await atomicJsonWrite(devicePath, record, 0o600);
52
+ await atomicTextWrite(keyPath, `${keys.privateKey}\n`, 0o600);
53
+ }
54
+ await assertPrivateMode(keyPath);
55
+ try {
56
+ let record = identitySchema.parse(JSON.parse(await readFile(devicePath, 'utf8')));
57
+ const privateKey = (await readFile(keyPath, 'utf8')).trim();
58
+ const regenerated = generateKeyPair(fromBase64Url(privateKey));
59
+ if (regenerated.publicKey !== record.publicKey) {
60
+ throw new IdentityInvalidError('device public and private keys do not match');
61
+ }
62
+ if (record.name !== deviceName) {
63
+ record = { ...record, name: deviceName };
64
+ await atomicJsonWrite(devicePath, record, 0o600);
65
+ }
66
+ this.identity = { ...record, privateKey, fingerprint: fingerprint(record.publicKey) };
67
+ await this.loadPeers();
68
+ return this.identity;
69
+ }
70
+ catch (error) {
71
+ if (error instanceof IdentityInvalidError)
72
+ throw error;
73
+ throw new IdentityInvalidError(`device identity is invalid: ${safeErrorMessage(error)}`);
74
+ }
75
+ }
76
+ current() {
77
+ if (this.identity === undefined)
78
+ throw new Error('identity store has not been loaded');
79
+ return this.identity;
80
+ }
81
+ async reset(deviceName) {
82
+ await rm(this.directory, { recursive: true, force: true });
83
+ this.identity = undefined;
84
+ this.peers.clear();
85
+ return this.loadOrCreate(deviceName);
86
+ }
87
+ listTrustedPeers() {
88
+ return [...this.peers.values()].map(peer => ({ ...peer }));
89
+ }
90
+ trustedPeer(deviceId) {
91
+ const peer = this.peers.get(deviceId);
92
+ return peer === undefined ? undefined : { ...peer };
93
+ }
94
+ isTrusted(deviceId, publicKey) {
95
+ return this.peers.get(deviceId)?.publicKey === publicKey;
96
+ }
97
+ async trustPeer(input) {
98
+ this.current();
99
+ const peer = {
100
+ ...input,
101
+ fingerprint: fingerprint(input.publicKey),
102
+ trustedAt: Date.now(),
103
+ };
104
+ this.peers.set(peer.deviceId, peer);
105
+ await this.savePeers();
106
+ return { ...peer };
107
+ }
108
+ async revokePeer(deviceId) {
109
+ const removed = this.peers.delete(deviceId);
110
+ if (removed)
111
+ await this.savePeers();
112
+ return removed;
113
+ }
114
+ async loadPeers() {
115
+ const path = join(this.directory, 'trusted-peers.json');
116
+ if (!(await exists(path))) {
117
+ await atomicJsonWrite(path, { schemaVersion: 1, peers: [] }, 0o600);
118
+ }
119
+ const parsed = trustedPeersSchema.parse(JSON.parse(await readFile(path, 'utf8')));
120
+ const peers = new Map();
121
+ for (const peer of parsed.peers) {
122
+ if (peer.fingerprint !== fingerprint(peer.publicKey)) {
123
+ throw new IdentityInvalidError(`trusted peer ${peer.deviceId} has an invalid fingerprint`);
124
+ }
125
+ if (peers.has(peer.deviceId))
126
+ throw new IdentityInvalidError(`trusted peer ${peer.deviceId} is duplicated`);
127
+ peers.set(peer.deviceId, peer);
128
+ }
129
+ this.peers = peers;
130
+ }
131
+ async savePeers() {
132
+ await atomicJsonWrite(join(this.directory, 'trusted-peers.json'), {
133
+ schemaVersion: 1,
134
+ peers: [...this.peers.values()],
135
+ }, 0o600);
136
+ }
137
+ }
138
+ export function serverStorageDirectory(root, serverUrl, role) {
139
+ const origin = new URL(serverUrl).origin;
140
+ const scope = createHash('sha256').update(origin).digest('hex').slice(0, 24);
141
+ return join(root, 'servers', scope, role);
142
+ }
143
+ export function fingerprint(publicKey) {
144
+ const compact = createHash('sha256').update(fromBase64Url(publicKey)).digest('hex').slice(0, 12).toUpperCase();
145
+ return compact.match(/.{1,4}/g).join(' ');
146
+ }
147
+ async function assertPrivateMode(path) {
148
+ if (process.platform === 'win32')
149
+ return;
150
+ const mode = (await stat(path)).mode & 0o777;
151
+ if ((mode & 0o077) !== 0) {
152
+ throw new IdentityInvalidError(`private key permissions must be 0600, got ${mode.toString(8).padStart(3, '0')}`);
153
+ }
154
+ }
155
+ async function atomicJsonWrite(path, value, mode) {
156
+ await atomicTextWrite(path, `${JSON.stringify(value, null, 2)}\n`, mode);
157
+ }
158
+ async function atomicTextWrite(path, value, mode) {
159
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
160
+ const temporary = `${path}.${process.pid}.${uuidV7()}.tmp`;
161
+ await writeFile(temporary, value, { encoding: 'utf8', mode, flag: 'wx' });
162
+ await chmod(temporary, mode);
163
+ await rename(temporary, path);
164
+ await chmod(path, mode);
165
+ }
166
+ async function exists(path) {
167
+ try {
168
+ await stat(path);
169
+ return true;
170
+ }
171
+ catch (error) {
172
+ if (isNodeError(error) && error.code === 'ENOENT')
173
+ return false;
174
+ throw error;
175
+ }
176
+ }
177
+ function isNodeError(error) {
178
+ return error instanceof Error && 'code' in error;
179
+ }
180
+ function safeErrorMessage(error) {
181
+ return error instanceof Error ? error.message : 'invalid identity data';
182
+ }
183
+ //# sourceMappingURL=identity-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-store.js","sourceRoot":"","sources":["../src/identity-store.ts"],"names":[],"mappings":"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"}
package/dist/ids.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function uuidV7(now?: number): string;
2
+ //# sourceMappingURL=ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../src/ids.ts"],"names":[],"mappings":"AAEA,wBAAgB,MAAM,CAAC,GAAG,SAAa,GAAG,MAAM,CAc/C"}
package/dist/ids.js ADDED
@@ -0,0 +1,17 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ export function uuidV7(now = Date.now()) {
3
+ if (!Number.isSafeInteger(now) || now < 0 || now > 0xffffffffffff) {
4
+ throw new RangeError('UUIDv7 timestamp must be a non-negative 48-bit integer');
5
+ }
6
+ const bytes = randomBytes(16);
7
+ let timestamp = BigInt(now);
8
+ for (let index = 5; index >= 0; index -= 1) {
9
+ bytes[index] = Number(timestamp & 0xffn);
10
+ timestamp >>= 8n;
11
+ }
12
+ bytes[6] = 0x70 | (bytes[6] & 0x0f);
13
+ bytes[8] = 0x80 | (bytes[8] & 0x3f);
14
+ const hex = bytes.toString('hex');
15
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
16
+ }
17
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.js","sourceRoot":"","sources":["../src/ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,UAAU,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACrC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,cAAc,EAAE,CAAC;QAClE,MAAM,IAAI,UAAU,CAAC,wDAAwD,CAAC,CAAA;IAChF,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAC7B,IAAI,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,CAAA;QACxC,SAAS,KAAK,EAAE,CAAA;IAClB,CAAC;IACD,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,CAAA;IACpC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,CAAA;IACpC,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACjC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAA;AAC5G,CAAC"}
@@ -0,0 +1,78 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import { ClientModeRuntime } from './client-runtime.js';
3
+ import { Config, type Config as ConfigShape, type ConfigInput, type EntryConfig } from './config.js';
4
+ import { HostPluginRuntime } from './service.js';
5
+ import type { TypertGatewayLike } from './typert-gateway-contract.js';
6
+ declare module '@deepseek-ai/cordis' {
7
+ interface Context {
8
+ dshRemote: HostPluginRuntime;
9
+ dshRemoteClient: ClientModeRuntime;
10
+ typertGateway: TypertGatewayLike;
11
+ }
12
+ }
13
+ export declare const name = "ds-harness-remote";
14
+ export { Config };
15
+ /**
16
+ * ≤0.1.6 settings registry seam (removed by DSH 0.1.7-rc.1, DSH-0.1.7-RC1-04).
17
+ * Kept structural so the plugin can still activate on the registry generation
18
+ * while `ctx.settings` types only describe the rc.1 `SettingsForms` face.
19
+ */
20
+ interface LegacySettingsScopeLike {
21
+ get(): ConfigInput;
22
+ replace(section: Config): Promise<unknown>;
23
+ }
24
+ interface LegacySettingsProviderLike {
25
+ register(ns: string, schema: unknown, options: {
26
+ base?: ConfigInput;
27
+ applies?: 'live' | 'restart';
28
+ validate?: (value: ConfigInput) => void;
29
+ }): LegacySettingsScopeLike;
30
+ describe?(): Array<{
31
+ ns: string;
32
+ user?: unknown;
33
+ }>;
34
+ }
35
+ export declare function apply(ctx: Context, entry?: EntryConfig | ConfigShape | undefined): void;
36
+ /**
37
+ * Preserve existing installs after the package/settings namespace rename. The
38
+ * old section remains untouched as a rollback source; only its raw user layer
39
+ * is copied, once, when the current namespace has no user layer of its own.
40
+ * Only reachable on the ≤0.1.6 registry generation.
41
+ */
42
+ export declare function migrateLegacySettings(settings: LegacySettingsProviderLike, currentScope: LegacySettingsScopeLike): Promise<'migrated' | 'skipped' | 'failed'>;
43
+ export type { ResolvedConfig } from './config.js';
44
+ export { resolveConfig } from './config.js';
45
+ export { ConnectionController, ConnectionRejectedError } from './connection-controller.js';
46
+ export type { PeerConnectionContext, RpcRouterFactory } from './connection-controller.js';
47
+ export { fingerprint, IdentityInvalidError, IdentityStore } from './identity-store.js';
48
+ export { serverStorageDirectory } from './identity-store.js';
49
+ export type { HostIdentity, RemoteDeviceRole, TrustedPeer } from './identity-store.js';
50
+ export { ClientServerApi, HostServerApi, ServerApiError } from './server-api.js';
51
+ export { HostServerConnection } from './server-connection.js';
52
+ export type { WebSocketFactory } from './server-connection.js';
53
+ export { ServerCredentialStore, ServerCredentialsInvalidError } from './server-credentials.js';
54
+ export type { ServerCredentials } from './server-credentials.js';
55
+ export { HOST_CAPABILITIES, RpcError, RpcRouter } from './rpc-router.js';
56
+ export { HostPluginRuntime } from './service.js';
57
+ export { ApiProxySwitch } from './api-proxy-switch.js';
58
+ export { ClientModeError, ClientModeRuntime } from './client-runtime.js';
59
+ export { PluginControlRuntime } from './control-runtime.js';
60
+ export { ClientSecureTransport } from './client-secure-transport.js';
61
+ export { HARNESS_API_ALLOWLIST, HarnessApiBridge } from './harness-api-bridge.js';
62
+ export { HARNESS_REMOTE_ALLOWLIST, HarnessRemoteBridge } from './harness-remote-bridge.js';
63
+ export { RemoteHarnessApiProxy } from './remote-api-proxy.js';
64
+ export { RemoteTypertGateway } from './remote-typert-gateway.js';
65
+ export { RemoteFileViewerBridge } from './file-viewer-bridge.js';
66
+ export { CodexRemoteDomain } from './codex/domain.js';
67
+ export { CodexPeerBridge } from './codex/peer-bridge.js';
68
+ export { CodexAppServerClient, CodexAppServerError } from './codex/app-server.js';
69
+ export { CODEX_APP_ALLOWLIST } from './codex/method-policy.js';
70
+ export { createRemoteFileContentProvider } from './remote-file-content-provider.js';
71
+ export { TypertGatewaySwitch } from './typert-gateway-switch.js';
72
+ export { runCli } from './cli.js';
73
+ export type { RemoteCliDependencies } from './cli.js';
74
+ export type { LocalTypertGateway, RemoteTypertGatewayTarget, TypertGatewayLike, TypertGatewayRequest, TypertGatewayWireStreamLike, TypertRpcResult, } from './typert-gateway-contract.js';
75
+ export type { AuthenticatedPeerChannel } from './types.js';
76
+ export { AcpGateway } from './acp.js';
77
+ export type { AcpBackendAdapter } from './acp.js';
78
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}