@blue-soda/dsh-remote 0.4.28 → 0.4.29
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.
- package/README.md +9 -9
- package/dist/atomic-file.d.ts +16 -0
- package/dist/atomic-file.d.ts.map +1 -0
- package/dist/atomic-file.js +81 -0
- package/dist/atomic-file.js.map +1 -0
- package/dist/identity-store.d.ts.map +1 -1
- package/dist/identity-store.js +6 -3
- package/dist/identity-store.js.map +1 -1
- package/dist/index.js +142 -83
- package/dist/index.js.map +4 -4
- package/dist/server-credentials.d.ts.map +1 -1
- package/dist/server-credentials.js +6 -3
- package/dist/server-credentials.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dsh-plugin.json +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
Continue DeepSeek Harness sessions and experimental Codex workspaces from another device over an end-to-end encrypted connection.
|
|
4
4
|
|
|
5
|
-
[GitHub](https://github.com/blue-soda/ds-harness-remote) · [Full guide](https://github.com/blue-soda/ds-harness-remote#readme) · [中文说明](https://github.com/blue-soda/ds-harness-remote/blob/main/README.zh.md) · [
|
|
5
|
+
[GitHub](https://github.com/blue-soda/ds-harness-remote) · [Full guide](https://github.com/blue-soda/ds-harness-remote#readme) · [中文说明](https://github.com/blue-soda/ds-harness-remote/blob/main/README.zh.md) · [Releases](https://github.com/blue-soda/ds-harness-remote/releases) · [Android app](https://github.com/blue-soda/deepseek-harness-android-app/tree/master)
|
|
6
6
|
|
|
7
7
|
`ds-harness-remote` is the Remote Host and workspace plugin for DeepSeek Harness. Harness keeps running on your work computer with its existing workspaces, tools, and permission controls; Remote gives authorized devices another window into that environment.
|
|
8
8
|
|
|
9
9
|
> Install this package with `dsh plugin`, not `npm install`. The DSH command updates the selected profile and adds the required bundle configuration.
|
|
10
10
|
|
|
11
|
-
> **This is a fork** of [liguobao/ds-harness-remote](https://github.com/liguobao/ds-harness-remote) (MIT),
|
|
12
|
-
> published as [`@blue-soda/dsh-remote`](https://www.npmjs.com/package/@blue-soda/dsh-remote).
|
|
13
|
-
> The original project and its contributors are credited in [LICENSE](LICENSE) and `contributors`.
|
|
14
|
-
|
|
11
|
+
> **This is a fork** of [liguobao/ds-harness-remote](https://github.com/liguobao/ds-harness-remote) (MIT),
|
|
12
|
+
> published as [`@blue-soda/dsh-remote`](https://www.npmjs.com/package/@blue-soda/dsh-remote).
|
|
13
|
+
> The original project and its contributors are credited in [LICENSE](LICENSE) and `contributors`.
|
|
14
|
+
|
|
15
15
|
## Install
|
|
16
16
|
|
|
17
17
|
### DSH Desktop
|
|
@@ -23,7 +23,7 @@ Continue DeepSeek Harness sessions and experimental Codex workspaces from anothe
|
|
|
23
23
|
Add the current package version to the `web` profile, then restart Harness:
|
|
24
24
|
|
|
25
25
|
```sh
|
|
26
|
-
dsh plugin --profile web add -w @blue-soda/dsh-remote@0.4.
|
|
26
|
+
dsh plugin --profile web add -w @blue-soda/dsh-remote@0.4.29
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
### dsh-TUI Host
|
|
@@ -31,7 +31,7 @@ dsh plugin --profile web add -w @blue-soda/dsh-remote@0.4.28
|
|
|
31
31
|
Remote can also run as a Host in a terminal-only [dsh-TUI](https://github.com/ccch1mneyyy/dsh-TUI) profile:
|
|
32
32
|
|
|
33
33
|
```sh
|
|
34
|
-
dsh plugin --profile dsh-tui add -w @blue-soda/dsh-remote@0.4.
|
|
34
|
+
dsh plugin --profile dsh-tui add -w @blue-soda/dsh-remote@0.4.29
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
After starting dsh-TUI, manage Remote with `/remote`, `/remote login`, `/remote status`, and `/remote logout`.
|
|
@@ -48,7 +48,7 @@ After starting dsh-TUI, manage Remote with `/remote`, `/remote login`, `/remote
|
|
|
48
48
|
|
|
49
49
|
## Compatibility
|
|
50
50
|
|
|
51
|
-
Plugin `0.4.
|
|
51
|
+
Plugin `0.4.29` targets DeepSeek Harness `dsh-v0.2.0-rc.2` and retains `dsh-v0.1.7-rc.1` compatibility; it also supports `dsh-v0.1.6-alpha.2` and earlier settings hosts. It supports:
|
|
52
52
|
|
|
53
53
|
- `dsh-v0.1.1-rc.2` through the official legacy `ApiProxy`;
|
|
54
54
|
- `dsh-v0.1.2-alpha.1` through `dsh-v0.1.2-rc.1` through the official Typert Remote Gateway;
|
|
@@ -58,7 +58,7 @@ The same package feature-detects the older settings registry and the `0.1.7-rc.1
|
|
|
58
58
|
|
|
59
59
|
## Self-hosted Server
|
|
60
60
|
|
|
61
|
-
This repository includes a
|
|
61
|
+
This repository includes a self-hosted, Relay-only Server in [`apps/server`](https://github.com/blue-soda/ds-harness-remote/tree/main/apps/server) that supports multiple accounts, with devices and tokens namespaced per account. `DSH_SERVER_ACCOUNT` and `DSH_SERVER_PASSWORD` configure a seed account; account creation is off by default and can be enabled with `DSH_SERVER_REGISTRATION_CODE`, or replaced by DeepSeek platform sign-in (`DSH_SERVER_DEEPSEEK_LOGIN=on`) or a QR provider (`DSH_SERVER_OAUTH_PROVIDER`). It provides account login, device credentials, encrypted Control/Noise forwarding, Relay, and a device-status page. It does not provide the complete site - Remote Web session UI or Admin - or WebRTC/TURN deployment.
|
|
62
62
|
|
|
63
63
|
## Security boundary
|
|
64
64
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ReplaceFileOptions {
|
|
2
|
+
/** Delay before each retry. Fewer entries than failures means the last error is thrown. */
|
|
3
|
+
delaysMs?: readonly number[];
|
|
4
|
+
}
|
|
5
|
+
export interface SweepOptions {
|
|
6
|
+
maxAgeMs?: number;
|
|
7
|
+
}
|
|
8
|
+
/** Replace `target` with `temporary`, retrying the transient Windows failures. */
|
|
9
|
+
export declare function replaceFile(temporary: string, target: string, options?: ReplaceFileOptions): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Remove abandoned `*.tmp` files a crashed write left beside the state files, and return
|
|
12
|
+
* the paths removed. Only names this module produces are considered, and only once they
|
|
13
|
+
* are old enough that no live writer can own them, so a concurrent write is never deleted.
|
|
14
|
+
*/
|
|
15
|
+
export declare function sweepStaleTemporaries(directory: string, options?: SweepOptions): Promise<string[]>;
|
|
16
|
+
//# sourceMappingURL=atomic-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-file.d.ts","sourceRoot":"","sources":["../src/atomic-file.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,kBAAkB;IACjC,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,kFAAkF;AAClF,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsB5G"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { readdir, rename, rm, stat } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Atomic replacement of a state file, with the retry Windows needs.
|
|
5
|
+
*
|
|
6
|
+
* On Windows `rename` is `MoveFileEx(..., MOVEFILE_REPLACE_EXISTING)`, which fails with
|
|
7
|
+
* `EPERM` while another handle holds the *destination* without `FILE_SHARE_DELETE`. The
|
|
8
|
+
* holders are short-lived and outside this process: antivirus and indexer scans, Explorer
|
|
9
|
+
* previews, backup or sync agents, and a second process writing the same state directory.
|
|
10
|
+
* Node always opens with `FILE_SHARE_DELETE` itself, so this process cannot cause it, and
|
|
11
|
+
* the failure disappears on the next attempt - which is why `EPERM` here means "retry",
|
|
12
|
+
* not "permission denied", and why exclusions or packaging changes do not fix it.
|
|
13
|
+
*
|
|
14
|
+
* A retry only hides a second *writer*: two instances sharing one `DSH_HOME` still race on
|
|
15
|
+
* a read-modify-write, so keep parallel Hosts on separate `DSH_HOME` values (see the
|
|
16
|
+
* refresh lock in `server-credentials.ts` for the same rule applied to credentials).
|
|
17
|
+
*/
|
|
18
|
+
const TRANSIENT_REPLACE_CODES = new Set(['EPERM', 'EBUSY', 'EACCES']);
|
|
19
|
+
const REPLACE_RETRY_DELAYS_MS = [20, 40, 80, 160, 320];
|
|
20
|
+
/** `<state file>.<pid>.<uuid v7>.tmp`, the temporary name every caller here creates. */
|
|
21
|
+
const TEMPORARY_NAME = /\.\d+\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.tmp$/iu;
|
|
22
|
+
/** A live write lasts milliseconds, so anything this old was abandoned by a crash. */
|
|
23
|
+
const STALE_TEMPORARY_AGE_MS = 10 * 60 * 1000;
|
|
24
|
+
/** Replace `target` with `temporary`, retrying the transient Windows failures. */
|
|
25
|
+
export async function replaceFile(temporary, target, options = {}) {
|
|
26
|
+
const delays = options.delaysMs ?? REPLACE_RETRY_DELAYS_MS;
|
|
27
|
+
for (let attempt = 0;; attempt += 1) {
|
|
28
|
+
try {
|
|
29
|
+
await rename(temporary, target);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
const delay = delays[attempt];
|
|
34
|
+
if (delay === undefined || !TRANSIENT_REPLACE_CODES.has(errorCode(error) ?? ''))
|
|
35
|
+
throw error;
|
|
36
|
+
await sleep(delay);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Remove abandoned `*.tmp` files a crashed write left beside the state files, and return
|
|
42
|
+
* the paths removed. Only names this module produces are considered, and only once they
|
|
43
|
+
* are old enough that no live writer can own them, so a concurrent write is never deleted.
|
|
44
|
+
*/
|
|
45
|
+
export async function sweepStaleTemporaries(directory, options = {}) {
|
|
46
|
+
const maxAgeMs = options.maxAgeMs ?? STALE_TEMPORARY_AGE_MS;
|
|
47
|
+
const removed = [];
|
|
48
|
+
let entries;
|
|
49
|
+
try {
|
|
50
|
+
entries = await readdir(directory);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return removed;
|
|
54
|
+
}
|
|
55
|
+
for (const entry of entries) {
|
|
56
|
+
if (!TEMPORARY_NAME.test(entry))
|
|
57
|
+
continue;
|
|
58
|
+
const path = join(directory, entry);
|
|
59
|
+
try {
|
|
60
|
+
const info = await stat(path);
|
|
61
|
+
if (!info.isFile() || Date.now() - info.mtimeMs < maxAgeMs)
|
|
62
|
+
continue;
|
|
63
|
+
await rm(path, { force: true });
|
|
64
|
+
removed.push(path);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Best effort: a file another process is removing is already gone.
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return removed;
|
|
71
|
+
}
|
|
72
|
+
function errorCode(error) {
|
|
73
|
+
if (typeof error !== 'object' || error === null || !('code' in error))
|
|
74
|
+
return undefined;
|
|
75
|
+
const code = error.code;
|
|
76
|
+
return typeof code === 'string' ? code : undefined;
|
|
77
|
+
}
|
|
78
|
+
function sleep(ms) {
|
|
79
|
+
return new Promise(resolve => { setTimeout(resolve, ms); });
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=atomic-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-file.js","sourceRoot":"","sources":["../src/atomic-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-store.d.ts","sourceRoot":"","sources":["../src/identity-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"identity-store.d.ts","sourceRoot":"","sources":["../src/identity-store.ts"],"names":[],"mappings":"AA+BA,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"}
|
package/dist/identity-store.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
|
-
import { chmod, mkdir, readFile,
|
|
2
|
+
import { chmod, mkdir, readFile, rm, stat, writeFile } from 'node:fs/promises';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { dirname, join } from 'node:path';
|
|
5
5
|
import { fromBase64Url, generateKeyPair } from '@dsh-remote/crypto';
|
|
6
6
|
import { z } from 'zod';
|
|
7
|
+
import { replaceFile, sweepStaleTemporaries } from './atomic-file.js';
|
|
7
8
|
import { uuidV7 } from './ids.js';
|
|
8
9
|
const identitySchema = z.object({
|
|
9
10
|
schemaVersion: z.literal(1),
|
|
@@ -156,11 +157,13 @@ async function atomicJsonWrite(path, value, mode) {
|
|
|
156
157
|
await atomicTextWrite(path, `${JSON.stringify(value, null, 2)}\n`, mode);
|
|
157
158
|
}
|
|
158
159
|
async function atomicTextWrite(path, value, mode) {
|
|
159
|
-
|
|
160
|
+
const directory = dirname(path);
|
|
161
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
162
|
+
await sweepStaleTemporaries(directory);
|
|
160
163
|
const temporary = `${path}.${process.pid}.${uuidV7()}.tmp`;
|
|
161
164
|
await writeFile(temporary, value, { encoding: 'utf8', mode, flag: 'wx' });
|
|
162
165
|
await chmod(temporary, mode);
|
|
163
|
-
await
|
|
166
|
+
await replaceFile(temporary, path);
|
|
164
167
|
await chmod(path, mode);
|
|
165
168
|
}
|
|
166
169
|
async function exists(path) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-store.js","sourceRoot":"","sources":["../src/identity-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"identity-store.js","sourceRoot":"","sources":["../src/identity-store.ts"],"names":[],"mappings":"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"}
|